RunCMakeTest.cmake 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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_SerialFailed)
  103. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/SerialFailed)
  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(NoSuchCommand no_such_command)
  109. set_tests_properties(NoSuchCommand PROPERTIES RUN_SERIAL ON)
  110. add_test(Echo \"${CMAKE_COMMAND}\" -E echo \"EchoTest\")
  111. ")
  112. run_cmake_command(SerialFailed ${CMAKE_CTEST_COMMAND} -V)
  113. endfunction()
  114. run_SerialFailed()
  115. function(run_TestLoad name load)
  116. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestLoad)
  117. set(RunCMake_TEST_NO_CLEAN 1)
  118. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  119. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  120. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  121. add_test(TestLoad1 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  122. add_test(TestLoad2 \"${CMAKE_COMMAND}\" -E echo \"test of --test-load\")
  123. ")
  124. run_cmake_command(${name} ${CMAKE_CTEST_COMMAND} -j2 --test-load ${load})
  125. endfunction()
  126. # Tests for the --test-load feature of ctest
  127. #
  128. # Spoof a load average value to make these tests more reliable.
  129. set(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING} 5)
  130. # Verify that new tests are not started when the load average exceeds
  131. # our threshold and that they then run once the load average drops.
  132. run_TestLoad(test-load-wait 3)
  133. # Verify that warning message is displayed but tests still start when
  134. # an invalid argument is given.
  135. run_TestLoad(test-load-invalid 'two')
  136. # Verify that new tests are started when the load average falls below
  137. # our threshold.
  138. run_TestLoad(test-load-pass 10)
  139. unset(ENV{__CTEST_FAKE_LOAD_AVERAGE_FOR_TESTING})
  140. function(run_TestOutputSize)
  141. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestOutputSize)
  142. set(RunCMake_TEST_NO_CLEAN 1)
  143. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  144. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  145. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  146. add_test(PassingTest \"${CMAKE_COMMAND}\" -E echo PassingTestOutput)
  147. add_test(FailingTest \"${CMAKE_COMMAND}\" -E no_such_command)
  148. ")
  149. run_cmake_command(TestOutputSize
  150. ${CMAKE_CTEST_COMMAND} -M Experimental -T Test
  151. --no-compress-output
  152. --test-output-size-passed 10
  153. --test-output-size-failed 12
  154. )
  155. endfunction()
  156. run_TestOutputSize()
  157. function(run_TestAffinity)
  158. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestAffinity)
  159. set(RunCMake_TEST_NO_CLEAN 1)
  160. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  161. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  162. # Create a test with affinity enabled. The default PROCESSORS
  163. # value is 1, so our expected output checks that this is the
  164. # number of processors in the mask.
  165. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  166. add_test(Affinity \"${TEST_AFFINITY}\")
  167. set_tests_properties(Affinity PROPERTIES PROCESSOR_AFFINITY ON)
  168. ")
  169. # Run ctest with a large parallel level so that the value is
  170. # not responsible for capping the number of processors available.
  171. run_cmake_command(TestAffinity ${CMAKE_CTEST_COMMAND} -V -j 64)
  172. endfunction()
  173. if(TEST_AFFINITY)
  174. run_TestAffinity()
  175. endif()
  176. function(run_TestStdin)
  177. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestStdin)
  178. set(RunCMake_TEST_NO_CLEAN 1)
  179. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  180. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  181. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  182. add_test(TestStdin \"${TEST_PRINT_STDIN}\")
  183. ")
  184. run_cmake_command(TestStdin ${CMAKE_CTEST_COMMAND} -V)
  185. endfunction()
  186. run_TestStdin()
  187. function(show_only_json_check_python v)
  188. if(RunCMake_TEST_FAILED OR NOT PYTHON_EXECUTABLE)
  189. return()
  190. endif()
  191. set(json_file "${RunCMake_TEST_BINARY_DIR}/ctest.json")
  192. file(WRITE "${json_file}" "${actual_stdout}")
  193. set(actual_stdout "" PARENT_SCOPE)
  194. execute_process(
  195. COMMAND ${PYTHON_EXECUTABLE} "${RunCMake_SOURCE_DIR}/show-only_json-v${v}_check.py" "${json_file}"
  196. RESULT_VARIABLE result
  197. OUTPUT_VARIABLE output
  198. ERROR_VARIABLE output
  199. )
  200. if(NOT result EQUAL 0)
  201. string(REPLACE "\n" "\n " output " ${output}")
  202. set(RunCMake_TEST_FAILED "Unexpected output:\n${output}" PARENT_SCOPE)
  203. endif()
  204. endfunction()
  205. function(run_ShowOnly)
  206. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/ShowOnly)
  207. set(RunCMake_TEST_NO_CLEAN 1)
  208. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  209. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  210. file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
  211. add_test(ShowOnly \"${CMAKE_COMMAND}\" -E echo)
  212. set_tests_properties(ShowOnly PROPERTIES WILL_FAIL true _BACKTRACE_TRIPLES \"file1;1;add_test;file0;;\")
  213. add_test(ShowOnlyNotAvailable NOT_AVAILABLE)
  214. ")
  215. run_cmake_command(show-only_human ${CMAKE_CTEST_COMMAND} --show-only=human)
  216. run_cmake_command(show-only_bad ${CMAKE_CTEST_COMMAND} --show-only=bad)
  217. run_cmake_command(show-only_json-v1 ${CMAKE_CTEST_COMMAND} --show-only=json-v1)
  218. endfunction()
  219. run_ShowOnly()