diff options
author | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-01 02:26:04 +0000 |
---|---|---|
committer | akalin@chromium.org <akalin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-01 02:26:04 +0000 |
commit | 2c3229ecedf2c3e86f041676d5974e1133e4f6e0 (patch) | |
tree | 20876251a3d6e61e6e68bab92327f6cf3de0f275 /base/logging_unittest.cc | |
parent | 14e2b8be2e44bd8e6836c43fdab55ba902784813 (diff) | |
download | chromium_src-2c3229ecedf2c3e86f041676d5974e1133e4f6e0.zip chromium_src-2c3229ecedf2c3e86f041676d5974e1133e4f6e0.tar.gz chromium_src-2c3229ecedf2c3e86f041676d5974e1133e4f6e0.tar.bz2 |
Made logging macros evaluate its stream arguments lazily.
Also added logging unittests.
BUG=57383
TEST=logging_unittest.cc
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=61127
Review URL: http://codereview.chromium.org/3575008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61142 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/logging_unittest.cc')
-rw-r--r-- | base/logging_unittest.cc | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc new file mode 100644 index 0000000..8a4e7c1 --- /dev/null +++ b/base/logging_unittest.cc @@ -0,0 +1,132 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/basictypes.h" +#include "base/logging.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace logging { + +namespace { + +using ::testing::Return; + +// 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 { + public: + MinLogLevelSaver() : old_min_log_level_(GetMinLogLevel()) {} + + ~MinLogLevelSaver() { SetMinLogLevel(old_min_log_level_); } + + private: + int old_min_log_level_; + + DISALLOW_COPY_AND_ASSIGN(MinLogLevelSaver); +}; + +class LoggingTest : public testing::Test { + private: + MinLogLevelSaver min_log_level_saver_; +}; + +class MockLogSource { + public: + MOCK_METHOD0(Log, const char*()); +}; + +TEST_F(LoggingTest, BasicLogging) { + MockLogSource mock_log_source; + const int kExpectedDebugOrReleaseCalls = 6; + const int kExpectedDebugCalls = 6; + const int kExpectedCalls = + kExpectedDebugOrReleaseCalls + (DEBUG_MODE ? kExpectedDebugCalls : 0); + EXPECT_CALL(mock_log_source, Log()).Times(kExpectedCalls). + WillRepeatedly(Return("log message")); + + SetMinLogLevel(LOG_INFO); + + EXPECT_TRUE(LOG_IS_ON(INFO)); + EXPECT_EQ(DEBUG_MODE != 0, DLOG_IS_ON(INFO)); + EXPECT_TRUE(VLOG_IS_ON(0)); + + LOG(INFO) << mock_log_source.Log(); + LOG_IF(INFO, true) << mock_log_source.Log(); + PLOG(INFO) << mock_log_source.Log(); + PLOG_IF(INFO, true) << mock_log_source.Log(); + VLOG(0) << mock_log_source.Log(); + VLOG_IF(0, true) << mock_log_source.Log(); + + DLOG(INFO) << mock_log_source.Log(); + DLOG_IF(INFO, true) << mock_log_source.Log(); + DPLOG(INFO) << mock_log_source.Log(); + DPLOG_IF(INFO, true) << mock_log_source.Log(); + DVLOG(0) << mock_log_source.Log(); + DVLOG_IF(0, true) << mock_log_source.Log(); +} + +TEST_F(LoggingTest, LoggingIsLazy) { + MockLogSource mock_log_source; + EXPECT_CALL(mock_log_source, Log()).Times(0); + + SetMinLogLevel(LOG_WARNING); + + EXPECT_FALSE(LOG_IS_ON(INFO)); + EXPECT_FALSE(DLOG_IS_ON(INFO)); + EXPECT_FALSE(VLOG_IS_ON(1)); + + LOG(INFO) << mock_log_source.Log(); + LOG_IF(INFO, false) << mock_log_source.Log(); + PLOG(INFO) << mock_log_source.Log(); + PLOG_IF(INFO, false) << mock_log_source.Log(); + VLOG(1) << mock_log_source.Log(); + VLOG_IF(1, true) << mock_log_source.Log(); + + DLOG(INFO) << mock_log_source.Log(); + DLOG_IF(INFO, true) << mock_log_source.Log(); + DPLOG(INFO) << mock_log_source.Log(); + DPLOG_IF(INFO, true) << mock_log_source.Log(); + DVLOG(1) << mock_log_source.Log(); + DVLOG_IF(1, true) << mock_log_source.Log(); +} + +TEST_F(LoggingTest, ChecksAreNotLazy) { + MockLogSource mock_log_source, uncalled_mock_log_source; + EXPECT_CALL(mock_log_source, Log()).Times(8). + WillRepeatedly(Return("check message")); + EXPECT_CALL(uncalled_mock_log_source, Log()).Times(0); + + SetMinLogLevel(LOG_FATAL + 1); + EXPECT_FALSE(LOG_IS_ON(FATAL)); + + CHECK(mock_log_source.Log()) << uncalled_mock_log_source.Log(); + PCHECK(!mock_log_source.Log()) << mock_log_source.Log(); + CHECK_EQ(mock_log_source.Log(), mock_log_source.Log()) + << uncalled_mock_log_source.Log(); + CHECK_NE(mock_log_source.Log(), mock_log_source.Log()) + << mock_log_source.Log(); +} + +TEST_F(LoggingTest, DchecksAreLazy) { + MockLogSource mock_log_source; + EXPECT_CALL(mock_log_source, Log()).Times(0); + +#if defined(NDEBUG) + logging::g_enable_dcheck = false; +#else + SetMinLogLevel(LOG_FATAL + 1); + EXPECT_FALSE(LOG_IS_ON(FATAL)); +#endif + DCHECK(mock_log_source.Log()) << mock_log_source.Log(); + DPCHECK(mock_log_source.Log()) << mock_log_source.Log(); + DCHECK_EQ(0, 0) << mock_log_source.Log(); + DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(NULL)) + << mock_log_source.Log(); +} + +} // namespace + +} // namespace logging |