RunCMakeTest.cmake 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. include(RunCMake)
  2. include(RunCTest)
  3. # Do not use any proxy for lookup of an invalid site.
  4. # DNS failure by proxy looks different than DNS failure without proxy.
  5. set(ENV{no_proxy} "$ENV{no_proxy},badhostname.invalid")
  6. set(RunCMake_TEST_TIMEOUT 60)
  7. block()
  8. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FailureLabels)
  9. set(RunCMake_TEST_NO_CLEAN 1)
  10. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  11. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  12. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  13. add_test(ShortName \"${CMAKE_COMMAND}\" -E false)
  14. set_tests_properties(ShortName PROPERTIES LABELS \"Label1;Label2\")
  15. add_test(LongerName \"${CMAKE_COMMAND}\" -E false)
  16. set_tests_properties(LongerName PROPERTIES LABELS \"Label3\")
  17. add_test(Long_Test_Name_That_Is_Over_Fifty_Characters_In_Length \"${CMAKE_COMMAND}\" -E false)
  18. set_tests_properties(Long_Test_Name_That_Is_Over_Fifty_Characters_In_Length PROPERTIES LABELS \"Label4\")
  19. ")
  20. run_cmake_command(FailureLabels ${CMAKE_CTEST_COMMAND})
  21. endblock()
  22. block()
  23. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/PrintLabels)
  24. set(RunCMake_TEST_NO_CLEAN 1)
  25. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  26. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  27. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  28. add_test(A \"${CMAKE_COMMAND}\" -E true)
  29. set_tests_properties(A PROPERTIES LABELS \"Label1;Label2\")
  30. add_test(B \"${CMAKE_COMMAND}\" -E true)
  31. set_tests_properties(B PROPERTIES LABELS \"Label3\")
  32. ")
  33. run_cmake_command(PrintLabels ${CMAKE_CTEST_COMMAND} --print-labels)
  34. endblock()
  35. run_cmake_command(repeat-opt-bad1
  36. ${CMAKE_CTEST_COMMAND} --repeat until-pass
  37. )
  38. run_cmake_command(repeat-opt-bad2
  39. ${CMAKE_CTEST_COMMAND} --repeat until-pass:foo
  40. )
  41. run_cmake_command(repeat-opt-bad3
  42. ${CMAKE_CTEST_COMMAND} --repeat until-fail:2 --repeat-until-fail 2
  43. )
  44. run_cmake_command(repeat-opt-bad4
  45. ${CMAKE_CTEST_COMMAND} --repeat-until-fail 2 --repeat until-fail:2
  46. )
  47. run_cmake_command(repeat-opt-until-pass
  48. ${CMAKE_CTEST_COMMAND} --repeat until-pass:2
  49. )
  50. run_cmake_command(repeat-opt-until-fail
  51. ${CMAKE_CTEST_COMMAND} --repeat until-fail:2
  52. )
  53. run_cmake_command(repeat-opt-after-timeout
  54. ${CMAKE_CTEST_COMMAND} --repeat after-timeout:2
  55. )
  56. run_cmake_command(repeat-until-fail-bad1
  57. ${CMAKE_CTEST_COMMAND} --repeat-until-fail
  58. )
  59. run_cmake_command(repeat-until-fail-bad2
  60. ${CMAKE_CTEST_COMMAND} --repeat-until-fail foo
  61. )
  62. run_cmake_command(repeat-until-fail-good
  63. ${CMAKE_CTEST_COMMAND} --repeat-until-fail 2
  64. )
  65. function(run_repeat_until_pass_tests)
  66. # Use a single build tree for a few tests without cleaning.
  67. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/repeat-until-pass-build)
  68. run_cmake(repeat-until-pass-cmake)
  69. set(RunCMake_TEST_NO_CLEAN 1)
  70. run_cmake_command(repeat-until-pass-ctest
  71. ${CMAKE_CTEST_COMMAND} -C Debug --repeat until-pass:3
  72. )
  73. endfunction()
  74. run_repeat_until_pass_tests()
  75. function(run_repeat_after_timeout_tests)
  76. # Use a single build tree for a few tests without cleaning.
  77. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/repeat-after-timeout-build)
  78. run_cmake(repeat-after-timeout-cmake)
  79. set(RunCMake_TEST_NO_CLEAN 1)
  80. run_cmake_command(repeat-after-timeout-ctest
  81. ${CMAKE_CTEST_COMMAND} -C Debug --repeat after-timeout:3
  82. )
  83. endfunction()
  84. run_repeat_after_timeout_tests()
  85. function(run_repeat_until_fail_tests)
  86. # Use a single build tree for a few tests without cleaning.
  87. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/repeat-until-fail-build)
  88. run_cmake(repeat-until-fail-cmake)
  89. set(RunCMake_TEST_NO_CLEAN 1)
  90. run_cmake_command(repeat-until-fail-ctest
  91. ${CMAKE_CTEST_COMMAND} -C Debug ${ARGN}
  92. )
  93. endfunction()
  94. run_repeat_until_fail_tests(--repeat-until-fail 3)
  95. run_repeat_until_fail_tests(--repeat until-fail:3)
  96. function(run_BadCTestTestfile)
  97. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/BadCTestTestfile)
  98. set(RunCMake_TEST_NO_CLEAN 1)
  99. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  100. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  101. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  102. subdirs()
  103. ")
  104. run_cmake_command(BadCTestTestfile ${CMAKE_CTEST_COMMAND})
  105. endfunction()
  106. run_BadCTestTestfile()
  107. function(run_Subdirectories)
  108. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Subdirectories)
  109. set(RunCMake_TEST_NO_CLEAN 1)
  110. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  111. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  112. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/add_subdirectory")
  113. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/add_subdirectory/sub")
  114. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/subdirs")
  115. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/subdirs/sub")
  116. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  117. add_subdirectory(add_subdirectory)
  118. subdirs(subdirs)
  119. ")
  120. file(WRITE "${RunCMake_TEST_BINARY_DIR}/add_subdirectory/CTestTestfile.cmake" "
  121. add_test(add_subdirectory \"${CMAKE_COMMAND}\" -E echo add_subdirectory)
  122. add_subdirectory(sub)
  123. ")
  124. file(WRITE "${RunCMake_TEST_BINARY_DIR}/add_subdirectory/sub/CTestTestfile.cmake" "
  125. add_test(add_subdirectory.sub \"${CMAKE_COMMAND}\" -E echo add_subdirectory.sub)
  126. ")
  127. file(WRITE "${RunCMake_TEST_BINARY_DIR}/subdirs/CTestTestfile.cmake" "
  128. add_test(subdirs \"${CMAKE_COMMAND}\" -E echo subdirs)
  129. subdirs(sub)
  130. ")
  131. file(WRITE "${RunCMake_TEST_BINARY_DIR}/subdirs/sub/CTestTestfile.cmake" "
  132. add_test(subdirs.sub \"${CMAKE_COMMAND}\" -E echo subdirs.sub)
  133. ")
  134. run_cmake_command(Subdirectories ${CMAKE_CTEST_COMMAND} -N)
  135. endfunction()
  136. run_Subdirectories()
  137. function(run_MergeOutput)
  138. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MergeOutput)
  139. set(RunCMake_TEST_NO_CLEAN 1)
  140. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  141. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  142. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  143. add_test(MergeOutput \"${CMAKE_COMMAND}\" -P \"${RunCMake_SOURCE_DIR}/MergeOutput.cmake\")
  144. ")
  145. run_cmake_command(MergeOutput ${CMAKE_CTEST_COMMAND} -V)
  146. endfunction()
  147. run_MergeOutput()
  148. function(run_LabelCount)
  149. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LabelCount)
  150. set(RunCMake_TEST_NO_CLEAN 1)
  151. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  152. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  153. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  154. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  155. set_tests_properties(test1 PROPERTIES LABELS 'bar')
  156. add_test(test2 \"${CMAKE_COMMAND}\" -E echo \"test2\")
  157. set_tests_properties(test2 PROPERTIES LABELS 'bar')
  158. add_test(test3 \"${CMAKE_COMMAND}\" -E echo \"test3\")
  159. set_tests_properties(test3 PROPERTIES LABELS 'foo')
  160. add_test(test4 \"${CMAKE_COMMAND}\" -E echo \"test4\")
  161. set_tests_properties(test4 PROPERTIES LABELS 'bar')
  162. ")
  163. run_cmake_command(LabelCount ${CMAKE_CTEST_COMMAND} -V)
  164. endfunction()
  165. run_LabelCount()
  166. function(run_RequiredRegexFoundTest)
  167. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/RequiredRegexFound)
  168. set(RunCMake_TEST_NO_CLEAN 1)
  169. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  170. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  171. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  172. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  173. set_tests_properties(test1 PROPERTIES PASS_REGULAR_EXPRESSION \"foo;test1;bar\")
  174. ")
  175. run_cmake_command(RequiredRegexFound ${CMAKE_CTEST_COMMAND} -V)
  176. endfunction()
  177. run_RequiredRegexFoundTest()
  178. function(run_RequiredRegexNotFoundTest)
  179. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/RequiredRegexNotFound)
  180. set(RunCMake_TEST_NO_CLEAN 1)
  181. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  182. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  183. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  184. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  185. set_tests_properties(test1 PROPERTIES PASS_REGULAR_EXPRESSION \"foo;toast1;bar\" WILL_FAIL True)
  186. ")
  187. run_cmake_command(RequiredRegexNotFound ${CMAKE_CTEST_COMMAND} -V)
  188. endfunction()
  189. run_RequiredRegexNotFoundTest()
  190. function(run_FailRegexFoundTest)
  191. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FailRegexFound)
  192. set(RunCMake_TEST_NO_CLEAN 1)
  193. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  194. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  195. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  196. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  197. set_tests_properties(test1 PROPERTIES FAIL_REGULAR_EXPRESSION \"foo;test1;bar\" WILL_FAIL True)
  198. ")
  199. run_cmake_command(FailRegexFound ${CMAKE_CTEST_COMMAND} -V)
  200. endfunction()
  201. run_FailRegexFoundTest()
  202. function(run_SkipRegexFoundTest)
  203. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SkipRegexFound)
  204. set(RunCMake_TEST_NO_CLEAN 1)
  205. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  206. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  207. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  208. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  209. set_tests_properties(test1 PROPERTIES SKIP_REGULAR_EXPRESSION \"test1\")
  210. ")
  211. run_cmake_command(SkipRegexFound ${CMAKE_CTEST_COMMAND} -V)
  212. endfunction()
  213. run_SkipRegexFoundTest()
  214. function(run_TestsFromFileTest case)
  215. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestsFromFile-${case})
  216. set(RunCMake_TEST_NO_CLEAN 1)
  217. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  218. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  219. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  220. add_test(Test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  221. add_test(Test2 \"${CMAKE_COMMAND}\" -E echo \"test2\")
  222. add_test(Test11 \"${CMAKE_COMMAND}\" -E echo \"test11\")
  223. ")
  224. run_cmake_command(TestsFromFile-${case} ${CMAKE_CTEST_COMMAND} ${ARGN})
  225. endfunction()
  226. run_TestsFromFileTest(include --tests-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList.txt)
  227. run_TestsFromFileTest(exclude --exclude-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList.txt)
  228. run_TestsFromFileTest(include-empty --tests-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList-empty.txt)
  229. run_TestsFromFileTest(exclude-empty --exclude-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList-empty.txt)
  230. run_TestsFromFileTest(include-missing --tests-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList-missing.txt)
  231. run_TestsFromFileTest(exclude-missing --exclude-from-file ${RunCMake_SOURCE_DIR}/TestsFromFile-TestList-missing.txt)
  232. function(run_SerialFailed)
  233. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SerialFailed)
  234. set(RunCMake_TEST_NO_CLEAN 1)
  235. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  236. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  237. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  238. add_test(NoSuchCommand no_such_command)
  239. set_tests_properties(NoSuchCommand PROPERTIES RUN_SERIAL ON)
  240. add_test(Echo \"${CMAKE_COMMAND}\" -E echo \"EchoTest\")
  241. ")
  242. run_cmake_command(SerialFailed ${CMAKE_CTEST_COMMAND} -V)
  243. endfunction()
  244. run_SerialFailed()
  245. function(run_Parallel case)
  246. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/Parallel-${case})
  247. set(RunCMake_TEST_NO_CLEAN 1)
  248. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  249. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  250. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  251. foreach(i RANGE 1 6)
  252. add_test(test\${i} \"${CMAKE_COMMAND}\" -E true)
  253. endforeach()
  254. ")
  255. run_cmake_command(Parallel-${case} ${CMAKE_CTEST_COMMAND} ${ARGN})
  256. endfunction()
  257. # Spoof a number of processors to make these tests predictable.
  258. set(ENV{__CTEST_FAKE_PROCESSOR_COUNT_FOR_TESTING} 1)
  259. run_Parallel(bad --parallel bad)
  260. run_Parallel(j-bad -j bad)
  261. set(RunCMake_TEST_RAW_ARGS [[--parallel ""]])
  262. run_Parallel(empty) # With 1 processor, defaults to 2.
  263. unset(RunCMake_TEST_RAW_ARGS)
  264. run_Parallel(j -j) # With 1 processor, defaults to 2.
  265. run_Parallel(0 -j0)
  266. run_Parallel(4 --parallel 4)
  267. run_Parallel(N --parallel -N)
  268. set(ENV{CTEST_PARALLEL_LEVEL} bad)
  269. run_Parallel(env-bad)
  270. if(CMAKE_HOST_WIN32)
  271. set(ENV{CTEST_PARALLEL_LEVEL} " ")
  272. else()
  273. set(ENV{CTEST_PARALLEL_LEVEL} "")
  274. endif()
  275. run_Parallel(env-empty) # With 1 processor, defaults to 2.
  276. set(ENV{CTEST_PARALLEL_LEVEL} 0)
  277. run_Parallel(env-0)
  278. set(ENV{CTEST_PARALLEL_LEVEL} 3)
  279. run_Parallel(env-3)
  280. unset(ENV{CTEST_PARALLEL_LEVEL})
  281. unset(ENV{__CTEST_FAKE_PROCESSOR_COUNT_FOR_TESTING)
  282. function(run_TestLoad name load)
  283. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestLoad)
  284. set(RunCMake_TEST_NO_CLEAN 1)
  285. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  286. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  287. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  288. add_test(TestLoad1 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  289. set_tests_properties(TestLoad1 PROPERTIES PROCESSORS 2)
  290. add_test(TestLoad2 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  291. set_tests_properties(TestLoad2 PROPERTIES PROCESSORS 2)
  292. ")
  293. run_cmake_command(${name} ${CMAKE_CTEST_COMMAND} -VV -j8 --test-load ${load})
  294. endfunction()
  295. # Tests for the --test-load feature of ctest
  296. #
  297. # Spoof a load average value to make these tests more reliable.
  298. set(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING} 7)
  299. # Verify that new tests are not started when the load average exceeds
  300. # our threshold and that they then run once the load average drops.
  301. run_TestLoad(test-load-wait0 5)
  302. run_TestLoad(test-load-wait1 8)
  303. # Verify that warning message is displayed but tests still start when
  304. # an invalid argument is given.
  305. run_TestLoad(test-load-invalid 'two')
  306. # Verify that new tests are started when the load average falls below
  307. # our threshold.
  308. run_TestLoad(test-load-pass 12)
  309. unset(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING})
  310. function(run_TestOutputSize)
  311. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestOutputSize)
  312. set(RunCMake_TEST_NO_CLEAN 1)
  313. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  314. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  315. file(WRITE "${RunCMake_TEST_BINARY_DIR}/DartConfiguration.tcl" "
  316. BuildDirectory: ${RunCMake_TEST_BINARY_DIR}
  317. ")
  318. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  319. add_test(PassingTest \"${CMAKE_COMMAND}\" -E echo PassingTestOutput)
  320. add_test(FailingTest \"${CMAKE_COMMAND}\" -E no_such_command)
  321. ")
  322. run_cmake_command(TestOutputSize
  323. ${CMAKE_CTEST_COMMAND} -M Experimental -T Test
  324. --no-compress-output
  325. --test-output-size-passed 10
  326. --test-output-size-failed 12
  327. )
  328. endfunction()
  329. run_TestOutputSize()
  330. # Test --test-output-truncation
  331. function(run_TestOutputTruncation mode expected)
  332. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestOutputTruncation_${mode})
  333. set(RunCMake_TEST_NO_CLEAN 1)
  334. set(TRUNCATED_OUTPUT ${expected}) # used in TestOutputTruncation-check.cmake
  335. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  336. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  337. file(WRITE "${RunCMake_TEST_BINARY_DIR}/DartConfiguration.tcl" "
  338. BuildDirectory: ${RunCMake_TEST_BINARY_DIR}
  339. ")
  340. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  341. add_test(Truncation_${mode} \"${CMAKE_COMMAND}\" -E echo 123456789)
  342. ")
  343. run_cmake_command(TestOutputTruncation_${mode}
  344. ${CMAKE_CTEST_COMMAND} -M Experimental -T Test
  345. --no-compress-output
  346. --test-output-size-passed 5
  347. --test-output-truncation ${mode}
  348. )
  349. endfunction()
  350. run_TestOutputTruncation("head" "\\.\\.\\.6789")
  351. run_TestOutputTruncation("middle" "12\\.\\.\\..*\\.\\.\\.89")
  352. run_TestOutputTruncation("tail" "12345\\.\\.\\.")
  353. run_TestOutputTruncation("bad" "")
  354. # Test --stop-on-failure
  355. function(run_stop_on_failure)
  356. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/stop-on-failure)
  357. set(RunCMake_TEST_NO_CLEAN 1)
  358. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  359. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  360. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  361. add_test(test1 \"${CMAKE_COMMAND}\" -E false)
  362. add_test(test2 \"${CMAKE_COMMAND}\" -E echo \"not running\")
  363. ")
  364. run_cmake_command(stop-on-failure ${CMAKE_CTEST_COMMAND} --stop-on-failure)
  365. endfunction()
  366. run_stop_on_failure()
  367. function(run_TestAffinity)
  368. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestAffinity)
  369. set(RunCMake_TEST_NO_CLEAN 1)
  370. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  371. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  372. # Create a test with affinity enabled. The default PROCESSORS
  373. # value is 1, so our expected output checks that this is the
  374. # number of processors in the mask.
  375. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  376. add_test(Affinity \"${TEST_AFFINITY}\")
  377. set_tests_properties(Affinity PROPERTIES PROCESSOR_AFFINITY ON)
  378. ")
  379. # Run ctest with a large parallel level so that the value is
  380. # not responsible for capping the number of processors available.
  381. run_cmake_command(TestAffinity ${CMAKE_CTEST_COMMAND} -V -j 64)
  382. endfunction()
  383. if(TEST_AFFINITY)
  384. run_TestAffinity()
  385. endif()
  386. function(run_TestStdin)
  387. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestStdin)
  388. set(RunCMake_TEST_NO_CLEAN 1)
  389. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  390. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  391. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  392. add_test(TestStdin \"${TEST_PRINT_STDIN}\")
  393. ")
  394. run_cmake_command(TestStdin ${CMAKE_CTEST_COMMAND} -V)
  395. endfunction()
  396. run_TestStdin()
  397. function(show_only_json_check_python v)
  398. if(RunCMake_TEST_FAILED OR NOT Python_EXECUTABLE)
  399. return()
  400. endif()
  401. set(json_file "${RunCMake_TEST_BINARY_DIR}/ctest.json")
  402. file(WRITE "${json_file}" "${actual_stdout}")
  403. set(actual_stdout "" PARENT_SCOPE)
  404. execute_process(
  405. COMMAND ${Python_EXECUTABLE} "${RunCMake_SOURCE_DIR}/show-only_json-v${v}_check.py" "${json_file}"
  406. RESULT_VARIABLE result
  407. OUTPUT_VARIABLE output
  408. ERROR_VARIABLE output
  409. )
  410. if(NOT result EQUAL 0)
  411. string(REPLACE "\n" "\n " output " ${output}")
  412. set(RunCMake_TEST_FAILED "Unexpected output:\n${output}" PARENT_SCOPE)
  413. endif()
  414. endfunction()
  415. function(run_ShowOnly)
  416. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ShowOnly)
  417. set(RunCMake_TEST_NO_CLEAN 1)
  418. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  419. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  420. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  421. add_test(ShowOnly \"${CMAKE_COMMAND}\" -E echo)
  422. set_tests_properties(ShowOnly PROPERTIES
  423. GENERATED_RESOURCE_SPEC_FILE \"/Path/Does/Not/Exist\"
  424. RESOURCE_GROUPS \"2,threads:2,gpus:4;gpus:2,threads:4\"
  425. REQUIRED_FILES RequiredFileDoesNotExist
  426. _BACKTRACE_TRIPLES \"file1;1;add_test;file0;;\"
  427. TIMEOUT 1234.5
  428. TIMEOUT_SIGNAL_NAME SIGINT
  429. TIMEOUT_SIGNAL_GRACE_PERIOD 2.1
  430. WILL_FAIL true
  431. USER_DEFINED_A \"User defined property A value\"
  432. USER_DEFINED_B \"User defined property B value\"
  433. )
  434. add_test(ShowOnlyNotAvailable NOT_AVAILABLE)
  435. ")
  436. run_cmake_command(show-only_human ${CMAKE_CTEST_COMMAND} --show-only=human)
  437. run_cmake_command(show-only_bad ${CMAKE_CTEST_COMMAND} --show-only=bad)
  438. run_cmake_command(show-only_json-v1 ${CMAKE_CTEST_COMMAND} --show-only=json-v1)
  439. endfunction()
  440. run_ShowOnly()
  441. function(run_NoTests)
  442. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/NoTests)
  443. set(RunCMake_TEST_NO_CLEAN 1)
  444. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  445. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  446. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "")
  447. run_cmake_command(no-tests_ignore ${CMAKE_CTEST_COMMAND} --no-tests=ignore)
  448. run_cmake_command(no-tests_error ${CMAKE_CTEST_COMMAND} --no-tests=error)
  449. run_cmake_command(no-tests_bad ${CMAKE_CTEST_COMMAND} --no-tests=bad)
  450. run_cmake_command(no-tests_legacy ${CMAKE_CTEST_COMMAND})
  451. run_cmake_command(no-tests_env_ignore ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=ignore ${CMAKE_CTEST_COMMAND})
  452. run_cmake_command(no-tests_env_error ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=error ${CMAKE_CTEST_COMMAND})
  453. run_cmake_command(no-tests_env_bad ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=bad ${CMAKE_CTEST_COMMAND})
  454. run_cmake_command(no-tests_env_empty_legacy ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION= ${CMAKE_CTEST_COMMAND})
  455. run_cmake_command(no-tests_env_bad_with_cli_error ${CMAKE_COMMAND} -E env CTEST_NO_TESTS_ACTION=bad ${CMAKE_CTEST_COMMAND} --no-tests=error)
  456. file(WRITE "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake" "
  457. set(CTEST_COMMAND \"${CMAKE_CTEST_COMMAND}\")
  458. set(CTEST_SOURCE_DIRECTORY \"${RunCMake_SOURCE_DIR}\")
  459. set(CTEST_BINARY_DIRECTORY \"${RunCMake_TEST_BINARY_DIR}\")
  460. ctest_start(Experimental)
  461. ctest_test()
  462. ")
  463. run_cmake_command(
  464. no-tests-script_ignore ${CMAKE_CTEST_COMMAND} --no-tests=ignore
  465. -S "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake")
  466. run_cmake_command(
  467. no-tests-script_error ${CMAKE_CTEST_COMMAND} --no-tests=error
  468. -S "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake")
  469. run_cmake_command(
  470. no-tests-script_legacy ${CMAKE_CTEST_COMMAND}
  471. -S "${RunCMake_TEST_BINARY_DIR}/NoTestsScript.cmake")
  472. endfunction()
  473. run_NoTests()
  474. # Check the configuration type variable is passed
  475. run_ctest(check-configuration-type)
  476. function(run_FailDrop case)
  477. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FailDrop-${case}-build)
  478. run_cmake_with_options(FailDrop-${case} ${ARGN})
  479. unset(ENV{CMAKE_TLS_VERIFY}) # Test that env variable is saved in ctest config file.
  480. unset(ENV{CMAKE_TLS_VERSION}) # Test that env variable is saved in ctest config file.
  481. set(RunCMake_TEST_NO_CLEAN 1)
  482. run_cmake_command(FailDrop-${case}-ctest
  483. ${CMAKE_CTEST_COMMAND} -M Experimental -T Submit -VV
  484. )
  485. endfunction()
  486. run_FailDrop(TLSVersion-1.1 -DCTEST_TLS_VERSION=1.1)
  487. run_FailDrop(TLSVersion-1.1-cmake -DCMAKE_TLS_VERSION=1.1) # Test fallback to CMake variable.
  488. set(ENV{CMAKE_TLS_VERSION} 1.1) # Test fallback to env variable.
  489. run_FailDrop(TLSVersion-1.1-env)
  490. unset(ENV{CMAKE_TLS_VERSION})
  491. run_FailDrop(TLSVerify-ON -DCTEST_TLS_VERIFY=ON)
  492. run_FailDrop(TLSVerify-ON-cmake -DCMAKE_TLS_VERIFY=ON) # Test fallback to CMake variable.
  493. set(ENV{CMAKE_TLS_VERIFY} 1) # Test fallback to env variable.
  494. run_FailDrop(TLSVerify-ON-env)
  495. unset(ENV{CMAKE_TLS_VERIFY})
  496. run_FailDrop(TLSVerify-OFF -DCTEST_TLS_VERIFY=OFF)
  497. run_FailDrop(TLSVerify-OFF-cmake -DCMAKE_TLS_VERIFY=OFF) # Test fallback to CMake variable.
  498. set(ENV{CMAKE_TLS_VERIFY} 0) # Test fallback to env variable.
  499. run_FailDrop(TLSVerify-OFF-env)
  500. unset(ENV{CMAKE_TLS_VERIFY})
  501. run_cmake_command(EmptyDirTest-ctest
  502. ${CMAKE_CTEST_COMMAND} -C Debug -M Experimental -T Test
  503. )
  504. run_cmake_command(EmptyDirCoverage-ctest
  505. # Isolate this test from any surrounding coverage tool.
  506. ${CMAKE_COMMAND} -E env --unset=COVFILE
  507. ${CMAKE_CTEST_COMMAND} -C Debug -M Experimental -T Coverage
  508. )
  509. function(run_MemCheckSan case opts)
  510. # Use a single build tree for a few tests without cleaning.
  511. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MemCheckSan${case}-build)
  512. set(RunCMake_TEST_OPTIONS
  513. "-DMEMORYCHECK_TYPE=${case}Sanitizer"
  514. "-DMEMORYCHECK_SANITIZER_OPTIONS=${opts}"
  515. )
  516. run_cmake(MemCheckSan)
  517. unset(RunCMake_TEST_OPTIONS)
  518. set(RunCMake_TEST_NO_CLEAN 1)
  519. set(RunCMake-stdout-file "../ctest_memcheck/Dummy${case}Sanitizer-stdout.txt")
  520. run_cmake_command(MemCheckSan${case}-ctest
  521. ${CMAKE_CTEST_COMMAND} -C Debug -M Experimental -T MemCheck -V
  522. )
  523. endfunction()
  524. run_MemCheckSan(Address "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
  525. run_MemCheckSan(Leak "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
  526. run_MemCheckSan(Memory "simulate_sanitizer=1:report_bugs=1:history_size=5:exitcode=55")
  527. run_MemCheckSan(Thread "report_bugs=1:history_size=5:exitcode=55")
  528. run_MemCheckSan(UndefinedBehavior "simulate_sanitizer=1")
  529. run_cmake_command(test-dir-invalid-arg ${CMAKE_CTEST_COMMAND} --test-dir)
  530. run_cmake_command(test-dir-non-existing-dir ${CMAKE_CTEST_COMMAND} --test-dir non-existing-dir)
  531. function(run_testDir testName testPreset)
  532. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/testDir)
  533. set(RunCMake_TEST_NO_CLEAN 1)
  534. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  535. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  536. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}/sub")
  537. file(WRITE "${RunCMake_TEST_BINARY_DIR}/sub/CTestTestfile.cmake" "
  538. add_test(Test1 \"${CMAKE_COMMAND}\" -E true)
  539. add_test(Test2 \"${CMAKE_COMMAND}\" -E true)
  540. ")
  541. if (testPreset)
  542. set(presetCommandLine --preset=default)
  543. configure_file(
  544. ${RunCMake_SOURCE_DIR}/testDir-presets.json.in
  545. ${RunCMake_TEST_BINARY_DIR}/CMakePresets.json)
  546. endif()
  547. run_cmake_command(${testName} ${CMAKE_CTEST_COMMAND} --test-dir "${RunCMake_TEST_BINARY_DIR}/sub" ${presetCommandLine})
  548. endfunction()
  549. run_testDir(testDir 0)
  550. run_testDir(testDir-preset 1)
  551. # Test --output-junit
  552. function(run_output_junit)
  553. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/output-junit)
  554. set(RunCMake_TEST_NO_CLEAN 1)
  555. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  556. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  557. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  558. add_test(test1 \"${CMAKE_COMMAND}\" -E false)
  559. add_test(test2 \"${CMAKE_COMMAND}\" -E echo \"hello world\")
  560. add_test(test3 \"${CMAKE_COMMAND}\" -E true)
  561. set_tests_properties(test3 PROPERTIES DISABLED \"ON\")
  562. add_test(test4 \"${CMAKE_CURRENT_SOURCE_DIR}/does_not_exist\")
  563. add_test(test5 \"${CMAKE_COMMAND}\" -E echo \"please skip\")
  564. set_tests_properties(test5 PROPERTIES SKIP_REGULAR_EXPRESSION \"please skip\")
  565. ")
  566. run_cmake_command(output-junit ${CMAKE_CTEST_COMMAND} --output-junit "${RunCMake_TEST_BINARY_DIR}/junit.xml")
  567. endfunction()
  568. run_output_junit()
  569. run_cmake_command(invalid-ctest-argument ${CMAKE_CTEST_COMMAND} --not-a-valid-ctest-argument)
  570. if(WIN32)
  571. block()
  572. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TimeoutSignalWindows)
  573. set(RunCMake_TEST_NO_CLEAN 1)
  574. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  575. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  576. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  577. add_test(test1 \"${CMAKE_COMMAND}\" -E true)
  578. set_tests_properties(test1 PROPERTIES TIMEOUT_SIGNAL_NAME SIGUSR1)
  579. set_tests_properties(test1 PROPERTIES TIMEOUT_SIGNAL_GRACE_PERIOD 1)
  580. ")
  581. run_cmake_command(TimeoutSignalWindows ${CMAKE_CTEST_COMMAND})
  582. endblock()
  583. else()
  584. block()
  585. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TimeoutSignalBad)
  586. set(RunCMake_TEST_NO_CLEAN 1)
  587. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  588. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  589. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  590. add_test(test1 \"${CMAKE_COMMAND}\" -E true)
  591. set_tests_properties(test1 PROPERTIES TIMEOUT_SIGNAL_NAME NOTASIG)
  592. set_tests_properties(test1 PROPERTIES TIMEOUT_SIGNAL_GRACE_PERIOD 0)
  593. set_tests_properties(test1 PROPERTIES TIMEOUT_SIGNAL_GRACE_PERIOD 1000)
  594. ")
  595. run_cmake_command(TimeoutSignalBad ${CMAKE_CTEST_COMMAND})
  596. endblock()
  597. endif()