1// Copyright (c) 2012 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// Note: this test tests LOG_V and LOG_E since all other logs are expressed
6// in forms of them. LOG is also tested for good measure.
7// Also note that we are only allowed to call InitLogging() twice so the test
8// cases are more dense than normal.
9
10// The following include must be first in this file. It ensures that
11// libjingle style logging is used.
12#define LOGGING_INSIDE_WEBRTC
13
14#include "third_party/webrtc/overrides/webrtc/base/logging.h"
15
16#include "base/command_line.h"
17#include "base/files/file_util.h"
18#include "testing/gtest/include/gtest/gtest.h"
19
20#if defined(OS_WIN)
21static const wchar_t* const log_file_name = L"libjingle_logging.log";
22#else
23static const char* const log_file_name = "libjingle_logging.log";
24#endif
25
26static const int kDefaultVerbosity = 0;
27
28static const char* AsString(rtc::LoggingSeverity severity) {
29  switch (severity) {
30    case rtc::LS_ERROR:
31      return "LS_ERROR";
32    case rtc::LS_WARNING:
33      return "LS_WARNING";
34    case rtc::LS_INFO:
35      return "LS_INFO";
36    case rtc::LS_VERBOSE:
37      return "LS_VERBOSE";
38    case rtc::LS_SENSITIVE:
39      return "LS_SENSITIVE";
40    default:
41      return "";
42  }
43}
44
45static bool ContainsString(const std::string& original,
46                           const char* string_to_match) {
47  return original.find(string_to_match) != std::string::npos;
48}
49
50static bool Initialize(int verbosity_level) {
51  if (verbosity_level != kDefaultVerbosity) {
52    // Update the command line with specified verbosity level for this file.
53    CommandLine* command_line = CommandLine::ForCurrentProcess();
54    std::ostringstream value_stream;
55    value_stream << "logging_unittest=" << verbosity_level;
56    const std::string& value = value_stream.str();
57    command_line->AppendSwitchASCII("vmodule", value);
58  }
59
60  // The command line flags are parsed here and the log file name is set.
61  logging::LoggingSettings settings;
62  settings.logging_dest = logging::LOG_TO_FILE;
63  settings.log_file = log_file_name;
64  settings.lock_log = logging::DONT_LOCK_LOG_FILE;
65  settings.delete_old = logging::DELETE_OLD_LOG_FILE;
66  if (!logging::InitLogging(settings)) {
67    return false;
68  }
69  EXPECT_TRUE(VLOG_IS_ON(verbosity_level));
70  EXPECT_FALSE(VLOG_IS_ON(verbosity_level + 1));
71  return true;
72}
73
74TEST(LibjingleLogTest, DefaultConfiguration) {
75  ASSERT_TRUE(Initialize(kDefaultVerbosity));
76
77  // In the default configuration nothing should be logged.
78  LOG_V(rtc::LS_ERROR) << AsString(rtc::LS_ERROR);
79  LOG_V(rtc::LS_WARNING) << AsString(rtc::LS_WARNING);
80  LOG_V(rtc::LS_INFO) << AsString(rtc::LS_INFO);
81  LOG_V(rtc::LS_VERBOSE) << AsString(rtc::LS_VERBOSE);
82  LOG_V(rtc::LS_SENSITIVE) << AsString(rtc::LS_SENSITIVE);
83
84  // Read file to string.
85  base::FilePath file_path(log_file_name);
86  std::string contents_of_file;
87  base::ReadFileToString(file_path, &contents_of_file);
88
89  // Make sure string contains the expected values.
90  EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_ERROR)));
91  EXPECT_FALSE(ContainsString(contents_of_file,
92                              AsString(rtc::LS_WARNING)));
93  EXPECT_FALSE(ContainsString(contents_of_file, AsString(rtc::LS_INFO)));
94  EXPECT_FALSE(ContainsString(contents_of_file,
95                              AsString(rtc::LS_VERBOSE)));
96  EXPECT_FALSE(ContainsString(contents_of_file,
97                              AsString(rtc::LS_SENSITIVE)));
98}
99
100TEST(LibjingleLogTest, InfoConfiguration) {
101  ASSERT_TRUE(Initialize(rtc::LS_INFO));
102
103  // In this configuration everything lower or equal to LS_INFO should be
104  // logged.
105  LOG_V(rtc::LS_ERROR) << AsString(rtc::LS_ERROR);
106  LOG_V(rtc::LS_WARNING) << AsString(rtc::LS_WARNING);
107  LOG_V(rtc::LS_INFO) << AsString(rtc::LS_INFO);
108  LOG_V(rtc::LS_VERBOSE) << AsString(rtc::LS_VERBOSE);
109  LOG_V(rtc::LS_SENSITIVE) << AsString(rtc::LS_SENSITIVE);
110
111  // Read file to string.
112  base::FilePath file_path(log_file_name);
113  std::string contents_of_file;
114  base::ReadFileToString(file_path, &contents_of_file);
115
116  // Make sure string contains the expected values.
117  EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_ERROR)));
118  EXPECT_TRUE(ContainsString(contents_of_file,
119                             AsString(rtc::LS_WARNING)));
120  EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_INFO)));
121  EXPECT_FALSE(ContainsString(contents_of_file,
122                              AsString(rtc::LS_VERBOSE)));
123  EXPECT_FALSE(ContainsString(contents_of_file,
124                              AsString(rtc::LS_SENSITIVE)));
125
126  // Also check that the log is proper.
127  EXPECT_TRUE(ContainsString(contents_of_file, "logging_unittest.cc"));
128  EXPECT_FALSE(ContainsString(contents_of_file, "logging.h"));
129  EXPECT_FALSE(ContainsString(contents_of_file, "logging.cc"));
130}
131
132TEST(LibjingleLogTest, LogEverythingConfiguration) {
133  ASSERT_TRUE(Initialize(rtc::LS_SENSITIVE));
134
135  // In this configuration everything should be logged.
136  LOG_V(rtc::LS_ERROR) << AsString(rtc::LS_ERROR);
137  LOG_V(rtc::LS_WARNING) << AsString(rtc::LS_WARNING);
138  LOG(LS_INFO) << AsString(rtc::LS_INFO);
139  static const int kFakeError = 1;
140  LOG_E(LS_INFO, EN, kFakeError) << "LOG_E(" << AsString(rtc::LS_INFO) <<
141      ")";
142  LOG_V(rtc::LS_VERBOSE) << AsString(rtc::LS_VERBOSE);
143  LOG_V(rtc::LS_SENSITIVE) << AsString(rtc::LS_SENSITIVE);
144
145  // Read file to string.
146  base::FilePath file_path(log_file_name);
147  std::string contents_of_file;
148  base::ReadFileToString(file_path, &contents_of_file);
149
150  // Make sure string contains the expected values.
151  EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_ERROR)));
152  EXPECT_TRUE(ContainsString(contents_of_file,
153                             AsString(rtc::LS_WARNING)));
154  EXPECT_TRUE(ContainsString(contents_of_file, AsString(rtc::LS_INFO)));
155  // LOG_E
156  EXPECT_TRUE(ContainsString(contents_of_file, strerror(kFakeError)));
157  EXPECT_TRUE(ContainsString(contents_of_file,
158                             AsString(rtc::LS_VERBOSE)));
159  EXPECT_TRUE(ContainsString(contents_of_file,
160                             AsString(rtc::LS_SENSITIVE)));
161}
162