1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/test/mock_log.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker namespace base {
8*6777b538SAndroid Build Coastguard Worker namespace test {
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker // static
11*6777b538SAndroid Build Coastguard Worker MockLog* MockLog::g_instance_ = nullptr;
12*6777b538SAndroid Build Coastguard Worker Lock MockLog::g_lock;
13*6777b538SAndroid Build Coastguard Worker
MockLog()14*6777b538SAndroid Build Coastguard Worker MockLog::MockLog() : is_capturing_logs_(false) {
15*6777b538SAndroid Build Coastguard Worker }
16*6777b538SAndroid Build Coastguard Worker
~MockLog()17*6777b538SAndroid Build Coastguard Worker MockLog::~MockLog() {
18*6777b538SAndroid Build Coastguard Worker if (is_capturing_logs_) {
19*6777b538SAndroid Build Coastguard Worker StopCapturingLogs();
20*6777b538SAndroid Build Coastguard Worker }
21*6777b538SAndroid Build Coastguard Worker }
22*6777b538SAndroid Build Coastguard Worker
StartCapturingLogs()23*6777b538SAndroid Build Coastguard Worker void MockLog::StartCapturingLogs() {
24*6777b538SAndroid Build Coastguard Worker AutoLock scoped_lock(g_lock);
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker // We don't use CHECK(), which can generate a new LOG message, and
27*6777b538SAndroid Build Coastguard Worker // thus can confuse MockLog objects or other registered
28*6777b538SAndroid Build Coastguard Worker // LogSinks.
29*6777b538SAndroid Build Coastguard Worker RAW_CHECK(!is_capturing_logs_);
30*6777b538SAndroid Build Coastguard Worker RAW_CHECK(!g_instance_);
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker is_capturing_logs_ = true;
33*6777b538SAndroid Build Coastguard Worker g_instance_ = this;
34*6777b538SAndroid Build Coastguard Worker previous_handler_ = logging::GetLogMessageHandler();
35*6777b538SAndroid Build Coastguard Worker logging::SetLogMessageHandler(LogMessageHandler);
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker
StopCapturingLogs()38*6777b538SAndroid Build Coastguard Worker void MockLog::StopCapturingLogs() {
39*6777b538SAndroid Build Coastguard Worker AutoLock scoped_lock(g_lock);
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker // We don't use CHECK(), which can generate a new LOG message, and
42*6777b538SAndroid Build Coastguard Worker // thus can confuse MockLog objects or other registered
43*6777b538SAndroid Build Coastguard Worker // LogSinks.
44*6777b538SAndroid Build Coastguard Worker RAW_CHECK(is_capturing_logs_);
45*6777b538SAndroid Build Coastguard Worker RAW_CHECK(g_instance_ == this);
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker is_capturing_logs_ = false;
48*6777b538SAndroid Build Coastguard Worker logging::SetLogMessageHandler(previous_handler_);
49*6777b538SAndroid Build Coastguard Worker g_instance_ = nullptr;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker // static
LogMessageHandler(int severity,const char * file,int line,size_t message_start,const std::string & str)53*6777b538SAndroid Build Coastguard Worker bool MockLog::LogMessageHandler(int severity,
54*6777b538SAndroid Build Coastguard Worker const char* file,
55*6777b538SAndroid Build Coastguard Worker int line,
56*6777b538SAndroid Build Coastguard Worker size_t message_start,
57*6777b538SAndroid Build Coastguard Worker const std::string& str) {
58*6777b538SAndroid Build Coastguard Worker // gMock guarantees thread-safety for calling a mocked method
59*6777b538SAndroid Build Coastguard Worker // (https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-google-mock-and-threads)
60*6777b538SAndroid Build Coastguard Worker // but we also need to make sure that Start/StopCapturingLogs are synchronized
61*6777b538SAndroid Build Coastguard Worker // with LogMessageHandler.
62*6777b538SAndroid Build Coastguard Worker AutoLock scoped_lock(g_lock);
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker return g_instance_->Log(severity, file, line, message_start, str);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker } // namespace test
68*6777b538SAndroid Build Coastguard Worker } // namespace base
69