blob: 0f978049fd106ef582c311ec2ac72dda25647904 [file] [log] [blame]
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <sstream>
#include <string>
#include "build/build_config.h"
#include "partition_alloc/partition_alloc_base/debug/debugging_buildflags.h"
#include "partition_alloc/partition_alloc_base/logging.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace partition_alloc::internal::logging {
namespace {
using ::testing::_;
using ::testing::Return;
class MockLogSource {
public:
MOCK_METHOD0(Log, const char*());
};
TEST(PALoggingTest, BasicLogging) {
MockLogSource mock_log_source;
constexpr int kTimes =
#if BUILDFLAG(PA_DCHECK_IS_ON)
16;
#else
8;
#endif
EXPECT_CALL(mock_log_source, Log())
.Times(kTimes)
.WillRepeatedly(Return("log message"));
SetMinLogLevel(LOGGING_INFO);
EXPECT_TRUE(PA_LOG_IS_ON(INFO));
EXPECT_EQ(BUILDFLAG(PA_DCHECK_IS_ON), PA_DLOG_IS_ON(INFO));
EXPECT_TRUE(PA_VLOG_IS_ON(0));
PA_LOG(INFO) << mock_log_source.Log();
PA_LOG_IF(INFO, true) << mock_log_source.Log();
PA_PLOG(INFO) << mock_log_source.Log();
PA_PLOG_IF(INFO, true) << mock_log_source.Log();
PA_VLOG(0) << mock_log_source.Log();
PA_VLOG_IF(0, true) << mock_log_source.Log();
PA_VPLOG(0) << mock_log_source.Log();
PA_VPLOG_IF(0, true) << mock_log_source.Log();
PA_DLOG(INFO) << mock_log_source.Log();
PA_DLOG_IF(INFO, true) << mock_log_source.Log();
PA_DPLOG(INFO) << mock_log_source.Log();
PA_DPLOG_IF(INFO, true) << mock_log_source.Log();
PA_DVLOG(0) << mock_log_source.Log();
PA_DVLOG_IF(0, true) << mock_log_source.Log();
PA_DVPLOG(0) << mock_log_source.Log();
PA_DVPLOG_IF(0, true) << mock_log_source.Log();
}
TEST(PALoggingTest, LogIsOn) {
SetMinLogLevel(LOGGING_INFO);
EXPECT_TRUE(PA_LOG_IS_ON(INFO));
EXPECT_TRUE(PA_LOG_IS_ON(WARNING));
EXPECT_TRUE(PA_LOG_IS_ON(ERROR));
EXPECT_TRUE(PA_LOG_IS_ON(FATAL));
EXPECT_TRUE(PA_LOG_IS_ON(DFATAL));
SetMinLogLevel(LOGGING_WARNING);
EXPECT_FALSE(PA_LOG_IS_ON(INFO));
EXPECT_TRUE(PA_LOG_IS_ON(WARNING));
EXPECT_TRUE(PA_LOG_IS_ON(ERROR));
EXPECT_TRUE(PA_LOG_IS_ON(FATAL));
EXPECT_TRUE(PA_LOG_IS_ON(DFATAL));
SetMinLogLevel(LOGGING_ERROR);
EXPECT_FALSE(PA_LOG_IS_ON(INFO));
EXPECT_FALSE(PA_LOG_IS_ON(WARNING));
EXPECT_TRUE(PA_LOG_IS_ON(ERROR));
EXPECT_TRUE(PA_LOG_IS_ON(FATAL));
EXPECT_TRUE(PA_LOG_IS_ON(DFATAL));
SetMinLogLevel(LOGGING_FATAL + 1);
EXPECT_FALSE(PA_LOG_IS_ON(INFO));
EXPECT_FALSE(PA_LOG_IS_ON(WARNING));
EXPECT_FALSE(PA_LOG_IS_ON(ERROR));
// PA_LOG_IS_ON(FATAL) should always be true.
EXPECT_TRUE(PA_LOG_IS_ON(FATAL));
// If BUILDFLAG(PA_DCHECK_IS_ON) then DFATAL is FATAL.
EXPECT_EQ(BUILDFLAG(PA_DCHECK_IS_ON), PA_LOG_IS_ON(DFATAL));
}
TEST(PALoggingTest, LoggingIsLazyBySeverity) {
MockLogSource mock_log_source;
EXPECT_CALL(mock_log_source, Log()).Times(0);
SetMinLogLevel(LOGGING_WARNING);
EXPECT_FALSE(PA_LOG_IS_ON(INFO));
EXPECT_FALSE(PA_DLOG_IS_ON(INFO));
EXPECT_FALSE(PA_VLOG_IS_ON(1));
PA_LOG(INFO) << mock_log_source.Log();
PA_LOG_IF(INFO, false) << mock_log_source.Log();
PA_PLOG(INFO) << mock_log_source.Log();
PA_PLOG_IF(INFO, false) << mock_log_source.Log();
PA_VLOG(1) << mock_log_source.Log();
PA_VLOG_IF(1, true) << mock_log_source.Log();
PA_VPLOG(1) << mock_log_source.Log();
PA_VPLOG_IF(1, true) << mock_log_source.Log();
PA_DLOG(INFO) << mock_log_source.Log();
PA_DLOG_IF(INFO, true) << mock_log_source.Log();
PA_DPLOG(INFO) << mock_log_source.Log();
PA_DPLOG_IF(INFO, true) << mock_log_source.Log();
PA_DVLOG(1) << mock_log_source.Log();
PA_DVLOG_IF(1, true) << mock_log_source.Log();
PA_DVPLOG(1) << mock_log_source.Log();
PA_DVPLOG_IF(1, true) << mock_log_source.Log();
}
// Always log-to-stderr(RawLog) if message handler is not assigned.
TEST(PALoggingTest, LogIsAlwaysToStdErr) {
MockLogSource mock_log_source_stderr;
SetMinLogLevel(LOGGING_INFO);
EXPECT_TRUE(PA_LOG_IS_ON(INFO));
EXPECT_CALL(mock_log_source_stderr, Log()).Times(1).WillOnce(Return("foo"));
PA_LOG(INFO) << mock_log_source_stderr.Log();
}
TEST(PALoggingTest, DebugLoggingReleaseBehavior) {
#if BUILDFLAG(PA_DCHECK_IS_ON)
int debug_only_variable = 1;
#endif
// These should avoid emitting references to |debug_only_variable|
// in release mode.
PA_DLOG_IF(INFO, debug_only_variable) << "test";
PA_DLOG_ASSERT(debug_only_variable) << "test";
PA_DPLOG_IF(INFO, debug_only_variable) << "test";
PA_DVLOG_IF(1, debug_only_variable) << "test";
}
} // namespace
} // namespace partition_alloc::internal::logging