1d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org/*
2d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *
4d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org */
10d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
11d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
12d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
13c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/condition_variable_wrapper.h"
15d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
16d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h"
17d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/sleep.h"
18d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
19d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
20d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.orgnamespace webrtc {
21d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.orgnamespace {
22d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
23d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.orgclass LoggingTest : public ::testing::Test, public TraceCallback {
24d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org public:
25d75680a372c87ad97394a15f49340109c6f2d3edandrew@webrtc.org  virtual void Print(TraceLevel level, const char* msg, int length) {
26d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    CriticalSectionScoped cs(crit_.get());
27d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    // We test the length here to ensure (with high likelihood) that only our
28d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    // traces will be tested.
294c27c038149965cddfbe4043284af39bacfc2bcdandrew@webrtc.org    if (level_ != kTraceNone && static_cast<int>(expected_log_.str().size()) ==
304c27c038149965cddfbe4043284af39bacfc2bcdandrew@webrtc.org        length - Trace::kBoilerplateLength - 1) {
31d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      EXPECT_EQ(level_, level);
324c27c038149965cddfbe4043284af39bacfc2bcdandrew@webrtc.org      EXPECT_EQ(expected_log_.str(), &msg[Trace::kBoilerplateLength]);
33d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      level_ = kTraceNone;
34d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      cv_->Wake();
35d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    }
36d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
37d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
38d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org protected:
39d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LoggingTest()
40d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    : crit_(CriticalSectionWrapper::CreateCriticalSection()),
41d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      cv_(ConditionVariableWrapper::CreateConditionVariable()),
42d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      level_(kTraceNone),
43d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org      expected_log_() {
44d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
45d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
46d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  void SetUp() {
47d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    Trace::CreateTrace();
48d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    Trace::SetTraceCallback(this);
49d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
50d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
51d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  void TearDown() {
52d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    Trace::SetTraceCallback(NULL);
53d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    Trace::ReturnTrace();
54e8839de6404bd073b764049774a81392068f1197andresp@webrtc.org    CriticalSectionScoped cs(crit_.get());
55d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    ASSERT_EQ(kTraceNone, level_) << "Print() was not called";
56d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
57d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
58d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  scoped_ptr<CriticalSectionWrapper> crit_;
59d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  scoped_ptr<ConditionVariableWrapper> cv_;
60e8839de6404bd073b764049774a81392068f1197andresp@webrtc.org  TraceLevel level_ GUARDED_BY(crit_);
61e8839de6404bd073b764049774a81392068f1197andresp@webrtc.org  std::ostringstream expected_log_ GUARDED_BY(crit_);
62d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org};
63d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
64d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.orgTEST_F(LoggingTest, LogStream) {
65d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  {
66d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    CriticalSectionScoped cs(crit_.get());
67d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    level_ = kTraceWarning;
68d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    std::string msg = "Important message";
69d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    expected_log_ << "(logging_unittest.cc:" << __LINE__ + 1 << "): " << msg;
70bc687c51d87cbcc52ff13b29ea96062c593bb90bandrew@webrtc.org    LOG(LS_WARNING) << msg;
71804d5527f49d09d2b4d2f462532abd78c905bff7andrew@webrtc.org    cv_->SleepCS(*crit_.get(), 2000);
72d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
73d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org}
74d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
75d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.orgTEST_F(LoggingTest, LogFunctionError) {
76d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  {
77d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    CriticalSectionScoped cs(crit_.get());
78d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    int bar = 42;
79d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    int baz = 99;
80d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    level_ = kTraceError;
81d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    expected_log_ << "(logging_unittest.cc:" << __LINE__ + 2
82d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org                  << "): Foo failed: bar=" << bar << ", baz=" << baz;
83d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org    LOG_FERR2(LS_ERROR, Foo, bar, baz);
84804d5527f49d09d2b4d2f462532abd78c905bff7andrew@webrtc.org    cv_->SleepCS(*crit_.get(), 2000);
85d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  }
86d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org}
87d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org
88d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org}  // namespace
89d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org}  // namespace webrtc
90