Index: base/logging_unittest.cc |
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc |
index 16c89cf76fced5d9f95464e42d7455dbb4c2f78d..3638b4a68382aa20a67e22f05582585eb4abd5d6 100644 |
--- a/base/logging_unittest.cc |
+++ b/base/logging_unittest.cc |
@@ -4,6 +4,7 @@ |
#include "base/logging.h" |
#include "base/compiler_specific.h" |
+#include "base/debug/dump_without_crashing.h" |
#include "base/macros.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -101,7 +102,7 @@ TEST_F(LoggingTest, BasicLogging) { |
} |
TEST_F(LoggingTest, LogIsOn) { |
-#if defined(NDEBUG) |
+#if defined(NDEBUG) || defined(DCHECK_IS_DUMP_WITHOUT_CRASH) |
const bool kDfatalIsFatal = false; |
#else // defined(NDEBUG) |
const bool kDfatalIsFatal = true; |
@@ -380,6 +381,7 @@ TEST_F(LoggingTest, DcheckStreamsAreLazy) { |
#endif |
} |
+#if !defined(DCHECK_IS_DUMP_WITHOUT_CRASH) |
void DcheckEmptyFunction1() { |
// Provide a body so that Release builds do not cause the compiler to |
// optimize DcheckEmptyFunction1 and DcheckEmptyFunction2 as a single |
@@ -455,6 +457,7 @@ TEST_F(LoggingTest, Dcheck) { |
DCHECK_EQ(mp2, &MemberFunctions::MemberFunction1); |
EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, g_log_sink_call_count); |
} |
+#endif // !defined(DCHECK_IS_DUMP_WITHOUT_CRASH) |
TEST_F(LoggingTest, DcheckReleaseBehavior) { |
int some_variable = 1; |
@@ -489,6 +492,32 @@ TEST_F(LoggingTest, CheckEqStatements) { |
CHECK_EQ(false, true); // Unreached. |
} |
+#if defined(DCHECK_IS_DUMP_WITHOUT_CRASH) |
+namespace { |
+ |
+int g_fake_dump_without_crashing_count = 0; |
+void FakeDumpWithoutCrashing() { |
+ g_fake_dump_without_crashing_count++; |
+} |
+ |
+} // namespace |
+ |
+TEST_F(LoggingTest, DCheckIsDumpWithoutCrash) { |
+ // Replace the dump-without-crashing function, to test. |
+ base::debug::SetDumpWithoutCrashingFunction(&FakeDumpWithoutCrashing); |
+ |
+ // Invoke DCHECK(false) twice, and verify that only one dump call is made. |
+ DCHECK(false); |
+ EXPECT_EQ(1, g_fake_dump_without_crashing_count); |
+ DCHECK(false); |
+ EXPECT_EQ(1, g_fake_dump_without_crashing_count); |
+ |
+ EXPECT_EQ(LOG_ERROR, LOG_DFATAL); |
+ |
+ base::debug::SetDumpWithoutCrashingFunction(nullptr); |
+} |
+#endif // defined(DCHECK_IS_DUMP_WITHOUT_CRASH) |
+ |
// Test that defining an operator<< for a type in a namespace doesn't prevent |
// other code in that namespace from calling the operator<<(ostream, wstring) |
// defined by logging.h. This can fail if operator<<(ostream, wstring) can't be |