1c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org/*
2c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *
4c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  Use of this source code is governed by a BSD-style license
5c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  that can be found in the LICENSE file in the root of the source
6c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  tree. An additional intellectual property rights grant can be found
7c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  in the file PATENTS.  All contributing project authors may
8c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org */
10c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
11c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
12c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
13c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
14c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// To enable BWE logging, run this command from trunk/ :
15c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// build/gyp_chromium --depth=. webrtc/modules/modules.gyp
16c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   -Denable_bwe_test_logging=1
17c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#ifndef BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
18c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_COMPILE_TIME_ENABLE 0
19c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#endif  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
20c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
21c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// BWE logging allows you to insert dynamically named log/plot points in the
22c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// call tree. E.g. the function:
23c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//  void f1() {
24c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//    BWE_TEST_LOGGING_TIME(clock_->TimeInMilliseconds());
25c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//    BWE_TEST_LOGGING_CONTEXT("stream");
26c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//    for (uint32_t i=0; i<4; ++i) {
27c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//      BWE_TEST_LOGGING_ENABLE(i & 1);
28c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//      BWE_TEST_LOGGING_CONTEXT(i);
29c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//      BWE_TEST_LOGGING_LOG1("weight", "%f tonnes", weights_[i]);
30c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//      for (float j=0.0f; j<1.0; j+=0.4f) {
31c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//        BWE_TEST_LOGGING_PLOT("bps", -1, j);
32c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//      }
33c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//    }
34c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//  }
35c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//
36c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Might produce the output:
37c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   stream_00000001_weight 13.000000 tonnes
38c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000001_bps  1.000000  0.000000
39c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000001_bps  1.000000  0.400000
40c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000001_bps  1.000000  0.800000
41c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   stream_00000003_weight 39.000000 tonnes
42c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000003_bps  1.000000  0.000000
43c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000003_bps  1.000000  0.400000
44c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  stream_00000003_bps  1.000000  0.800000
45c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//
46c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Log *contexts* are names concatenated with '_' between them, with the name
47c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// of the logged/plotted string/value last. Plot *time* is inherited down the
48c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// tree. A branch is enabled by default but can be *disabled* to reduce output.
49c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// The difference between the LOG and PLOT macros is that PLOT prefixes the line
50c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// so it can be easily filtered, plus it outputs the current time.
51c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
52c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#if !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
53c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
54cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org// Set a thread-global base logging context. This name will be prepended to all
55cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org// hierarchical contexts.
56cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org// |name| is a char*, std::string or uint32_t to name the context.
57cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org#define BWE_TEST_LOGGING_GLOBAL_CONTEXT(name)
58cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
59cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org// Thread-globally allow/disallow logging.
60cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org// |enable| is expected to be a bool.
61cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org#define BWE_TEST_LOGGING_GLOBAL_ENABLE(enabled)
62cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
63c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Insert a (hierarchical) logging context.
64c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |name| is a char*, std::string or uint32_t to name the context.
65c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_CONTEXT(name)
66c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
67c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Allow/disallow logging down the call tree from this point. Logging must be
68c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// enabled all the way to the root of the call tree to take place.
69c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |enable| is expected to be a bool.
70c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_ENABLE(enabled)
71c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
72c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Set current time (only affects PLOT output). Down the call tree, the latest
73c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// time set always takes precedence.
74c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |time| is an int64_t time in ms, or -1 to inherit time from previous context.
75c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_TIME(time)
76c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
77c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Print to stdout, e.g.:
78c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   Context1_Context2_Name  printf-formated-string
79c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |name| is a char*, std::string or uint32_t to name the log line.
80c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |format| is a printf format string.
81c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |_1...| are arguments for printf.
82c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG1(name, format, _1)
83c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG2(name, format, _1, _2)
84c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG3(name, format, _1, _2, _3)
85c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG4(name, format, _1, _2, _3, _4)
86c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG5(name, format, _1, _2, _3, _4, _5)
87c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
88c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// Print to stdout in tab-separated format suitable for plotting, e.g.:
89c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org//   PLOT  Context1_Context2_Name  time  value
90c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |name| is a char*, std::string or uint32_t to name the plotted value.
91c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |time| is an int64_t time in ms, or -1 to inherit time from previous context.
92c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org// |value| is a double precision float to be plotted.
93c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_PLOT(name, time, value)
94c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
95c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#else  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
96c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
97c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include <map>
98c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include <stack>
99c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include <string>
100c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
101774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h"
102c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include "webrtc/common_types.h"
103c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
104c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
105cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org#define BWE_TEST_LOGGING_GLOBAL_CONTEXT(name) \
106cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    do { \
107cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->SetGlobalContext(name); \
108cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    } while (0);
109cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
110cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org#define BWE_TEST_LOGGING_GLOBAL_ENABLE(enabled) \
111cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    do { \
112cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->SetGlobalEnable(enabled); \
113cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    } while (0);
114cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
115c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define __BWE_TEST_LOGGING_CONTEXT_NAME(ctx, line) ctx ## line
116c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define __BWE_TEST_LOGGING_CONTEXT_DECLARE(ctx, line, name, time, enabled) \
117c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    webrtc::testing::bwe::Logging::Context \
118c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org        __BWE_TEST_LOGGING_CONTEXT_NAME(ctx, line)(name, time, enabled)
119c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
120c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_CONTEXT(name) \
121c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, name, -1, true)
122c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_ENABLE(enabled) \
123c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, "", -1, \
124c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                                       static_cast<bool>(enabled))
125c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_TIME(time) \
126c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, "", \
127c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                                       static_cast<int64_t>(time), true)
128c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
129c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG1(name, format, _1) \
130c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do { \
131c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      BWE_TEST_LOGGING_CONTEXT(name); \
132c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1); \
133c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
134c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG2(name, format, _1, _2) \
135c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do { \
136c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      BWE_TEST_LOGGING_CONTEXT(name); \
137c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2); \
138c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
139c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG3(name, format, _1, _2, _3) \
140c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do { \
141c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      BWE_TEST_LOGGING_CONTEXT(name); \
142c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3); \
143c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
144c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG4(name, format, _1, _2, _3, _4) \
145c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do { \
146c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      BWE_TEST_LOGGING_CONTEXT(name); \
147c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3, \
148c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                                                        _4); \
149c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
150c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_LOG5(name, format, _1, _2, _3, _4, _5) \
151c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do {\
152c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      BWE_TEST_LOGGING_CONTEXT(name); \
153c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3, \
154c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                                                        _4, _5); \
155c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
156c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
157c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#define BWE_TEST_LOGGING_PLOT(name, time, value)\
158c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    do { \
159c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, name, \
160c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                                         static_cast<int64_t>(time), true); \
161c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org      webrtc::testing::bwe::Logging::GetInstance()->Plot(value); \
162c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    } while (0);
163c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
164c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.orgnamespace webrtc {
165c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
166c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.orgclass CriticalSectionWrapper;
167c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
168c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.orgnamespace testing {
169c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.orgnamespace bwe {
170c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
171c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.orgclass Logging {
172c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org public:
173c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  class Context {
174c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org   public:
175c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    Context(uint32_t name, int64_t timestamp_ms, bool enabled);
176c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    Context(const std::string& name, int64_t timestamp_ms, bool enabled);
177c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    Context(const char* name, int64_t timestamp_ms, bool enabled);
178c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    ~Context();
179c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org   private:
180c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    DISALLOW_IMPLICIT_CONSTRUCTORS(Context);
181c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  };
182c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
183c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  static Logging* GetInstance();
184cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
185cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetGlobalContext(uint32_t name);
186cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetGlobalContext(const std::string& name);
187cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetGlobalContext(const char* name);
188cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void SetGlobalEnable(bool enabled);
189cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
190c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  void Log(const char format[], ...);
191c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  void Plot(double value);
192c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
193c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org private:
194c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  struct State {
195cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    State();
196cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    State(const std::string& new_tag, int64_t timestamp_ms, bool enabled);
197cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    void MergePrevious(const State& previous);
198cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org
199c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    std::string tag;
200c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    int64_t timestamp_ms;
201c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org    bool enabled;
202c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  };
203cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  struct ThreadState {
204cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    State global_state;
205cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org    std::stack<State> stack;
206cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  };
207cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  typedef std::map<uint32_t, ThreadState> ThreadMap;
208c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
209c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  Logging();
210cda3cf3d646f20bb2b785c64c0091868dcc2de5csolenberg@webrtc.org  void PushState(const std::string& append_to_tag, int64_t timestamp_ms,
211c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org                 bool enabled);
212c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  void PopState();
213c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
214c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  static Logging g_Logging;
215c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  scoped_ptr<CriticalSectionWrapper> crit_sect_;
216c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  ThreadMap thread_map_;
217c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
218c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org  DISALLOW_COPY_AND_ASSIGN(Logging);
219c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org};
220c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org}  // namespace bwe
221c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org}  // namespace testing
222c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org}  // namespace webrtc
223c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org
224c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#endif  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
225c2b61668e22020142791964d3210f6d6da02afa1solenberg@webrtc.org#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
226