blob: 8a9e95320eec9234f701692a9b36cbfc99e1b554 [file] [log] [blame]
// Copyright 2020 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <string>
#include "base/log_once_unittest_1.h"
#include "base/log_once_unittest_2.h"
#include "base/logging.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
static inline void log_once_unittest() {
// Note: The LOG_ONCE statement below must remain on the same line as the
// LOG_ONCE statements in log_once_unittest_1.h and log_once_unittest_2.h
LOG_ONCE(INFO) << "This is log_once_unittest().";
SB_DCHECK(__LINE__ == 28); // Note keep in sync with the other statements.
}
static inline void notimplemented_log_once_unittest() {
// Note: The NOTIMPLEMENTED_LOG_ONCE statement below must remain on the same
// line as the NOTIMPLEMENTED_LOG_ONCE statements in log_once_unittest_1.h
// and log_once_unittest_2.h
NOTIMPLEMENTED_LOG_ONCE() << "This is notimplemented_log_once_unittest().";
SB_DCHECK(__LINE__ == 36); // Note keep in sync with the other statements.
}
} // namespace
namespace logging {
namespace {
TEST(LogOnceTest, LogOnce) {
// Set up a callback function to capture the log output string.
auto old_log_message_handler = GetLogMessageHandler();
// Use a static because only captureless lambdas can be converted to a
// function pointer for SetLogMessageHandler().
static std::string* log_string_ptr = nullptr;
std::string log_string;
log_string_ptr = &log_string;
SetLogMessageHandler([](int severity, const char* file, int line,
size_t start, const std::string& str) -> bool {
*log_string_ptr = str;
return true;
});
log_once_unittest();
EXPECT_NE(std::string::npos, log_string.find("This is log_once_unittest()."));
log_once_unittest_1();
EXPECT_NE(std::string::npos,
log_string.find("This is log_once_unittest_1()."));
log_once_unittest_2();
EXPECT_NE(std::string::npos,
log_string.find("This is log_once_unittest_2()."));
log_string.clear();
log_once_unittest();
EXPECT_TRUE(log_string.empty());
log_once_unittest_1();
EXPECT_TRUE(log_string.empty());
log_once_unittest_2();
EXPECT_TRUE(log_string.empty());
// Clean up.
SetLogMessageHandler(old_log_message_handler);
log_string_ptr = nullptr;
}
TEST(LogOnceTest, NotImplementedLogOnce) {
// Set up a callback function to capture the log output string.
auto old_log_message_handler = GetLogMessageHandler();
// Use a static because only captureless lambdas can be converted to a
// function pointer for SetLogMessageHandler().
static std::string* log_string_ptr = nullptr;
std::string log_string;
log_string_ptr = &log_string;
SetLogMessageHandler([](int severity, const char* file, int line,
size_t start, const std::string& str) -> bool {
*log_string_ptr = str;
return true;
});
notimplemented_log_once_unittest();
EXPECT_NE(std::string::npos,
log_string.find("This is notimplemented_log_once_unittest()."));
notimplemented_log_once_unittest_1();
EXPECT_NE(std::string::npos,
log_string.find("This is notimplemented_log_once_unittest_1()."));
notimplemented_log_once_unittest_2();
EXPECT_NE(std::string::npos,
log_string.find("This is notimplemented_log_once_unittest_2()."));
log_string.clear();
notimplemented_log_once_unittest();
EXPECT_TRUE(log_string.empty());
notimplemented_log_once_unittest_1();
EXPECT_TRUE(log_string.empty());
notimplemented_log_once_unittest_2();
EXPECT_TRUE(log_string.empty());
// Clean up.
SetLogMessageHandler(old_log_message_handler);
log_string_ptr = nullptr;
}
} // namespace
} // namespace logging