Files
CMake/Tests/RunCMake/GoogleTest/fake_gtest.cpp
Stefan Floeren 839a1010a3 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>
2020-05-05 07:23:17 +00:00

46 lines
1.7 KiB
C++

#include <iostream>
#include <string>
int main(int argc, char** argv)
{
// Note: GoogleTest.cmake doesn't actually depend on Google Test as such;
// it only requires that we produces output in the expected format when
// invoked with --gtest_list_tests. Thus, we fake that here. This allows us
// to test the module without actually needing Google Test.
if (argc > 1 && std::string(argv[1]) == "--gtest_list_tests") {
std::cout << "basic." << std::endl;
std::cout << " case_foo" << std::endl;
std::cout << " case_bar" << std::endl;
std::cout << " DISABLED_disabled_case" << std::endl;
std::cout << "DISABLED_disabled." << std::endl;
std::cout << " case" << std::endl;
std::cout << "typed/0. # TypeParam = short" << std::endl;
std::cout << " case" << std::endl;
std::cout << "typed/1. # TypeParam = float" << std::endl;
std::cout << " case" << std::endl;
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;
}
if (argc > 5) {
// Simple test of EXTRA_ARGS
if (std::string(argv[3]) == "how" && std::string(argv[4]) == "now" &&
std::string(argv[5]) == "\"brown\" cow") {
return 0;
}
}
// Print arguments for debugging, if we didn't get the expected arguments
for (int i = 1; i < argc; ++i) {
std::cerr << "arg[" << i << "]: '" << argv[i] << "'\n";
}
return 1;
}