GoogleTestAddTests.cmake 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. cmake_minimum_required(VERSION ${CMAKE_VERSION})
  4. # Overwrite possibly existing ${_CTEST_FILE} with empty file
  5. set(flush_tests_MODE WRITE)
  6. # Flushes script to ${_CTEST_FILE}
  7. macro(flush_script)
  8. file(${flush_tests_MODE} "${_CTEST_FILE}" "${script}")
  9. set(flush_tests_MODE APPEND PARENT_SCOPE)
  10. set(script "")
  11. endmacro()
  12. # Flushes tests_buffer to tests
  13. macro(flush_tests_buffer)
  14. list(APPEND tests "${tests_buffer}")
  15. set(tests_buffer "")
  16. endmacro()
  17. function(add_command NAME TEST_NAME)
  18. set(args "")
  19. foreach(arg ${ARGN})
  20. if(arg MATCHES "[^-./:a-zA-Z0-9_]")
  21. string(APPEND args " [==[${arg}]==]")
  22. else()
  23. string(APPEND args " ${arg}")
  24. endif()
  25. endforeach()
  26. string(APPEND script "${NAME}(${TEST_NAME} ${args})\n")
  27. string(LENGTH "${script}" script_len)
  28. if(${script_len} GREATER "50000")
  29. flush_script()
  30. endif()
  31. set(script "${script}" PARENT_SCOPE)
  32. endfunction()
  33. function(generate_testname_guards OUTPUT OPEN_GUARD_VAR CLOSE_GUARD_VAR)
  34. set(open_guard "[=[")
  35. set(close_guard "]=]")
  36. set(counter 1)
  37. while("${OUTPUT}" MATCHES "${close_guard}")
  38. math(EXPR counter "${counter} + 1")
  39. string(REPEAT "=" ${counter} equals)
  40. set(open_guard "[${equals}[")
  41. set(close_guard "]${equals}]")
  42. endwhile()
  43. set(${OPEN_GUARD_VAR} "${open_guard}" PARENT_SCOPE)
  44. set(${CLOSE_GUARD_VAR} "${close_guard}" PARENT_SCOPE)
  45. endfunction()
  46. function(escape_square_brackets OUTPUT BRACKET PLACEHOLDER PLACEHOLDER_VAR OUTPUT_VAR)
  47. if("${OUTPUT}" MATCHES "\\${BRACKET}")
  48. set(placeholder "${PLACEHOLDER}")
  49. while("${OUTPUT}" MATCHES "${placeholder}")
  50. set(placeholder "${placeholder}_")
  51. endwhile()
  52. string(REPLACE "${BRACKET}" "${placeholder}" OUTPUT "${OUTPUT}")
  53. set(${PLACEHOLDER_VAR} "${placeholder}" PARENT_SCOPE)
  54. set(${OUTPUT_VAR} "${OUTPUT}" PARENT_SCOPE)
  55. endif()
  56. endfunction()
  57. function(gtest_discover_tests_impl)
  58. cmake_parse_arguments(
  59. ""
  60. ""
  61. "NO_PRETTY_TYPES;NO_PRETTY_VALUES;TEST_EXECUTABLE;TEST_WORKING_DIR;TEST_PREFIX;TEST_SUFFIX;TEST_LIST;CTEST_FILE;TEST_DISCOVERY_TIMEOUT;TEST_XML_OUTPUT_DIR;TEST_FILTER"
  62. "TEST_EXTRA_ARGS;TEST_PROPERTIES;TEST_EXECUTOR"
  63. ${ARGN}
  64. )
  65. set(prefix "${_TEST_PREFIX}")
  66. set(suffix "${_TEST_SUFFIX}")
  67. set(extra_args ${_TEST_EXTRA_ARGS})
  68. set(properties ${_TEST_PROPERTIES})
  69. set(script)
  70. set(suite)
  71. set(tests)
  72. set(tests_buffer)
  73. if(_TEST_FILTER)
  74. set(filter "--gtest_filter=${_TEST_FILTER}")
  75. else()
  76. set(filter)
  77. endif()
  78. # Run test executable to get list of available tests
  79. if(NOT EXISTS "${_TEST_EXECUTABLE}")
  80. message(FATAL_ERROR
  81. "Specified test executable does not exist.\n"
  82. " Path: '${_TEST_EXECUTABLE}'"
  83. )
  84. endif()
  85. execute_process(
  86. COMMAND ${_TEST_EXECUTOR} "${_TEST_EXECUTABLE}" --gtest_list_tests ${filter}
  87. WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
  88. TIMEOUT ${_TEST_DISCOVERY_TIMEOUT}
  89. OUTPUT_VARIABLE output
  90. RESULT_VARIABLE result
  91. )
  92. if(NOT ${result} EQUAL 0)
  93. string(REPLACE "\n" "\n " output "${output}")
  94. if(_TEST_EXECUTOR)
  95. set(path "${_TEST_EXECUTOR} ${_TEST_EXECUTABLE}")
  96. else()
  97. set(path "${_TEST_EXECUTABLE}")
  98. endif()
  99. message(FATAL_ERROR
  100. "Error running test executable.\n"
  101. " Path: '${path}'\n"
  102. " Result: ${result}\n"
  103. " Output:\n"
  104. " ${output}\n"
  105. )
  106. endif()
  107. generate_testname_guards("${output}" open_guard close_guard)
  108. escape_square_brackets("${output}" "[" "__osb" open_sb output)
  109. escape_square_brackets("${output}" "]" "__csb" close_sb output)
  110. # Preserve semicolon in test-parameters
  111. string(REPLACE [[;]] [[\;]] output "${output}")
  112. string(REPLACE "\n" ";" output "${output}")
  113. # Parse output
  114. foreach(line ${output})
  115. # Skip header
  116. if(NOT line MATCHES "gtest_main\\.cc")
  117. # Do we have a module name or a test name?
  118. if(NOT line MATCHES "^ ")
  119. # Module; remove trailing '.' to get just the name...
  120. string(REGEX REPLACE "\\.( *#.*)?$" "" suite "${line}")
  121. if(line MATCHES "#")
  122. string(REGEX REPLACE "/.*" "" pretty_suite "${line}")
  123. if(NOT _NO_PRETTY_TYPES)
  124. string(REGEX REPLACE ".*/[0-9]+[ .#]+TypeParam = (.*)" "\\1" type_parameter "${line}")
  125. else()
  126. string(REGEX REPLACE ".*/([0-9]+)[ .#]+TypeParam = .*" "\\1" type_parameter "${line}")
  127. endif()
  128. set(test_name_template "@prefix@@pretty_suite@.@pretty_test@<@type_parameter@>@suffix@")
  129. else()
  130. set(pretty_suite "${suite}")
  131. set(test_name_template "@prefix@@pretty_suite@.@pretty_test@@suffix@")
  132. endif()
  133. string(REGEX REPLACE "^DISABLED_" "" pretty_suite "${pretty_suite}")
  134. else()
  135. string(STRIP "${line}" test)
  136. if(test MATCHES "#" AND NOT _NO_PRETTY_VALUES)
  137. string(REGEX REPLACE "/[0-9]+[ #]+GetParam\\(\\) = " "/" pretty_test "${test}")
  138. else()
  139. string(REGEX REPLACE " +#.*" "" pretty_test "${test}")
  140. endif()
  141. string(REGEX REPLACE "^DISABLED_" "" pretty_test "${pretty_test}")
  142. string(REGEX REPLACE " +#.*" "" test "${test}")
  143. if(NOT "${_TEST_XML_OUTPUT_DIR}" STREQUAL "")
  144. set(TEST_XML_OUTPUT_PARAM "--gtest_output=xml:${_TEST_XML_OUTPUT_DIR}/${prefix}${suite}.${test}${suffix}.xml")
  145. else()
  146. unset(TEST_XML_OUTPUT_PARAM)
  147. endif()
  148. string(CONFIGURE "${test_name_template}" testname)
  149. # unescape []
  150. if(open_sb)
  151. string(REPLACE "${open_sb}" "[" testname "${testname}")
  152. endif()
  153. if(close_sb)
  154. string(REPLACE "${close_sb}" "]" testname "${testname}")
  155. endif()
  156. set(guarded_testname "${open_guard}${testname}${close_guard}")
  157. # add to script
  158. add_command(add_test
  159. "${guarded_testname}"
  160. ${_TEST_EXECUTOR}
  161. "${_TEST_EXECUTABLE}"
  162. "--gtest_filter=${suite}.${test}"
  163. "--gtest_also_run_disabled_tests"
  164. ${TEST_XML_OUTPUT_PARAM}
  165. ${extra_args}
  166. )
  167. if(suite MATCHES "^DISABLED_" OR test MATCHES "^DISABLED_")
  168. add_command(set_tests_properties
  169. "${guarded_testname}"
  170. PROPERTIES DISABLED TRUE
  171. )
  172. endif()
  173. add_command(set_tests_properties
  174. "${guarded_testname}"
  175. PROPERTIES
  176. WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
  177. SKIP_REGULAR_EXPRESSION "\\[ SKIPPED \\]"
  178. ${properties}
  179. )
  180. # possibly unbalanced square brackets render lists invalid so skip such tests in ${_TEST_LIST}
  181. if(NOT "${testname}" MATCHES [=[(\[|\])]=])
  182. # escape ;
  183. string(REPLACE [[;]] [[\\;]] testname "${testname}")
  184. list(APPEND tests_buffer "${testname}")
  185. list(LENGTH tests_buffer tests_buffer_length)
  186. if(${tests_buffer_length} GREATER "250")
  187. flush_tests_buffer()
  188. endif()
  189. endif()
  190. endif()
  191. endif()
  192. endforeach()
  193. # Create a list of all discovered tests, which users may use to e.g. set
  194. # properties on the tests
  195. flush_tests_buffer()
  196. add_command(set "" ${_TEST_LIST} "${tests}")
  197. # Write CTest script
  198. flush_script()
  199. endfunction()
  200. if(CMAKE_SCRIPT_MODE_FILE)
  201. gtest_discover_tests_impl(
  202. NO_PRETTY_TYPES ${NO_PRETTY_TYPES}
  203. NO_PRETTY_VALUES ${NO_PRETTY_VALUES}
  204. TEST_EXECUTABLE ${TEST_EXECUTABLE}
  205. TEST_EXECUTOR ${TEST_EXECUTOR}
  206. TEST_WORKING_DIR ${TEST_WORKING_DIR}
  207. TEST_PREFIX ${TEST_PREFIX}
  208. TEST_SUFFIX ${TEST_SUFFIX}
  209. TEST_FILTER ${TEST_FILTER}
  210. TEST_LIST ${TEST_LIST}
  211. CTEST_FILE ${CTEST_FILE}
  212. TEST_DISCOVERY_TIMEOUT ${TEST_DISCOVERY_TIMEOUT}
  213. TEST_XML_OUTPUT_DIR ${TEST_XML_OUTPUT_DIR}
  214. TEST_EXTRA_ARGS ${TEST_EXTRA_ARGS}
  215. TEST_PROPERTIES ${TEST_PROPERTIES}
  216. )
  217. endif()