GoogleTestAddTests: Fix output processing
The function gtest_discover_tests calls the passed test executable with
the parameter --gtest_list_tests and parses the output to find all
tests.
In case of value-parameterized tests ([1]), the test values are included
in the output. While test names are alphanumeric, the values can contain
arbitrary content.
First, the output is separated into lines with `foreach`. Included
semi-colons breaks this and need to get escaped.
Afterwards, the testname is passed on to the `add_command` helper. This
helper was converted into a macro in commit dac201442d
(GoogleTest:
Optimize gtest_discover_tests, 2020-02-18). As a macro, its arguments
are re-evaluated. Therefore we need to escape `\`, `;` and to prevent
unwanted variable expansion `$`.
Fixes: #20661
[1] <https://github.com/google/googletest/blob/0eea2e9/googletest/docs/advanced.md#value-parameterized-tests>
This commit is contained in:
parent
671daf1998
commit
839a1010a3
@ -83,6 +83,8 @@ function(gtest_discover_tests_impl)
|
||||
)
|
||||
endif()
|
||||
|
||||
# Preserve semicolon in test-parameters
|
||||
string(REPLACE [[;]] [[\;]] output "${output}")
|
||||
string(REPLACE "\n" ";" output "${output}")
|
||||
|
||||
# Parse output
|
||||
@ -114,9 +116,19 @@ function(gtest_discover_tests_impl)
|
||||
else()
|
||||
unset(TEST_XML_OUTPUT_PARAM)
|
||||
endif()
|
||||
|
||||
# sanitize test name for further processing downstream
|
||||
set(testname "${prefix}${pretty_suite}.${pretty_test}${suffix}")
|
||||
# escape \
|
||||
string(REPLACE [[\]] [[\\]] testname "${testname}")
|
||||
# escape ;
|
||||
string(REPLACE [[;]] [[\;]] testname "${testname}")
|
||||
# escape $
|
||||
string(REPLACE [[$]] [[\$]] testname "${testname}")
|
||||
|
||||
# ...and add to script
|
||||
add_command(add_test
|
||||
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
||||
"${testname}"
|
||||
${_TEST_EXECUTOR}
|
||||
"${_TEST_EXECUTABLE}"
|
||||
"--gtest_filter=${suite}.${test}"
|
||||
@ -126,18 +138,18 @@ function(gtest_discover_tests_impl)
|
||||
)
|
||||
if(suite MATCHES "^DISABLED" OR test MATCHES "^DISABLED")
|
||||
add_command(set_tests_properties
|
||||
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
||||
"${testname}"
|
||||
PROPERTIES DISABLED TRUE
|
||||
)
|
||||
endif()
|
||||
add_command(set_tests_properties
|
||||
"${prefix}${pretty_suite}.${pretty_test}${suffix}"
|
||||
"${testname}"
|
||||
PROPERTIES
|
||||
WORKING_DIRECTORY "${_TEST_WORKING_DIR}"
|
||||
SKIP_REGULAR_EXPRESSION "\\\\[ SKIPPED \\\\]"
|
||||
${properties}
|
||||
)
|
||||
list(APPEND tests_buffer "${prefix}${pretty_suite}.${pretty_test}${suffix}")
|
||||
list(APPEND tests_buffer "${testname}")
|
||||
list(LENGTH tests_buffer tests_buffer_length)
|
||||
if(${tests_buffer_length} GREATER "250")
|
||||
flush_tests_buffer()
|
||||
|
@ -1,22 +1,28 @@
|
||||
Test project .*
|
||||
Start 1: TEST:basic\.case_foo!1
|
||||
1/8 Test #1: TEST:basic\.case_foo!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 2: TEST:basic\.case_bar!1
|
||||
2/8 Test #2: TEST:basic\.case_bar!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 3: TEST:basic\.disabled_case!1
|
||||
3/8 Test #3: TEST:basic\.disabled_case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 4: TEST:disabled\.case!1
|
||||
4/8 Test #4: TEST:disabled\.case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 5: TEST:typed/short\.case!1
|
||||
5/8 Test #5: TEST:typed/short\.case!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 6: TEST:typed/float\.case!1
|
||||
6/8 Test #6: TEST:typed/float\.case!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 7: TEST:value/test\.case/1!1
|
||||
7/8 Test #7: TEST:value/test\.case/1!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 8: TEST:value/test\.case/"foo"!1
|
||||
8/8 Test #8: TEST:value/test\.case/"foo"!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 1: TEST:basic\.case_foo!1
|
||||
1/11 Test #1: TEST:basic\.case_foo!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 2: TEST:basic\.case_bar!1
|
||||
2/11 Test #2: TEST:basic\.case_bar!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 3: TEST:basic\.disabled_case!1
|
||||
3/11 Test #3: TEST:basic\.disabled_case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 4: TEST:disabled\.case!1
|
||||
4/11 Test #4: TEST:disabled\.case!1 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 5: TEST:typed/short\.case!1
|
||||
5/11 Test #5: TEST:typed/short\.case!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 6: TEST:typed/float\.case!1
|
||||
6/11 Test #6: TEST:typed/float\.case!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 7: TEST:value/test\.case/1!1
|
||||
7/11 Test #7: TEST:value/test\.case/1!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 8: TEST:value/test\.case/"foo"!1
|
||||
8/11 Test #8: TEST:value/test\.case/"foo"!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 9: TEST:param/special\.case/"semicolon;"!1
|
||||
9/11 Test #9: TEST:param/special\.case/"semicolon;"!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 10: TEST:param/special\.case/"backslash\\"!1
|
||||
10/11 Test #10: TEST:param/special\.case/"backslash\\"!1 \.+ +Passed +[0-9.]+ sec
|
||||
Start 11: TEST:param/special\.case/"\$\{var\}"!1
|
||||
11/11 Test #11: TEST:param/special\.case/"\$\{var\}"!1 \.+ +Passed +[0-9.]+ sec
|
||||
|
||||
100% tests passed, 0 tests failed out of 6
|
||||
100% tests passed, 0 tests failed out of 9
|
||||
|
||||
Total Test time \(real\) = +[0-9.]+ sec
|
||||
|
||||
|
@ -1,25 +1,31 @@
|
||||
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
|
||||
Start 12: TEST:basic\.case_foo!2
|
||||
1/11 Test #12: TEST:basic\.case_foo!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 13: TEST:basic\.case_bar!2
|
||||
2/11 Test #13: TEST:basic\.case_bar!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 14: TEST:basic\.disabled_case!2
|
||||
3/11 Test #14: TEST:basic\.disabled_case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 15: TEST:disabled\.case!2
|
||||
4/11 Test #15: TEST:disabled\.case!2 \.+\*+Not Run \(Disabled\) +[0-9.]+ sec
|
||||
Start 16: TEST:typed/short\.case!2
|
||||
5/11 Test #16: TEST:typed/short\.case!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 17: TEST:typed/float\.case!2
|
||||
6/11 Test #17: TEST:typed/float\.case!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 18: TEST:value/test\.case/1!2
|
||||
7/11 Test #18: TEST:value/test\.case/1!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 19: TEST:value/test\.case/"foo"!2
|
||||
8/11 Test #19: TEST:value/test\.case/"foo"!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 20: TEST:param/special\.case/"semicolon;"!2
|
||||
9/11 Test #20: TEST:param/special\.case/"semicolon;"!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 21: TEST:param/special\.case/"backslash\\"!2
|
||||
10/11 Test #21: TEST:param/special\.case/"backslash\\"!2 \.+ +Passed +[0-9.]+ sec
|
||||
Start 22: TEST:param/special\.case/"\$\{var\}"!2
|
||||
11/11 Test #22: TEST:param/special\.case/"\$\{var\}"!2 \.+ +Passed +[0-9.]+ sec
|
||||
|
||||
100% tests passed, 0 tests failed out of 6
|
||||
100% tests passed, 0 tests failed out of 9
|
||||
|
||||
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\)
|
||||
.*14 - TEST:basic\.disabled_case!2 \(Disabled\)
|
||||
.*15 - TEST:disabled\.case!2 \(Disabled\)
|
||||
|
@ -21,6 +21,10 @@ int main(int argc, char** argv)
|
||||
std::cout << "value/test." << std::endl;
|
||||
std::cout << " case/0 # GetParam() = 1" << std::endl;
|
||||
std::cout << " case/1 # GetParam() = \"foo\"" << std::endl;
|
||||
std::cout << "param/special." << std::endl;
|
||||
std::cout << " case/0 # GetParam() = \"semicolon;\"" << std::endl;
|
||||
std::cout << " case/1 # GetParam() = \"backslash\\\"" << std::endl;
|
||||
std::cout << " case/2 # GetParam() = \"${var}\"" << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user