RunCMakeTest.cmake 9.9 KB

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