OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/logging.h" | 6 #include "base/logging.h" |
7 | 7 |
8 #include "testing/gmock/include/gmock/gmock.h" | 8 #include "testing/gmock/include/gmock/gmock.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
11 namespace logging { | 11 namespace logging { |
12 | 12 |
13 namespace { | 13 namespace { |
14 | 14 |
15 using ::testing::Return; | 15 using ::testing::Return; |
16 | 16 |
| 17 // Needs to be global since log assert handlers can't maintain state. |
| 18 int log_sink_call_count = 0; |
| 19 |
| 20 void LogSink(const std::string& str) { |
| 21 ++log_sink_call_count; |
| 22 } |
| 23 |
17 // Class to make sure any manipulations we do to the min log level are | 24 // Class to make sure any manipulations we do to the min log level are |
18 // contained (i.e., do not affect other unit tests). | 25 // contained (i.e., do not affect other unit tests). |
19 class MinLogLevelSaver { | 26 class LogStateSaver { |
20 public: | 27 public: |
21 MinLogLevelSaver() : old_min_log_level_(GetMinLogLevel()) {} | 28 LogStateSaver() : old_min_log_level_(GetMinLogLevel()) {} |
22 | 29 |
23 ~MinLogLevelSaver() { SetMinLogLevel(old_min_log_level_); } | 30 ~LogStateSaver() { |
| 31 SetMinLogLevel(old_min_log_level_); |
| 32 SetLogAssertHandler(NULL); |
| 33 SetLogReportHandler(NULL); |
| 34 log_sink_call_count = 0; |
| 35 } |
24 | 36 |
25 private: | 37 private: |
26 int old_min_log_level_; | 38 int old_min_log_level_; |
27 | 39 |
28 DISALLOW_COPY_AND_ASSIGN(MinLogLevelSaver); | 40 DISALLOW_COPY_AND_ASSIGN(LogStateSaver); |
29 }; | 41 }; |
30 | 42 |
31 class LoggingTest : public testing::Test { | 43 class LoggingTest : public testing::Test { |
32 private: | 44 private: |
33 MinLogLevelSaver min_log_level_saver_; | 45 LogStateSaver log_state_saver_; |
34 }; | 46 }; |
35 | 47 |
36 class MockLogSource { | 48 class MockLogSource { |
37 public: | 49 public: |
38 MOCK_METHOD0(Log, const char*()); | 50 MOCK_METHOD0(Log, const char*()); |
39 }; | 51 }; |
40 | 52 |
41 TEST_F(LoggingTest, BasicLogging) { | 53 TEST_F(LoggingTest, BasicLogging) { |
42 MockLogSource mock_log_source; | 54 MockLogSource mock_log_source; |
43 const int kExpectedDebugOrReleaseCalls = 6; | 55 const int kExpectedDebugOrReleaseCalls = 6; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 SetMinLogLevel(LOG_FATAL + 1); | 145 SetMinLogLevel(LOG_FATAL + 1); |
134 EXPECT_FALSE(LOG_IS_ON(FATAL)); | 146 EXPECT_FALSE(LOG_IS_ON(FATAL)); |
135 #endif // !defined(LOGGING_IS_OFFICIAL_BUILD) && defined(NDEBUG) | 147 #endif // !defined(LOGGING_IS_OFFICIAL_BUILD) && defined(NDEBUG) |
136 DCHECK(mock_log_source.Log()) << mock_log_source.Log(); | 148 DCHECK(mock_log_source.Log()) << mock_log_source.Log(); |
137 DPCHECK(mock_log_source.Log()) << mock_log_source.Log(); | 149 DPCHECK(mock_log_source.Log()) << mock_log_source.Log(); |
138 DCHECK_EQ(0, 0) << mock_log_source.Log(); | 150 DCHECK_EQ(0, 0) << mock_log_source.Log(); |
139 DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL)) | 151 DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL)) |
140 << mock_log_source.Log(); | 152 << mock_log_source.Log(); |
141 } | 153 } |
142 | 154 |
| 155 TEST_F(LoggingTest, Dcheck) { |
| 156 #if defined(LOGGING_IS_OFFICIAL_BUILD) |
| 157 // Official build. |
| 158 EXPECT_FALSE(DCHECK_IS_ON()); |
| 159 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); |
| 160 #elif defined(NDEBUG) |
| 161 // Unofficial release build. |
| 162 logging::g_enable_dcheck = true; |
| 163 logging::SetLogReportHandler(&LogSink); |
| 164 EXPECT_TRUE(DCHECK_IS_ON()); |
| 165 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); |
| 166 #else |
| 167 // Unofficial debug build. |
| 168 logging::SetLogAssertHandler(&LogSink); |
| 169 EXPECT_TRUE(DCHECK_IS_ON()); |
| 170 EXPECT_TRUE(DLOG_IS_ON(DCHECK)); |
| 171 #endif // defined(LOGGING_IS_OFFICIAL_BUILD) |
| 172 |
| 173 EXPECT_EQ(0, log_sink_call_count); |
| 174 DCHECK(false); |
| 175 EXPECT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count); |
| 176 DPCHECK(false); |
| 177 EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count); |
| 178 DCHECK_EQ(0, 1); |
| 179 EXPECT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count); |
| 180 } |
| 181 |
143 TEST_F(LoggingTest, DcheckReleaseBehavior) { | 182 TEST_F(LoggingTest, DcheckReleaseBehavior) { |
144 int some_variable = 1; | 183 int some_variable = 1; |
145 // These should still reference |some_variable| so we don't get | 184 // These should still reference |some_variable| so we don't get |
146 // unused variable warnings. | 185 // unused variable warnings. |
147 DCHECK(some_variable) << "test"; | 186 DCHECK(some_variable) << "test"; |
148 DPCHECK(some_variable) << "test"; | 187 DPCHECK(some_variable) << "test"; |
149 DCHECK_EQ(some_variable, 1) << "test"; | 188 DCHECK_EQ(some_variable, 1) << "test"; |
150 } | 189 } |
151 | 190 |
152 } // namespace | 191 } // namespace |
153 | 192 |
154 } // namespace logging | 193 } // namespace logging |
OLD | NEW |