From 18b67bfc58b1c5657198e5d7e5cc9a99049b154e Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 16 Jan 2020 14:58:28 -0500 Subject: [PATCH] Googletest export Add extra filtering so that the reported message differentiates between the case where INSTANTIATE_TEST_SUITE_P is missing vs. the case where TEST_P is missing. PiperOrigin-RevId: 290114508 --- .../include/gtest/internal/gtest-param-util.h | 5 +++-- googletest/src/gtest.cc | 21 +++++++++++++++---- .../googletest-output-test-golden-lin.txt | 17 +++++++++++---- googletest/test/googletest-output-test_.cc | 4 ++++ 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/googletest/include/gtest/internal/gtest-param-util.h b/googletest/include/gtest/internal/gtest-param-util.h index 65aa9568..7f7a13bf 100644 --- a/googletest/include/gtest/internal/gtest-param-util.h +++ b/googletest/include/gtest/internal/gtest-param-util.h @@ -483,7 +483,7 @@ struct MarkAsIgnored { }; GTEST_API_ void InsertSyntheticTestCase(const std::string& name, - CodeLocation location); + CodeLocation location, bool has_test_p); // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. // @@ -600,7 +600,8 @@ class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { if (!generated_instantiations) { // There are no generaotrs, or they all generate nothing ... - InsertSyntheticTestCase(GetTestSuiteName(), code_location_); + InsertSyntheticTestCase(GetTestSuiteName(), code_location_, + !tests_.empty()); } } // RegisterTests diff --git a/googletest/src/gtest.cc b/googletest/src/gtest.cc index 1f8a68e3..095778e6 100644 --- a/googletest/src/gtest.cc +++ b/googletest/src/gtest.cc @@ -455,19 +455,32 @@ MarkAsIgnored::MarkAsIgnored(const char* test_suite) { // If this parameterized test suite has no instantiations (and that // has not been marked as okay), emit a test case reporting that. -void InsertSyntheticTestCase(const std::string &name, CodeLocation location) { +void InsertSyntheticTestCase(const std::string& name, CodeLocation location, + bool has_test_p) { const auto& ignored = *GetIgnoredParameterizedTestSuites(); if (ignored.find(name) != ignored.end()) return; - std::string message = - "Paramaterized test suite " + name + + const char kMissingInstantiation[] = // " is defined via TEST_P, but never instantiated. None of the test cases " "will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only " "ones provided expand to nothing." "\n\n" "Ideally, TEST_P definitions should only ever be included as part of " "binaries that intend to use them. (As opposed to, for example, being " - "placed in a library that may be linked in to get other utilities.)" + "placed in a library that may be linked in to get other utilities.)"; + + const char kMissingTestCase[] = // + " is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are " + "defined via TEST_P . No test cases will run." + "\n\n" + "Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from " + "code that always depend on code that provides TEST_P. Failing to do " + "so is often an indication of dead code, e.g. the last TEST_P was " + "removed but the rest got left behind."; + + std::string message = + "Paramaterized test suite " + name + + (has_test_p ? kMissingInstantiation : kMissingTestCase) + "\n\n" "To suppress this error for this test suite, insert the following line " "(in a non-header) in the namespace it is defined in:" diff --git a/googletest/test/googletest-output-test-golden-lin.txt b/googletest/test/googletest-output-test-golden-lin.txt index 2b34aad3..8bc45800 100644 --- a/googletest/test/googletest-output-test-golden-lin.txt +++ b/googletest/test/googletest-output-test-golden-lin.txt @@ -12,7 +12,7 @@ Expected equality of these values: 3 Stack trace: (omitted) -[==========] Running 87 tests from 41 test suites. +[==========] Running 88 tests from 41 test suites. [----------] Global test environment set-up. FooEnvironment::SetUp() called. BarEnvironment::SetUp() called. @@ -982,7 +982,16 @@ Expected failure Stack trace: (omitted) [ FAILED ] PrintingStrings/ParamTest.Failure/a, where GetParam() = "a" -[----------] 2 tests from GoogleTestVerification +[----------] 3 tests from GoogleTestVerification +[ RUN ] GoogleTestVerification.UninstantiatedParamaterizedTestSuite +Paramaterized test suite NoTests is instantiated via INSTANTIATE_TEST_SUITE_P, but no tests are defined via TEST_P . No test cases will run. + +Ideally, INSTANTIATE_TEST_SUITE_P should only ever be invoked from code that always depend on code that provides TEST_P. Failing to do so is often an indication of dead code, e.g. the last TEST_P was removed but the rest got left behind. + +To suppress this error for this test suite, insert the following line (in a non-header) in the namespace it is defined in: + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(NoTests); +[ OK ] GoogleTestVerification.UninstantiatedParamaterizedTestSuite [ RUN ] GoogleTestVerification.UninstantiatedParamaterizedTestSuite Paramaterized test suite DetectNotInstantiatedTest is defined via TEST_P, but never instantiated. None of the test cases will run. Either no INSTANTIATE_TEST_SUITE_P is provided or the only ones provided expand to nothing. @@ -1014,8 +1023,8 @@ Failed Expected fatal failure. Stack trace: (omitted) -[==========] 87 tests from 41 test suites ran. -[ PASSED ] 33 tests. +[==========] 88 tests from 41 test suites ran. +[ PASSED ] 34 tests. [ FAILED ] 54 tests, listed below: [ FAILED ] NonfatalFailureTest.EscapesStringOperands [ FAILED ] NonfatalFailureTest.DiffForLongStrings diff --git a/googletest/test/googletest-output-test_.cc b/googletest/test/googletest-output-test_.cc index b1d66f9f..76af5bca 100644 --- a/googletest/test/googletest-output-test_.cc +++ b/googletest/test/googletest-output-test_.cc @@ -790,6 +790,10 @@ INSTANTIATE_TEST_SUITE_P(PrintingStrings, testing::Values(std::string("a")), ParamNameFunc); +// The case where a suite has INSTANTIATE_TEST_SUITE_P but not TEST_P. +using NoTests = ParamTest; +INSTANTIATE_TEST_SUITE_P(ThisIsOdd, NoTests, ::testing::Values("Hello")); + // fails under kErrorOnUninstantiatedParameterizedTest=true class DetectNotInstantiatedTest : public testing::TestWithParam {}; TEST_P(DetectNotInstantiatedTest, Used) { }