ctest: Restore enforcement of RESOURCE_LOCK test property

Refactoring in commit 5ff0b4ed57 (cmCTestMultiProcessHandler:
Consolidate test readiness checks, 2023-10-20, v3.29.0-rc1~378^2~4)
accidentally broke `RESOURCE_LOCK`.  Fix it and replace the previous
test with one that would have caught this.

Fixes: #25843
This commit is contained in:
Brad King 2024-04-01 11:35:19 -04:00
parent 951f75f3b2
commit 85745cce7a
9 changed files with 33 additions and 78 deletions

View File

@ -442,6 +442,15 @@ void cmCTestMultiProcessHandler::SetStopTimePassed()
}
}
bool cmCTestMultiProcessHandler::ResourceLocksAvailable(int test)
{
return std::all_of(this->Properties[test]->ProjectResources.begin(),
this->Properties[test]->ProjectResources.end(),
[this](std::string const& r) -> bool {
return !cm::contains(this->ProjectResourcesLocked, r);
});
}
void cmCTestMultiProcessHandler::LockResources(int index)
{
this->RunningCount += this->GetProcessorsUsed(index);
@ -643,11 +652,9 @@ void cmCTestMultiProcessHandler::StartNextTests()
}
// Exclude tests that depend on currently-locked project resources.
for (std::string const& i : this->Properties[test]->ProjectResources) {
if (cm::contains(this->ProjectResourcesLocked, i)) {
if (!this->ResourceLocksAvailable(test)) {
continue;
}
}
// Allocate system resources needed by this test.
if (!this->AllocateResources(test)) {

View File

@ -143,6 +143,7 @@ protected:
void InitializeLoop();
void FinalizeLoop();
bool ResourceLocksAvailable(int test);
void LockResources(int index);
void UnlockResources(int index);

View File

@ -3103,15 +3103,6 @@ if(BUILD_TESTING)
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Tests/CTestTestLabelRegExp
)
configure_file(
"${CMake_SOURCE_DIR}/Tests/CTestTestResourceLock/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestResourceLock/test.cmake"
@ONLY ESCAPE_QUOTES)
add_test(CTestTestResourceLock ${CMAKE_CTEST_COMMAND}
-S "${CMake_BINARY_DIR}/Tests/CTestTestResourceLock/test.cmake" -V
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestResourceLock/output.log"
)
configure_file(
"${CMake_SOURCE_DIR}/Tests/CTestTestScheduler/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestScheduler/test.cmake"

View File

@ -1,13 +0,0 @@
cmake_minimum_required (VERSION 3.5)
project(CTestTestResourceLock)
include(CTest)
add_executable (LockFile lockFile.c)
add_test (TestLockedFile1.1 LockFile locked1.txt)
add_test (TestLockedFile1.2 LockFile locked1.txt)
set_tests_properties(TestLockedFile1.1 TestLockedFile1.2 PROPERTIES RESOURCE_LOCK "locked1.txt")
add_test (TestLockedFile2.1 LockFile locked2.txt)
add_test (TestLockedFile2.2 LockFile locked2.txt)
set_tests_properties(TestLockedFile2.1 TestLockedFile2.2 PROPERTIES RESOURCE_LOCK "locked2.txt")

View File

@ -1,4 +0,0 @@
set(CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "open.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=PublicDashboard")

View File

@ -1,27 +0,0 @@
#include <stdio.h>
/* Disable deprecation warning for fopen */
#pragma warning(disable : 4996)
/*if run serially, works fine.
If run in parallel, someone will attempt to delete
a locked file, which will fail */
int main(int argc, char** argv)
{
FILE* file;
int i;
const char* fname;
if (argc >= 2) {
fname = argv[1];
} else {
fname = "lockedFile.txt";
}
file = fopen(fname, "w");
for (i = 0; i < 10000; i++) {
fprintf(file, "%s", "x");
fflush(file);
}
fclose(file);
return remove(fname);
}

View File

@ -1,21 +0,0 @@
cmake_minimum_required(VERSION 3.5)
# Settings:
set(CTEST_DASHBOARD_ROOT "@CMake_BINARY_DIR@/Tests/CTestTest")
set(CTEST_SITE "@SITE@")
set(CTEST_BUILD_NAME "CTestTest-@BUILDNAME@-ResourceLock")
set(CTEST_SOURCE_DIRECTORY "@CMake_SOURCE_DIR@/Tests/CTestTestResourceLock")
set(CTEST_BINARY_DIRECTORY "@CMake_BINARY_DIR@/Tests/CTestTestResourceLock")
set(CTEST_CVS_COMMAND "@CVSCOMMAND@")
set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
set(CTEST_CMAKE_GENERATOR_PLATFORM "@CMAKE_GENERATOR_PLATFORM@")
set(CTEST_CMAKE_GENERATOR_TOOLSET "@CMAKE_GENERATOR_TOOLSET@")
set(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
set(CTEST_COVERAGE_COMMAND "@COVERAGE_COMMAND@")
set(CTEST_NOTES_FILES "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}")
CTEST_START(Experimental)
CTEST_CONFIGURE(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_BUILD(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_TEST(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res PARALLEL_LEVEL 4)

View File

@ -0,0 +1,12 @@
Test project [^
]*/Tests/RunCMake/ctest_test/ResourceLock-build
Start 2: test1
1/4 Test #2: test1 ............................ Passed +[0-9.]+ sec
Start 3: test2
2/4 Test #3: test2 ............................ Passed +[0-9.]+ sec
Start 4: test3
3/4 Test #4: test3 ............................ Passed +[0-9.]+ sec
Start 5: test4
4/4 Test #5: test4 ............................ Passed +[0-9.]+ sec
+
100% tests passed, 0 tests failed out of 4

View File

@ -13,6 +13,15 @@ endfunction()
run_ctest_test(TestQuiet QUIET)
set(CASE_CMAKELISTS_SUFFIX_CODE [[
foreach(i RANGE 1 4)
add_test(NAME test${i} COMMAND ${CMAKE_COMMAND} -E true)
set_property(TEST test${i} PROPERTY RESOURCE_LOCK resource)
endforeach()
]])
run_ctest_test(ResourceLock INCLUDE test PARALLEL_LEVEL 4)
unset(CASE_CMAKELISTS_SUFFIX_CODE)
set(ENV{__CTEST_FAKE_PROCESSOR_COUNT_FOR_TESTING} 4)
set(CASE_CMAKELISTS_SUFFIX_CODE [[
foreach(i RANGE 1 6)