Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2751)

Unified Diff: base/logging_unittest.cc

Issue 4199005: Fixed subtle difference in behavior between DCHECK and DCHECK_EQ et al. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed wtc's comments Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/logging.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/logging_unittest.cc
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
index fa28ec6e373b953b3ba6d86cbc897f158b795535..e03c45ec179c8ad008d73e001ba143b2e6039932 100644
--- a/base/logging_unittest.cc
+++ b/base/logging_unittest.cc
@@ -14,23 +14,35 @@ namespace {
using ::testing::Return;
+// Needs to be global since log assert handlers can't maintain state.
+int log_sink_call_count = 0;
+
+void LogSink(const std::string& str) {
+ ++log_sink_call_count;
+}
+
// Class to make sure any manipulations we do to the min log level are
// contained (i.e., do not affect other unit tests).
-class MinLogLevelSaver {
+class LogStateSaver {
public:
- MinLogLevelSaver() : old_min_log_level_(GetMinLogLevel()) {}
+ LogStateSaver() : old_min_log_level_(GetMinLogLevel()) {}
- ~MinLogLevelSaver() { SetMinLogLevel(old_min_log_level_); }
+ ~LogStateSaver() {
+ SetMinLogLevel(old_min_log_level_);
+ SetLogAssertHandler(NULL);
+ SetLogReportHandler(NULL);
+ log_sink_call_count = 0;
+ }
private:
int old_min_log_level_;
- DISALLOW_COPY_AND_ASSIGN(MinLogLevelSaver);
+ DISALLOW_COPY_AND_ASSIGN(LogStateSaver);
};
class LoggingTest : public testing::Test {
private:
- MinLogLevelSaver min_log_level_saver_;
+ LogStateSaver log_state_saver_;
};
class MockLogSource {
@@ -140,6 +152,33 @@ TEST_F(LoggingTest, DchecksAreLazy) {
<< mock_log_source.Log();
}
+TEST_F(LoggingTest, Dcheck) {
+#if defined(LOGGING_IS_OFFICIAL_BUILD)
+ // Official build.
+ EXPECT_FALSE(DCHECK_IS_ON());
+ EXPECT_FALSE(DLOG_IS_ON(DCHECK));
+#elif defined(NDEBUG)
+ // Unofficial release build.
+ logging::g_enable_dcheck = true;
+ logging::SetLogReportHandler(&LogSink);
+ EXPECT_TRUE(DCHECK_IS_ON());
+ EXPECT_FALSE(DLOG_IS_ON(DCHECK));
+#else
+ // Unofficial debug build.
+ logging::SetLogAssertHandler(&LogSink);
+ EXPECT_TRUE(DCHECK_IS_ON());
+ EXPECT_TRUE(DLOG_IS_ON(DCHECK));
+#endif // defined(LOGGING_IS_OFFICIAL_BUILD)
+
+ EXPECT_EQ(0, log_sink_call_count);
+ DCHECK(false);
+ EXPECT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count);
+ DPCHECK(false);
+ EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count);
+ DCHECK_EQ(0, 1);
+ EXPECT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count);
+}
+
TEST_F(LoggingTest, DcheckReleaseBehavior) {
int some_variable = 1;
// These should still reference |some_variable| so we don't get
« no previous file with comments | « base/logging.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698