summaryrefslogtreecommitdiffstats
path: root/Tests/RunCMake/GoogleTest
Commit message (Collapse)AuthorAgeFilesLines
* codespell: Fix typosBrad King2023-05-221-2/+2
|
* Merge topic 'GoogleTest-type-param-suite'Brad King2023-03-065-3/+67
|\ | | | | | | | | | | | | 9aa9032266 GoogleTest: Restore suite name for type-parametrized tests Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !8282
| * GoogleTest: Restore suite name for type-parametrized testsBrad King2023-03-035-3/+67
| | | | | | | | | | | | | | | | Fix a regression from commit 073dd1bd81 (GoogleTest: Change format for typed tests, 2022-02-07, v3.23.0-rc1~4^2) in the suite name detection. Co-authored-by: Evgeniy Shcherbina <ixsci@pm.me> Fixes: #24563
* | Tests: Isolate more RunCMake cases from external ctest environment valuesBrad King2022-11-141-0/+4
| | | | | | | | | | | | | | Fix a few RunCMake cases that were running `ctest` without isolating it from external environment values that affect its behavior. Fixes: #24153
* | GoogleTest: Reports skipped test with gtest_add_testsDavidPerretSN2022-11-073-1/+15
|/ | | | | | Skipped GTests were reported as success when tests where added with gtest_add_tests. This fixes this behaviour. Fixes: #24130
* GoogleTest: Fix escaping in test namesEvgeniy Shcherbina2022-02-117-0/+130
| | | | | | | | | | | | Due to add_command() being a macro it introduced excessive and nonobvious escaping in different parts of the script. Because of one of such places the resulting script would have an erroneous ${TEST_LIST} if the user data (in test parameters) had a semicolon. To eliminate this non-obvious escaping, add_command() was converted to function. Updated the escaping accordingly. Fixes: #23059
* GoogleTest: Change format for typed testsEvgeniy Shcherbina2022-02-074-42/+42
| | | | | | | | | | | | | | | Before it would output a typed test as follows: Suit/Type.Case And now it would be: Suit.Case<Type> In case of NO_PRETTY_TYPES it would simply use the type number instead of its text representation: Suit.Case<0> The change is introduced to make sure CTest outputs tests in a similar fashion which is "*Suit.Case*" and angle brackets "<>" emphasize that we are dealing with a typed (template) kind.
* GoogleTest: Fix type param tests for suites with many casesEvgeniy Shcherbina2022-02-075-9/+23
| | | | | | | | | | | | | | | | | | | | When there were many cases (two digits or more) the "prettier" would fail to recognize the pretty part leaving the test name unprocessed. The fix made sure the processing would work correctly, irrespective of the case number. Before the fix, for the following input: TypedSuite/1. # TypeParam = int case TypedSuite/10. # TypeParam = char case The output would be: TypedSuite/int.case TypedSuite/10. # TypeParam = char.case Now the output will be: TypedSuite/int.case TypedSuite/char.case
* GoogleTest: Preserve spaces in test parametersEvgeniy Shcherbina2022-02-033-0/+9
| | | | | | | | Before the fix the gtest_discover_tests() function would strip the user data in test parameters (everything to the right of GetParam()) of spaces. Now the parameters aren't altered in any way. Fixes #23058
* GoogleTest: Add handling for square brackets in test namesEvgeniy Shcherbina2022-01-113-3/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If a test name contains a square bracket (due to parameters) then it breaks gtest_discovery_test() function in some not-so-predictable way. That happens due to the special meaning these brackets have in the CMake language and they can't be escaped universally. So the following treatment has been implemented: * Every occurrence of ('[' | ']') in a test name gets replaced with the corresponding placeholder ("__osb_*" | "__csb_*") before the Google Test output processing and gets replaced back before adding a new test to CTest, keeping the original test name intact in the CTest output. The placeholders are chosen that way to minimize the chance of clashing with something in the user tests but even if the default ones would clash with something then they are enhanced to not clash with anything (hence "_*" at the placeholder's end). * The GTest output gets searched for the default test name guards ("[=[" | "]=]") and if they are found a new one gets generated until the one is found which can safely encompass any test name. The search is quite simple: find the least amount of '=' which would allow escaping any test. * The resulting ${TEST_LIST} variable will contain every test but tests with square brackets as there is no way to make sure such tests won't break the list altogether. Fixes: #23039
* GoogleTest: Generalize test samplesEvgeniy Shcherbina2022-01-115-135/+135
| | | | | Replaced brittle (and irrelevant to the tests) parts of the sample outputs with generic regexps to ease making new test cases.
* GoogleTest: Fix regex matching all dots in the suite nameFrancesco Guastella2022-01-078-89/+170
|
* gtest_discover_tests: Re-run PRE_TEST discovery on any arg changeCraig Scott2021-11-164-0/+77
| | | | Fixes: #22912
* Tests: Fix and update wrongly named GoogleTest stdout fileCraig Scott2021-11-141-3/+3
| | | | The GoogleTest-skip-test output was never being checked since this test was added due to this file having the wrong name.
* GoogleTest: Add TEST_FILTER arg to gtest_discover_testsAshish Sadanandan2021-08-055-20/+92
| | | | | | | | | The `TEST_FILTER` argument can be used to filter tests during the discovery phase. It combines `--gtest_filter=<expr>` with the `--gtest_list_tests` argument when invoking the test excutable for listing defined tests. Fixes: #17493
* Tests: Fix newline matching in several RunCMake.* casesBrad King2021-07-023-6/+12
| | | | | | | | The RunCMake infrastructure's `*-stdout.txt` expected output files interpret `\n` as a `\` and `n` rather than a newline. Use a literal newline instead. Otherwise the cases that were trying to match any configuration name via `[^\n]*` would fail on `RelWithDebInfo` because it contains the letter `n`.
* Tests: Fix typos and spelling in commentsJosef Angstenberger2021-05-071-1/+1
|
* Tests: Suppress failures on macOS arm64 due to separate Xcode signing phaseBrad King2021-02-225-0/+23
| | | | | | | | | | | | | | | | Some tests fail because Xcode runs `POST_BUILD` commands before signing the binaries they run. Tell the linker to perform ad-hoc codesign even though Xcode normally tells it not to. Other tests fail because `install_name_tool` does not revise ad-hoc signatures without the codesign `linker-signed` flag. Add that flag ourselves where needed by our tests. For now these changes help our test suite pass so we can use it to cover everything else. Both of these cases may need further investigation to update CMake to help projects in general. Issue: #21845, #21854
* Tests: Clarify internal project name in RunCMake.GoogleTest casesBrad King2021-02-224-4/+4
|
* GoogleTest: Match the full 'DISABLED_' prefix to disable testsBrad King2020-12-033-46/+57
| | | | | | | Test names that start in `DISABLED` not followed by an underscore are not disabled. Fixes: #21543
* CTest: exit nonzero after message(SEND_ERROR|FATAL_ERROR)Kevin Puetz2020-08-261-0/+1
| | | | Fixes: #21004
* Tests: Add test for GoogleTest XML_OUTPUT_DIRStefan Floeren2020-07-014-0/+57
| | | | | Add tests to make sure the XML_OUTPUT_DIR is generated correctly and the correct files are getting created.
* Tests: Don't ask for things not required for GoogleTestCraig Scott2020-06-244-8/+4
| | | | The test cases only need C or C++, but not both. The CTest module is also not needed because we are not running a dashboard script.
* GoogleTestAddTests: Fix output processingStefan Floeren2020-05-053-36/+52
| | | | | | | | | | | | | | | | | | | | | | | 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>
* GoogleTest: Add testcase for skipped testsAlexander Stein2020-04-104-0/+48
| | | | | This simply runs a mocked test case which uses the prefix for signaling a skipped test. CTest's output is checked for a skipped test result.
* GoogleTest: Add tests for MultiConfig discovery in PRE_TEST modeRyan Thornton2020-03-275-0/+88
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | PRE_TEST makes it possible to properly distinguish between test cases that exist only in certain configurations. In the new test scenario, debug tests are disabled in release builds, and release tests are disabled in debug builds when a multi config generator is used. Note, this is a bit of a hack and *only* works for PRE_TEST mode. POST_BUILD makes no attempt to get this right. It preserves the status quo and you obtain the tests that were last discovered. See further discussion in !4078 Ideally, the POST_BUILD behavior could be fixed by using generator expressions in OUTPUT and BYPRODUCT expressions. Then you could do something like: set(ctest_include_file "${ctest_file_base}_include-$<CONFIG>.cmake") set(ctest_tests_file "${ctest_file_base}_tests-$<CONFIG>.cmake") Once #12877 lands, maybe this can be revisited. Co-authored-by: Ryan Thornton <ThorntonRyan@JohnDeere.com> Co-authored-by: Kevin Puetz <PuetzKevinA@JohnDeere.com>
* GoogleTest: Parameterize tests to check PRE_TEST/POST_BUILD discovery modeRyan Thornton2020-03-2711-34/+68
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now, the unit tests are ran twice -- once with POST_BUILD (i.e. default mode) and again with PRE_TEST (i.e. new discovery mode). Both modes of setting gtest discovery mode are also tested: 1. Using the global override (i.e. CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE) 2. Explicitly passing DISCOVERY_MODE in calls to gtest_discover_tests (in GoogleTestDiscoveryTimeout.cmake) The goal is to show that the new PRE_TEST discovery mode does not break existing behavior (i.e. should not break POST_BUILD mode) and should also pass the same tests in the same way. A few non trivial implementation details worth noting: 1. Refactoring discovery_timeout_test into own project Originally, I tried doing: ``` run_GoogleTest(POST_BUILD) run_GoogleTest(PRE_TEST) ``` Without changing the internal structure of run_GoogleTest. But since discovery_timeout_test is part of the same project as the other tests, and CTest include files always get evaluated and that's where test discovery occurs, this means every other test now notices the timeout problem when running in PRE_TEST mode. As a result, keeping the existing test structure meant that each existing test (and any new test) would need to have its own PRE_TEST / POST_BUILD variant for stderr and stdout in order to handle the case where discovery_timeout_test timed out. This exponential increase in test output files introduced unnecessary complexity and made it more cumbersome to work on test cases. Why should an unrelated test case care about discovery_timeout_test? So, to fix that issue, the tests were broken apart into two main groups: 1. run_GoogleTest_discovery_timeout (the test dealing with discovery_timeout_test) 2. run_GoogleTest (everything else) This isolates the PRE_TEST / POST_BUILD timeout variants to a single test case. And the other test cases remain unchanged -- further driving home the point that DISCOVERY_MODE shouldn't change existing behavior. 2. Different number of PRE_TEST / POST_BUILD file variants On the PRE_TEST path, different build systems / compilers (i.e. MSBuild and ninja/gcc) produces different build output when building discovery_timeout_test, but we don't actually care what it is, just as long as it builds successfully. This the fundamental difference in behavior between POST_BUILD (which would have failed) and PRE_TEST (which doesn't) and is the reason why we don't need a GoogleTest-discovery-build-result.txt or GoogleTest-discovery-build-stdout.txt 3. Fix flaky discovery timeout test The test expects to see: > Output: > timeout > case. But sometimes, the test would only produce: > Output: > timout In certain environments, specifically when built with OpenWatcom 1.4, and while the build server was under heavy load (i.e. running many tests in parallel), std::endl behaves inconsistently and doesn't completely flush std::cout when the program is terminated due to timeout. This results in inconsistent test failures because the actual output doesn't fully match what's expected. At first we tried adding an additional: std::cout << std::flush That didn't work. But using C-style printf() and fflush() appears to do the trick: > This time I managed to get on the machine while it was still busy doing other nightly builds > and could reproduce the problem reliably. With that I was finally able to find a fix. > It turns out my earlier hypothesis that C++ stream flushing was not working on the old compiler was correct, > but even .flush() is not enough. > I changed it to use C-style printf() and fflush() and now the test passes on that build. > -- Brad King <brad.king@kitware.com> Co-authored-by: Ryan Thornton <ThorntonRyan@JohnDeere.com> Co-authored-by: Kevin Puetz <PuetzKevinA@JohnDeere.com>
* GoogleTest: Add test case for XML_OUTPUT_DIRAlexander Stein2020-03-134-0/+69
|
* GoogleTest: Add missing test case for gtest_discover_tests failureRyan Thornton2020-03-116-1/+29
| | | | | | | | | | | | | | Discovery timeout test needs split out into two components: - build - test Building the project should result in a failure due to the timeout when executing gtest discovery as a post build step. Likewise, if you ran CTest after this build failure, we should *also* detect that the discovery_timeout_test has not been built because no discovery_timeout_test[1]_tests.cmake has been created due to the test discovery failure (caused by the timeout).
* Revise C++ coding style using clang-format-6.0Kitware Robot2018-06-011-2/+2
| | | | | | | | | | | | Run the `clang-format.bash` script to update all our C and C++ code to a new style defined by `.clang-format`. Use `clang-format` version 6.0. * If you reached this commit for a line in `git blame`, re-run the blame operation starting at the parent of this commit to see older history for the content. * See the parent commit for instructions to rebase a change across this style transition commit.
* Merge topic 'gtest_discover_tests_timeout'Brad King2018-03-1613-10/+113
|\ | | | | | | | | | | | | 96fdde26bb GoogleTest: Rename TIMEOUT parameter to avoid clash Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !1851
| * GoogleTest: Rename TIMEOUT parameter to avoid clashCraig Scott2018-03-1513-10/+113
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In gtest_discover_tests(), the TIMEOUT keyword was making it impossible to set the TIMEOUT test property via the PROPERTIES keyword. This would be a frequent case, but it doesn't complain and instead silently does something different to what would normally be expected. The TIMEOUT keyword has been renamed to DISCOVERY_TIMEOUT, thereby removing the clash. This is a breaking change. 3.10.1 and 3.10.2 were the only versions that supported the TIMEOUT keyword and uses of it were likely not working as intended. Fixes: #17801
* | GENERATOR_IS_MULTI_CONFIG: Use for multi-config checks in TestsCraig Scott2017-12-291-1/+1
|/
* GoogleTest: Add test for missing test executableMatthew Woehlke2017-12-063-0/+10
| | | | | | | Add a test to verify expected behavior when a test executable on which gtest_discover_tests is invoked was not built. (The test for the newly added timeout conveniently sets up this situation, so this new test was almost trivial to add.)
* GoogleTest: Add timeout to discoveryMatthew Woehlke2017-12-065-0/+43
| | | | | | | | | | Add a TIMEOUT option to gtest_discover_tests. This provides a work-around in case a test goes out to lunch, rather than causing the build to simply hang. (Although this is still a problem with the user's project, hanging the build is not cool, especially in the case of automatically running CI builds. It is much preferred that the build should actively fail in this case, and it is trivially easy for us to implement that.)
* GoogleTest: Fix multiple discovery on same targetMatthew Woehlke2017-11-214-3/+42
| | | | | | | | | | | | | 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.
* Add dynamic test discovery for for Google TestMatthew Woehlke2017-07-275-0/+110
Add a new gtest_discover_tests function to GoogleTest.cmake, implementing dynamic test discovery (i.e. tests are discovered by actually running the test executable and asking for the list of available tests, which is used to dynamically declare the tests) rather than the source-parsing approach used by gtest_add_tests. Compared to the source-parsing approach, this has the advantage of being robust against users declaring tests in unusual ways, and much better support for advanced features such as parameterized tests. A unit test, modeled after the TEST_INCLUDE_DIR[S] test, is also included. Note that the unit test does not actually require that Google Test is available. The new functionality does not actually depend on Google Test as such; it only requires that the test executable lists tests in the expected format when invoked with --gtest_list_tests, which the unit test can fake readily.