1 // Copyright 2023 The Abseil Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "absl/log/vlog_is_on.h"
16
17 #include "gmock/gmock.h"
18 #include "gtest/gtest.h"
19 #include "absl/base/log_severity.h"
20 #include "absl/flags/flag.h"
21 #include "absl/log/flags.h"
22 #include "absl/log/globals.h"
23 #include "absl/log/log.h"
24 #include "absl/log/scoped_mock_log.h"
25 #include "absl/types/optional.h"
26
27 namespace {
28
29 using ::testing::_;
30
MaxLogVerbosity()31 absl::optional<int> MaxLogVerbosity() {
32 #ifdef ABSL_MAX_VLOG_VERBOSITY
33 return ABSL_MAX_VLOG_VERBOSITY;
34 #else
35 return absl::nullopt;
36 #endif
37 }
38
MinLogLevel()39 absl::optional<int> MinLogLevel() {
40 #ifdef ABSL_MIN_LOG_LEVEL
41 return static_cast<int>(ABSL_MIN_LOG_LEVEL);
42 #else
43 return absl::nullopt;
44 #endif
45 }
46
TEST(VLogIsOn,GlobalWorksWithoutMaxVerbosityAndMinLogLevel)47 TEST(VLogIsOn, GlobalWorksWithoutMaxVerbosityAndMinLogLevel) {
48 if (MaxLogVerbosity().has_value() || MinLogLevel().has_value()) {
49 GTEST_SKIP();
50 }
51
52 absl::SetGlobalVLogLevel(3);
53 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
54
55 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "important"));
56
57 log.StartCapturingLogs();
58 VLOG(3) << "important";
59 VLOG(4) << "spam";
60 }
61
TEST(VLogIsOn,FileWorksWithoutMaxVerbosityAndMinLogLevel)62 TEST(VLogIsOn, FileWorksWithoutMaxVerbosityAndMinLogLevel) {
63 if (MaxLogVerbosity().has_value() || MinLogLevel().has_value()) {
64 GTEST_SKIP();
65 }
66
67 absl::SetVLogLevel("vlog_is_on_test", 3);
68 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
69
70 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "important"));
71
72 log.StartCapturingLogs();
73 VLOG(3) << "important";
74 VLOG(4) << "spam";
75 }
76
TEST(VLogIsOn,PatternWorksWithoutMaxVerbosityAndMinLogLevel)77 TEST(VLogIsOn, PatternWorksWithoutMaxVerbosityAndMinLogLevel) {
78 if (MaxLogVerbosity().has_value() || MinLogLevel().has_value()) {
79 GTEST_SKIP();
80 }
81
82 absl::SetVLogLevel("vlog_is_on*", 3);
83 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
84
85 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "important"));
86
87 log.StartCapturingLogs();
88 VLOG(3) << "important";
89 VLOG(4) << "spam";
90 }
91
TEST(VLogIsOn,GlobalDoesNotFilterBelowMaxVerbosity)92 TEST(VLogIsOn, GlobalDoesNotFilterBelowMaxVerbosity) {
93 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() < 2) {
94 GTEST_SKIP();
95 }
96
97 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
98 absl::SetGlobalVLogLevel(1000);
99 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
100
101 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "asdf"));
102
103 log.StartCapturingLogs();
104 VLOG(2) << "asdf";
105 }
106
TEST(VLogIsOn,FileDoesNotFilterBelowMaxVerbosity)107 TEST(VLogIsOn, FileDoesNotFilterBelowMaxVerbosity) {
108 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() < 2) {
109 GTEST_SKIP();
110 }
111
112 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
113 absl::SetVLogLevel("vlog_is_on_test", 1000);
114 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
115
116 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "asdf"));
117
118 log.StartCapturingLogs();
119 VLOG(2) << "asdf";
120 }
121
TEST(VLogIsOn,PatternDoesNotFilterBelowMaxVerbosity)122 TEST(VLogIsOn, PatternDoesNotFilterBelowMaxVerbosity) {
123 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() < 2) {
124 GTEST_SKIP();
125 }
126
127 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
128 absl::SetVLogLevel("vlog_is_on*", 1000);
129 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
130
131 EXPECT_CALL(log, Log(absl::LogSeverity::kInfo, _, "asdf"));
132
133 log.StartCapturingLogs();
134 VLOG(2) << "asdf";
135 }
136
TEST(VLogIsOn,GlobalFiltersAboveMaxVerbosity)137 TEST(VLogIsOn, GlobalFiltersAboveMaxVerbosity) {
138 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() >= 4) {
139 GTEST_SKIP();
140 }
141
142 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
143 absl::SetGlobalVLogLevel(1000);
144 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
145
146 log.StartCapturingLogs();
147 VLOG(4) << "dfgh";
148 }
149
TEST(VLogIsOn,FileFiltersAboveMaxVerbosity)150 TEST(VLogIsOn, FileFiltersAboveMaxVerbosity) {
151 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() >= 4) {
152 GTEST_SKIP();
153 }
154
155 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
156 absl::SetVLogLevel("vlog_is_on_test", 1000);
157 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
158
159 log.StartCapturingLogs();
160 VLOG(4) << "dfgh";
161 }
162
TEST(VLogIsOn,PatternFiltersAboveMaxVerbosity)163 TEST(VLogIsOn, PatternFiltersAboveMaxVerbosity) {
164 if (!MaxLogVerbosity().has_value() || *MaxLogVerbosity() >= 4) {
165 GTEST_SKIP();
166 }
167
168 // Set an arbitrary high value to avoid filtering VLOGs in tests by default.
169 absl::SetVLogLevel("vlog_is_on*", 1000);
170 absl::ScopedMockLog log(absl::MockLogDefault::kDisallowUnexpected);
171
172 log.StartCapturingLogs();
173 VLOG(4) << "dfgh";
174 }
175
176 } // namespace
177