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