1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // Copyright 2015 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/test/mock_log.h"
- namespace base {
- namespace test {
- // static
- MockLog* MockLog::g_instance_ = nullptr;
- Lock MockLog::g_lock;
- MockLog::MockLog() : is_capturing_logs_(false) {
- }
- MockLog::~MockLog() {
- if (is_capturing_logs_) {
- StopCapturingLogs();
- }
- }
- void MockLog::StartCapturingLogs() {
- AutoLock scoped_lock(g_lock);
- // We don't use CHECK(), which can generate a new LOG message, and
- // thus can confuse MockLog objects or other registered
- // LogSinks.
- RAW_CHECK(!is_capturing_logs_);
- RAW_CHECK(!g_instance_);
- is_capturing_logs_ = true;
- g_instance_ = this;
- previous_handler_ = logging::GetLogMessageHandler();
- logging::SetLogMessageHandler(LogMessageHandler);
- }
- void MockLog::StopCapturingLogs() {
- AutoLock scoped_lock(g_lock);
- // We don't use CHECK(), which can generate a new LOG message, and
- // thus can confuse MockLog objects or other registered
- // LogSinks.
- RAW_CHECK(is_capturing_logs_);
- RAW_CHECK(g_instance_ == this);
- is_capturing_logs_ = false;
- logging::SetLogMessageHandler(previous_handler_);
- g_instance_ = nullptr;
- }
- // static
- bool MockLog::LogMessageHandler(int severity,
- const char* file,
- int line,
- size_t message_start,
- const std::string& str) {
- // gMock guarantees thread-safety for calling a mocked method
- // (https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-google-mock-and-threads)
- // but we also need to make sure that Start/StopCapturingLogs are synchronized
- // with LogMessageHandler.
- AutoLock scoped_lock(g_lock);
- return g_instance_->Log(severity, file, line, message_start, str);
- }
- } // namespace test
- } // namespace base
|