RunCMakeTest.cmake 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. include(RunCTest)
  2. # 1. Specify subprojects in the CTest script
  3. function(run_CTestScriptVariable)
  4. set(CTEST_EXTRA_CONFIG "set(CTEST_USE_LAUNCHERS 1)")
  5. set(CASE_TEST_PREFIX_CODE [[
  6. file(COPY "${CTEST_RUNCMAKE_SOURCE_DIRECTORY}/MyProductionCode"
  7. DESTINATION ${CTEST_SOURCE_DIRECTORY})
  8. file(COPY "${CTEST_RUNCMAKE_SOURCE_DIRECTORY}/MyExperimentalFeature"
  9. DESTINATION ${CTEST_SOURCE_DIRECTORY})
  10. set(CTEST_LABELS_FOR_SUBPROJECTS "MyProductionCode;MyExperimentalFeature")
  11. ]])
  12. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  13. add_subdirectory(MyExperimentalFeature)
  14. add_subdirectory(MyProductionCode)
  15. ]])
  16. run_ctest(CTestScriptVariable)
  17. unset(CTEST_EXTRA_CONFIG)
  18. unset(CASE_TEST_PREFIX_CODE)
  19. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  20. endfunction()
  21. run_CTestScriptVariable()
  22. # 2. Specify subprojects via a CTest script variable on the command line e.g.
  23. # ctest -S test.cmake -DCTEST_LABELS_FOR_SUBPROJECTS:STRING="MySubproject"
  24. # Note: This test includes a failing build
  25. # Note: Also use --instrumentation mode to ensure it doesn't interfere with label generation
  26. function(run_CTestScriptVariableCommandLine USE_INSTRUMENTATION)
  27. set(CTEST_EXTRA_CONFIG "set(CTEST_USE_LAUNCHERS 1)")
  28. set(CASE_TEST_PREFIX_CODE [[
  29. file(COPY "${CTEST_RUNCMAKE_SOURCE_DIRECTORY}/MyThirdPartyDependency"
  30. DESTINATION ${CTEST_SOURCE_DIRECTORY})
  31. ]])
  32. if(USE_INSTRUMENTATION)
  33. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  34. add_subdirectory(MyThirdPartyDependency)
  35. set(CMAKE_EXPERIMENTAL_INSTRUMENTATION "2555e60c-9119-46fb-af73-8c54e9b6b326")
  36. cmake_instrumentation(DATA_VERSION 1 API_VERSION 1)
  37. ]])
  38. set(RunCMake-check-file CTestScriptVariableCommandLine-check.cmake)
  39. run_ctest(CTestScriptVariableCommandLineWithInstrumentation
  40. "-DCTEST_LABELS_FOR_SUBPROJECTS:STRING=MyThirdPartyDependency")
  41. unset(RunCMake-check-file)
  42. else()
  43. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  44. add_subdirectory(MyThirdPartyDependency)
  45. ]])
  46. run_ctest(CTestScriptVariableCommandLine
  47. "-DCTEST_LABELS_FOR_SUBPROJECTS:STRING=MyThirdPartyDependency")
  48. endif()
  49. unset(CTEST_EXTRA_CONFIG)
  50. unset(CASE_TEST_PREFIX_CODE)
  51. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  52. endfunction()
  53. run_CTestScriptVariableCommandLine(ON)
  54. run_CTestScriptVariableCommandLine(OFF)
  55. # 3. Set subprojects via a CTest module variable on the command line
  56. # (will populate DartConfiguration.tcl)
  57. function(run_ModuleVariableCommandLine)
  58. set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/ModuleVariableCommandLine")
  59. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ModuleVariableCommandLine-build")
  60. set(RunCMake_TEST_NO_CLEAN 1)
  61. file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}")
  62. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  63. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  64. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  65. set(someFile "${CMAKE_CURRENT_SOURCE_DIR}/test.cmake")
  66. add_test(NAME SuccessfulTest COMMAND "${CMAKE_COMMAND}" --version)
  67. set_property(TEST SuccessfulTest PROPERTY LABELS MySubproject)
  68. add_test(NAME FailingTest
  69. COMMAND ${CMAKE_COMMAND} -E compare_files "${someFile}" "${someFile}xxx")
  70. set_property(TEST FailingTest PROPERTY LABELS MySubproject)
  71. ]])
  72. configure_file(${RunCMake_SOURCE_DIR}/CMakeLists.txt.in
  73. ${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt @ONLY)
  74. set(RunCMake_TEST_OPTIONS "-DCTEST_LABELS_FOR_SUBPROJECTS:STRING=MySubproject")
  75. run_cmake(ModuleVariableCommandLine-cmake)
  76. unset(RunCMake_TEST_OPTIONS)
  77. run_cmake_command(ModuleVariableCommandLine ${CMAKE_CTEST_COMMAND} -C Debug -V)
  78. unset(RunCMake_TEST_SOURCE_DIR)
  79. unset(RunCMake_TEST_BINARY_DIR)
  80. unset(RunCMake_TEST_NO_CLEAN)
  81. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  82. endfunction()
  83. run_ModuleVariableCommandLine()
  84. # 4. Set subprojects via a CTest module variable in CMakeLists.txt
  85. # (will populate DartConfiguration.tcl)
  86. function(run_ModuleVariableCMakeLists)
  87. set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/ModuleVariableCMakeLists")
  88. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/ModuleVariableCMakeLists-build")
  89. set(RunCMake_TEST_NO_CLEAN 1)
  90. file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}")
  91. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  92. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  93. set(CASE_CMAKELISTS_PREFIX_CODE [[
  94. set(CTEST_LABELS_FOR_SUBPROJECTS MySubproject)
  95. ]])
  96. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  97. set(someFile "${CMAKE_CURRENT_SOURCE_DIR}/test.cmake")
  98. add_test(NAME SuccessfulTest COMMAND "${CMAKE_COMMAND}" --version)
  99. set_property(TEST SuccessfulTest PROPERTY LABELS MySubproject)
  100. add_test(NAME FailingTest
  101. COMMAND ${CMAKE_COMMAND} -E compare_files "${someFile}" "${someFile}xxx")
  102. set_property(TEST FailingTest PROPERTY LABELS MySubproject)
  103. ]])
  104. configure_file(${RunCMake_SOURCE_DIR}/CMakeLists.txt.in
  105. ${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt @ONLY)
  106. run_cmake(ModuleVariableCMakeLists-cmake)
  107. run_cmake_command(ModuleVariableCMakeLists ${CMAKE_CTEST_COMMAND} -C Debug -V)
  108. unset(RunCMake_TEST_SOURCE_DIR)
  109. unset(RunCMake_TEST_BINARY_DIR)
  110. unset(RunCMake_TEST_NO_CLEAN)
  111. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  112. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  113. endfunction()
  114. run_ModuleVariableCMakeLists()
  115. # The remaining tests set subprojects in CTestConfig.cmake. Settings in this
  116. # config file are shared by both the CTest module and the ctest command line
  117. # `Dashboard Client` mode (e.g. ctest -S).
  118. function(run_ModuleVariableCTestConfig CASE_NAME)
  119. set(RunCMake_TEST_SOURCE_DIR "${RunCMake_BINARY_DIR}/${CASE_NAME}")
  120. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${CASE_NAME}-build")
  121. set(RunCMake_TEST_NO_CLEAN 1)
  122. file(REMOVE_RECURSE "${RunCMake_TEST_SOURCE_DIR}")
  123. file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
  124. file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
  125. set(CTEST_EXTRA_CONFIG "set(CTEST_LABELS_FOR_SUBPROJECTS \"MySubproject\")")
  126. configure_file(${RunCMake_SOURCE_DIR}/CTestConfig.cmake.in
  127. ${RunCMake_TEST_SOURCE_DIR}/CTestConfig.cmake @ONLY)
  128. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  129. set(someFile "${CMAKE_CURRENT_SOURCE_DIR}/test.cmake")
  130. add_test(NAME SuccessfulTest COMMAND "${CMAKE_COMMAND}" --version)
  131. set_property(TEST SuccessfulTest PROPERTY LABELS MySubproject)
  132. add_test(NAME FailingTest
  133. COMMAND ${CMAKE_COMMAND} -E compare_files "${someFile}" "${someFile}xxx")
  134. set_property(TEST FailingTest PROPERTY LABELS MySubproject)
  135. add_test(NAME AnotherSuccessfulTest COMMAND "${CMAKE_COMMAND}" --version)
  136. set_property(TEST AnotherSuccessfulTest PROPERTY LABELS NotASubproject)
  137. ]])
  138. configure_file(${RunCMake_SOURCE_DIR}/CMakeLists.txt.in
  139. ${RunCMake_TEST_SOURCE_DIR}/CMakeLists.txt @ONLY)
  140. run_cmake(${CASE_NAME}-cmake)
  141. run_cmake_command(${CASE_NAME} ${CMAKE_CTEST_COMMAND} -C Debug -V ${ARGN})
  142. unset(RunCMake_TEST_SOURCE_DIR)
  143. unset(RunCMake_TEST_BINARY_DIR)
  144. unset(RunCMake_TEST_NO_CLEAN)
  145. unset(CTEST_EXTRA_CONFIG)
  146. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  147. endfunction()
  148. # 5. Check that the Subproject timing Summary is printed
  149. run_ModuleVariableCTestConfig(ModuleVariableCTestConfig)
  150. # 6. Use --no-subproject-summary to disable the Subproject timing summary.
  151. run_ModuleVariableCTestConfig(ModuleVariableCTestConfigNoSummary --no-subproject-summary)
  152. # 7. Verify that subprojects are sent to CDash when running a CTest script
  153. function(run_CTestConfigCTestScript)
  154. set(CTEST_EXTRA_CONFIG [[
  155. set(CTEST_USE_LAUNCHERS 1)
  156. set(CTEST_LABELS_FOR_SUBPROJECTS "MyProductionCode;MyExperimentalFeature")
  157. ]])
  158. set(CASE_TEST_PREFIX_CODE [[
  159. file(COPY "${CTEST_RUNCMAKE_SOURCE_DIRECTORY}/MyProductionCode"
  160. DESTINATION ${CTEST_SOURCE_DIRECTORY})
  161. file(COPY "${CTEST_RUNCMAKE_SOURCE_DIRECTORY}/MyExperimentalFeature"
  162. DESTINATION ${CTEST_SOURCE_DIRECTORY})
  163. ]])
  164. set(CASE_CMAKELISTS_SUFFIX_CODE [[
  165. add_subdirectory(MyExperimentalFeature)
  166. add_subdirectory(MyProductionCode)
  167. ]])
  168. run_ctest(CTestConfigCTestScript)
  169. unset(CTEST_EXTRA_CONFIG)
  170. unset(CASE_TEST_PREFIX_CODE)
  171. unset(CASE_CMAKELISTS_SUFFIX_CODE)
  172. endfunction()
  173. run_CTestConfigCTestScript()