Merge topic 'fix-12904-avoid-overflow'
e378ba5
Add CTestLimitDashJ test (#12904)3247806
CTest: Prevent creation of unbounded number of tests in ctest (#12904)
This commit is contained in:
commit
e2969c503b
|
@ -248,7 +248,12 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
void cmCTestMultiProcessHandler::StartNextTests()
|
void cmCTestMultiProcessHandler::StartNextTests()
|
||||||
{
|
{
|
||||||
size_t numToStart = this->ParallelLevel - this->RunningCount;
|
size_t numToStart = 0;
|
||||||
|
if(this->RunningCount < this->ParallelLevel)
|
||||||
|
{
|
||||||
|
numToStart = this->ParallelLevel - this->RunningCount;
|
||||||
|
}
|
||||||
|
|
||||||
if(numToStart == 0)
|
if(numToStart == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1959,6 +1959,9 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
|
||||||
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestParallel/testOutput.log"
|
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestParallel/testOutput.log"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_test_macro(CTestLimitDashJ ${CMAKE_CTEST_COMMAND} -j 4
|
||||||
|
--output-on-failure -C "\${CTestTest_CONFIG}")
|
||||||
|
|
||||||
add_test(CTestTestPrintLabels ${CMAKE_CTEST_COMMAND} --print-labels)
|
add_test(CTestTestPrintLabels ${CMAKE_CTEST_COMMAND} --print-labels)
|
||||||
set_tests_properties(CTestTestPrintLabels PROPERTIES LABELS "Label1;Label2")
|
set_tests_properties(CTestTestPrintLabels PROPERTIES LABELS "Label1;Label2")
|
||||||
set_tests_properties(CTestTestPrintLabels PROPERTIES PASS_REGULAR_EXPRESSION
|
set_tests_properties(CTestTestPrintLabels PROPERTIES PASS_REGULAR_EXPRESSION
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
project(CTestLimitDashJ NONE)
|
||||||
|
|
||||||
|
# This file demonstrates http://public.kitware.com/Bug/view.php?id=12904
|
||||||
|
# when configured with CMake 2.8.10.2 and earlier, and when running
|
||||||
|
# "ctest -j 4" in the resulting build tree. This example is hard-coded
|
||||||
|
# to assume -j 4 just to reproduce the issue easily. Adjust the
|
||||||
|
# FAIL_REGULAR_EXPRESSION and PROCESSORS values to reproduce this problem
|
||||||
|
# with a different ctest -j value...
|
||||||
|
|
||||||
|
if(EXISTS "${CMAKE_BINARY_DIR}/Testing/Temporary/CTestCostData.txt")
|
||||||
|
message(STATUS "Removing CTestCostData.txt to force ordering by COST PROPERTY value rather than prior run data")
|
||||||
|
file(REMOVE "${CMAKE_BINARY_DIR}/Testing/Temporary/CTestCostData.txt")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CTest)
|
||||||
|
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/CreateSleepDelete.cmake
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/CreateSleepDelete.cmake
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach(n RANGE 1 100)
|
||||||
|
add_test(NAME t${n}
|
||||||
|
COMMAND ${CMAKE_CTEST_COMMAND}
|
||||||
|
-D basefilename=f${n}
|
||||||
|
-S ${CMAKE_CURRENT_BINARY_DIR}/CreateSleepDelete.cmake
|
||||||
|
)
|
||||||
|
set_property(TEST t${n} PROPERTY FAIL_REGULAR_EXPRESSION "(c='[5-9]'|c='[1-9][0-9]+')")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set_property(TEST t1 PROPERTY RUN_SERIAL 1)
|
||||||
|
set_property(TEST t1 PROPERTY PROCESSORS 4)
|
||||||
|
|
||||||
|
set_property(TEST t51 PROPERTY RUN_SERIAL 1)
|
||||||
|
set_property(TEST t51 PROPERTY PROCESSORS 4)
|
||||||
|
|
||||||
|
foreach(n RANGE 2 50)
|
||||||
|
set_property(TEST t${n} PROPERTY DEPENDS t1)
|
||||||
|
endforeach()
|
||||||
|
set_property(TEST t1 PROPERTY DEPENDS t51)
|
||||||
|
set_property(TEST t51 PROPERTY DEPENDS t100)
|
||||||
|
|
||||||
|
foreach(n 50)
|
||||||
|
set_property(TEST t${n} PROPERTY COST 6)
|
||||||
|
endforeach()
|
||||||
|
foreach(n RANGE 52 99)
|
||||||
|
set_property(TEST t${n} PROPERTY COST 3)
|
||||||
|
endforeach()
|
|
@ -0,0 +1,48 @@
|
||||||
|
set(CTEST_RUN_CURRENT_SCRIPT 0)
|
||||||
|
|
||||||
|
if(NOT DEFINED basefilename)
|
||||||
|
message(FATAL_ERROR "pass -Dbasefilename=f1")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED ext)
|
||||||
|
set(ext "jkqvxz")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED sleep_interval)
|
||||||
|
set(sleep_interval 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_filename_component(self_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||||
|
set(filename "${self_dir}/${basefilename}.${ext}")
|
||||||
|
|
||||||
|
# count files
|
||||||
|
file(GLOB f1 *.${ext})
|
||||||
|
list(LENGTH f1 c1)
|
||||||
|
message("c='${c1}'")
|
||||||
|
|
||||||
|
# write a new file
|
||||||
|
message("Writing file: filename='${filename}'")
|
||||||
|
file(WRITE "${filename}" "${filename}")
|
||||||
|
|
||||||
|
# count files again
|
||||||
|
file(GLOB f2 *.${ext})
|
||||||
|
list(LENGTH f2 c2)
|
||||||
|
message("c='${c2}'")
|
||||||
|
|
||||||
|
# snooze
|
||||||
|
message("Sleeping: sleep_interval='${sleep_interval}'")
|
||||||
|
ctest_sleep(${sleep_interval})
|
||||||
|
|
||||||
|
# count files again
|
||||||
|
file(GLOB f3 *.${ext})
|
||||||
|
list(LENGTH f3 c3)
|
||||||
|
message("c='${c3}'")
|
||||||
|
|
||||||
|
# delete the file we wrote earlier
|
||||||
|
message("Removing file: filename='${filename}'")
|
||||||
|
file(REMOVE "${filename}")
|
||||||
|
|
||||||
|
# count files again
|
||||||
|
file(GLOB f4 *.${ext})
|
||||||
|
list(LENGTH f4 c4)
|
||||||
|
message("c='${c4}'")
|
Loading…
Reference in New Issue