xref: /aosp_15_r20/external/cronet/base/test/mock_log.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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