blob: e11ca60dabdd89752f7736867b2f76f2538255bc [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 "src/ledger/lib/logging/logging.h"
#include <iostream>
#include <sstream>
#include <string>
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "src/ledger/lib/logging/logging.h"
#include "third_party/abseil-cpp/absl/base/log_severity.h"
namespace ledger {
namespace {
using ::testing::IsEmpty;
using ::testing::MatchesRegex;
class LoggingTest : public ::testing::Test {
public:
LoggingTest() {
// Make std::cerr write to a stringstream.
// Intercepting std::cerr instead of stderr allows gtest messages to be printed.
cerr_to_restore_ = std::cerr.rdbuf();
std::cerr.rdbuf(output_.rdbuf());
// Restore the default logging severity.
SetLogSeverity(absl::LogSeverity::kInfo);
}
~LoggingTest() {
// Restore std::cerr.
std::cerr.rdbuf(cerr_to_restore_);
}
// Checks that std::cerr is flushed and returns all the error output seen until now.
std::string ReadCerr() {
std::string output = output_.str();
output_.str("");
std::cerr.flush();
EXPECT_THAT(output_.str(), IsEmpty());
return output;
}
private:
std::stringstream output_;
std::streambuf* cerr_to_restore_;
};
using LoggingDeathTest = ::testing::Test;
TEST_F(LoggingTest, LogSeverity) {
SetLogSeverity(absl::LogSeverity::kFatal);
EXPECT_EQ(GetLogSeverity(), absl::LogSeverity::kFatal);
SetLogVerbosity(2);
EXPECT_EQ((int)GetLogSeverity(), -2);
SetLogSeverity((absl::LogSeverity)-1);
EXPECT_EQ((int)GetLogSeverity(), -1);
}
TEST_F(LoggingTest, LogInfo) {
LEDGER_LOG(INFO) << "Log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[INFO:.*logging_unittest.cc.*\\] Log message\n"));
SetLogSeverity(absl::LogSeverity::kWarning);
LEDGER_LOG(INFO) << "Not displayed";
EXPECT_THAT(ReadCerr(), IsEmpty());
}
TEST_F(LoggingTest, LogWarning) {
LEDGER_LOG(WARNING) << "Log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[WARNING:.*logging_unittest.cc.*\\] Log message\n"));
SetLogSeverity(absl::LogSeverity::kWarning);
LEDGER_LOG(WARNING) << "Other log message";
EXPECT_THAT(ReadCerr(),
MatchesRegex("\\[WARNING:.*logging_unittest.cc.*\\] Other log message\n"));
SetLogSeverity(absl::LogSeverity::kError);
LEDGER_LOG(WARNING) << "Not displayed";
EXPECT_THAT(ReadCerr(), IsEmpty());
}
TEST_F(LoggingTest, LogError) {
LEDGER_LOG(ERROR) << "Log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[ERROR:.*logging_unittest.cc.*\\] Log message\n"));
SetLogSeverity(absl::LogSeverity::kWarning);
LEDGER_LOG(ERROR) << "Other log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[ERROR:.*logging_unittest.cc.*\\] Other log message\n"));
SetLogSeverity(absl::LogSeverity::kFatal);
LEDGER_LOG(ERROR) << "Not displayed";
EXPECT_THAT(ReadCerr(), IsEmpty());
}
TEST_F(LoggingDeathTest, LogFatal) {
ASSERT_DEATH({ LEDGER_LOG(FATAL) << "bad things happened"; },
"\\[FATAL:.*logging_unittest.cc.*\\] bad things happened\n");
}
TEST_F(LoggingDeathTest, LogFatalAlwaysPrinted) {
SetLogSeverity((absl::LogSeverity)((int)absl::LogSeverity::kFatal + 1));
ASSERT_DEATH({ LEDGER_LOG(FATAL) << "still printed"; },
"\\[FATAL:.*logging_unittest.cc.*\\] still printed\n");
}
TEST_F(LoggingTest, LogVerbose1) {
LEDGER_VLOG(1) << "Not displayed";
EXPECT_THAT(ReadCerr(), IsEmpty());
SetLogVerbosity(1);
LEDGER_VLOG(1) << "Log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[VERBOSE1:.*logging_unittest.cc.*\\] Log message\n"));
}
TEST_F(LoggingTest, LogVerbose2) {
SetLogVerbosity(1);
LEDGER_VLOG(2) << "Not displayed";
EXPECT_THAT(ReadCerr(), IsEmpty());
SetLogVerbosity(2);
LEDGER_VLOG(2) << "Log message";
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[VERBOSE2:.*logging_unittest.cc.*\\] Log message\n"));
}
TEST_F(LoggingTest, CheckSuccess) { LEDGER_CHECK(true); }
TEST_F(LoggingDeathTest, CheckFailure) {
bool condition = false;
ASSERT_DEATH({ LEDGER_CHECK(condition) << "oh no"; },
"\\[FATAL:.*logging_unittest.cc.*\\] Check failed: condition. oh no\n");
}
TEST_F(LoggingTest, DCheckSuccess) { LEDGER_DCHECK(true); }
TEST_F(LoggingTest, DCheckIgnoredInRelease) {
if (LEDGER_DEBUG) {
GTEST_SKIP();
}
LEDGER_DCHECK(false);
}
TEST_F(LoggingDeathTest, DCheckFailure) {
if (!LEDGER_DEBUG) {
GTEST_SKIP();
}
bool condition = false;
ASSERT_DEATH({ LEDGER_DCHECK(condition) << "oh no"; },
"\\[FATAL:.*logging_unittest.cc.*\\] Check failed: condition. oh no\n");
}
TEST_F(LoggingTest, NotReachedIgnoredInRelease) {
if (LEDGER_DEBUG) {
GTEST_SKIP();
}
LEDGER_NOTREACHED();
}
TEST_F(LoggingDeathTest, NotReached) {
if (!LEDGER_DEBUG) {
GTEST_SKIP();
}
ASSERT_DEATH({ LEDGER_NOTREACHED(); },
"\\[FATAL:.*logging_unittest.cc.*\\] Check failed: false. Unreachable. \n");
}
TEST_F(LoggingTest, NotImplemented) {
LEDGER_NOTIMPLEMENTED();
EXPECT_THAT(ReadCerr(), MatchesRegex("\\[ERROR:.*logging_unittest.cc.*\\] Not implemented. \n"));
}
} // namespace
} // namespace ledger