xref: /aosp_15_r20/external/cronet/base/check_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2020 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 #include <tuple>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/check_deref.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/check_version_internal.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/debug/dump_without_crashing.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/features.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/macros/concat.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/notimplemented.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
22*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
23*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker int g_dump_without_crashing_count = 0;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker constexpr base::NotFatalUntil kNextMilestone =
31*6777b538SAndroid Build Coastguard Worker     BASE_CONCAT(base::NotFatalUntil::M, BASE_CHECK_NEXT_VERSION_INTERNAL);
32*6777b538SAndroid Build Coastguard Worker constexpr base::NotFatalUntil kCurrentMilestone =
33*6777b538SAndroid Build Coastguard Worker     BASE_CONCAT(base::NotFatalUntil::M, BASE_CHECK_VERSION_INTERNAL);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker class ScopedExpectDumpWithoutCrashing {
36*6777b538SAndroid Build Coastguard Worker  public:
ScopedExpectDumpWithoutCrashing()37*6777b538SAndroid Build Coastguard Worker   ScopedExpectDumpWithoutCrashing() {
38*6777b538SAndroid Build Coastguard Worker     g_dump_without_crashing_count = 0;
39*6777b538SAndroid Build Coastguard Worker     base::debug::SetDumpWithoutCrashingFunction(&DumpWithoutCrashing);
40*6777b538SAndroid Build Coastguard Worker   }
41*6777b538SAndroid Build Coastguard Worker 
~ScopedExpectDumpWithoutCrashing()42*6777b538SAndroid Build Coastguard Worker   ~ScopedExpectDumpWithoutCrashing() {
43*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(1, g_dump_without_crashing_count);
44*6777b538SAndroid Build Coastguard Worker     base::debug::SetDumpWithoutCrashingFunction(nullptr);
45*6777b538SAndroid Build Coastguard Worker   }
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker  private:
DumpWithoutCrashing()48*6777b538SAndroid Build Coastguard Worker   static void DumpWithoutCrashing() { ++g_dump_without_crashing_count; }
49*6777b538SAndroid Build Coastguard Worker };
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker MATCHER_P2(LogErrorMatches, line, expected_msg, "") {
52*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(arg, testing::HasSubstr(
53*6777b538SAndroid Build Coastguard Worker                        base::StringPrintf("check_unittest.cc(%d)] ", line)));
54*6777b538SAndroid Build Coastguard Worker   if (std::string(expected_msg).find("=~") == 0) {
55*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(std::string(arg),
56*6777b538SAndroid Build Coastguard Worker                 testing::ContainsRegex(std::string(expected_msg).substr(2)));
57*6777b538SAndroid Build Coastguard Worker   } else {
58*6777b538SAndroid Build Coastguard Worker     EXPECT_THAT(std::string(arg), testing::HasSubstr(expected_msg));
59*6777b538SAndroid Build Coastguard Worker   }
60*6777b538SAndroid Build Coastguard Worker   return true;
61*6777b538SAndroid Build Coastguard Worker }
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker // TODO(pbos): Upstream support for ignoring matchers in gtest when death
64*6777b538SAndroid Build Coastguard Worker // testing is not available.
65*6777b538SAndroid Build Coastguard Worker // Without this we get a compile failure on iOS because
66*6777b538SAndroid Build Coastguard Worker // GTEST_UNSUPPORTED_DEATH_TEST does not compile with a MATCHER as parameter.
67*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
68*6777b538SAndroid Build Coastguard Worker #define CHECK_MATCHER(line, msg) LogErrorMatches(line, msg)
69*6777b538SAndroid Build Coastguard Worker #else
70*6777b538SAndroid Build Coastguard Worker #define CHECK_MATCHER(line, msg) msg
71*6777b538SAndroid Build Coastguard Worker #endif
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker // Macro which expects a CHECK to fire with a certain message. If msg starts
74*6777b538SAndroid Build Coastguard Worker // with "=~", it's interpreted as a regular expression.
75*6777b538SAndroid Build Coastguard Worker // Example: EXPECT_CHECK("Check failed: false.", CHECK(false));
76*6777b538SAndroid Build Coastguard Worker //
77*6777b538SAndroid Build Coastguard Worker // Note: Please use the `CheckDeathTest` fixture when using this check.
78*6777b538SAndroid Build Coastguard Worker #if !CHECK_WILL_STREAM()
79*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK(msg, check_expr) \
80*6777b538SAndroid Build Coastguard Worker   do {                                \
81*6777b538SAndroid Build Coastguard Worker     EXPECT_CHECK_DEATH(check_expr);   \
82*6777b538SAndroid Build Coastguard Worker   } while (0)
83*6777b538SAndroid Build Coastguard Worker #else
84*6777b538SAndroid Build Coastguard Worker #define EXPECT_CHECK(msg, check_expr) \
85*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(check_expr, CHECK_MATCHER(__LINE__, msg))
86*6777b538SAndroid Build Coastguard Worker #endif  // !CHECK_WILL_STREAM()
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker // Macro which expects a DCHECK to fire if DCHECKs are enabled.
89*6777b538SAndroid Build Coastguard Worker //
90*6777b538SAndroid Build Coastguard Worker // Note: Please use the `CheckDeathTest` fixture when using this check.
91*6777b538SAndroid Build Coastguard Worker #define EXPECT_DCHECK(msg, check_expr)                                         \
92*6777b538SAndroid Build Coastguard Worker   do {                                                                         \
93*6777b538SAndroid Build Coastguard Worker     if (DCHECK_IS_ON() && logging::LOGGING_DCHECK == logging::LOGGING_FATAL) { \
94*6777b538SAndroid Build Coastguard Worker       EXPECT_DEATH_IF_SUPPORTED(check_expr, CHECK_MATCHER(__LINE__, msg));     \
95*6777b538SAndroid Build Coastguard Worker     } else if (DCHECK_IS_ON()) {                                               \
96*6777b538SAndroid Build Coastguard Worker       ScopedExpectDumpWithoutCrashing expect_dump;                             \
97*6777b538SAndroid Build Coastguard Worker       check_expr;                                                              \
98*6777b538SAndroid Build Coastguard Worker     } else {                                                                   \
99*6777b538SAndroid Build Coastguard Worker       check_expr;                                                              \
100*6777b538SAndroid Build Coastguard Worker     }                                                                          \
101*6777b538SAndroid Build Coastguard Worker   } while (0)
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker #define EXPECT_LOG_ERROR_WITH_FILENAME(expected_file, expected_line, expr,     \
104*6777b538SAndroid Build Coastguard Worker                                        msg)                                    \
105*6777b538SAndroid Build Coastguard Worker   do {                                                                         \
106*6777b538SAndroid Build Coastguard Worker     static bool got_log_message = false;                                       \
107*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(logging::GetLogMessageHandler(), nullptr);                       \
108*6777b538SAndroid Build Coastguard Worker     logging::SetLogMessageHandler([](int severity, const char* file, int line, \
109*6777b538SAndroid Build Coastguard Worker                                      size_t message_start,                     \
110*6777b538SAndroid Build Coastguard Worker                                      const std::string& str) {                 \
111*6777b538SAndroid Build Coastguard Worker       EXPECT_FALSE(got_log_message);                                           \
112*6777b538SAndroid Build Coastguard Worker       got_log_message = true;                                                  \
113*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(severity, logging::LOGGING_ERROR);                             \
114*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(str.substr(message_start), (msg));                             \
115*6777b538SAndroid Build Coastguard Worker       if (base::StringPiece(expected_file) != "") {                            \
116*6777b538SAndroid Build Coastguard Worker         EXPECT_STREQ(expected_file, file);                                     \
117*6777b538SAndroid Build Coastguard Worker       }                                                                        \
118*6777b538SAndroid Build Coastguard Worker       if (expected_line != -1) {                                               \
119*6777b538SAndroid Build Coastguard Worker         EXPECT_EQ(expected_line, line);                                        \
120*6777b538SAndroid Build Coastguard Worker       }                                                                        \
121*6777b538SAndroid Build Coastguard Worker       return true;                                                             \
122*6777b538SAndroid Build Coastguard Worker     });                                                                        \
123*6777b538SAndroid Build Coastguard Worker     expr;                                                                      \
124*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(got_log_message);                                              \
125*6777b538SAndroid Build Coastguard Worker     logging::SetLogMessageHandler(nullptr);                                    \
126*6777b538SAndroid Build Coastguard Worker   } while (0)
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker #define EXPECT_LOG_ERROR(expected_line, expr, msg) \
129*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(__FILE__, expected_line, expr, msg)
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker #define EXPECT_NO_LOG(expr)                                                    \
132*6777b538SAndroid Build Coastguard Worker   do {                                                                         \
133*6777b538SAndroid Build Coastguard Worker     ASSERT_EQ(logging::GetLogMessageHandler(), nullptr);                       \
134*6777b538SAndroid Build Coastguard Worker     logging::SetLogMessageHandler([](int severity, const char* file, int line, \
135*6777b538SAndroid Build Coastguard Worker                                      size_t message_start,                     \
136*6777b538SAndroid Build Coastguard Worker                                      const std::string& str) {                 \
137*6777b538SAndroid Build Coastguard Worker       EXPECT_TRUE(false) << "Unexpected log: " << str;                         \
138*6777b538SAndroid Build Coastguard Worker       return true;                                                             \
139*6777b538SAndroid Build Coastguard Worker     });                                                                        \
140*6777b538SAndroid Build Coastguard Worker     expr;                                                                      \
141*6777b538SAndroid Build Coastguard Worker     logging::SetLogMessageHandler(nullptr);                                    \
142*6777b538SAndroid Build Coastguard Worker   } while (0)
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
145*6777b538SAndroid Build Coastguard Worker #define EXPECT_DUMP_WILL_BE_CHECK EXPECT_DCHECK
146*6777b538SAndroid Build Coastguard Worker #else
147*6777b538SAndroid Build Coastguard Worker #define EXPECT_DUMP_WILL_BE_CHECK(expected_string, statement)               \
148*6777b538SAndroid Build Coastguard Worker   do {                                                                      \
149*6777b538SAndroid Build Coastguard Worker     ScopedExpectDumpWithoutCrashing expect_dump;                            \
150*6777b538SAndroid Build Coastguard Worker     EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),   \
151*6777b538SAndroid Build Coastguard Worker                                    base::Location::Current().line_number(), \
152*6777b538SAndroid Build Coastguard Worker                                    statement, expected_string "\n");        \
153*6777b538SAndroid Build Coastguard Worker   } while (0)
154*6777b538SAndroid Build Coastguard Worker #endif  // DCHECK_IS_ON()
155*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,Basics)156*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, Basics) {
157*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: false. ", CHECK(false));
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: false. foo", CHECK(false) << "foo");
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker   double a = 2, b = 1;
162*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a < b (2.000000 vs. 1.000000)", CHECK_LT(a, b));
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a < b (2.000000 vs. 1.000000)custom message",
165*6777b538SAndroid Build Coastguard Worker                CHECK_LT(a, b) << "custom message");
166*6777b538SAndroid Build Coastguard Worker }
167*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,PCheck)168*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, PCheck) {
169*6777b538SAndroid Build Coastguard Worker   const char file[] = "/nonexistentfile123";
170*6777b538SAndroid Build Coastguard Worker   std::ignore = fopen(file, "r");
171*6777b538SAndroid Build Coastguard Worker   std::string err =
172*6777b538SAndroid Build Coastguard Worker       logging::SystemErrorCodeToString(logging::GetLastSystemErrorCode());
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK(
175*6777b538SAndroid Build Coastguard Worker       "Check failed: fopen(file, \"r\") != nullptr."
176*6777b538SAndroid Build Coastguard Worker       " : " +
177*6777b538SAndroid Build Coastguard Worker           err,
178*6777b538SAndroid Build Coastguard Worker       PCHECK(fopen(file, "r") != nullptr));
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK(
181*6777b538SAndroid Build Coastguard Worker       "Check failed: fopen(file, \"r\") != nullptr."
182*6777b538SAndroid Build Coastguard Worker       " foo: " +
183*6777b538SAndroid Build Coastguard Worker           err,
184*6777b538SAndroid Build Coastguard Worker       PCHECK(fopen(file, "r") != nullptr) << "foo");
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK(
187*6777b538SAndroid Build Coastguard Worker       "Check failed: fopen(file, \"r\") != nullptr."
188*6777b538SAndroid Build Coastguard Worker       " : " +
189*6777b538SAndroid Build Coastguard Worker           err,
190*6777b538SAndroid Build Coastguard Worker       DPCHECK(fopen(file, "r") != nullptr));
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK(
193*6777b538SAndroid Build Coastguard Worker       "Check failed: fopen(file, \"r\") != nullptr."
194*6777b538SAndroid Build Coastguard Worker       " foo: " +
195*6777b538SAndroid Build Coastguard Worker           err,
196*6777b538SAndroid Build Coastguard Worker       DPCHECK(fopen(file, "r") != nullptr) << "foo");
197*6777b538SAndroid Build Coastguard Worker }
198*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,CheckOp)199*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, CheckOp) {
200*6777b538SAndroid Build Coastguard Worker   const int a = 1, b = 2;
201*6777b538SAndroid Build Coastguard Worker   // clang-format off
202*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a == b (1 vs. 2)", CHECK_EQ(a, b));
203*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a != a (1 vs. 1)", CHECK_NE(a, a));
204*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: b <= a (2 vs. 1)", CHECK_LE(b, a));
205*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: b < a (2 vs. 1)",  CHECK_LT(b, a));
206*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a >= b (1 vs. 2)", CHECK_GE(a, b));
207*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a > b (1 vs. 2)",  CHECK_GT(a, b));
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: a == b (1 vs. 2)", DCHECK_EQ(a, b));
210*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: a != a (1 vs. 1)", DCHECK_NE(a, a));
211*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: b <= a (2 vs. 1)", DCHECK_LE(b, a));
212*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: b < a (2 vs. 1)",  DCHECK_LT(b, a));
213*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: a >= b (1 vs. 2)", DCHECK_GE(a, b));
214*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: a > b (1 vs. 2)",  DCHECK_GT(a, b));
215*6777b538SAndroid Build Coastguard Worker   // clang-format on
216*6777b538SAndroid Build Coastguard Worker 
217*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a == b (1 vs. 2)",
218*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_EQ(a, b));
219*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a != a (1 vs. 1)",
220*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_NE(a, a));
221*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: b <= a (2 vs. 1)",
222*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_LE(b, a));
223*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: b < a (2 vs. 1)",
224*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_LT(b, a));
225*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a >= b (1 vs. 2)",
226*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_GE(a, b));
227*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a > b (1 vs. 2)",
228*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK_GT(a, b));
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,CheckStreamsAreLazy)231*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, CheckStreamsAreLazy) {
232*6777b538SAndroid Build Coastguard Worker   int called_count = 0;
233*6777b538SAndroid Build Coastguard Worker   int not_called_count = 0;
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker   auto Called = [&]() {
236*6777b538SAndroid Build Coastguard Worker     ++called_count;
237*6777b538SAndroid Build Coastguard Worker     // This returns a non-constant because returning 42 here directly triggers a
238*6777b538SAndroid Build Coastguard Worker     // dead-code warning when streaming to *CHECK(Called()) << NotCalled();
239*6777b538SAndroid Build Coastguard Worker     return called_count >= 0;
240*6777b538SAndroid Build Coastguard Worker   };
241*6777b538SAndroid Build Coastguard Worker   auto NotCalled = [&]() {
242*6777b538SAndroid Build Coastguard Worker     ++not_called_count;
243*6777b538SAndroid Build Coastguard Worker     return 42;
244*6777b538SAndroid Build Coastguard Worker   };
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker   CHECK(Called()) << NotCalled();
247*6777b538SAndroid Build Coastguard Worker   CHECK_EQ(Called(), Called()) << NotCalled();
248*6777b538SAndroid Build Coastguard Worker   PCHECK(Called()) << NotCalled();
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   DCHECK(Called()) << NotCalled();
251*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(Called(), Called()) << NotCalled();
252*6777b538SAndroid Build Coastguard Worker   DPCHECK(Called()) << NotCalled();
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(not_called_count, 0);
255*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(called_count, 8);
257*6777b538SAndroid Build Coastguard Worker #else
258*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(called_count, 4);
259*6777b538SAndroid Build Coastguard Worker #endif
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker 
DcheckEmptyFunction1()262*6777b538SAndroid Build Coastguard Worker void DcheckEmptyFunction1() {
263*6777b538SAndroid Build Coastguard Worker   // Provide a body so that Release builds do not cause the compiler to
264*6777b538SAndroid Build Coastguard Worker   // optimize DcheckEmptyFunction1 and DcheckEmptyFunction2 as a single
265*6777b538SAndroid Build Coastguard Worker   // function, which breaks the Dcheck tests below.
266*6777b538SAndroid Build Coastguard Worker   LOG(INFO) << "DcheckEmptyFunction1";
267*6777b538SAndroid Build Coastguard Worker }
DcheckEmptyFunction2()268*6777b538SAndroid Build Coastguard Worker void DcheckEmptyFunction2() {}
269*6777b538SAndroid Build Coastguard Worker 
270*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
271*6777b538SAndroid Build Coastguard Worker class ScopedDcheckSeverity {
272*6777b538SAndroid Build Coastguard Worker  public:
ScopedDcheckSeverity(logging::LogSeverity new_severity)273*6777b538SAndroid Build Coastguard Worker   explicit ScopedDcheckSeverity(logging::LogSeverity new_severity)
274*6777b538SAndroid Build Coastguard Worker       : old_severity_(logging::LOGGING_DCHECK) {
275*6777b538SAndroid Build Coastguard Worker     logging::LOGGING_DCHECK = new_severity;
276*6777b538SAndroid Build Coastguard Worker   }
277*6777b538SAndroid Build Coastguard Worker 
~ScopedDcheckSeverity()278*6777b538SAndroid Build Coastguard Worker   ~ScopedDcheckSeverity() { logging::LOGGING_DCHECK = old_severity_; }
279*6777b538SAndroid Build Coastguard Worker 
280*6777b538SAndroid Build Coastguard Worker  private:
281*6777b538SAndroid Build Coastguard Worker   logging::LogSeverity old_severity_;
282*6777b538SAndroid Build Coastguard Worker };
283*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(DCHECK_IS_CONFIGURABLE)
284*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,Dcheck)285*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, Dcheck) {
286*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
287*6777b538SAndroid Build Coastguard Worker   // DCHECKs are enabled, and LOGGING_DCHECK is mutable, but defaults to
288*6777b538SAndroid Build Coastguard Worker   // non-fatal. Set it to LOGGING_FATAL to get the expected behavior from the
289*6777b538SAndroid Build Coastguard Worker   // rest of this test.
290*6777b538SAndroid Build Coastguard Worker   ScopedDcheckSeverity dcheck_severity(logging::LOGGING_FATAL);
291*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(DCHECK_IS_CONFIGURABLE)
292*6777b538SAndroid Build Coastguard Worker 
293*6777b538SAndroid Build Coastguard Worker #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
294*6777b538SAndroid Build Coastguard Worker   // Release build.
295*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(DCHECK_IS_ON());
296*6777b538SAndroid Build Coastguard Worker #elif defined(NDEBUG) && defined(DCHECK_ALWAYS_ON)
297*6777b538SAndroid Build Coastguard Worker   // Release build with real DCHECKS.
298*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(DCHECK_IS_ON());
299*6777b538SAndroid Build Coastguard Worker #else
300*6777b538SAndroid Build Coastguard Worker   // Debug build.
301*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(DCHECK_IS_ON());
302*6777b538SAndroid Build Coastguard Worker #endif
303*6777b538SAndroid Build Coastguard Worker 
304*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: false. ", DCHECK(false));
305*6777b538SAndroid Build Coastguard Worker 
306*6777b538SAndroid Build Coastguard Worker   // Produce a consistent error code so that both the main instance of this test
307*6777b538SAndroid Build Coastguard Worker   // and the EXPECT_DEATH invocation below get the same error codes for DPCHECK.
308*6777b538SAndroid Build Coastguard Worker   const char file[] = "/nonexistentfile123";
309*6777b538SAndroid Build Coastguard Worker   std::ignore = fopen(file, "r");
310*6777b538SAndroid Build Coastguard Worker   std::string err =
311*6777b538SAndroid Build Coastguard Worker       logging::SystemErrorCodeToString(logging::GetLastSystemErrorCode());
312*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: false. : " + err, DPCHECK(false));
313*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: 0 == 1 (0 vs. 1)", DCHECK_EQ(0, 1));
314*6777b538SAndroid Build Coastguard Worker 
315*6777b538SAndroid Build Coastguard Worker   // Test DCHECK on std::nullptr_t
316*6777b538SAndroid Build Coastguard Worker   const void* p_null = nullptr;
317*6777b538SAndroid Build Coastguard Worker   const void* p_not_null = &p_null;
318*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(p_null, nullptr);
319*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(nullptr, p_null);
320*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(p_not_null, nullptr);
321*6777b538SAndroid Build Coastguard Worker   DCHECK_NE(nullptr, p_not_null);
322*6777b538SAndroid Build Coastguard Worker 
323*6777b538SAndroid Build Coastguard Worker   // Test DCHECK on a scoped enum.
324*6777b538SAndroid Build Coastguard Worker   enum class Animal { DOG, CAT };
325*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(Animal::DOG, Animal::DOG);
326*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: Animal::DOG == Animal::CAT (0 vs. 1)",
327*6777b538SAndroid Build Coastguard Worker                 DCHECK_EQ(Animal::DOG, Animal::CAT));
328*6777b538SAndroid Build Coastguard Worker 
329*6777b538SAndroid Build Coastguard Worker   // Test DCHECK on functions and function pointers.
330*6777b538SAndroid Build Coastguard Worker   struct MemberFunctions {
331*6777b538SAndroid Build Coastguard Worker     void MemberFunction1() {
332*6777b538SAndroid Build Coastguard Worker       // See the comment in DcheckEmptyFunction1().
333*6777b538SAndroid Build Coastguard Worker       LOG(INFO) << "Do not merge with MemberFunction2.";
334*6777b538SAndroid Build Coastguard Worker     }
335*6777b538SAndroid Build Coastguard Worker     void MemberFunction2() {}
336*6777b538SAndroid Build Coastguard Worker   };
337*6777b538SAndroid Build Coastguard Worker   void (MemberFunctions::*mp1)() = &MemberFunctions::MemberFunction1;
338*6777b538SAndroid Build Coastguard Worker   void (MemberFunctions::*mp2)() = &MemberFunctions::MemberFunction2;
339*6777b538SAndroid Build Coastguard Worker   void (*fp1)() = DcheckEmptyFunction1;
340*6777b538SAndroid Build Coastguard Worker   void (*fp2)() = DcheckEmptyFunction2;
341*6777b538SAndroid Build Coastguard Worker   void (*fp3)() = DcheckEmptyFunction1;
342*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(fp1, fp3);
343*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(mp1, &MemberFunctions::MemberFunction1);
344*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(mp2, &MemberFunctions::MemberFunction2);
345*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("=~Check failed: fp1 == fp2 \\(\\w+ vs. \\w+\\)",
346*6777b538SAndroid Build Coastguard Worker                 DCHECK_EQ(fp1, fp2));
347*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK(
348*6777b538SAndroid Build Coastguard Worker       "Check failed: mp2 == &MemberFunctions::MemberFunction1 (1 vs. 1)",
349*6777b538SAndroid Build Coastguard Worker       DCHECK_EQ(mp2, &MemberFunctions::MemberFunction1));
350*6777b538SAndroid Build Coastguard Worker }
351*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,DcheckReleaseBehavior)352*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, DcheckReleaseBehavior) {
353*6777b538SAndroid Build Coastguard Worker   int var1 = 1;
354*6777b538SAndroid Build Coastguard Worker   int var2 = 2;
355*6777b538SAndroid Build Coastguard Worker   int var3 = 3;
356*6777b538SAndroid Build Coastguard Worker   int var4 = 4;
357*6777b538SAndroid Build Coastguard Worker 
358*6777b538SAndroid Build Coastguard Worker   // No warnings about unused variables even though no check fires and DCHECK
359*6777b538SAndroid Build Coastguard Worker   // may or may not be enabled.
360*6777b538SAndroid Build Coastguard Worker   DCHECK(var1) << var2;
361*6777b538SAndroid Build Coastguard Worker   DPCHECK(var1) << var3;
362*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(var1, 1) << var4;
363*6777b538SAndroid Build Coastguard Worker }
364*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,DCheckEqStatements)365*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, DCheckEqStatements) {
366*6777b538SAndroid Build Coastguard Worker   bool reached = false;
367*6777b538SAndroid Build Coastguard Worker   if (false)
368*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(false, true);  // Unreached.
369*6777b538SAndroid Build Coastguard Worker   else
370*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(true, reached = true);  // Reached, passed.
371*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(DCHECK_IS_ON() ? true : false, reached);
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   if (false)
374*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(false, true);  // Unreached.
375*6777b538SAndroid Build Coastguard Worker }
376*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,CheckEqStatements)377*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, CheckEqStatements) {
378*6777b538SAndroid Build Coastguard Worker   bool reached = false;
379*6777b538SAndroid Build Coastguard Worker   if (false)
380*6777b538SAndroid Build Coastguard Worker     CHECK_EQ(false, true);  // Unreached.
381*6777b538SAndroid Build Coastguard Worker   else
382*6777b538SAndroid Build Coastguard Worker     CHECK_EQ(true, reached = true);  // Reached, passed.
383*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(reached);
384*6777b538SAndroid Build Coastguard Worker 
385*6777b538SAndroid Build Coastguard Worker   if (false)
386*6777b538SAndroid Build Coastguard Worker     CHECK_EQ(false, true);  // Unreached.
387*6777b538SAndroid Build Coastguard Worker }
388*6777b538SAndroid Build Coastguard Worker 
389*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
TEST(CheckDeathTest,ConfigurableDCheck)390*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, ConfigurableDCheck) {
391*6777b538SAndroid Build Coastguard Worker   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
392*6777b538SAndroid Build Coastguard Worker           "gtest_internal_run_death_test")) {
393*6777b538SAndroid Build Coastguard Worker     // This specific test relies on LOGGING_DCHECK not starting out as FATAL,
394*6777b538SAndroid Build Coastguard Worker     // even when run part of death tests (should die only after LOGGING_DCHECK
395*6777b538SAndroid Build Coastguard Worker     // gets reconfigured to FATAL below).
396*6777b538SAndroid Build Coastguard Worker     logging::LOGGING_DCHECK = logging::LOGGING_ERROR;
397*6777b538SAndroid Build Coastguard Worker   } else {
398*6777b538SAndroid Build Coastguard Worker     // Verify that DCHECKs default to non-fatal in configurable-DCHECK builds.
399*6777b538SAndroid Build Coastguard Worker     // Note that we require only that DCHECK is non-fatal by default, rather
400*6777b538SAndroid Build Coastguard Worker     // than requiring that it be exactly INFO, ERROR, etc level.
401*6777b538SAndroid Build Coastguard Worker     EXPECT_LT(logging::LOGGING_DCHECK, logging::LOGGING_FATAL);
402*6777b538SAndroid Build Coastguard Worker   }
403*6777b538SAndroid Build Coastguard Worker   DCHECK(false);
404*6777b538SAndroid Build Coastguard Worker 
405*6777b538SAndroid Build Coastguard Worker   // Verify that DCHECK* aren't hard-wired to crash on failure.
406*6777b538SAndroid Build Coastguard Worker   logging::LOGGING_DCHECK = logging::LOGGING_ERROR;
407*6777b538SAndroid Build Coastguard Worker   DCHECK(false);
408*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(1, 2);
409*6777b538SAndroid Build Coastguard Worker 
410*6777b538SAndroid Build Coastguard Worker   // Verify that DCHECK does crash if LOGGING_DCHECK is set to LOGGING_FATAL.
411*6777b538SAndroid Build Coastguard Worker   logging::LOGGING_DCHECK = logging::LOGGING_FATAL;
412*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: false. ", DCHECK(false));
413*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: 1 == 2 (1 vs. 2)", DCHECK_EQ(1, 2));
414*6777b538SAndroid Build Coastguard Worker }
415*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,ConfigurableDCheckFeature)416*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, ConfigurableDCheckFeature) {
417*6777b538SAndroid Build Coastguard Worker   // Initialize FeatureList with and without DcheckIsFatal, and verify the
418*6777b538SAndroid Build Coastguard Worker   // value of LOGGING_DCHECK. Note that we don't require that DCHECK take a
419*6777b538SAndroid Build Coastguard Worker   // specific value when the feature is off, only that it is non-fatal.
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker   {
422*6777b538SAndroid Build Coastguard Worker     base::test::ScopedFeatureList feature_list;
423*6777b538SAndroid Build Coastguard Worker     feature_list.InitFromCommandLine("DcheckIsFatal", "");
424*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(logging::LOGGING_DCHECK, logging::LOGGING_FATAL);
425*6777b538SAndroid Build Coastguard Worker   }
426*6777b538SAndroid Build Coastguard Worker 
427*6777b538SAndroid Build Coastguard Worker   {
428*6777b538SAndroid Build Coastguard Worker     base::test::ScopedFeatureList feature_list;
429*6777b538SAndroid Build Coastguard Worker     feature_list.InitFromCommandLine("", "DcheckIsFatal");
430*6777b538SAndroid Build Coastguard Worker     EXPECT_LT(logging::LOGGING_DCHECK, logging::LOGGING_FATAL);
431*6777b538SAndroid Build Coastguard Worker   }
432*6777b538SAndroid Build Coastguard Worker 
433*6777b538SAndroid Build Coastguard Worker   // The default case is last, so we leave LOGGING_DCHECK in the default state.
434*6777b538SAndroid Build Coastguard Worker   {
435*6777b538SAndroid Build Coastguard Worker     base::test::ScopedFeatureList feature_list;
436*6777b538SAndroid Build Coastguard Worker     feature_list.InitFromCommandLine("", "");
437*6777b538SAndroid Build Coastguard Worker     EXPECT_LT(logging::LOGGING_DCHECK, logging::LOGGING_FATAL);
438*6777b538SAndroid Build Coastguard Worker   }
439*6777b538SAndroid Build Coastguard Worker }
440*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(DCHECK_IS_CONFIGURABLE)
441*6777b538SAndroid Build Coastguard Worker 
442*6777b538SAndroid Build Coastguard Worker struct StructWithOstream {
operator ==__anon6bc9643c0111::StructWithOstream443*6777b538SAndroid Build Coastguard Worker   bool operator==(const StructWithOstream& o) const { return &o == this; }
444*6777b538SAndroid Build Coastguard Worker };
445*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM()
operator <<(std::ostream & out,const StructWithOstream &)446*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const StructWithOstream&) {
447*6777b538SAndroid Build Coastguard Worker   return out << "ostream";
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker #endif  // CHECK_WILL_STREAM()
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker struct StructWithToString {
operator ==__anon6bc9643c0111::StructWithToString452*6777b538SAndroid Build Coastguard Worker   bool operator==(const StructWithToString& o) const { return &o == this; }
ToString__anon6bc9643c0111::StructWithToString453*6777b538SAndroid Build Coastguard Worker   std::string ToString() const { return "ToString"; }
454*6777b538SAndroid Build Coastguard Worker };
455*6777b538SAndroid Build Coastguard Worker 
456*6777b538SAndroid Build Coastguard Worker struct StructWithToStringAndOstream {
operator ==__anon6bc9643c0111::StructWithToStringAndOstream457*6777b538SAndroid Build Coastguard Worker   bool operator==(const StructWithToStringAndOstream& o) const {
458*6777b538SAndroid Build Coastguard Worker     return &o == this;
459*6777b538SAndroid Build Coastguard Worker   }
ToString__anon6bc9643c0111::StructWithToStringAndOstream460*6777b538SAndroid Build Coastguard Worker   std::string ToString() const { return "ToString"; }
461*6777b538SAndroid Build Coastguard Worker };
462*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM()
operator <<(std::ostream & out,const StructWithToStringAndOstream &)463*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out,
464*6777b538SAndroid Build Coastguard Worker                          const StructWithToStringAndOstream&) {
465*6777b538SAndroid Build Coastguard Worker   return out << "ostream";
466*6777b538SAndroid Build Coastguard Worker }
467*6777b538SAndroid Build Coastguard Worker #endif  // CHECK_WILL_STREAM()
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker struct StructWithToStringNotStdString {
470*6777b538SAndroid Build Coastguard Worker   struct PseudoString {};
471*6777b538SAndroid Build Coastguard Worker 
operator ==__anon6bc9643c0111::StructWithToStringNotStdString472*6777b538SAndroid Build Coastguard Worker   bool operator==(const StructWithToStringNotStdString& o) const {
473*6777b538SAndroid Build Coastguard Worker     return &o == this;
474*6777b538SAndroid Build Coastguard Worker   }
ToString__anon6bc9643c0111::StructWithToStringNotStdString475*6777b538SAndroid Build Coastguard Worker   PseudoString ToString() const { return PseudoString(); }
476*6777b538SAndroid Build Coastguard Worker };
477*6777b538SAndroid Build Coastguard Worker #if CHECK_WILL_STREAM()
operator <<(std::ostream & out,const StructWithToStringNotStdString::PseudoString &)478*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out,
479*6777b538SAndroid Build Coastguard Worker                          const StructWithToStringNotStdString::PseudoString&) {
480*6777b538SAndroid Build Coastguard Worker   return out << "ToString+ostream";
481*6777b538SAndroid Build Coastguard Worker }
482*6777b538SAndroid Build Coastguard Worker #endif  // CHECK_WILL_STREAM()
483*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,OstreamVsToString)484*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, OstreamVsToString) {
485*6777b538SAndroid Build Coastguard Worker   StructWithOstream a, b;
486*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a == b (ostream vs. ostream)", CHECK_EQ(a, b));
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker   StructWithToString c, d;
489*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: c == d (ToString vs. ToString)", CHECK_EQ(c, d));
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   StructWithToStringAndOstream e, f;
492*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: e == f (ostream vs. ostream)", CHECK_EQ(e, f));
493*6777b538SAndroid Build Coastguard Worker 
494*6777b538SAndroid Build Coastguard Worker   StructWithToStringNotStdString g, h;
495*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: g == h (ToString+ostream vs. ToString+ostream)",
496*6777b538SAndroid Build Coastguard Worker                CHECK_EQ(g, h));
497*6777b538SAndroid Build Coastguard Worker }
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker // This non-void function is here to make sure that NOTREACHED_NORETURN() is
500*6777b538SAndroid Build Coastguard Worker // properly annotated as [[noreturn]] and does not require a return statement.
NotReachedNoreturnInFunction()501*6777b538SAndroid Build Coastguard Worker int NotReachedNoreturnInFunction() {
502*6777b538SAndroid Build Coastguard Worker   NOTREACHED_NORETURN();
503*6777b538SAndroid Build Coastguard Worker   // No return statement here.
504*6777b538SAndroid Build Coastguard Worker }
505*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,NotReached)506*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, NotReached) {
507*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
508*6777b538SAndroid Build Coastguard Worker   // This specific death test relies on LOGGING_DCHECK not being FATAL, even
509*6777b538SAndroid Build Coastguard Worker   // when run as part of a death test.
510*6777b538SAndroid Build Coastguard Worker   ScopedDcheckSeverity dcheck_severity(logging::LOGGING_ERROR);
511*6777b538SAndroid Build Coastguard Worker #endif
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
514*6777b538SAndroid Build Coastguard Worker   // Expect a DCHECK with streamed params intact.
515*6777b538SAndroid Build Coastguard Worker   EXPECT_DCHECK("Check failed: false. foo", NOTREACHED() << "foo");
516*6777b538SAndroid Build Coastguard Worker #elif CHECK_WILL_STREAM() || BUILDFLAG(ENABLE_LOG_ERROR_NOT_REACHED)
517*6777b538SAndroid Build Coastguard Worker   // This block makes sure that base::Location::Current() returns non-dummy
518*6777b538SAndroid Build Coastguard Worker   // values for file_name() and line_number(). This is necessary to avoid a
519*6777b538SAndroid Build Coastguard Worker   // false negative inside EXPECT_LOG_ERROR_WITH_FILENAME() where we exhonorate
520*6777b538SAndroid Build Coastguard Worker   // the NOTREACHED() macro below even though it didn't provide the expected
521*6777b538SAndroid Build Coastguard Worker   // filename and line numbers.
522*6777b538SAndroid Build Coastguard Worker   // See EXPECT_LOG_ERROR_WITH_FILENAME() for the exclusion of "" and -1.
523*6777b538SAndroid Build Coastguard Worker   ASSERT_NE(base::Location::Current().file_name(), nullptr);
524*6777b538SAndroid Build Coastguard Worker   EXPECT_STRNE(base::Location::Current().file_name(), "");
525*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(base::Location::Current().line_number(), -1);
526*6777b538SAndroid Build Coastguard Worker   // Expect LOG(ERROR) that looks like CHECK(false) with streamed params intact.
527*6777b538SAndroid Build Coastguard Worker   // Note that this implementation uses base::Location::Current() which doesn't
528*6777b538SAndroid Build Coastguard Worker   // match __FILE__ (strips ../../ prefix) and __LINE__ (uses __builtin_LINE()).
529*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),
530*6777b538SAndroid Build Coastguard Worker                                  base::Location::Current().line_number(),
531*6777b538SAndroid Build Coastguard Worker                                  NOTREACHED() << "foo",
532*6777b538SAndroid Build Coastguard Worker                                  "Check failed: false. foo\n");
533*6777b538SAndroid Build Coastguard Worker #else
534*6777b538SAndroid Build Coastguard Worker   // Expect LOG(ERROR) that looks like CHECK(false) without file or line intact.
535*6777b538SAndroid Build Coastguard Worker   // We use `""` and `-1` to not expect a specific filename or line number.
536*6777b538SAndroid Build Coastguard Worker   // The actual location comes from
537*6777b538SAndroid Build Coastguard Worker   // logging::NotReachedError::TriggerNotReached() but we have no good way of
538*6777b538SAndroid Build Coastguard Worker   // asserting what that filename or line number is from here.
539*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME("", -1, NOTREACHED() << "foo",
540*6777b538SAndroid Build Coastguard Worker                                  "Check failed: false. NOTREACHED log messages "
541*6777b538SAndroid Build Coastguard Worker                                  "are omitted in official builds. Sorry!\n");
542*6777b538SAndroid Build Coastguard Worker #endif
543*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(NotReachedNoreturnInFunction(),
544*6777b538SAndroid Build Coastguard Worker                             CHECK_WILL_STREAM() ? "NOTREACHED hit. " : "");
545*6777b538SAndroid Build Coastguard Worker }
546*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,NotReachedFatalExperiment)547*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, NotReachedFatalExperiment) {
548*6777b538SAndroid Build Coastguard Worker   base::test::ScopedFeatureList feature_list(
549*6777b538SAndroid Build Coastguard Worker       base::features::kNotReachedIsFatal);
550*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK_DEATH(NOTREACHED());
551*6777b538SAndroid Build Coastguard Worker }
552*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,DumpWillBeCheck)553*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, DumpWillBeCheck) {
554*6777b538SAndroid Build Coastguard Worker   DUMP_WILL_BE_CHECK(true);
555*6777b538SAndroid Build Coastguard Worker 
556*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: false. foo",
557*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_CHECK(false) << "foo");
558*6777b538SAndroid Build Coastguard Worker }
559*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,DumpWillBeNotReachedNoreturn)560*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, DumpWillBeNotReachedNoreturn) {
561*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("NOTREACHED hit. foo",
562*6777b538SAndroid Build Coastguard Worker                             DUMP_WILL_BE_NOTREACHED_NORETURN() << "foo");
563*6777b538SAndroid Build Coastguard Worker }
564*6777b538SAndroid Build Coastguard Worker 
565*6777b538SAndroid Build Coastguard Worker static const std::string kNotImplementedMessage = "Not implemented reached in ";
566*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,NotImplemented)567*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, NotImplemented) {
568*6777b538SAndroid Build Coastguard Worker   static const std::string expected_msg =
569*6777b538SAndroid Build Coastguard Worker       kNotImplementedMessage + __PRETTY_FUNCTION__;
570*6777b538SAndroid Build Coastguard Worker 
571*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
572*6777b538SAndroid Build Coastguard Worker   // Expect LOG(ERROR) with streamed params intact.
573*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),
574*6777b538SAndroid Build Coastguard Worker                                  base::Location::Current().line_number(),
575*6777b538SAndroid Build Coastguard Worker                                  NOTIMPLEMENTED() << "foo",
576*6777b538SAndroid Build Coastguard Worker                                  expected_msg + "foo\n");
577*6777b538SAndroid Build Coastguard Worker #else
578*6777b538SAndroid Build Coastguard Worker   // Expect nothing.
579*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NOTIMPLEMENTED() << "foo");
580*6777b538SAndroid Build Coastguard Worker #endif
581*6777b538SAndroid Build Coastguard Worker }
582*6777b538SAndroid Build Coastguard Worker 
NiLogOnce()583*6777b538SAndroid Build Coastguard Worker void NiLogOnce() {
584*6777b538SAndroid Build Coastguard Worker   NOTIMPLEMENTED_LOG_ONCE();
585*6777b538SAndroid Build Coastguard Worker }
586*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,NotImplementedLogOnce)587*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, NotImplementedLogOnce) {
588*6777b538SAndroid Build Coastguard Worker   static const std::string expected_msg =
589*6777b538SAndroid Build Coastguard Worker       kNotImplementedMessage + "void (anonymous namespace)::NiLogOnce()\n";
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
592*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),
593*6777b538SAndroid Build Coastguard Worker                                  base::Location::Current().line_number() - 10,
594*6777b538SAndroid Build Coastguard Worker                                  NiLogOnce(), expected_msg);
595*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NiLogOnce());
596*6777b538SAndroid Build Coastguard Worker #else
597*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NiLogOnce());
598*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NiLogOnce());
599*6777b538SAndroid Build Coastguard Worker #endif
600*6777b538SAndroid Build Coastguard Worker }
601*6777b538SAndroid Build Coastguard Worker 
NiLogTenTimesWithStream()602*6777b538SAndroid Build Coastguard Worker void NiLogTenTimesWithStream() {
603*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 10; ++i) {
604*6777b538SAndroid Build Coastguard Worker     NOTIMPLEMENTED_LOG_ONCE() << " iteration: " << i;
605*6777b538SAndroid Build Coastguard Worker   }
606*6777b538SAndroid Build Coastguard Worker }
607*6777b538SAndroid Build Coastguard Worker 
TEST(CheckTest,NotImplementedLogOnceWithStreamedParams)608*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, NotImplementedLogOnceWithStreamedParams) {
609*6777b538SAndroid Build Coastguard Worker   static const std::string expected_msg1 =
610*6777b538SAndroid Build Coastguard Worker       kNotImplementedMessage +
611*6777b538SAndroid Build Coastguard Worker       "void (anonymous namespace)::NiLogTenTimesWithStream() iteration: 0\n";
612*6777b538SAndroid Build Coastguard Worker 
613*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
614*6777b538SAndroid Build Coastguard Worker   // Expect LOG(ERROR) with streamed params intact, exactly once.
615*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),
616*6777b538SAndroid Build Coastguard Worker                                  base::Location::Current().line_number() - 13,
617*6777b538SAndroid Build Coastguard Worker                                  NiLogTenTimesWithStream(), expected_msg1);
618*6777b538SAndroid Build Coastguard Worker   // A different NOTIMPLEMENTED_LOG_ONCE() call is still logged.
619*6777b538SAndroid Build Coastguard Worker   static const std::string expected_msg2 =
620*6777b538SAndroid Build Coastguard Worker       kNotImplementedMessage + __PRETTY_FUNCTION__ + "tree fish\n";
621*6777b538SAndroid Build Coastguard Worker   EXPECT_LOG_ERROR_WITH_FILENAME(base::Location::Current().file_name(),
622*6777b538SAndroid Build Coastguard Worker                                  base::Location::Current().line_number(),
623*6777b538SAndroid Build Coastguard Worker                                  NOTIMPLEMENTED_LOG_ONCE() << "tree fish",
624*6777b538SAndroid Build Coastguard Worker                                  expected_msg2);
625*6777b538SAndroid Build Coastguard Worker 
626*6777b538SAndroid Build Coastguard Worker #else
627*6777b538SAndroid Build Coastguard Worker   // Expect nothing.
628*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NiLogTenTimesWithStream());
629*6777b538SAndroid Build Coastguard Worker   EXPECT_NO_LOG(NOTIMPLEMENTED_LOG_ONCE() << "tree fish");
630*6777b538SAndroid Build Coastguard Worker #endif
631*6777b538SAndroid Build Coastguard Worker }
632*6777b538SAndroid Build Coastguard Worker 
633*6777b538SAndroid Build Coastguard Worker // Test CHECK_DEREF of `T*`
TEST(CheckTest,CheckDerefOfPointer)634*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, CheckDerefOfPointer) {
635*6777b538SAndroid Build Coastguard Worker   std::string pointee = "not-null";
636*6777b538SAndroid Build Coastguard Worker   std::string* value_pointer = &pointee;
637*6777b538SAndroid Build Coastguard Worker 
638*6777b538SAndroid Build Coastguard Worker   auto& deref_result = CHECK_DEREF(value_pointer);
639*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_lvalue_reference_v<decltype(deref_result)>);
640*6777b538SAndroid Build Coastguard Worker   // Compare the pointers to ensure they are the same object (and not a copy)
641*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(&deref_result, &pointee);
642*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(deref_result), std::string&>);
643*6777b538SAndroid Build Coastguard Worker }
644*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,CheckDerefOfNullPointer)645*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, CheckDerefOfNullPointer) {
646*6777b538SAndroid Build Coastguard Worker   std::string* null_pointer = nullptr;
647*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: null_pointer != nullptr. ",
648*6777b538SAndroid Build Coastguard Worker                CHECK_DEREF(null_pointer));
649*6777b538SAndroid Build Coastguard Worker }
650*6777b538SAndroid Build Coastguard Worker 
651*6777b538SAndroid Build Coastguard Worker // Test CHECK_DEREF of `const T*`
TEST(CheckTest,CheckDerefOfConstPointer)652*6777b538SAndroid Build Coastguard Worker TEST(CheckTest, CheckDerefOfConstPointer) {
653*6777b538SAndroid Build Coastguard Worker   std::string pointee = "not-null";
654*6777b538SAndroid Build Coastguard Worker   const std::string* const_value_pointer = &pointee;
655*6777b538SAndroid Build Coastguard Worker 
656*6777b538SAndroid Build Coastguard Worker   auto& deref_result = CHECK_DEREF(const_value_pointer);
657*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_lvalue_reference_v<decltype(deref_result)>);
658*6777b538SAndroid Build Coastguard Worker   // Compare the pointers to ensure they are the same object (and not a copy)
659*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(&deref_result, &pointee);
660*6777b538SAndroid Build Coastguard Worker   static_assert(std::is_same_v<decltype(deref_result), const std::string&>);
661*6777b538SAndroid Build Coastguard Worker }
662*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,CheckDerefOfConstNullPointer)663*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, CheckDerefOfConstNullPointer) {
664*6777b538SAndroid Build Coastguard Worker   std::string* const_null_pointer = nullptr;
665*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: const_null_pointer != nullptr. ",
666*6777b538SAndroid Build Coastguard Worker                CHECK_DEREF(const_null_pointer));
667*6777b538SAndroid Build Coastguard Worker }
668*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,CheckNotFatalUntil)669*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, CheckNotFatalUntil) {
670*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
671*6777b538SAndroid Build Coastguard Worker   // This specific death test relies on LOGGING_DCHECK not being FATAL, even
672*6777b538SAndroid Build Coastguard Worker   // when run as part of a death test, as CHECK with a milestone acts like a
673*6777b538SAndroid Build Coastguard Worker   // DCHECK.
674*6777b538SAndroid Build Coastguard Worker   ScopedDcheckSeverity dcheck_severity(logging::LOGGING_ERROR);
675*6777b538SAndroid Build Coastguard Worker #endif
676*6777b538SAndroid Build Coastguard Worker 
677*6777b538SAndroid Build Coastguard Worker   // Next milestone not yet fatal.
678*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: false. foo",
679*6777b538SAndroid Build Coastguard Worker                             CHECK(false, kNextMilestone) << "foo");
680*6777b538SAndroid Build Coastguard Worker 
681*6777b538SAndroid Build Coastguard Worker   // Fatal in current major version.
682*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: false. foo", CHECK(false, kCurrentMilestone)
683*6777b538SAndroid Build Coastguard Worker                                                << "foo");
684*6777b538SAndroid Build Coastguard Worker }
685*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,CheckOpNotFatalUntil)686*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, CheckOpNotFatalUntil) {
687*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
688*6777b538SAndroid Build Coastguard Worker   // This specific death test relies on LOGGING_DCHECK not being FATAL, even
689*6777b538SAndroid Build Coastguard Worker   // when run as part of a death test, as CHECK with a milestone acts like a
690*6777b538SAndroid Build Coastguard Worker   // DCHECK.
691*6777b538SAndroid Build Coastguard Worker   ScopedDcheckSeverity dcheck_severity(logging::LOGGING_ERROR);
692*6777b538SAndroid Build Coastguard Worker #endif
693*6777b538SAndroid Build Coastguard Worker   const int a = 1, b = 2;
694*6777b538SAndroid Build Coastguard Worker 
695*6777b538SAndroid Build Coastguard Worker   // Next milestone not yet fatal.
696*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a == b (1 vs. 2)",
697*6777b538SAndroid Build Coastguard Worker                             CHECK_EQ(a, b, kNextMilestone));
698*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a != a (1 vs. 1)",
699*6777b538SAndroid Build Coastguard Worker                             CHECK_NE(a, a, kNextMilestone));
700*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: b <= a (2 vs. 1)",
701*6777b538SAndroid Build Coastguard Worker                             CHECK_LE(b, a, kNextMilestone));
702*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: b < a (2 vs. 1)",
703*6777b538SAndroid Build Coastguard Worker                             CHECK_LT(b, a, kNextMilestone));
704*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a >= b (1 vs. 2)",
705*6777b538SAndroid Build Coastguard Worker                             CHECK_GE(a, b, kNextMilestone));
706*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: a > b (1 vs. 2)",
707*6777b538SAndroid Build Coastguard Worker                             CHECK_GT(a, b, kNextMilestone));
708*6777b538SAndroid Build Coastguard Worker 
709*6777b538SAndroid Build Coastguard Worker   // Fatal in current major version.
710*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a == b (1 vs. 2)",
711*6777b538SAndroid Build Coastguard Worker                CHECK_EQ(a, b, kCurrentMilestone));
712*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a != a (1 vs. 1)",
713*6777b538SAndroid Build Coastguard Worker                CHECK_NE(a, a, kCurrentMilestone));
714*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: b <= a (2 vs. 1)",
715*6777b538SAndroid Build Coastguard Worker                CHECK_LE(b, a, kCurrentMilestone));
716*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: b < a (2 vs. 1)",
717*6777b538SAndroid Build Coastguard Worker                CHECK_LT(b, a, kCurrentMilestone));
718*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a >= b (1 vs. 2)",
719*6777b538SAndroid Build Coastguard Worker                CHECK_GE(a, b, kCurrentMilestone));
720*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: a > b (1 vs. 2)",
721*6777b538SAndroid Build Coastguard Worker                CHECK_GT(a, b, kCurrentMilestone));
722*6777b538SAndroid Build Coastguard Worker }
723*6777b538SAndroid Build Coastguard Worker 
TEST(CheckDeathTest,NotReachedNotFatalUntil)724*6777b538SAndroid Build Coastguard Worker TEST(CheckDeathTest, NotReachedNotFatalUntil) {
725*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
726*6777b538SAndroid Build Coastguard Worker   // This specific death test relies on LOGGING_DCHECK not being FATAL, even
727*6777b538SAndroid Build Coastguard Worker   // when run as part of a death test, as CHECK with a milestone acts like a
728*6777b538SAndroid Build Coastguard Worker   // DCHECK.
729*6777b538SAndroid Build Coastguard Worker   ScopedDcheckSeverity dcheck_severity(logging::LOGGING_ERROR);
730*6777b538SAndroid Build Coastguard Worker #endif
731*6777b538SAndroid Build Coastguard Worker 
732*6777b538SAndroid Build Coastguard Worker   // Next milestone not yet fatal.
733*6777b538SAndroid Build Coastguard Worker   EXPECT_DUMP_WILL_BE_CHECK("Check failed: false. foo",
734*6777b538SAndroid Build Coastguard Worker                             NOTREACHED(kNextMilestone) << "foo");
735*6777b538SAndroid Build Coastguard Worker 
736*6777b538SAndroid Build Coastguard Worker   // Fatal in current major version.
737*6777b538SAndroid Build Coastguard Worker   EXPECT_CHECK("Check failed: false. foo", NOTREACHED(kCurrentMilestone)
738*6777b538SAndroid Build Coastguard Worker                                                << "foo");
739*6777b538SAndroid Build Coastguard Worker }
740*6777b538SAndroid Build Coastguard Worker 
741*6777b538SAndroid Build Coastguard Worker }  // namespace
742