vlog_unittest.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 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 "base/vlog.h"
6
7#include "base/basictypes.h"
8#include "base/logging.h"
9#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
10#include "base/time.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
13namespace logging {
14
15namespace {
16
17class VlogTest : public testing::Test {
18};
19
20TEST_F(VlogTest, NoVmodule) {
21  EXPECT_EQ(0, VlogInfo("", "").GetVlogLevel("test1"));
22  EXPECT_EQ(0, VlogInfo("0", "").GetVlogLevel("test2"));
23  EXPECT_EQ(0, VlogInfo("blah", "").GetVlogLevel("test3"));
24  EXPECT_EQ(0, VlogInfo("0blah1", "").GetVlogLevel("test4"));
25  EXPECT_EQ(1, VlogInfo("1", "").GetVlogLevel("test5"));
26  EXPECT_EQ(5, VlogInfo("5", "").GetVlogLevel("test6"));
27}
28
29TEST_F(VlogTest, Vmodule) {
30  const char kVSwitch[] = "-1";
31  const char kVModuleSwitch[] =
32      "foo=,bar=0,baz=blah,,qux=0blah1,quux=1,corge=5";
33  VlogInfo vlog_info(kVSwitch, kVModuleSwitch);
34  EXPECT_EQ(-1, vlog_info.GetVlogLevel("/path/to/grault.cc"));
35  EXPECT_EQ(0, vlog_info.GetVlogLevel("/path/to/foo.cc"));
36  EXPECT_EQ(0, vlog_info.GetVlogLevel("D:\\Path\\To\\bar-inl.mm"));
37  EXPECT_EQ(-1, vlog_info.GetVlogLevel("D:\\path\\to what/bar_unittest.m"));
38  EXPECT_EQ(0, vlog_info.GetVlogLevel("baz.h"));
39  EXPECT_EQ(0, vlog_info.GetVlogLevel("/another/path/to/qux.h"));
40  EXPECT_EQ(1, vlog_info.GetVlogLevel("/path/to/quux"));
41  EXPECT_EQ(5, vlog_info.GetVlogLevel("c:\\path/to/corge.h"));
42}
43
44#define BENCHMARK(iters, elapsed, code)                         \
45  do {                                                          \
46    base::TimeTicks start = base::TimeTicks::Now();             \
47    for (int i = 0; i < iters; ++i) code;                       \
48    base::TimeTicks end = base::TimeTicks::Now();               \
49    elapsed = end - start;                                      \
50    double cps = iters / elapsed.InSecondsF();                  \
51    LOG(INFO) << cps << " cps (" << elapsed.InSecondsF()        \
52              << "s elapsed)";                                  \
53  } while (0)
54
55double GetSlowdown(const base::TimeDelta& base,
56                   const base::TimeDelta& elapsed) {
57  return elapsed.InSecondsF() / base.InSecondsF();
58}
59
60
61TEST_F(VlogTest, Perf) {
62  const char* kVlogs[] = {
63    "/path/to/foo.cc",
64    "C:\\path\\to\\bar.h",
65    "/path/to/not-matched.mm",
66    "C:\\path\\to\\baz-inl.mm",
67    "C:\\path\\to\\qux.mm",
68    "/path/to/quux.mm",
69    "/path/to/another-not-matched.mm",
70  };
71  const int kVlogCount = arraysize(kVlogs);
72  const int kBenchmarkIterations = RunningOnValgrind() ? 30000 : 10000000;
73
74  base::TimeDelta null_elapsed;
75  {
76    VlogInfo null_vlog_info("", "");
77    BENCHMARK(kBenchmarkIterations, null_elapsed, {
78      EXPECT_NE(-1, null_vlog_info.GetVlogLevel(kVlogs[i % kVlogCount]));
79    });
80  }
81
82  {
83    VlogInfo small_vlog_info("0", "foo=1,bar=2,baz=3,qux=4,quux=5");
84    base::TimeDelta elapsed;
85    BENCHMARK(kBenchmarkIterations, elapsed, {
86      EXPECT_NE(-1, small_vlog_info.GetVlogLevel(kVlogs[i % kVlogCount]));
87    });
88    LOG(INFO) << "slowdown = " << GetSlowdown(null_elapsed, elapsed)
89              << "x";
90  }
91
92  {
93    VlogInfo pattern_vlog_info("0", "fo*=1,ba?=2,b*?z=3,*ux=4,?uux=5");
94    base::TimeDelta elapsed;
95    BENCHMARK(kBenchmarkIterations, elapsed, {
96      EXPECT_NE(-1, pattern_vlog_info.GetVlogLevel(kVlogs[i % kVlogCount]));
97    });
98    LOG(INFO) << "slowdown = " << GetSlowdown(null_elapsed, elapsed)
99              << "x";
100  }
101}
102
103#undef BENCHMARK
104
105}  // namespace
106
107}  // namespace logging
108