xref: /aosp_15_r20/external/openscreen/platform/impl/logging_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "platform/api/logging.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include <string>
8*3f982cf4SFabien Sanglard #include <vector>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "absl/strings/match.h"
11*3f982cf4SFabien Sanglard #include "absl/strings/str_cat.h"
12*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h"
13*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
14*3f982cf4SFabien Sanglard #include "platform/impl/logging.h"
15*3f982cf4SFabien Sanglard #include "platform/impl/logging_test.h"
16*3f982cf4SFabien Sanglard #include "util/osp_logging.h"
17*3f982cf4SFabien Sanglard 
18*3f982cf4SFabien Sanglard namespace openscreen {
19*3f982cf4SFabien Sanglard 
20*3f982cf4SFabien Sanglard class LoggingTest : public ::testing::Test {
21*3f982cf4SFabien Sanglard  public:
LoggingTest()22*3f982cf4SFabien Sanglard   LoggingTest() {}
23*3f982cf4SFabien Sanglard 
SetUp()24*3f982cf4SFabien Sanglard   void SetUp() {
25*3f982cf4SFabien Sanglard     previous_log_level = GetLogLevel();
26*3f982cf4SFabien Sanglard     SetLogLevel(LogLevel::kInfo);
27*3f982cf4SFabien Sanglard     SetLogBufferForTest(&log_messages);
28*3f982cf4SFabien Sanglard     testing::FLAGS_gtest_death_test_style = "threadsafe";
29*3f982cf4SFabien Sanglard   }
30*3f982cf4SFabien Sanglard 
TearDown()31*3f982cf4SFabien Sanglard   void TearDown() {
32*3f982cf4SFabien Sanglard     SetLogLevel(previous_log_level);
33*3f982cf4SFabien Sanglard     SetLogBufferForTest(nullptr);
34*3f982cf4SFabien Sanglard   }
35*3f982cf4SFabien Sanglard 
36*3f982cf4SFabien Sanglard  protected:
ExpectLog(LogLevel level,absl::string_view message)37*3f982cf4SFabien Sanglard   void ExpectLog(LogLevel level, absl::string_view message) {
38*3f982cf4SFabien Sanglard     const char* level_string = "";
39*3f982cf4SFabien Sanglard     switch (level) {
40*3f982cf4SFabien Sanglard       case LogLevel::kVerbose:
41*3f982cf4SFabien Sanglard         level_string = "VERBOSE";
42*3f982cf4SFabien Sanglard         break;
43*3f982cf4SFabien Sanglard       case LogLevel::kInfo:
44*3f982cf4SFabien Sanglard         level_string = "INFO";
45*3f982cf4SFabien Sanglard         break;
46*3f982cf4SFabien Sanglard       case LogLevel::kWarning:
47*3f982cf4SFabien Sanglard         level_string = "WARNING";
48*3f982cf4SFabien Sanglard         break;
49*3f982cf4SFabien Sanglard       case LogLevel::kError:
50*3f982cf4SFabien Sanglard         level_string = "ERROR";
51*3f982cf4SFabien Sanglard         break;
52*3f982cf4SFabien Sanglard       case LogLevel::kFatal:
53*3f982cf4SFabien Sanglard         level_string = "FATAL";
54*3f982cf4SFabien Sanglard         break;
55*3f982cf4SFabien Sanglard     }
56*3f982cf4SFabien Sanglard     expected_messages.push_back({level_string, std::string(message)});
57*3f982cf4SFabien Sanglard   }
58*3f982cf4SFabien Sanglard 
VerifyNoLogs()59*3f982cf4SFabien Sanglard   void VerifyNoLogs() { EXPECT_TRUE(log_messages.empty()); }
60*3f982cf4SFabien Sanglard 
VerifyLogs()61*3f982cf4SFabien Sanglard   void VerifyLogs() {
62*3f982cf4SFabien Sanglard     ASSERT_EQ(expected_messages.size(), log_messages.size());
63*3f982cf4SFabien Sanglard     auto expected_it = expected_messages.begin();
64*3f982cf4SFabien Sanglard     auto actual_it = log_messages.begin();
65*3f982cf4SFabien Sanglard     // NOTE: This is somewhat brittle; it relies on details of how
66*3f982cf4SFabien Sanglard     // logging_posix.cc formats log messages.
67*3f982cf4SFabien Sanglard     while (expected_it != expected_messages.end()) {
68*3f982cf4SFabien Sanglard       EXPECT_TRUE(
69*3f982cf4SFabien Sanglard           absl::StartsWith(*actual_it, absl::StrCat("[", expected_it->level)));
70*3f982cf4SFabien Sanglard       EXPECT_TRUE(absl::EndsWith(
71*3f982cf4SFabien Sanglard           *actual_it, absl::StrCat("] ", expected_it->message, "\n")));
72*3f982cf4SFabien Sanglard       actual_it++;
73*3f982cf4SFabien Sanglard       expected_it++;
74*3f982cf4SFabien Sanglard     }
75*3f982cf4SFabien Sanglard     expected_messages.clear();
76*3f982cf4SFabien Sanglard     log_messages.clear();
77*3f982cf4SFabien Sanglard   }
78*3f982cf4SFabien Sanglard 
79*3f982cf4SFabien Sanglard  private:
80*3f982cf4SFabien Sanglard   struct LogMessage {
81*3f982cf4SFabien Sanglard     std::string level;
82*3f982cf4SFabien Sanglard     std::string message;
83*3f982cf4SFabien Sanglard   };
84*3f982cf4SFabien Sanglard   std::vector<std::string> log_messages;
85*3f982cf4SFabien Sanglard   std::vector<LogMessage> expected_messages;
86*3f982cf4SFabien Sanglard   LogLevel previous_log_level = LogLevel::kWarning;
87*3f982cf4SFabien Sanglard };
88*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,UnconditionalLogging)89*3f982cf4SFabien Sanglard TEST_F(LoggingTest, UnconditionalLogging) {
90*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kVerbose);
91*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, "Verbose");
92*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kInfo, "Info");
93*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
94*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard   OSP_VLOG << "Verbose";
97*3f982cf4SFabien Sanglard   OSP_LOG_INFO << "Info";
98*3f982cf4SFabien Sanglard   OSP_LOG_WARN << "Warning";
99*3f982cf4SFabien Sanglard   OSP_LOG_ERROR << "Error";
100*3f982cf4SFabien Sanglard 
101*3f982cf4SFabien Sanglard   VerifyLogs();
102*3f982cf4SFabien Sanglard 
103*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kWarning);
104*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
105*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
106*3f982cf4SFabien Sanglard 
107*3f982cf4SFabien Sanglard   OSP_VLOG << "Verbose";
108*3f982cf4SFabien Sanglard   OSP_LOG_INFO << "Info";
109*3f982cf4SFabien Sanglard   OSP_LOG_WARN << "Warning";
110*3f982cf4SFabien Sanglard   OSP_LOG_ERROR << "Error";
111*3f982cf4SFabien Sanglard 
112*3f982cf4SFabien Sanglard   VerifyLogs();
113*3f982cf4SFabien Sanglard }
114*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,ConditionalLogging)115*3f982cf4SFabien Sanglard TEST_F(LoggingTest, ConditionalLogging) {
116*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kVerbose);
117*3f982cf4SFabien Sanglard 
118*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, "Verbose");
119*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kInfo, "Info");
120*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
121*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
122*3f982cf4SFabien Sanglard 
123*3f982cf4SFabien Sanglard   OSP_VLOG_IF(true) << "Verbose";
124*3f982cf4SFabien Sanglard   OSP_LOG_IF(INFO, true) << "Info";
125*3f982cf4SFabien Sanglard   OSP_LOG_IF(WARN, true) << "Warning";
126*3f982cf4SFabien Sanglard   OSP_LOG_IF(ERROR, true) << "Error";
127*3f982cf4SFabien Sanglard   VerifyLogs();
128*3f982cf4SFabien Sanglard 
129*3f982cf4SFabien Sanglard   OSP_VLOG_IF(false) << "Verbose";
130*3f982cf4SFabien Sanglard   OSP_LOG_IF(INFO, false) << "Info";
131*3f982cf4SFabien Sanglard   OSP_LOG_IF(WARN, false) << "Warning";
132*3f982cf4SFabien Sanglard   OSP_LOG_IF(ERROR, false) << "Error";
133*3f982cf4SFabien Sanglard   VerifyNoLogs();
134*3f982cf4SFabien Sanglard }
135*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,DebugUnconditionalLogging)136*3f982cf4SFabien Sanglard TEST_F(LoggingTest, DebugUnconditionalLogging) {
137*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kVerbose);
138*3f982cf4SFabien Sanglard   OSP_DVLOG << "Verbose";
139*3f982cf4SFabien Sanglard   OSP_DLOG_INFO << "Info";
140*3f982cf4SFabien Sanglard   OSP_DLOG_WARN << "Warning";
141*3f982cf4SFabien Sanglard   OSP_DLOG_ERROR << "Error";
142*3f982cf4SFabien Sanglard 
143*3f982cf4SFabien Sanglard #if OSP_DCHECK_IS_ON()
144*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, "Verbose");
145*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kInfo, "Info");
146*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
147*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
148*3f982cf4SFabien Sanglard   VerifyLogs();
149*3f982cf4SFabien Sanglard #else
150*3f982cf4SFabien Sanglard   VerifyNoLogs();
151*3f982cf4SFabien Sanglard #endif  // OSP_DCHECK_IS_ON()
152*3f982cf4SFabien Sanglard 
153*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kWarning);
154*3f982cf4SFabien Sanglard 
155*3f982cf4SFabien Sanglard   OSP_DVLOG << "Verbose";
156*3f982cf4SFabien Sanglard   OSP_DLOG_INFO << "Info";
157*3f982cf4SFabien Sanglard   OSP_DLOG_WARN << "Warning";
158*3f982cf4SFabien Sanglard   OSP_DLOG_ERROR << "Error";
159*3f982cf4SFabien Sanglard 
160*3f982cf4SFabien Sanglard #if OSP_DCHECK_IS_ON()
161*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
162*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
163*3f982cf4SFabien Sanglard   VerifyLogs();
164*3f982cf4SFabien Sanglard #else
165*3f982cf4SFabien Sanglard   VerifyNoLogs();
166*3f982cf4SFabien Sanglard #endif  // OSP_DCHECK_IS_ON()
167*3f982cf4SFabien Sanglard }
168*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,DebugConditionalLogging)169*3f982cf4SFabien Sanglard TEST_F(LoggingTest, DebugConditionalLogging) {
170*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kVerbose);
171*3f982cf4SFabien Sanglard 
172*3f982cf4SFabien Sanglard   OSP_DVLOG_IF(true) << "Verbose";
173*3f982cf4SFabien Sanglard   OSP_DLOG_IF(INFO, true) << "Info";
174*3f982cf4SFabien Sanglard   OSP_DLOG_IF(WARN, true) << "Warning";
175*3f982cf4SFabien Sanglard   OSP_DLOG_IF(ERROR, true) << "Error";
176*3f982cf4SFabien Sanglard 
177*3f982cf4SFabien Sanglard #if OSP_DCHECK_IS_ON()
178*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, "Verbose");
179*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kInfo, "Info");
180*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "Warning");
181*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kError, "Error");
182*3f982cf4SFabien Sanglard   VerifyLogs();
183*3f982cf4SFabien Sanglard #else
184*3f982cf4SFabien Sanglard   VerifyNoLogs();
185*3f982cf4SFabien Sanglard #endif  // OSP_DCHECK_IS_ON()
186*3f982cf4SFabien Sanglard 
187*3f982cf4SFabien Sanglard   OSP_DVLOG_IF(false) << "Verbose";
188*3f982cf4SFabien Sanglard   OSP_DLOG_IF(INFO, false) << "Info";
189*3f982cf4SFabien Sanglard   OSP_DLOG_IF(WARN, false) << "Warning";
190*3f982cf4SFabien Sanglard   OSP_DLOG_IF(ERROR, false) << "Error";
191*3f982cf4SFabien Sanglard   VerifyNoLogs();
192*3f982cf4SFabien Sanglard }
193*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,CheckAndLogFatal)194*3f982cf4SFabien Sanglard TEST_F(LoggingTest, CheckAndLogFatal) {
195*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK(false), ".*OSP_CHECK\\(false\\) failed: ");
196*3f982cf4SFabien Sanglard 
197*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_EQ(1, 2),
198*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) == \\(2\\)\\) failed: 1 vs\\. 2: ");
199*3f982cf4SFabien Sanglard 
200*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_NE(1, 1),
201*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) != \\(1\\)\\) failed: 1 vs\\. 1: ");
202*3f982cf4SFabien Sanglard 
203*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_LT(2, 1),
204*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(2\\) < \\(1\\)\\) failed: 2 vs\\. 1: ");
205*3f982cf4SFabien Sanglard 
206*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_LE(2, 1),
207*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(2\\) <= \\(1\\)\\) failed: 2 vs\\. 1: ");
208*3f982cf4SFabien Sanglard 
209*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_GT(1, 2),
210*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) > \\(2\\)\\) failed: 1 vs\\. 2: ");
211*3f982cf4SFabien Sanglard 
212*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_CHECK_GE(1, 2),
213*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) >= \\(2\\)\\) failed: 1 vs\\. 2: ");
214*3f982cf4SFabien Sanglard 
215*3f982cf4SFabien Sanglard   ASSERT_DEATH((OSP_LOG_FATAL << "Fatal"), ".*Fatal");
216*3f982cf4SFabien Sanglard 
217*3f982cf4SFabien Sanglard   VerifyLogs();
218*3f982cf4SFabien Sanglard }
219*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,DCheckAndDLogFatal)220*3f982cf4SFabien Sanglard TEST_F(LoggingTest, DCheckAndDLogFatal) {
221*3f982cf4SFabien Sanglard #if OSP_DCHECK_IS_ON()
222*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK(false), ".*OSP_CHECK\\(false\\) failed: ");
223*3f982cf4SFabien Sanglard 
224*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_EQ(1, 2),
225*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) == \\(2\\)\\) failed: 1 vs\\. 2: ");
226*3f982cf4SFabien Sanglard 
227*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_NE(1, 1),
228*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) != \\(1\\)\\) failed: 1 vs\\. 1: ");
229*3f982cf4SFabien Sanglard 
230*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_LT(2, 1),
231*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(2\\) < \\(1\\)\\) failed: 2 vs\\. 1: ");
232*3f982cf4SFabien Sanglard 
233*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_LE(2, 1),
234*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(2\\) <= \\(1\\)\\) failed: 2 vs\\. 1: ");
235*3f982cf4SFabien Sanglard 
236*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_GT(1, 2),
237*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) > \\(2\\)\\) failed: 1 vs\\. 2: ");
238*3f982cf4SFabien Sanglard 
239*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_DCHECK_GE(1, 2),
240*3f982cf4SFabien Sanglard                ".*OSP_CHECK\\(\\(1\\) >= \\(2\\)\\) failed: 1 vs\\. 2: ");
241*3f982cf4SFabien Sanglard 
242*3f982cf4SFabien Sanglard   ASSERT_DEATH((OSP_DLOG_FATAL << "Fatal"), ".*Fatal");
243*3f982cf4SFabien Sanglard 
244*3f982cf4SFabien Sanglard   VerifyLogs();
245*3f982cf4SFabien Sanglard #else
246*3f982cf4SFabien Sanglard   VerifyNoLogs();
247*3f982cf4SFabien Sanglard #endif  // OSP_DCHECK_IS_ON()
248*3f982cf4SFabien Sanglard }
249*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,OspUnimplemented)250*3f982cf4SFabien Sanglard TEST_F(LoggingTest, OspUnimplemented) {
251*3f982cf4SFabien Sanglard   // Default is to log once per process if the level >= kWarning.
252*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kWarning);
253*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kWarning, "TestBody: UNIMPLEMENTED() hit.");
254*3f982cf4SFabien Sanglard   for (int i = 0; i < 2; i++) {
255*3f982cf4SFabien Sanglard     OSP_UNIMPLEMENTED();
256*3f982cf4SFabien Sanglard   }
257*3f982cf4SFabien Sanglard   VerifyLogs();
258*3f982cf4SFabien Sanglard 
259*3f982cf4SFabien Sanglard   // Setting the level to kVerbose logs every time.
260*3f982cf4SFabien Sanglard   SetLogLevel(LogLevel::kVerbose);
261*3f982cf4SFabien Sanglard   std::string message("TestBody: UNIMPLEMENTED() hit.");
262*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, message);
263*3f982cf4SFabien Sanglard   ExpectLog(LogLevel::kVerbose, message);
264*3f982cf4SFabien Sanglard   for (int i = 0; i < 2; i++) {
265*3f982cf4SFabien Sanglard     OSP_UNIMPLEMENTED();
266*3f982cf4SFabien Sanglard   }
267*3f982cf4SFabien Sanglard   VerifyLogs();
268*3f982cf4SFabien Sanglard }
269*3f982cf4SFabien Sanglard 
TEST_F(LoggingTest,OspNotReached)270*3f982cf4SFabien Sanglard TEST_F(LoggingTest, OspNotReached) {
271*3f982cf4SFabien Sanglard   ASSERT_DEATH(OSP_NOTREACHED(), ".*TestBody: NOTREACHED\\(\\) hit.");
272*3f982cf4SFabien Sanglard }
273*3f982cf4SFabien Sanglard 
274*3f982cf4SFabien Sanglard }  // namespace openscreen
275