1 //
2 // Copyright 2022 The Abseil Authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // https://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15
16 #ifndef ABSL_LOG_CHECK_TEST_IMPL_H_
17 #define ABSL_LOG_CHECK_TEST_IMPL_H_
18
19 // Verify that both sets of macros behave identically by parameterizing the
20 // entire test file.
21 #ifndef ABSL_TEST_CHECK
22 #error ABSL_TEST_CHECK must be defined for these tests to work.
23 #endif
24
25 #include <ostream>
26 #include <string>
27
28 #include "gmock/gmock.h"
29 #include "gtest/gtest.h"
30 #include "absl/base/attributes.h"
31 #include "absl/base/config.h"
32 #include "absl/log/internal/test_helpers.h"
33 #include "absl/status/status.h"
34
35 // NOLINTBEGIN(misc-definitions-in-headers)
36
37 namespace absl_log_internal {
38
39 using ::testing::AllOf;
40 using ::testing::HasSubstr;
41 using ::testing::Not;
42
43 auto* test_env ABSL_ATTRIBUTE_UNUSED = ::testing::AddGlobalTestEnvironment(
44 new absl::log_internal::LogTestEnvironment);
45
46 #if GTEST_HAS_DEATH_TEST
47
TEST(CHECKDeathTest,TestBasicValues)48 TEST(CHECKDeathTest, TestBasicValues) {
49 ABSL_TEST_CHECK(true);
50
51 EXPECT_DEATH(ABSL_TEST_CHECK(false), "Check failed: false");
52
53 int i = 2;
54 ABSL_TEST_CHECK(i != 3); // NOLINT
55 }
56
57 #endif // GTEST_HAS_DEATH_TEST
58
TEST(CHECKTest,TestLogicExpressions)59 TEST(CHECKTest, TestLogicExpressions) {
60 int i = 5;
61 ABSL_TEST_CHECK(i > 0 && i < 10);
62 ABSL_TEST_CHECK(i < 0 || i > 3);
63 }
64
65 #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
66 ABSL_CONST_INIT const auto global_var_check = [](int i) {
67 ABSL_TEST_CHECK(i > 0); // NOLINT
68 return i + 1;
69 }(3);
70
71 ABSL_CONST_INIT const auto global_var = [](int i) {
72 ABSL_TEST_CHECK_GE(i, 0); // NOLINT
73 return i + 1;
74 }(global_var_check);
75 #endif // ABSL_INTERNAL_CPLUSPLUS_LANG
76
TEST(CHECKTest,TestPlacementsInCompoundStatements)77 TEST(CHECKTest, TestPlacementsInCompoundStatements) {
78 // check placement inside if/else clauses
79 if (true) ABSL_TEST_CHECK(true);
80
81 if (false)
82 ; // NOLINT
83 else
84 ABSL_TEST_CHECK(true);
85
86 switch (0)
87 case 0:
88 ABSL_TEST_CHECK(true); // NOLINT
89
90 #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
91 constexpr auto var = [](int i) {
92 ABSL_TEST_CHECK(i > 0); // NOLINT
93 return i + 1;
94 }(global_var);
95 (void)var;
96 #endif // ABSL_INTERNAL_CPLUSPLUS_LANG
97 }
98
TEST(CHECKTest,TestBoolConvertible)99 TEST(CHECKTest, TestBoolConvertible) {
100 struct Tester {
101 } tester;
102 ABSL_TEST_CHECK([&]() { return &tester; }());
103 }
104
105 #if GTEST_HAS_DEATH_TEST
106
TEST(CHECKDeathTest,TestChecksWithSideEffects)107 TEST(CHECKDeathTest, TestChecksWithSideEffects) {
108 int var = 0;
109 ABSL_TEST_CHECK([&var]() {
110 ++var;
111 return true;
112 }());
113 EXPECT_EQ(var, 1);
114
115 EXPECT_DEATH(ABSL_TEST_CHECK([&var]() {
116 ++var;
117 return false;
118 }()) << var,
119 "Check failed: .* 2");
120 }
121
122 #endif // GTEST_HAS_DEATH_TEST
123
124 template <int a, int b>
sum()125 constexpr int sum() {
126 return a + b;
127 }
128 #define MACRO_ONE 1
129 #define TEMPLATE_SUM(a, b) sum<a, b>()
130 #define CONCAT(a, b) a b
131 #define IDENTITY(x) x
132
TEST(CHECKTest,TestPassingMacroExpansion)133 TEST(CHECKTest, TestPassingMacroExpansion) {
134 ABSL_TEST_CHECK(IDENTITY(true));
135 ABSL_TEST_CHECK_EQ(TEMPLATE_SUM(MACRO_ONE, 2), 3);
136 ABSL_TEST_CHECK_STREQ(CONCAT("x", "y"), "xy");
137 }
138
139 #if GTEST_HAS_DEATH_TEST
140
TEST(CHECKTest,TestMacroExpansionInMessage)141 TEST(CHECKTest, TestMacroExpansionInMessage) {
142 auto MessageGen = []() { ABSL_TEST_CHECK(IDENTITY(false)); };
143 EXPECT_DEATH(MessageGen(), HasSubstr("IDENTITY(false)"));
144 }
145
TEST(CHECKTest,TestNestedMacroExpansionInMessage)146 TEST(CHECKTest, TestNestedMacroExpansionInMessage) {
147 EXPECT_DEATH(ABSL_TEST_CHECK(IDENTITY(false)), HasSubstr("IDENTITY(false)"));
148 }
149
TEST(CHECKTest,TestMacroExpansionCompare)150 TEST(CHECKTest, TestMacroExpansionCompare) {
151 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(IDENTITY(false), IDENTITY(true)),
152 HasSubstr("IDENTITY(false) == IDENTITY(true)"));
153 EXPECT_DEATH(ABSL_TEST_CHECK_GT(IDENTITY(1), IDENTITY(2)),
154 HasSubstr("IDENTITY(1) > IDENTITY(2)"));
155 }
156
TEST(CHECKTest,TestMacroExpansionStrCompare)157 TEST(CHECKTest, TestMacroExpansionStrCompare) {
158 EXPECT_DEATH(ABSL_TEST_CHECK_STREQ(IDENTITY("x"), IDENTITY("y")),
159 HasSubstr("IDENTITY(\"x\") == IDENTITY(\"y\")"));
160 EXPECT_DEATH(ABSL_TEST_CHECK_STRCASENE(IDENTITY("a"), IDENTITY("A")),
161 HasSubstr("IDENTITY(\"a\") != IDENTITY(\"A\")"));
162 }
163
TEST(CHECKTest,TestMacroExpansionStatus)164 TEST(CHECKTest, TestMacroExpansionStatus) {
165 EXPECT_DEATH(
166 ABSL_TEST_CHECK_OK(IDENTITY(absl::FailedPreconditionError("message"))),
167 HasSubstr("IDENTITY(absl::FailedPreconditionError(\"message\"))"));
168 }
169
TEST(CHECKTest,TestMacroExpansionComma)170 TEST(CHECKTest, TestMacroExpansionComma) {
171 EXPECT_DEATH(ABSL_TEST_CHECK(TEMPLATE_SUM(MACRO_ONE, 2) == 4),
172 HasSubstr("TEMPLATE_SUM(MACRO_ONE, 2) == 4"));
173 }
174
TEST(CHECKTest,TestMacroExpansionCommaCompare)175 TEST(CHECKTest, TestMacroExpansionCommaCompare) {
176 EXPECT_DEATH(
177 ABSL_TEST_CHECK_EQ(TEMPLATE_SUM(2, MACRO_ONE), TEMPLATE_SUM(3, 2)),
178 HasSubstr("TEMPLATE_SUM(2, MACRO_ONE) == TEMPLATE_SUM(3, 2)"));
179 EXPECT_DEATH(
180 ABSL_TEST_CHECK_GT(TEMPLATE_SUM(2, MACRO_ONE), TEMPLATE_SUM(3, 2)),
181 HasSubstr("TEMPLATE_SUM(2, MACRO_ONE) > TEMPLATE_SUM(3, 2)"));
182 }
183
TEST(CHECKTest,TestMacroExpansionCommaStrCompare)184 TEST(CHECKTest, TestMacroExpansionCommaStrCompare) {
185 EXPECT_DEATH(ABSL_TEST_CHECK_STREQ(CONCAT("x", "y"), "z"),
186 HasSubstr("CONCAT(\"x\", \"y\") == \"z\""));
187 EXPECT_DEATH(ABSL_TEST_CHECK_STRNE(CONCAT("x", "y"), "xy"),
188 HasSubstr("CONCAT(\"x\", \"y\") != \"xy\""));
189 }
190
191 #endif // GTEST_HAS_DEATH_TEST
192
193 #undef TEMPLATE_SUM
194 #undef CONCAT
195 #undef MACRO
196 #undef ONE
197
198 #if GTEST_HAS_DEATH_TEST
199
TEST(CHECKDeachTest,TestOrderOfInvocationsBetweenCheckAndMessage)200 TEST(CHECKDeachTest, TestOrderOfInvocationsBetweenCheckAndMessage) {
201 int counter = 0;
202
203 auto GetStr = [&counter]() -> std::string {
204 return counter++ == 0 ? "" : "non-empty";
205 };
206
207 EXPECT_DEATH(ABSL_TEST_CHECK(!GetStr().empty()) << GetStr(),
208 HasSubstr("non-empty"));
209 }
210
TEST(CHECKTest,TestSecondaryFailure)211 TEST(CHECKTest, TestSecondaryFailure) {
212 auto FailingRoutine = []() {
213 ABSL_TEST_CHECK(false) << "Secondary";
214 return false;
215 };
216 EXPECT_DEATH(ABSL_TEST_CHECK(FailingRoutine()) << "Primary",
217 AllOf(HasSubstr("Secondary"), Not(HasSubstr("Primary"))));
218 }
219
TEST(CHECKTest,TestSecondaryFailureInMessage)220 TEST(CHECKTest, TestSecondaryFailureInMessage) {
221 auto MessageGen = []() {
222 ABSL_TEST_CHECK(false) << "Secondary";
223 return "Primary";
224 };
225 EXPECT_DEATH(ABSL_TEST_CHECK(false) << MessageGen(),
226 AllOf(HasSubstr("Secondary"), Not(HasSubstr("Primary"))));
227 }
228
229 #endif // GTEST_HAS_DEATH_TEST
230
TEST(CHECKTest,TestBinaryChecksWithPrimitives)231 TEST(CHECKTest, TestBinaryChecksWithPrimitives) {
232 ABSL_TEST_CHECK_EQ(1, 1);
233 ABSL_TEST_CHECK_NE(1, 2);
234 ABSL_TEST_CHECK_GE(1, 1);
235 ABSL_TEST_CHECK_GE(2, 1);
236 ABSL_TEST_CHECK_LE(1, 1);
237 ABSL_TEST_CHECK_LE(1, 2);
238 ABSL_TEST_CHECK_GT(2, 1);
239 ABSL_TEST_CHECK_LT(1, 2);
240 }
241
242 // For testing using CHECK*() on anonymous enums.
243 enum { CASE_A, CASE_B };
244
TEST(CHECKTest,TestBinaryChecksWithEnumValues)245 TEST(CHECKTest, TestBinaryChecksWithEnumValues) {
246 // Tests using CHECK*() on anonymous enums.
247 ABSL_TEST_CHECK_EQ(CASE_A, CASE_A);
248 ABSL_TEST_CHECK_NE(CASE_A, CASE_B);
249 ABSL_TEST_CHECK_GE(CASE_A, CASE_A);
250 ABSL_TEST_CHECK_GE(CASE_B, CASE_A);
251 ABSL_TEST_CHECK_LE(CASE_A, CASE_A);
252 ABSL_TEST_CHECK_LE(CASE_A, CASE_B);
253 ABSL_TEST_CHECK_GT(CASE_B, CASE_A);
254 ABSL_TEST_CHECK_LT(CASE_A, CASE_B);
255 }
256
TEST(CHECKTest,TestBinaryChecksWithNullptr)257 TEST(CHECKTest, TestBinaryChecksWithNullptr) {
258 const void* p_null = nullptr;
259 const void* p_not_null = &p_null;
260 ABSL_TEST_CHECK_EQ(p_null, nullptr);
261 ABSL_TEST_CHECK_EQ(nullptr, p_null);
262 ABSL_TEST_CHECK_NE(p_not_null, nullptr);
263 ABSL_TEST_CHECK_NE(nullptr, p_not_null);
264 }
265
266 #if GTEST_HAS_DEATH_TEST
267
268 // Test logging of various char-typed values by failing CHECK*().
TEST(CHECKDeathTest,TestComparingCharsValues)269 TEST(CHECKDeathTest, TestComparingCharsValues) {
270 {
271 char a = ';';
272 char b = 'b';
273 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
274 "Check failed: a == b \\(';' vs. 'b'\\)");
275 b = 1;
276 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
277 "Check failed: a == b \\(';' vs. char value 1\\)");
278 }
279 {
280 signed char a = ';';
281 signed char b = 'b';
282 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
283 "Check failed: a == b \\(';' vs. 'b'\\)");
284 b = -128;
285 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
286 "Check failed: a == b \\(';' vs. signed char value -128\\)");
287 }
288 {
289 unsigned char a = ';';
290 unsigned char b = 'b';
291 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
292 "Check failed: a == b \\(';' vs. 'b'\\)");
293 b = 128;
294 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
295 "Check failed: a == b \\(';' vs. unsigned char value 128\\)");
296 }
297 }
298
TEST(CHECKDeathTest,TestNullValuesAreReportedCleanly)299 TEST(CHECKDeathTest, TestNullValuesAreReportedCleanly) {
300 const char* a = nullptr;
301 const char* b = nullptr;
302 EXPECT_DEATH(ABSL_TEST_CHECK_NE(a, b),
303 "Check failed: a != b \\(\\(null\\) vs. \\(null\\)\\)");
304
305 a = "xx";
306 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(a, b),
307 "Check failed: a == b \\(xx vs. \\(null\\)\\)");
308 EXPECT_DEATH(ABSL_TEST_CHECK_EQ(b, a),
309 "Check failed: b == a \\(\\(null\\) vs. xx\\)");
310
311 std::nullptr_t n{};
312 EXPECT_DEATH(ABSL_TEST_CHECK_NE(n, nullptr),
313 "Check failed: n != nullptr \\(\\(null\\) vs. \\(null\\)\\)");
314 }
315
316 #endif // GTEST_HAS_DEATH_TEST
317
TEST(CHECKTest,TestSTREQ)318 TEST(CHECKTest, TestSTREQ) {
319 ABSL_TEST_CHECK_STREQ("this", "this");
320 ABSL_TEST_CHECK_STREQ(nullptr, nullptr);
321 ABSL_TEST_CHECK_STRCASEEQ("this", "tHiS");
322 ABSL_TEST_CHECK_STRCASEEQ(nullptr, nullptr);
323 ABSL_TEST_CHECK_STRNE("this", "tHiS");
324 ABSL_TEST_CHECK_STRNE("this", nullptr);
325 ABSL_TEST_CHECK_STRCASENE("this", "that");
326 ABSL_TEST_CHECK_STRCASENE(nullptr, "that");
327 ABSL_TEST_CHECK_STREQ((std::string("a") + "b").c_str(), "ab");
328 ABSL_TEST_CHECK_STREQ(std::string("test").c_str(),
329 (std::string("te") + std::string("st")).c_str());
330 }
331
TEST(CHECKTest,TestComparisonPlacementsInCompoundStatements)332 TEST(CHECKTest, TestComparisonPlacementsInCompoundStatements) {
333 // check placement inside if/else clauses
334 if (true) ABSL_TEST_CHECK_EQ(1, 1);
335 if (true) ABSL_TEST_CHECK_STREQ("c", "c");
336
337 if (false)
338 ; // NOLINT
339 else
340 ABSL_TEST_CHECK_LE(0, 1);
341
342 if (false)
343 ; // NOLINT
344 else
345 ABSL_TEST_CHECK_STRNE("a", "b");
346
347 switch (0)
348 case 0:
349 ABSL_TEST_CHECK_NE(1, 0);
350
351 switch (0)
352 case 0:
353 ABSL_TEST_CHECK_STRCASEEQ("A", "a");
354
355 #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
356 constexpr auto var = [](int i) {
357 ABSL_TEST_CHECK_GT(i, 0);
358 return i + 1;
359 }(global_var);
360 (void)var;
361
362 // CHECK_STR... checks are not supported in constexpr routines.
363 // constexpr auto var2 = [](int i) {
364 // ABSL_TEST_CHECK_STRNE("c", "d");
365 // return i + 1;
366 // }(global_var);
367
368 #if defined(__GNUC__)
369 int var3 = (({ ABSL_TEST_CHECK_LE(1, 2); }), global_var < 10) ? 1 : 0;
370 (void)var3;
371
372 int var4 = (({ ABSL_TEST_CHECK_STREQ("a", "a"); }), global_var < 10) ? 1 : 0;
373 (void)var4;
374 #endif // __GNUC__
375 #endif // ABSL_INTERNAL_CPLUSPLUS_LANG
376 }
377
TEST(CHECKTest,TestDCHECK)378 TEST(CHECKTest, TestDCHECK) {
379 #ifdef NDEBUG
380 ABSL_TEST_DCHECK(1 == 2) << " DCHECK's shouldn't be compiled in normal mode";
381 #endif
382 ABSL_TEST_DCHECK(1 == 1); // NOLINT(readability/check)
383 ABSL_TEST_DCHECK_EQ(1, 1);
384 ABSL_TEST_DCHECK_NE(1, 2);
385 ABSL_TEST_DCHECK_GE(1, 1);
386 ABSL_TEST_DCHECK_GE(2, 1);
387 ABSL_TEST_DCHECK_LE(1, 1);
388 ABSL_TEST_DCHECK_LE(1, 2);
389 ABSL_TEST_DCHECK_GT(2, 1);
390 ABSL_TEST_DCHECK_LT(1, 2);
391
392 // Test DCHECK on std::nullptr_t
393 const void* p_null = nullptr;
394 const void* p_not_null = &p_null;
395 ABSL_TEST_DCHECK_EQ(p_null, nullptr);
396 ABSL_TEST_DCHECK_EQ(nullptr, p_null);
397 ABSL_TEST_DCHECK_NE(p_not_null, nullptr);
398 ABSL_TEST_DCHECK_NE(nullptr, p_not_null);
399 }
400
TEST(CHECKTest,TestQCHECK)401 TEST(CHECKTest, TestQCHECK) {
402 // The tests that QCHECK does the same as CHECK
403 ABSL_TEST_QCHECK(1 == 1); // NOLINT(readability/check)
404 ABSL_TEST_QCHECK_EQ(1, 1);
405 ABSL_TEST_QCHECK_NE(1, 2);
406 ABSL_TEST_QCHECK_GE(1, 1);
407 ABSL_TEST_QCHECK_GE(2, 1);
408 ABSL_TEST_QCHECK_LE(1, 1);
409 ABSL_TEST_QCHECK_LE(1, 2);
410 ABSL_TEST_QCHECK_GT(2, 1);
411 ABSL_TEST_QCHECK_LT(1, 2);
412
413 // Tests using QCHECK*() on anonymous enums.
414 ABSL_TEST_QCHECK_EQ(CASE_A, CASE_A);
415 ABSL_TEST_QCHECK_NE(CASE_A, CASE_B);
416 ABSL_TEST_QCHECK_GE(CASE_A, CASE_A);
417 ABSL_TEST_QCHECK_GE(CASE_B, CASE_A);
418 ABSL_TEST_QCHECK_LE(CASE_A, CASE_A);
419 ABSL_TEST_QCHECK_LE(CASE_A, CASE_B);
420 ABSL_TEST_QCHECK_GT(CASE_B, CASE_A);
421 ABSL_TEST_QCHECK_LT(CASE_A, CASE_B);
422 }
423
TEST(CHECKTest,TestQCHECKPlacementsInCompoundStatements)424 TEST(CHECKTest, TestQCHECKPlacementsInCompoundStatements) {
425 // check placement inside if/else clauses
426 if (true) ABSL_TEST_QCHECK(true);
427
428 if (false)
429 ; // NOLINT
430 else
431 ABSL_TEST_QCHECK(true);
432
433 if (false)
434 ; // NOLINT
435 else
436 ABSL_TEST_QCHECK(true);
437
438 switch (0)
439 case 0:
440 ABSL_TEST_QCHECK(true);
441
442 #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
443 constexpr auto var = [](int i) {
444 ABSL_TEST_QCHECK(i > 0); // NOLINT
445 return i + 1;
446 }(global_var);
447 (void)var;
448
449 #if defined(__GNUC__)
450 int var2 = (({ ABSL_TEST_CHECK_LE(1, 2); }), global_var < 10) ? 1 : 0;
451 (void)var2;
452 #endif // __GNUC__
453 #endif // ABSL_INTERNAL_CPLUSPLUS_LANG
454 }
455
456 class ComparableType {
457 public:
ComparableType(int v)458 explicit ComparableType(int v) : v_(v) {}
459
MethodWithCheck(int i)460 void MethodWithCheck(int i) {
461 ABSL_TEST_CHECK_EQ(*this, i);
462 ABSL_TEST_CHECK_EQ(i, *this);
463 }
464
Get()465 int Get() const { return v_; }
466
467 private:
468 friend bool operator==(const ComparableType& lhs, const ComparableType& rhs) {
469 return lhs.v_ == rhs.v_;
470 }
471 friend bool operator!=(const ComparableType& lhs, const ComparableType& rhs) {
472 return lhs.v_ != rhs.v_;
473 }
474 friend bool operator<(const ComparableType& lhs, const ComparableType& rhs) {
475 return lhs.v_ < rhs.v_;
476 }
477 friend bool operator<=(const ComparableType& lhs, const ComparableType& rhs) {
478 return lhs.v_ <= rhs.v_;
479 }
480 friend bool operator>(const ComparableType& lhs, const ComparableType& rhs) {
481 return lhs.v_ > rhs.v_;
482 }
483 friend bool operator>=(const ComparableType& lhs, const ComparableType& rhs) {
484 return lhs.v_ >= rhs.v_;
485 }
486 friend bool operator==(const ComparableType& lhs, int rhs) {
487 return lhs.v_ == rhs;
488 }
489 friend bool operator==(int lhs, const ComparableType& rhs) {
490 return lhs == rhs.v_;
491 }
492
493 friend std::ostream& operator<<(std::ostream& out, const ComparableType& v) {
494 return out << "ComparableType{" << v.Get() << "}";
495 }
496
497 int v_;
498 };
499
TEST(CHECKTest,TestUserDefinedCompOp)500 TEST(CHECKTest, TestUserDefinedCompOp) {
501 ABSL_TEST_CHECK_EQ(ComparableType{0}, ComparableType{0});
502 ABSL_TEST_CHECK_NE(ComparableType{1}, ComparableType{2});
503 ABSL_TEST_CHECK_LT(ComparableType{1}, ComparableType{2});
504 ABSL_TEST_CHECK_LE(ComparableType{1}, ComparableType{2});
505 ABSL_TEST_CHECK_GT(ComparableType{2}, ComparableType{1});
506 ABSL_TEST_CHECK_GE(ComparableType{2}, ComparableType{2});
507 }
508
TEST(CHECKTest,TestCheckInMethod)509 TEST(CHECKTest, TestCheckInMethod) {
510 ComparableType v{1};
511 v.MethodWithCheck(1);
512 }
513
TEST(CHECKDeathTest,TestUserDefinedStreaming)514 TEST(CHECKDeathTest, TestUserDefinedStreaming) {
515 ComparableType v1{1};
516 ComparableType v2{2};
517
518 EXPECT_DEATH(
519 ABSL_TEST_CHECK_EQ(v1, v2),
520 HasSubstr(
521 "Check failed: v1 == v2 (ComparableType{1} vs. ComparableType{2})"));
522 }
523
524 } // namespace absl_log_internal
525
526 // NOLINTEND(misc-definitions-in-headers)
527
528 #endif // ABSL_LOG_CHECK_TEST_IMPL_H_
529