Browse Source

GoogleTest: Fix multiple discovery on same target

According to the documentation, tests can be discovered for a target
multiple times by using a different prefix and/or suffix to ensure name
uniqueness. However, while this worked for gtest_add_tests, it did not
work with gtest_discover_tests because the generated file that sets up
the tests was named based only on the target name, and so subsequent
discovery from the same target would clobber earlier discovery.

Fix this by introducing a counter that records how many times discovery
has been used on a target, and use this to generate unique names of the
generated test list files.
Matthew Woehlke 8 years ago
parent
commit
70f9f62da8

+ 25 - 2
Modules/GoogleTest.cmake

@@ -361,9 +361,32 @@ function(gtest_discover_tests TARGET)
     set(_TEST_LIST ${TARGET}_TESTS)
     set(_TEST_LIST ${TARGET}_TESTS)
   endif()
   endif()
 
 
+  get_property(
+    has_counter
+    TARGET ${TARGET}
+    PROPERTY CTEST_DISCOVERED_TEST_COUNTER
+    SET
+  )
+  if(has_counter)
+    get_property(
+      counter
+      TARGET ${TARGET}
+      PROPERTY CTEST_DISCOVERED_TEST_COUNTER
+    )
+    math(EXPR counter "${counter} + 1")
+  else()
+    set(counter 1)
+  endif()
+  set_property(
+    TARGET ${TARGET}
+    PROPERTY CTEST_DISCOVERED_TEST_COUNTER
+    ${counter}
+  )
+
   # Define rule to generate test list for aforementioned test executable
   # Define rule to generate test list for aforementioned test executable
-  set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include.cmake")
-  set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests.cmake")
+  set(ctest_file_base "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}[${counter}]")
+  set(ctest_include_file "${ctest_file_base}_include.cmake")
+  set(ctest_tests_file "${ctest_file_base}_tests.cmake")
   get_property(crosscompiling_emulator
   get_property(crosscompiling_emulator
     TARGET ${TARGET}
     TARGET ${TARGET}
     PROPERTY CROSSCOMPILING_EMULATOR
     PROPERTY CROSSCOMPILING_EMULATOR

+ 0 - 0
Tests/RunCMake/GoogleTest/GoogleTest-test-stdout.txt → Tests/RunCMake/GoogleTest/GoogleTest-test1-stdout.txt


+ 25 - 0
Tests/RunCMake/GoogleTest/GoogleTest-test2-stdout.txt

@@ -0,0 +1,25 @@
+Test project .*
+    Start  9: TEST:basic\.case_foo!2
+1/8 Test  #9: TEST:basic\.case_foo!2 \.+ +Passed +[0-9.]+ sec
+    Start 10: TEST:basic\.case_bar!2
+2/8 Test #10: TEST:basic\.case_bar!2 \.+ +Passed +[0-9.]+ sec
+    Start 11: TEST:basic\.disabled_case!2
+3/8 Test #11: TEST:basic\.disabled_case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+    Start 12: TEST:disabled\.case!2
+4/8 Test #12: TEST:disabled\.case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
+    Start 13: TEST:typed/short\.case!2
+5/8 Test #13: TEST:typed/short\.case!2 \.+ +Passed +[0-9.]+ sec
+    Start 14: TEST:typed/float\.case!2
+6/8 Test #14: TEST:typed/float\.case!2 \.+ +Passed +[0-9.]+ sec
+    Start 15: TEST:value/test\.case/1!2
+7/8 Test #15: TEST:value/test\.case/1!2 \.+ +Passed +[0-9.]+ sec
+    Start 16: TEST:value/test\.case/"foo"!2
+8/8 Test #16: TEST:value/test\.case/"foo"!2 \.+ +Passed +[0-9.]+ sec
+
+100% tests passed, 0 tests failed out of 6
+
+Total Test time \(real\) = +[0-9.]+ sec
+
+The following tests did not run:
+.*11 - TEST:basic\.disabled_case!2 \(Disabled\)
+.*12 - TEST:disabled\.case!2 \(Disabled\)

+ 9 - 1
Tests/RunCMake/GoogleTest/GoogleTest.cmake

@@ -11,5 +11,13 @@ gtest_discover_tests(
   TEST_PREFIX TEST:
   TEST_PREFIX TEST:
   TEST_SUFFIX !1
   TEST_SUFFIX !1
   EXTRA_ARGS how now "\"brown\" cow"
   EXTRA_ARGS how now "\"brown\" cow"
-  PROPERTIES LABELS TEST
+  PROPERTIES LABELS TEST1
+)
+
+gtest_discover_tests(
+  fake_gtest
+  TEST_PREFIX TEST:
+  TEST_SUFFIX !2
+  EXTRA_ARGS how now "\"brown\" cow"
+  PROPERTIES LABELS TEST2
 )
 )

+ 8 - 2
Tests/RunCMake/GoogleTest/RunCMakeTest.cmake

@@ -15,10 +15,16 @@ function(run_GoogleTest)
     --build .
     --build .
     --config Debug
     --config Debug
   )
   )
-  run_cmake_command(GoogleTest-test
+  run_cmake_command(GoogleTest-test1
     ${CMAKE_CTEST_COMMAND}
     ${CMAKE_CTEST_COMMAND}
     -C Debug
     -C Debug
-    -L TEST
+    -L TEST1
+    --no-label-summary
+  )
+  run_cmake_command(GoogleTest-test2
+    ${CMAKE_CTEST_COMMAND}
+    -C Debug
+    -L TEST2
     --no-label-summary
     --no-label-summary
   )
   )
 endfunction()
 endfunction()