From 85745cce7aec38d9a7eaa83fb83ef3a7327fd6dc Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 1 Apr 2024 11:35:19 -0400 Subject: 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 --- Source/CTest/cmCTestMultiProcessHandler.cxx | 15 +++++++++---- Source/CTest/cmCTestMultiProcessHandler.h | 1 + Tests/CMakeLists.txt | 9 -------- Tests/CTestTestResourceLock/CMakeLists.txt | 13 ----------- Tests/CTestTestResourceLock/CTestConfig.cmake | 4 ---- Tests/CTestTestResourceLock/lockFile.c | 27 ----------------------- Tests/CTestTestResourceLock/test.cmake.in | 21 ------------------ Tests/RunCMake/ctest_test/ResourceLock-stdout.txt | 12 ++++++++++ Tests/RunCMake/ctest_test/RunCMakeTest.cmake | 9 ++++++++ 9 files changed, 33 insertions(+), 78 deletions(-) delete mode 100644 Tests/CTestTestResourceLock/CMakeLists.txt delete mode 100644 Tests/CTestTestResourceLock/CTestConfig.cmake delete mode 100644 Tests/CTestTestResourceLock/lockFile.c delete mode 100644 Tests/CTestTestResourceLock/test.cmake.in create mode 100644 Tests/RunCMake/ctest_test/ResourceLock-stdout.txt diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index 53c5f76..773a305 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -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,10 +652,8 @@ 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)) { - continue; - } + if (!this->ResourceLocksAvailable(test)) { + continue; } // Allocate system resources needed by this test. diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h index d4759f1..f491815 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.h +++ b/Source/CTest/cmCTestMultiProcessHandler.h @@ -143,6 +143,7 @@ protected: void InitializeLoop(); void FinalizeLoop(); + bool ResourceLocksAvailable(int test); void LockResources(int index); void UnlockResources(int index); diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index ab31e70..72b55e0 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -3104,15 +3104,6 @@ if(BUILD_TESTING) ) 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" @ONLY ESCAPE_QUOTES) diff --git a/Tests/CTestTestResourceLock/CMakeLists.txt b/Tests/CTestTestResourceLock/CMakeLists.txt deleted file mode 100644 index 683aba5..0000000 --- a/Tests/CTestTestResourceLock/CMakeLists.txt +++ /dev/null @@ -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") diff --git a/Tests/CTestTestResourceLock/CTestConfig.cmake b/Tests/CTestTestResourceLock/CTestConfig.cmake deleted file mode 100644 index bd265f9..0000000 --- a/Tests/CTestTestResourceLock/CTestConfig.cmake +++ /dev/null @@ -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") diff --git a/Tests/CTestTestResourceLock/lockFile.c b/Tests/CTestTestResourceLock/lockFile.c deleted file mode 100644 index 8c023ef..0000000 --- a/Tests/CTestTestResourceLock/lockFile.c +++ /dev/null @@ -1,27 +0,0 @@ -#include - -/* 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); -} diff --git a/Tests/CTestTestResourceLock/test.cmake.in b/Tests/CTestTestResourceLock/test.cmake.in deleted file mode 100644 index dab26fc..0000000 --- a/Tests/CTestTestResourceLock/test.cmake.in +++ /dev/null @@ -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) diff --git a/Tests/RunCMake/ctest_test/ResourceLock-stdout.txt b/Tests/RunCMake/ctest_test/ResourceLock-stdout.txt new file mode 100644 index 0000000..c9b6253 --- /dev/null +++ b/Tests/RunCMake/ctest_test/ResourceLock-stdout.txt @@ -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 diff --git a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake index 3c9a80d..dd5c005 100644 --- a/Tests/RunCMake/ctest_test/RunCMakeTest.cmake +++ b/Tests/RunCMake/ctest_test/RunCMakeTest.cmake @@ -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) -- cgit v0.12