RunCMakeTest.cmake 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. include(RunCMake)
  2. set(RunCMake_TEST_TIMEOUT 60)
  3. unset(ENV{CTEST_PARALLEL_LEVEL})
  4. unset(ENV{CTEST_OUTPUT_ON_FAILURE})
  5. run_cmake_command(repeat-until-pass-bad1
  6. ${CMAKE_CTEST_COMMAND} --repeat-until-pass
  7. )
  8. run_cmake_command(repeat-until-pass-bad2
  9. ${CMAKE_CTEST_COMMAND} --repeat-until-pass foo
  10. )
  11. run_cmake_command(repeat-until-pass-good
  12. ${CMAKE_CTEST_COMMAND} --repeat-until-pass 2
  13. )
  14. run_cmake_command(repeat-until-fail-bad1
  15. ${CMAKE_CTEST_COMMAND} --repeat-until-fail
  16. )
  17. run_cmake_command(repeat-until-fail-bad2
  18. ${CMAKE_CTEST_COMMAND} --repeat-until-fail foo
  19. )
  20. run_cmake_command(repeat-until-fail-good
  21. ${CMAKE_CTEST_COMMAND} --repeat-until-fail 2
  22. )
  23. run_cmake_command(repeat-until-pass-and-fail
  24. ${CMAKE_CTEST_COMMAND} --repeat-until-pass 2 --repeat-until-fail 2
  25. )
  26. run_cmake_command(repeat-until-fail-and-pass
  27. ${CMAKE_CTEST_COMMAND} --repeat-until-fail 2 --repeat-until-pass 2
  28. )
  29. function(run_repeat_until_pass_tests)
  30. # Use a single build tree for a few tests without cleaning.
  31. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/repeat-until-pass-build)
  32. run_cmake(repeat-until-pass-cmake)
  33. set(RunCMake_TEST_NO_CLEAN 1)
  34. run_cmake_command(repeat-until-pass-ctest
  35. ${CMAKE_CTEST_COMMAND} -C Debug --repeat-until-pass 3
  36. )
  37. endfunction()
  38. run_repeat_until_pass_tests()
  39. function(run_repeat_until_fail_tests)
  40. # Use a single build tree for a few tests without cleaning.
  41. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/repeat-until-fail-build)
  42. run_cmake(repeat-until-fail-cmake)
  43. set(RunCMake_TEST_NO_CLEAN 1)
  44. run_cmake_command(repeat-until-fail-ctest
  45. ${CMAKE_CTEST_COMMAND} -C Debug --repeat-until-fail 3
  46. )
  47. endfunction()
  48. run_repeat_until_fail_tests()
  49. function(run_BadCTestTestfile)
  50. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/BadCTestTestfile)
  51. set(RunCMake_TEST_NO_CLEAN 1)
  52. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  53. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  54. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  55. subdirs()
  56. ")
  57. run_cmake_command(BadCTestTestfile ${CMAKE_CTEST_COMMAND})
  58. endfunction()
  59. run_BadCTestTestfile()
  60. function(run_MergeOutput)
  61. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MergeOutput)
  62. set(RunCMake_TEST_NO_CLEAN 1)
  63. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  64. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  65. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  66. add_test(MergeOutput \"${CMAKE_COMMAND}\" -P \"${RunCMake_SOURCE_DIR}/MergeOutput.cmake\")
  67. ")
  68. run_cmake_command(MergeOutput ${CMAKE_CTEST_COMMAND} -V)
  69. endfunction()
  70. run_MergeOutput()
  71. function(run_LabelCount)
  72. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LabelCount)
  73. set(RunCMake_TEST_NO_CLEAN 1)
  74. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  75. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  76. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  77. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  78. set_tests_properties(test1 PROPERTIES LABELS 'bar')
  79. add_test(test2 \"${CMAKE_COMMAND}\" -E echo \"test2\")
  80. set_tests_properties(test2 PROPERTIES LABELS 'bar')
  81. add_test(test3 \"${CMAKE_COMMAND}\" -E echo \"test3\")
  82. set_tests_properties(test3 PROPERTIES LABELS 'foo')
  83. add_test(test4 \"${CMAKE_COMMAND}\" -E echo \"test4\")
  84. set_tests_properties(test4 PROPERTIES LABELS 'bar')
  85. ")
  86. run_cmake_command(LabelCount ${CMAKE_CTEST_COMMAND} -V)
  87. endfunction()
  88. run_LabelCount()
  89. function(run_RequiredRegexFoundTest)
  90. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/RequiredRegexFound)
  91. set(RunCMake_TEST_NO_CLEAN 1)
  92. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  93. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  94. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  95. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  96. set_tests_properties(test1 PROPERTIES PASS_REGULAR_EXPRESSION \"foo;test1;bar\")
  97. ")
  98. run_cmake_command(RequiredRegexFound ${CMAKE_CTEST_COMMAND} -V)
  99. endfunction()
  100. run_RequiredRegexFoundTest()
  101. function(run_RequiredRegexNotFoundTest)
  102. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/RequiredRegexNotFound)
  103. set(RunCMake_TEST_NO_CLEAN 1)
  104. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  105. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  106. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  107. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  108. set_tests_properties(test1 PROPERTIES PASS_REGULAR_EXPRESSION \"foo;toast1;bar\" WILL_FAIL True)
  109. ")
  110. run_cmake_command(RequiredRegexNotFound ${CMAKE_CTEST_COMMAND} -V)
  111. endfunction()
  112. run_RequiredRegexNotFoundTest()
  113. function(run_FailRegexFoundTest)
  114. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/FailRegexFound)
  115. set(RunCMake_TEST_NO_CLEAN 1)
  116. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  117. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  118. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  119. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  120. set_tests_properties(test1 PROPERTIES FAIL_REGULAR_EXPRESSION \"foo;test1;bar\" WILL_FAIL True)
  121. ")
  122. run_cmake_command(FailRegexFound ${CMAKE_CTEST_COMMAND} -V)
  123. endfunction()
  124. run_FailRegexFoundTest()
  125. function(run_SkipRegexFoundTest)
  126. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SkipRegexFound)
  127. set(RunCMake_TEST_NO_CLEAN 1)
  128. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  129. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  130. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  131. add_test(test1 \"${CMAKE_COMMAND}\" -E echo \"test1\")
  132. set_tests_properties(test1 PROPERTIES SKIP_REGULAR_EXPRESSION \"test1\")
  133. ")
  134. run_cmake_command(SkipRegexFound ${CMAKE_CTEST_COMMAND} -V)
  135. endfunction()
  136. run_SkipRegexFoundTest()
  137. function(run_SerialFailed)
  138. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SerialFailed)
  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(NoSuchCommand no_such_command)
  144. set_tests_properties(NoSuchCommand PROPERTIES RUN_SERIAL ON)
  145. add_test(Echo \"${CMAKE_COMMAND}\" -E echo \"EchoTest\")
  146. ")
  147. run_cmake_command(SerialFailed ${CMAKE_CTEST_COMMAND} -V)
  148. endfunction()
  149. run_SerialFailed()
  150. function(run_TestLoad name load)
  151. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestLoad)
  152. set(RunCMake_TEST_NO_CLEAN 1)
  153. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  154. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  155. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  156. add_test(TestLoad1 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  157. add_test(TestLoad2 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  158. ")
  159. run_cmake_command(${name} ${CMAKE_CTEST_COMMAND} -j2 --test-load ${load})
  160. endfunction()
  161. # Tests for the --test-load feature of ctest
  162. #
  163. # Spoof a load average value to make these tests more reliable.
  164. set(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING} 5)
  165. # Verify that new tests are not started when the load average exceeds
  166. # our threshold and that they then run once the load average drops.
  167. run_TestLoad(test-load-wait 3)
  168. # Verify that warning message is displayed but tests still start when
  169. # an invalid argument is given.
  170. run_TestLoad(test-load-invalid 'two')
  171. # Verify that new tests are started when the load average falls below
  172. # our threshold.
  173. run_TestLoad(test-load-pass 10)
  174. unset(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING})
  175. function(run_TestOutputSize)
  176. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestOutputSize)
  177. set(RunCMake_TEST_NO_CLEAN 1)
  178. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  179. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  180. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  181. add_test(PassingTest \"${CMAKE_COMMAND}\" -E echo PassingTestOutput)
  182. add_test(FailingTest \"${CMAKE_COMMAND}\" -E no_such_command)
  183. ")
  184. run_cmake_command(TestOutputSize
  185. ${CMAKE_CTEST_COMMAND} -M Experimental -T Test
  186. --no-compress-output
  187. --test-output-size-passed 10
  188. --test-output-size-failed 12
  189. )
  190. endfunction()
  191. run_TestOutputSize()
  192. function(run_TestAffinity)
  193. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestAffinity)
  194. set(RunCMake_TEST_NO_CLEAN 1)
  195. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  196. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  197. # Create a test with affinity enabled. The default PROCESSORS
  198. # value is 1, so our expected output checks that this is the
  199. # number of processors in the mask.
  200. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  201. add_test(Affinity \"${TEST_AFFINITY}\")
  202. set_tests_properties(Affinity PROPERTIES PROCESSOR_AFFINITY ON)
  203. ")
  204. # Run ctest with a large parallel level so that the value is
  205. # not responsible for capping the number of processors available.
  206. run_cmake_command(TestAffinity ${CMAKE_CTEST_COMMAND} -V -j 64)
  207. endfunction()
  208. if(TEST_AFFINITY)
  209. run_TestAffinity()
  210. endif()
  211. function(run_TestStdin)
  212. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestStdin)
  213. set(RunCMake_TEST_NO_CLEAN 1)
  214. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  215. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  216. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  217. add_test(TestStdin \"${TEST_PRINT_STDIN}\")
  218. ")
  219. run_cmake_command(TestStdin ${CMAKE_CTEST_COMMAND} -V)
  220. endfunction()
  221. run_TestStdin()
  222. function(show_only_json_check_python v)
  223. if(RunCMake_TEST_FAILED OR NOT PYTHON_EXECUTABLE)
  224. return()
  225. endif()
  226. set(json_file "${RunCMake_TEST_BINARY_DIR}/ctest.json")
  227. file(WRITE "${json_file}" "${actual_stdout}")
  228. set(actual_stdout "" PARENT_SCOPE)
  229. execute_process(
  230. COMMAND ${PYTHON_EXECUTABLE} "${RunCMake_SOURCE_DIR}/show-only_json-v${v}_check.py" "${json_file}"
  231. RESULT_VARIABLE result
  232. OUTPUT_VARIABLE output
  233. ERROR_VARIABLE output
  234. )
  235. if(NOT result EQUAL 0)
  236. string(REPLACE "\n" "\n " output " ${output}")
  237. set(RunCMake_TEST_FAILED "Unexpected output:\n${output}" PARENT_SCOPE)
  238. endif()
  239. endfunction()
  240. function(run_ShowOnly)
  241. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ShowOnly)
  242. set(RunCMake_TEST_NO_CLEAN 1)
  243. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  244. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  245. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  246. add_test(ShowOnly \"${CMAKE_COMMAND}\" -E echo)
  247. set_tests_properties(ShowOnly PROPERTIES
  248. WILL_FAIL true
  249. PROCESSES \"2,threads:2,gpus:4;gpus:2,threads:4\"
  250. REQUIRED_FILES RequiredFileDoesNotExist
  251. _BACKTRACE_TRIPLES \"file1;1;add_test;file0;;\"
  252. )
  253. add_test(ShowOnlyNotAvailable NOT_AVAILABLE)
  254. ")
  255. run_cmake_command(show-only_human ${CMAKE_CTEST_COMMAND} --show-only=human)
  256. run_cmake_command(show-only_bad ${CMAKE_CTEST_COMMAND} --show-only=bad)
  257. run_cmake_command(show-only_json-v1 ${CMAKE_CTEST_COMMAND} --show-only=json-v1)
  258. endfunction()
  259. run_ShowOnly()