1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TEST_GTEST_UTIL_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_GTEST_UTIL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <string> 9*6777b538SAndroid Build Coastguard Worker #include <utility> 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/debug/debugging_buildflags.h" 14*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 15*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // EXPECT/ASSERT_DCHECK_DEATH is intended to replace EXPECT/ASSERT_DEBUG_DEATH 18*6777b538SAndroid Build Coastguard Worker // when the death is expected to be caused by a DCHECK. Contrary to 19*6777b538SAndroid Build Coastguard Worker // EXPECT/ASSERT_DEBUG_DEATH however, it doesn't execute the statement in non- 20*6777b538SAndroid Build Coastguard Worker // dcheck builds as DCHECKs are intended to catch things that should never 21*6777b538SAndroid Build Coastguard Worker // happen and as such executing the statement results in undefined behavior 22*6777b538SAndroid Build Coastguard Worker // (|statement| is compiled in unsupported configurations nonetheless). 23*6777b538SAndroid Build Coastguard Worker // DCHECK_IS_CONFIGURABLE is excluded from DCHECK_DEATH because it's non-FATAL 24*6777b538SAndroid Build Coastguard Worker // by default and there are no known tests that configure a FATAL level. If this 25*6777b538SAndroid Build Coastguard Worker // gets used from FATAL contexts under DCHECK_IS_CONFIGURABLE this may need to 26*6777b538SAndroid Build Coastguard Worker // be updated to look at LOGGING_DCHECK's current severity level. 27*6777b538SAndroid Build Coastguard Worker // Death tests misbehave on Android. 28*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && \ 29*6777b538SAndroid Build Coastguard Worker !BUILDFLAG(DCHECK_IS_CONFIGURABLE) && !BUILDFLAG(IS_ANDROID) 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // EXPECT/ASSERT_DCHECK_DEATH tests verify that a DCHECK is hit ("Check failed" 32*6777b538SAndroid Build Coastguard Worker // is part of the error message). Optionally you may specify part of the message 33*6777b538SAndroid Build Coastguard Worker // to verify which DCHECK (or LOG(DFATAL)) is being hit. 34*6777b538SAndroid Build Coastguard Worker #define EXPECT_DCHECK_DEATH(statement) EXPECT_DEATH(statement, "Check failed") 35*6777b538SAndroid Build Coastguard Worker #define EXPECT_DCHECK_DEATH_WITH(statement, msg) EXPECT_DEATH(statement, msg) 36*6777b538SAndroid Build Coastguard Worker #define ASSERT_DCHECK_DEATH(statement) ASSERT_DEATH(statement, "Check failed") 37*6777b538SAndroid Build Coastguard Worker #define ASSERT_DCHECK_DEATH_WITH(statement, msg) ASSERT_DEATH(statement, msg) 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker #else 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker #define EXPECT_DCHECK_DEATH(statement) \ 42*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", ) 43*6777b538SAndroid Build Coastguard Worker #define EXPECT_DCHECK_DEATH_WITH(statement, msg) \ 44*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, msg, ) 45*6777b538SAndroid Build Coastguard Worker #define ASSERT_DCHECK_DEATH(statement) \ 46*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", return ) 47*6777b538SAndroid Build Coastguard Worker #define ASSERT_DCHECK_DEATH_WITH(statement, msg) \ 48*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, msg, return ) 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker #endif // DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && 51*6777b538SAndroid Build Coastguard Worker // !BUILDFLAG(DCHECK_IS_CONFIGURABLE) && !BUILDFLAG(IS_ANDROID) 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // As above, but for CHECK(). 54*6777b538SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM() 57*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH(statement) EXPECT_DEATH(statement, "Check failed") 58*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH_WITH(statement, msg) EXPECT_DEATH(statement, msg) 59*6777b538SAndroid Build Coastguard Worker #define ASSERT_CHECK_DEATH(statement) ASSERT_DEATH(statement, "Check failed") 60*6777b538SAndroid Build Coastguard Worker #else 61*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH(statement) EXPECT_DEATH(statement, "") 62*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH_WITH(statement, msg) EXPECT_DEATH(statement, "") 63*6777b538SAndroid Build Coastguard Worker #define ASSERT_CHECK_DEATH(statement) ASSERT_DEATH(statement, "") 64*6777b538SAndroid Build Coastguard Worker #endif // CHECK_WILL_STREAM() 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker #else // defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker // Note GTEST_UNSUPPORTED_DEATH_TEST takes a |regex| only to see whether it is a 69*6777b538SAndroid Build Coastguard Worker // valid regex. It is never evaluated. 70*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH(statement) \ 71*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "", ) 72*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK_DEATH_WITH(statement, msg) \ 73*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "", ) 74*6777b538SAndroid Build Coastguard Worker #define ASSERT_CHECK_DEATH(statement) \ 75*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "", return ) 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker #endif // defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // `BASE_EXPECT_DEATH` is similar to gtest's `EXPECT_DEATH_IF_SUPPORTED`. It 80*6777b538SAndroid Build Coastguard Worker // takes into account that Android does not support them. 81*6777b538SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker #define BASE_EXPECT_DEATH EXPECT_DEATH 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker #else // defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker #define BASE_EXPECT_DEATH(statement, matcher) \ 88*6777b538SAndroid Build Coastguard Worker GTEST_UNSUPPORTED_DEATH_TEST(statement, "", ) 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker #endif // defined(GTEST_HAS_DEATH_TEST) && !BUILDFLAG(IS_ANDROID) 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker namespace base { 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker class FilePath; 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker struct TestIdentifier { 97*6777b538SAndroid Build Coastguard Worker TestIdentifier(); 98*6777b538SAndroid Build Coastguard Worker TestIdentifier(const TestIdentifier& other); 99*6777b538SAndroid Build Coastguard Worker TestIdentifier& operator=(const TestIdentifier& other); 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker std::string test_case_name; 102*6777b538SAndroid Build Coastguard Worker std::string test_name; 103*6777b538SAndroid Build Coastguard Worker std::string file; 104*6777b538SAndroid Build Coastguard Worker int line; 105*6777b538SAndroid Build Coastguard Worker }; 106*6777b538SAndroid Build Coastguard Worker 107*6777b538SAndroid Build Coastguard Worker // Constructs a full test name given a test case name and a test name, 108*6777b538SAndroid Build Coastguard Worker // e.g. for test case "A" and test name "B" returns "A.B". 109*6777b538SAndroid Build Coastguard Worker std::string FormatFullTestName(const std::string& test_case_name, 110*6777b538SAndroid Build Coastguard Worker const std::string& test_name); 111*6777b538SAndroid Build Coastguard Worker 112*6777b538SAndroid Build Coastguard Worker // Returns the full test name with the "DISABLED_" prefix stripped out. 113*6777b538SAndroid Build Coastguard Worker // e.g. for the full test names "A.DISABLED_B", "DISABLED_A.B", and 114*6777b538SAndroid Build Coastguard Worker // "DISABLED_A.DISABLED_B", returns "A.B". 115*6777b538SAndroid Build Coastguard Worker std::string TestNameWithoutDisabledPrefix(const std::string& full_test_name); 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Worker // Returns a vector of gtest-based tests compiled into 118*6777b538SAndroid Build Coastguard Worker // current executable. 119*6777b538SAndroid Build Coastguard Worker std::vector<TestIdentifier> GetCompiledInTests(); 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker // Writes the list of gtest-based tests compiled into 122*6777b538SAndroid Build Coastguard Worker // current executable as a JSON file. Returns true on success. 123*6777b538SAndroid Build Coastguard Worker [[nodiscard]] bool WriteCompiledInTestsToFile(const FilePath& path); 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker // Reads the list of gtest-based tests from |path| into |output|. 126*6777b538SAndroid Build Coastguard Worker // Returns true on success. 127*6777b538SAndroid Build Coastguard Worker [[nodiscard]] bool ReadTestNamesFromFile(const FilePath& path, 128*6777b538SAndroid Build Coastguard Worker std::vector<TestIdentifier>* output); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker } // namespace base 131*6777b538SAndroid Build Coastguard Worker 132*6777b538SAndroid Build Coastguard Worker #endif // BASE_TEST_GTEST_UTIL_H_ 133