logging: add XLOG() and XLOGF() logging macros
[folly.git] / folly / experimental / logging / test / LogLevelTest.cpp
1 /*
2  * Copyright 2004-present Facebook, Inc.
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  *   http://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 <folly/Conv.h>
17 #include <folly/Random.h>
18 #include <folly/experimental/logging/LogLevel.h>
19 #include <folly/portability/GTest.h>
20
21 using namespace folly;
22
23 TEST(LogLevel, fromString) {
24   EXPECT_EQ(LogLevel::UNINITIALIZED, stringToLogLevel("uninitialized"));
25   EXPECT_EQ(LogLevel::UNINITIALIZED, stringToLogLevel("UnInitialized"));
26   EXPECT_EQ(
27       LogLevel::UNINITIALIZED, stringToLogLevel("LogLevel::UNINITIALIZED"));
28
29   EXPECT_EQ(LogLevel::NONE, stringToLogLevel("none"));
30   EXPECT_EQ(LogLevel::NONE, stringToLogLevel("NONE"));
31   EXPECT_EQ(LogLevel::NONE, stringToLogLevel("NoNe"));
32   EXPECT_EQ(LogLevel::NONE, stringToLogLevel("LogLevel::none"));
33
34   EXPECT_EQ(LogLevel::DEBUG, stringToLogLevel("debug"));
35   EXPECT_EQ(LogLevel::DEBUG, stringToLogLevel("dEBug"));
36   EXPECT_EQ(LogLevel::DEBUG, stringToLogLevel("loglevel::dEBug"));
37
38   EXPECT_EQ(LogLevel::INFO, stringToLogLevel("info"));
39   EXPECT_EQ(LogLevel::INFO, stringToLogLevel("INFO"));
40   EXPECT_EQ(LogLevel::INFO, stringToLogLevel("loglevel(INFO)"));
41
42   EXPECT_EQ(LogLevel::WARN, stringToLogLevel("warn"));
43   EXPECT_EQ(LogLevel::WARN, stringToLogLevel("WARN"));
44   EXPECT_EQ(LogLevel::WARN, stringToLogLevel("warning"));
45
46   EXPECT_EQ(LogLevel::ERR, stringToLogLevel("err"));
47   EXPECT_EQ(LogLevel::ERR, stringToLogLevel("eRr"));
48   EXPECT_EQ(LogLevel::ERR, stringToLogLevel("error"));
49   EXPECT_EQ(LogLevel::ERR, stringToLogLevel("ERROR"));
50
51   EXPECT_EQ(LogLevel::CRITICAL, stringToLogLevel("critical"));
52   EXPECT_EQ(LogLevel::CRITICAL, stringToLogLevel("CRITICAL"));
53
54   EXPECT_EQ(LogLevel::MAX_LEVEL, stringToLogLevel("max"));
55   EXPECT_EQ(LogLevel::MAX_LEVEL, stringToLogLevel("Max_Level"));
56   EXPECT_EQ(LogLevel::MAX_LEVEL, stringToLogLevel("LogLevel::MAX"));
57   EXPECT_EQ(LogLevel::MAX_LEVEL, stringToLogLevel("LogLevel::MAX_LEVEL"));
58
59   EXPECT_EQ(LogLevel::DBG0, stringToLogLevel("dbg0"));
60   EXPECT_EQ(LogLevel::DBG5, stringToLogLevel("dbg5"));
61   EXPECT_EQ(LogLevel::DBG5, stringToLogLevel("DBG5"));
62   EXPECT_EQ(LogLevel::DBG9, stringToLogLevel("DBG9"));
63   EXPECT_EQ(LogLevel::DEBUG + 1, stringToLogLevel("DBG99"));
64   EXPECT_EQ(LogLevel::DEBUG, stringToLogLevel("900"));
65   EXPECT_EQ(LogLevel::DEBUG, stringToLogLevel("LogLevel(900)"));
66
67   EXPECT_THROW(stringToLogLevel("foobar"), std::range_error);
68   EXPECT_THROW(stringToLogLevel("dbg"), std::range_error);
69   EXPECT_THROW(stringToLogLevel("dbgxyz"), std::range_error);
70   EXPECT_THROW(stringToLogLevel("dbg-1"), std::range_error);
71   EXPECT_THROW(stringToLogLevel("dbg12345"), std::range_error);
72   EXPECT_THROW(stringToLogLevel("900z"), std::range_error);
73 }
74
75 TEST(LogLevel, toString) {
76   EXPECT_EQ(
77       "LogLevel::UNINITIALIZED", logLevelToString(LogLevel::UNINITIALIZED));
78   EXPECT_EQ("LogLevel::NONE", logLevelToString(LogLevel::NONE));
79   EXPECT_EQ("LogLevel::INFO", logLevelToString(LogLevel::INFO));
80   EXPECT_EQ("LogLevel::WARN", logLevelToString(LogLevel::WARN));
81   EXPECT_EQ("LogLevel::WARN", logLevelToString(LogLevel::WARNING));
82   EXPECT_EQ("LogLevel::DEBUG", logLevelToString(LogLevel::DEBUG));
83   EXPECT_EQ("LogLevel::ERR", logLevelToString(LogLevel::ERR));
84   EXPECT_EQ("LogLevel::CRITICAL", logLevelToString(LogLevel::CRITICAL));
85   EXPECT_EQ("LogLevel::MAX_LEVEL", logLevelToString(LogLevel::MAX_LEVEL));
86
87   EXPECT_EQ("LogLevel::DBG0", logLevelToString(LogLevel::DBG0));
88   EXPECT_EQ("LogLevel::DBG2", logLevelToString(LogLevel::DBG2));
89   EXPECT_EQ("LogLevel::DBG5", logLevelToString(LogLevel::DBG5));
90   EXPECT_EQ("LogLevel::DBG9", logLevelToString(LogLevel::DBG9));
91   EXPECT_EQ("LogLevel::DBG97", logLevelToString(static_cast<LogLevel>(903)));
92   EXPECT_EQ("LogLevel::DBG64", logLevelToString(LogLevel::DBG4 - 60));
93
94   EXPECT_EQ("LogLevel(1234)", logLevelToString(static_cast<LogLevel>(1234)));
95 }
96
97 TEST(LogLevel, toStringAndBack) {
98   // Check that stringToLogLevel(logLevelToString()) is the identity function
99   auto checkLevel = [](LogLevel level) {
100     auto stringForm = logLevelToString(level);
101     auto outputLevel = stringToLogLevel(stringForm);
102     EXPECT_EQ(level, outputLevel)
103         << "error converting " << level << " (" << static_cast<uint32_t>(level)
104         << ") to string and back.  String is " << stringForm;
105   };
106
107   // Check all of the named levels
108   checkLevel(LogLevel::UNINITIALIZED);
109   checkLevel(LogLevel::NONE);
110   checkLevel(LogLevel::DEBUG);
111   checkLevel(LogLevel::DBG0);
112   checkLevel(LogLevel::DBG1);
113   checkLevel(LogLevel::DBG2);
114   checkLevel(LogLevel::DBG3);
115   checkLevel(LogLevel::DBG4);
116   checkLevel(LogLevel::DBG5);
117   checkLevel(LogLevel::DBG6);
118   checkLevel(LogLevel::DBG7);
119   checkLevel(LogLevel::DBG8);
120   checkLevel(LogLevel::DBG9);
121   checkLevel(LogLevel::INFO);
122   checkLevel(LogLevel::WARN);
123   checkLevel(LogLevel::WARNING);
124   checkLevel(LogLevel::ERR);
125   checkLevel(LogLevel::CRITICAL);
126   checkLevel(LogLevel::MAX_LEVEL);
127
128   // Try with some random integer values
129   for (uint32_t numIters = 0; numIters < 10000; ++numIters) {
130     auto levelValue =
131         folly::Random::rand32(static_cast<uint32_t>(LogLevel::MAX_LEVEL));
132     checkLevel(static_cast<LogLevel>(levelValue));
133   }
134 }