OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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. | 17 // Needs to be global since log assert handlers can't maintain state. |
18 int log_sink_call_count = 0; | 18 int log_sink_call_count = 0; |
19 | 19 |
20 #if !LOGGING_IS_OFFICIAL_BUILD | |
21 void LogSink(const std::string& str) { | |
22 ++log_sink_call_count; | |
23 } | |
24 #endif // !LOGGING_IS_OFFICIAL_BUILD | |
25 | |
26 // Class to make sure any manipulations we do to the min log level are | 20 // Class to make sure any manipulations we do to the min log level are |
27 // contained (i.e., do not affect other unit tests). | 21 // contained (i.e., do not affect other unit tests). |
28 class LogStateSaver { | 22 class LogStateSaver { |
29 public: | 23 public: |
30 LogStateSaver() : old_min_log_level_(GetMinLogLevel()) {} | 24 LogStateSaver() : old_min_log_level_(GetMinLogLevel()) {} |
31 | 25 |
32 ~LogStateSaver() { | 26 ~LogStateSaver() { |
33 SetMinLogLevel(old_min_log_level_); | 27 SetMinLogLevel(old_min_log_level_); |
34 SetLogAssertHandler(NULL); | 28 SetLogAssertHandler(NULL); |
35 SetLogReportHandler(NULL); | 29 SetLogReportHandler(NULL); |
36 log_sink_call_count = 0; | 30 log_sink_call_count = 0; |
37 } | 31 } |
38 | 32 |
39 private: | 33 private: |
40 int old_min_log_level_; | 34 int old_min_log_level_; |
41 | 35 |
42 DISALLOW_COPY_AND_ASSIGN(LogStateSaver); | 36 DISALLOW_COPY_AND_ASSIGN(LogStateSaver); |
43 }; | 37 }; |
44 | 38 |
45 class LoggingTest : public testing::Test { | 39 class LoggingTest : public testing::Test { |
40 protected: | |
41 // Placed here to avoid unused function warning for some build configurations. | |
Nico
2014/03/07 22:58:35
Can't you change the #if above to defined(DCHECK_A
Xianzhu
2014/03/07 23:29:36
Also needs "!defined(OFFICIAL_BUILD) ||" because t
| |
42 static void LogSink(const std::string& str) { | |
43 ++log_sink_call_count; | |
44 } | |
45 | |
46 private: | 46 private: |
47 LogStateSaver log_state_saver_; | 47 LogStateSaver log_state_saver_; |
48 }; | 48 }; |
49 | 49 |
50 class MockLogSource { | 50 class MockLogSource { |
51 public: | 51 public: |
52 MOCK_METHOD0(Log, const char*()); | 52 MOCK_METHOD0(Log, const char*()); |
53 }; | 53 }; |
54 | 54 |
55 TEST_F(LoggingTest, BasicLogging) { | 55 TEST_F(LoggingTest, BasicLogging) { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
162 | 162 |
163 DLOG(INFO) << mock_log_source.Log(); | 163 DLOG(INFO) << mock_log_source.Log(); |
164 DLOG_IF(INFO, true) << mock_log_source.Log(); | 164 DLOG_IF(INFO, true) << mock_log_source.Log(); |
165 DPLOG(INFO) << mock_log_source.Log(); | 165 DPLOG(INFO) << mock_log_source.Log(); |
166 DPLOG_IF(INFO, true) << mock_log_source.Log(); | 166 DPLOG_IF(INFO, true) << mock_log_source.Log(); |
167 DVLOG(1) << mock_log_source.Log(); | 167 DVLOG(1) << mock_log_source.Log(); |
168 DVLOG_IF(1, true) << mock_log_source.Log(); | 168 DVLOG_IF(1, true) << mock_log_source.Log(); |
169 } | 169 } |
170 | 170 |
171 // Official builds have CHECKs directly call BreakDebugger. | 171 // Official builds have CHECKs directly call BreakDebugger. |
172 #if !LOGGING_IS_OFFICIAL_BUILD | 172 #if !defined(OFFICIAL_BUILD) |
173 | 173 |
174 TEST_F(LoggingTest, CheckStreamsAreLazy) { | 174 TEST_F(LoggingTest, CheckStreamsAreLazy) { |
175 MockLogSource mock_log_source, uncalled_mock_log_source; | 175 MockLogSource mock_log_source, uncalled_mock_log_source; |
176 EXPECT_CALL(mock_log_source, Log()).Times(8). | 176 EXPECT_CALL(mock_log_source, Log()).Times(8). |
177 WillRepeatedly(Return("check message")); | 177 WillRepeatedly(Return("check message")); |
178 EXPECT_CALL(uncalled_mock_log_source, Log()).Times(0); | 178 EXPECT_CALL(uncalled_mock_log_source, Log()).Times(0); |
179 | 179 |
180 SetLogAssertHandler(&LogSink); | 180 SetLogAssertHandler(&LogSink); |
181 | 181 |
182 CHECK(mock_log_source.Log()) << uncalled_mock_log_source.Log(); | 182 CHECK(mock_log_source.Log()) << uncalled_mock_log_source.Log(); |
(...skipping 14 matching lines...) Expand all Loading... | |
197 // in release mode. | 197 // in release mode. |
198 DLOG_IF(INFO, debug_only_variable) << "test"; | 198 DLOG_IF(INFO, debug_only_variable) << "test"; |
199 DLOG_ASSERT(debug_only_variable) << "test"; | 199 DLOG_ASSERT(debug_only_variable) << "test"; |
200 DPLOG_IF(INFO, debug_only_variable) << "test"; | 200 DPLOG_IF(INFO, debug_only_variable) << "test"; |
201 DVLOG_IF(1, debug_only_variable) << "test"; | 201 DVLOG_IF(1, debug_only_variable) << "test"; |
202 } | 202 } |
203 | 203 |
204 TEST_F(LoggingTest, DcheckStreamsAreLazy) { | 204 TEST_F(LoggingTest, DcheckStreamsAreLazy) { |
205 MockLogSource mock_log_source; | 205 MockLogSource mock_log_source; |
206 EXPECT_CALL(mock_log_source, Log()).Times(0); | 206 EXPECT_CALL(mock_log_source, Log()).Times(0); |
207 #if !LOGGING_IS_OFFICIAL_BUILD && defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | 207 if (DCHECK_IS_ON()) { |
208 // Unofficial release build without dcheck enabled. | 208 DCHECK(true) << mock_log_source.Log(); |
209 set_dcheck_state(DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); | 209 DCHECK_EQ(0, 0) << mock_log_source.Log(); |
210 DCHECK(mock_log_source.Log()) << mock_log_source.Log(); | 210 } else { |
211 DPCHECK(mock_log_source.Log()) << mock_log_source.Log(); | 211 DCHECK(mock_log_source.Log()) << mock_log_source.Log(); |
212 DCHECK_EQ(0, 0) << mock_log_source.Log(); | 212 DPCHECK(mock_log_source.Log()) << mock_log_source.Log(); |
213 DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL)) | 213 DCHECK_EQ(0, 0) << mock_log_source.Log(); |
214 << mock_log_source.Log(); | 214 DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL)) |
215 #endif | 215 << mock_log_source.Log(); |
216 } | |
216 } | 217 } |
217 | 218 |
218 TEST_F(LoggingTest, Dcheck) { | 219 TEST_F(LoggingTest, Dcheck) { |
219 #if LOGGING_IS_OFFICIAL_BUILD | 220 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) |
220 // Official build. | 221 // Release build. |
221 EXPECT_FALSE(DCHECK_IS_ON()); | 222 EXPECT_FALSE(DCHECK_IS_ON()); |
222 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); | 223 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); |
223 #elif defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | |
224 // Unofficial release build. | |
225 set_dcheck_state(ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); | |
226 SetLogReportHandler(&LogSink); | |
227 EXPECT_TRUE(DCHECK_IS_ON()); | |
228 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); | |
229 #elif defined(NDEBUG) && defined(DCHECK_ALWAYS_ON) | 224 #elif defined(NDEBUG) && defined(DCHECK_ALWAYS_ON) |
230 // Unofficial release build with real DCHECKS. | 225 // Release build with real DCHECKS. |
231 set_dcheck_state(ENABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS); | |
232 SetLogAssertHandler(&LogSink); | 226 SetLogAssertHandler(&LogSink); |
233 EXPECT_TRUE(DCHECK_IS_ON()); | 227 EXPECT_TRUE(DCHECK_IS_ON()); |
234 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); | 228 EXPECT_FALSE(DLOG_IS_ON(DCHECK)); |
235 #else | 229 #else |
236 // Unofficial debug build. | 230 // Debug build. |
237 SetLogAssertHandler(&LogSink); | 231 SetLogAssertHandler(&LogSink); |
238 EXPECT_TRUE(DCHECK_IS_ON()); | 232 EXPECT_TRUE(DCHECK_IS_ON()); |
239 EXPECT_TRUE(DLOG_IS_ON(DCHECK)); | 233 EXPECT_TRUE(DLOG_IS_ON(DCHECK)); |
240 #endif // defined(LOGGING_IS_OFFICIAL_BUILD) | 234 #endif |
241 | 235 |
242 EXPECT_EQ(0, log_sink_call_count); | 236 EXPECT_EQ(0, log_sink_call_count); |
243 DCHECK(false); | 237 DCHECK(false); |
244 EXPECT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count); | 238 EXPECT_EQ(DCHECK_IS_ON() ? 1 : 0, log_sink_call_count); |
245 DPCHECK(false); | 239 DPCHECK(false); |
246 EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count); | 240 EXPECT_EQ(DCHECK_IS_ON() ? 2 : 0, log_sink_call_count); |
247 DCHECK_EQ(0, 1); | 241 DCHECK_EQ(0, 1); |
248 EXPECT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count); | 242 EXPECT_EQ(DCHECK_IS_ON() ? 3 : 0, log_sink_call_count); |
249 } | 243 } |
250 | 244 |
251 TEST_F(LoggingTest, DcheckReleaseBehavior) { | 245 TEST_F(LoggingTest, DcheckReleaseBehavior) { |
252 int some_variable = 1; | 246 int some_variable = 1; |
253 // These should still reference |some_variable| so we don't get | 247 // These should still reference |some_variable| so we don't get |
254 // unused variable warnings. | 248 // unused variable warnings. |
255 DCHECK(some_variable) << "test"; | 249 DCHECK(some_variable) << "test"; |
256 DPCHECK(some_variable) << "test"; | 250 DPCHECK(some_variable) << "test"; |
257 DCHECK_EQ(some_variable, 1) << "test"; | 251 DCHECK_EQ(some_variable, 1) << "test"; |
258 } | 252 } |
259 | 253 |
260 } // namespace | 254 } // namespace |
261 | 255 |
262 } // namespace logging | 256 } // namespace logging |
OLD | NEW |