1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/vlog.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker namespace logging {
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker namespace {
13*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,NoVmodule)14*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, NoVmodule) {
15*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
16*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0,
17*6777b538SAndroid Build Coastguard Worker VlogInfo(std::string(), std::string(), &min_log_level)
18*6777b538SAndroid Build Coastguard Worker .GetVlogLevel("test1"));
19*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0,
20*6777b538SAndroid Build Coastguard Worker VlogInfo("0", std::string(), &min_log_level).GetVlogLevel("test2"));
21*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
22*6777b538SAndroid Build Coastguard Worker 0, VlogInfo("blah", std::string(), &min_log_level).GetVlogLevel("test3"));
23*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
24*6777b538SAndroid Build Coastguard Worker 0,
25*6777b538SAndroid Build Coastguard Worker VlogInfo("0blah1", std::string(), &min_log_level).GetVlogLevel("test4"));
26*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1,
27*6777b538SAndroid Build Coastguard Worker VlogInfo("1", std::string(), &min_log_level).GetVlogLevel("test5"));
28*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5,
29*6777b538SAndroid Build Coastguard Worker VlogInfo("5", std::string(), &min_log_level).GetVlogLevel("test6"));
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,MatchVlogPattern)32*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, MatchVlogPattern) {
33*6777b538SAndroid Build Coastguard Worker // Degenerate cases.
34*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("", ""));
35*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("", "****"));
36*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("", "x"));
37*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("x", ""));
38*6777b538SAndroid Build Coastguard Worker
39*6777b538SAndroid Build Coastguard Worker // Basic.
40*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "blah"));
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker // ? should match exactly one character.
43*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "bl?h"));
44*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("blh", "bl?h"));
45*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("blaah", "bl?h"));
46*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "?lah"));
47*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("lah", "?lah"));
48*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("bblah", "?lah"));
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker // * can match any number (even 0) of characters.
51*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "bl*h"));
52*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blabcdefh", "bl*h"));
53*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blh", "bl*h"));
54*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "*blah"));
55*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("ohblah", "*blah"));
56*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "blah*"));
57*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blahhhh", "blah*"));
58*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blahhhh", "blah*"));
59*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "*blah*"));
60*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blahhhh", "*blah*"));
61*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("bbbblahhhh", "*blah*"));
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker // Multiple *s should work fine.
64*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("ballaah", "b*la*h"));
65*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blah", "b*la*h"));
66*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("bbbblah", "b*la*h"));
67*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("blaaah", "b*la*h"));
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker // There should be no escaping going on.
70*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("bl\\ah", "bl\\?h"));
71*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("bl?h", "bl\\?h"));
72*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("bl\\aaaah", "bl\\*h"));
73*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(MatchVlogPattern("bl*h", "bl\\*h"));
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker // Any slash matches any slash.
76*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("/b\\lah", "/b\\lah"));
77*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MatchVlogPattern("\\b/lah", "/b\\lah"));
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleBasic)80*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleBasic) {
81*6777b538SAndroid Build Coastguard Worker const char kVSwitch[] = "-1";
82*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] =
83*6777b538SAndroid Build Coastguard Worker "foo=,bar=0,baz=blah,,qux=0blah1,quux=1,corge.ext=5";
84*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
85*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(kVSwitch, kVModuleSwitch, &min_log_level);
86*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(-1, vlog_info.GetVlogLevel("/path/to/grault.cc"));
87*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("/path/to/foo.cc"));
88*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("D:\\Path\\To\\bar-inl.mm"));
89*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(-1, vlog_info.GetVlogLevel("D:\\path\\to what/bar_unittest.m"));
90*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("baz.h"));
91*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("/another/path/to/qux.h"));
92*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("/path/to/quux"));
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5, vlog_info.GetVlogLevel("c:\\path/to/corge.ext.h"));
94*6777b538SAndroid Build Coastguard Worker }
95*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleDirs)96*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleDirs) {
97*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] =
98*6777b538SAndroid Build Coastguard Worker "foo/bar.cc=1,baz\\*\\qux.cc=2,*quux/*=3,*/*-inl.h=4";
99*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
100*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("/foo/bar.cc"));
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("bar.cc"));
103*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("foo/bar.cc"));
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("baz/grault/qux.h"));
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("/baz/grault/qux.cc"));
107*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("baz/grault/qux.cc"));
108*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("baz/grault/blah/qux.cc"));
109*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("baz\\grault\\qux.cc"));
110*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("baz\\grault//blah\\qux.cc"));
111*6777b538SAndroid Build Coastguard Worker
112*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("/foo/bar/baz/quux.cc"));
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, vlog_info.GetVlogLevel("/foo/bar/baz/quux/grault.cc"));
114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, vlog_info.GetVlogLevel("/foo\\bar/baz\\quux/grault.cc"));
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("foo/bar/test-inl.cc"));
117*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, vlog_info.GetVlogLevel("foo/bar/test-inl.h"));
118*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, vlog_info.GetVlogLevel("foo/bar/baz/blah-inl.h"));
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleDuplicateName)121*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleDuplicateName) {
122*6777b538SAndroid Build Coastguard Worker // When filename rules are duplicated, the first one is effective.
123*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] = "foo=2,foo=1";
124*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
125*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
126*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("foo.cc"));
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleDuplicatePattern)129*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleDuplicatePattern) {
130*6777b538SAndroid Build Coastguard Worker // When pattern rules are duplicated, the first one is effective.
131*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] = "foo*=3,foo*=4";
132*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
133*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
134*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, vlog_info.GetVlogLevel("foobar.cc"));
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleOrderFirstMatchIsName)137*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleOrderFirstMatchIsName) {
138*6777b538SAndroid Build Coastguard Worker // When rules overlap, the first matching rule is effective.
139*6777b538SAndroid Build Coastguard Worker // This is a filename before pattern case.
140*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] = "foo=2,bar/*=1";
141*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
142*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
143*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("bar/a.cc"));
144*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("bar/foo.cc"));
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleOrderFirstMatchIsPattern)147*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleOrderFirstMatchIsPattern) {
148*6777b538SAndroid Build Coastguard Worker // When rules overlap, the first matching rule is effective.
149*6777b538SAndroid Build Coastguard Worker // This is a pattern before filename case.
150*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] = "bar/*=1,foo=2";
151*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
152*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
153*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("bar/foo.cc"));
154*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("bar/a.cc"));
155*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("foo.cc"));
156*6777b538SAndroid Build Coastguard Worker }
157*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,VmoduleOrderSample)158*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, VmoduleOrderSample) {
159*6777b538SAndroid Build Coastguard Worker // logging.h --vmodule example, with some overlapping cases checked.
160*6777b538SAndroid Build Coastguard Worker const char kVModuleSwitch[] =
161*6777b538SAndroid Build Coastguard Worker "profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4";
162*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
163*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
164*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, vlog_info.GetVlogLevel("foo/chromeos/bar.cc"));
165*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, vlog_info.GetVlogLevel("browser_foo.cc"));
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, vlog_info.GetVlogLevel("foo/chromeos/browser_bar.cc"));
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("icon_loader.cc"));
168*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("foo/profile.cc"));
169*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info.GetVlogLevel("foo/chromeos/profile.cc"));
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("foo.cc"));
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker
TEST(VlogTest,WithSwitches)173*6777b538SAndroid Build Coastguard Worker TEST(VlogTest, WithSwitches) {
174*6777b538SAndroid Build Coastguard Worker // Set up simple VlogInfo with just "foo".
175*6777b538SAndroid Build Coastguard Worker int min_log_level = 0;
176*6777b538SAndroid Build Coastguard Worker VlogInfo vlog_info("", "foo=1", &min_log_level);
177*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info.GetVlogLevel("foo.cc"));
178*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, vlog_info.GetVlogLevel("bar.cc"));
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Worker // Now create another one adding "bar".
181*6777b538SAndroid Build Coastguard Worker std::unique_ptr<VlogInfo> vlog_info_with_switches(
182*6777b538SAndroid Build Coastguard Worker vlog_info.WithSwitches("bar=2"));
183*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, vlog_info_with_switches->GetVlogLevel("foo.cc"));
184*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, vlog_info_with_switches->GetVlogLevel("bar.cc"));
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker } // namespace
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker } // namespace logging
189