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.
This commit is contained in:
Matthew Woehlke
2017-11-20 12:53:25 -05:00
committed by Brad King
parent 7746fdb2fe
commit 70f9f62da8
5 changed files with 67 additions and 5 deletions

View File

@@ -361,9 +361,32 @@ function(gtest_discover_tests TARGET)
set(_TEST_LIST ${TARGET}_TESTS)
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
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
TARGET ${TARGET}
PROPERTY CROSSCOMPILING_EMULATOR

View File

@@ -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\)

View File

@@ -11,5 +11,13 @@ gtest_discover_tests(
TEST_PREFIX TEST:
TEST_SUFFIX !1
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
)

View File

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