| /* | 
 |  *  Copyright 2019 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #include "rtc_base/checks.h" | 
 |  | 
 | #include "test/gmock.h" | 
 | #include "test/gtest.h" | 
 |  | 
 | namespace { | 
 |  | 
 | using ::testing::HasSubstr; | 
 | using ::testing::Not; | 
 |  | 
 | TEST(ChecksTest, ExpressionNotEvaluatedWhenCheckPassing) { | 
 |   int i = 0; | 
 |   RTC_CHECK(true) << "i=" << ++i; | 
 |   RTC_CHECK_EQ(i, 0) << "Previous check passed, but i was incremented!"; | 
 | } | 
 |  | 
 | #if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 
 |  | 
 | struct StructWithStringfy { | 
 |   template <typename Sink> | 
 |   friend void AbslStringify(Sink& sink, const StructWithStringfy& /*self*/) { | 
 |     sink.Append("absl-stringify"); | 
 |   } | 
 | }; | 
 |  | 
 | TEST(ChecksDeathTest, Checks) { | 
 | #if RTC_CHECK_MSG_ENABLED | 
 |   EXPECT_DEATH(RTC_FATAL() << "message", | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed: FATAL\\(\\)\n" | 
 |                "# message"); | 
 |  | 
 |   int a = 1, b = 2; | 
 |   EXPECT_DEATH(RTC_CHECK_EQ(a, b) << 1 << 2u, | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed: a == b \\(1 vs. 2\\)\n" | 
 |                "# 12"); | 
 |   RTC_CHECK_EQ(5, 5); | 
 |  | 
 |   RTC_CHECK(true) << "Shouldn't crash" << 1; | 
 |   EXPECT_DEATH(RTC_CHECK(false) << "Hi there!", | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed: false\n" | 
 |                "# Hi there!"); | 
 |  | 
 |   StructWithStringfy t; | 
 |   EXPECT_DEATH(RTC_CHECK(false) << t, HasSubstr("absl-stringify")); | 
 | #else | 
 |   EXPECT_DEATH(RTC_FATAL() << "message", | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed.\n" | 
 |                "# "); | 
 |  | 
 |   int a = 1, b = 2; | 
 |   EXPECT_DEATH(RTC_CHECK_EQ(a, b) << 1 << 2u, | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed.\n" | 
 |                "# "); | 
 |   RTC_CHECK_EQ(5, 5); | 
 |  | 
 |   RTC_CHECK(true) << "Shouldn't crash" << 1; | 
 |   EXPECT_DEATH(RTC_CHECK(false) << "Hi there!", | 
 |                "\n\n#\n" | 
 |                "# Fatal error in: \\S+, line \\w+\n" | 
 |                "# last system error: \\w+\n" | 
 |                "# Check failed.\n" | 
 |                "# "); | 
 |  | 
 |   // Should compile, but shouldn't try to stringify 't' | 
 |   StructWithStringfy t; | 
 |   EXPECT_DEATH(RTC_CHECK(false) << t, Not(HasSubstr("absl-stringify"))); | 
 | #endif  // RTC_CHECK_MSG_ENABLED | 
 | } | 
 | #endif  // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 
 |  | 
 | }  // namespace |