flags_test.cc (6317B)
1 // 2 // Copyright 2022 The Abseil Authors. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // https://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 #include "absl/log/internal/flags.h" 17 18 #include <string> 19 20 #include "gmock/gmock.h" 21 #include "gtest/gtest.h" 22 #include "absl/base/attributes.h" 23 #include "absl/base/log_severity.h" 24 #include "absl/flags/flag.h" 25 #include "absl/flags/reflection.h" 26 #include "absl/log/globals.h" 27 #include "absl/log/internal/test_helpers.h" 28 #include "absl/log/internal/test_matchers.h" 29 #include "absl/log/log.h" 30 #include "absl/log/scoped_mock_log.h" 31 #include "absl/strings/str_cat.h" 32 33 namespace { 34 using ::absl::log_internal::TextMessage; 35 36 using ::testing::HasSubstr; 37 using ::testing::Not; 38 39 auto* test_env ABSL_ATTRIBUTE_UNUSED = ::testing::AddGlobalTestEnvironment( 40 new absl::log_internal::LogTestEnvironment); 41 42 constexpr static absl::LogSeverityAtLeast DefaultStderrThreshold() { 43 return absl::LogSeverityAtLeast::kError; 44 } 45 46 class LogFlagsTest : public ::testing::Test { 47 protected: 48 absl::FlagSaver flag_saver_; 49 }; 50 51 // This test is disabled because it adds order dependency to the test suite. 52 // This order dependency is currently not fixable due to the way the 53 // stderrthreshold global value is out of sync with the stderrthreshold flag. 54 TEST_F(LogFlagsTest, DISABLED_StderrKnobsDefault) { 55 EXPECT_EQ(absl::StderrThreshold(), DefaultStderrThreshold()); 56 } 57 58 TEST_F(LogFlagsTest, SetStderrThreshold) { 59 absl::SetFlag(&FLAGS_stderrthreshold, 60 static_cast<int>(absl::LogSeverityAtLeast::kInfo)); 61 62 EXPECT_EQ(absl::StderrThreshold(), absl::LogSeverityAtLeast::kInfo); 63 64 absl::SetFlag(&FLAGS_stderrthreshold, 65 static_cast<int>(absl::LogSeverityAtLeast::kError)); 66 67 EXPECT_EQ(absl::StderrThreshold(), absl::LogSeverityAtLeast::kError); 68 } 69 70 TEST_F(LogFlagsTest, SetMinLogLevel) { 71 absl::SetFlag(&FLAGS_minloglevel, 72 static_cast<int>(absl::LogSeverityAtLeast::kError)); 73 74 EXPECT_EQ(absl::MinLogLevel(), absl::LogSeverityAtLeast::kError); 75 76 absl::log_internal::ScopedMinLogLevel scoped_min_log_level( 77 absl::LogSeverityAtLeast::kWarning); 78 79 EXPECT_EQ(absl::GetFlag(FLAGS_minloglevel), 80 static_cast<int>(absl::LogSeverityAtLeast::kWarning)); 81 } 82 83 TEST_F(LogFlagsTest, PrependLogPrefix) { 84 absl::SetFlag(&FLAGS_log_prefix, false); 85 86 EXPECT_EQ(absl::ShouldPrependLogPrefix(), false); 87 88 absl::EnableLogPrefix(true); 89 90 EXPECT_EQ(absl::GetFlag(FLAGS_log_prefix), true); 91 } 92 93 TEST_F(LogFlagsTest, EmptyBacktraceAtFlag) { 94 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 95 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 96 97 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 98 99 test_sink.StartCapturingLogs(); 100 absl::SetFlag(&FLAGS_log_backtrace_at, ""); 101 LOG(INFO) << "hello world"; 102 } 103 104 TEST_F(LogFlagsTest, BacktraceAtNonsense) { 105 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 106 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 107 108 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 109 110 test_sink.StartCapturingLogs(); 111 absl::SetFlag(&FLAGS_log_backtrace_at, "gibberish"); 112 LOG(INFO) << "hello world"; 113 } 114 115 TEST_F(LogFlagsTest, BacktraceAtWrongFile) { 116 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 117 const int log_line = __LINE__ + 1; 118 auto do_log = [] { LOG(INFO) << "hello world"; }; 119 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 120 121 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 122 123 test_sink.StartCapturingLogs(); 124 absl::SetFlag(&FLAGS_log_backtrace_at, 125 absl::StrCat("some_other_file.cc:", log_line)); 126 do_log(); 127 } 128 129 TEST_F(LogFlagsTest, BacktraceAtWrongLine) { 130 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 131 const int log_line = __LINE__ + 1; 132 auto do_log = [] { LOG(INFO) << "hello world"; }; 133 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 134 135 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 136 137 test_sink.StartCapturingLogs(); 138 absl::SetFlag(&FLAGS_log_backtrace_at, 139 absl::StrCat("flags_test.cc:", log_line + 1)); 140 do_log(); 141 } 142 143 TEST_F(LogFlagsTest, BacktraceAtWholeFilename) { 144 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 145 const int log_line = __LINE__ + 1; 146 auto do_log = [] { LOG(INFO) << "hello world"; }; 147 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 148 149 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 150 151 test_sink.StartCapturingLogs(); 152 absl::SetFlag(&FLAGS_log_backtrace_at, absl::StrCat(__FILE__, ":", log_line)); 153 do_log(); 154 } 155 156 TEST_F(LogFlagsTest, BacktraceAtNonmatchingSuffix) { 157 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 158 const int log_line = __LINE__ + 1; 159 auto do_log = [] { LOG(INFO) << "hello world"; }; 160 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 161 162 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 163 164 test_sink.StartCapturingLogs(); 165 absl::SetFlag(&FLAGS_log_backtrace_at, 166 absl::StrCat("flags_test.cc:", log_line, "gibberish")); 167 do_log(); 168 } 169 170 TEST_F(LogFlagsTest, LogsBacktrace) { 171 absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo); 172 const int log_line = __LINE__ + 1; 173 auto do_log = [] { LOG(INFO) << "hello world"; }; 174 absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected); 175 176 testing::InSequence seq; 177 EXPECT_CALL(test_sink, Send(TextMessage(HasSubstr("(stacktrace:")))); 178 EXPECT_CALL(test_sink, Send(TextMessage(Not(HasSubstr("(stacktrace:"))))); 179 180 test_sink.StartCapturingLogs(); 181 absl::SetFlag(&FLAGS_log_backtrace_at, 182 absl::StrCat("flags_test.cc:", log_line)); 183 do_log(); 184 absl::SetFlag(&FLAGS_log_backtrace_at, ""); 185 do_log(); 186 } 187 188 } // namespace