scoped_mock_log.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/test/scoped_mock_log.h"
6
7#include "base/logging.h"
8
9namespace net {
10namespace test {
11
12// static
13ScopedMockLog* ScopedMockLog::g_instance_ = NULL;
14
15ScopedMockLog::ScopedMockLog() : is_capturing_logs_(false) {}
16
17ScopedMockLog::~ScopedMockLog() {
18  if (is_capturing_logs_) {
19    StopCapturingLogs();
20  }
21}
22
23void ScopedMockLog::StartCapturingLogs() {
24  // We don't use CHECK(), which can generate a new LOG message, and
25  // thus can confuse ScopedMockLog objects or other registered
26  // LogSinks.
27  RAW_CHECK(!is_capturing_logs_);
28  RAW_CHECK(!g_instance_);
29
30  is_capturing_logs_ = true;
31  g_instance_ = this;
32  previous_handler_ = logging::GetLogMessageHandler();
33  logging::SetLogMessageHandler(LogMessageHandler);
34}
35
36void ScopedMockLog::StopCapturingLogs() {
37  // We don't use CHECK(), which can generate a new LOG message, and
38  // thus can confuse ScopedMockLog objects or other registered
39  // LogSinks.
40  RAW_CHECK(is_capturing_logs_);
41  RAW_CHECK(g_instance_ == this);
42
43  is_capturing_logs_ = false;
44  logging::SetLogMessageHandler(previous_handler_);
45  g_instance_ = NULL;
46}
47
48// static
49bool ScopedMockLog::LogMessageHandler(int severity,
50                                      const char* file,
51                                      int line,
52                                      size_t message_start,
53                                      const std::string& str) {
54  return g_instance_->Log(severity, file, line, message_start, str);
55}
56
57}  // namespace test
58}  // namespace net
59