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