Line data Source code
1 : // Copyright (c) 2006-2023 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/snaplogger
4 : // contact@m2osw.com
5 : //
6 : // This program is free software; you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation; either version 2 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License along
17 : // with this program; if not, write to the Free Software Foundation, Inc.,
18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 :
20 : // self
21 : //
22 : #include "catch_main.h"
23 :
24 :
25 : // snaplogger
26 : //
27 : #include <snaplogger/buffer_appender.h>
28 : #include <snaplogger/exception.h>
29 : #include <snaplogger/format.h>
30 : #include <snaplogger/logger.h>
31 : #include <snaplogger/map_diagnostic.h>
32 : #include <snaplogger/message.h>
33 : #include <snaplogger/severity.h>
34 : #include <snaplogger/version.h>
35 :
36 :
37 : // snapdev
38 : //
39 : #include <snapdev/enum_class_math.h>
40 :
41 :
42 : // C lib
43 : //
44 : #include <unistd.h>
45 : #include <netdb.h>
46 : #include <sys/param.h>
47 :
48 :
49 :
50 :
51 3 : CATCH_TEST_CASE("severity", "[severity]")
52 : {
53 3 : CATCH_START_SECTION("severity: Create Severity")
54 : {
55 1 : snaplogger::severity_t const err_plus_one(static_cast<snaplogger::severity_t>(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR) + 1));
56 :
57 : // user severity by name
58 : {
59 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(err_plus_one, "error"));
60 :
61 3 : CATCH_REQUIRE_THROWS_MATCHES(
62 : snaplogger::add_severity(s)
63 : , snaplogger::duplicate_error
64 : , Catch::Matchers::ExceptionMessage(
65 : "logger_error: a system severity (error) cannot be replaced (same name)."));
66 1 : }
67 :
68 : // system severity by name
69 : {
70 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(err_plus_one, "error", true));
71 :
72 3 : CATCH_REQUIRE_THROWS_MATCHES(
73 : snaplogger::add_severity(s)
74 : , snaplogger::duplicate_error
75 : , Catch::Matchers::ExceptionMessage(
76 : "logger_error: a system severity (error) cannot be replaced (same name)."));
77 1 : }
78 :
79 : // user severity by severity
80 : {
81 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(snaplogger::severity_t::SEVERITY_ERROR, "bad-error"));
82 :
83 3 : CATCH_REQUIRE_THROWS_MATCHES(
84 : snaplogger::add_severity(s)
85 : , snaplogger::duplicate_error
86 : , Catch::Matchers::ExceptionMessage(
87 : "logger_error: a system severity ("
88 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
89 : + ") cannot be replaced (same severity level: "
90 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
91 : + ")."));
92 1 : }
93 :
94 : // user severity by severity
95 : {
96 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(snaplogger::severity_t::SEVERITY_ERROR, "bad-error", true));
97 :
98 3 : CATCH_REQUIRE_THROWS_MATCHES(
99 : snaplogger::add_severity(s)
100 : , snaplogger::duplicate_error
101 : , Catch::Matchers::ExceptionMessage(
102 : "logger_error: a system severity ("
103 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
104 : + ") cannot be replaced (same severity level: "
105 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
106 : + ")."));
107 1 : }
108 :
109 : // actually create a valid severity
110 : {
111 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
112 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
113 :
114 1 : snaplogger::severity_t const level(static_cast<snaplogger::severity_t>(205));
115 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(level, "bad-error"));
116 :
117 1 : CATCH_REQUIRE(s->get_severity() == level);
118 1 : CATCH_REQUIRE(s->get_name() == "bad-error");
119 :
120 1 : CATCH_REQUIRE(s->get_all_names().size() == 1);
121 1 : CATCH_REQUIRE(s->get_all_names()[0] == "bad-error");
122 :
123 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
124 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
125 :
126 : // duplicates are not allowed
127 : //
128 5 : CATCH_REQUIRE_THROWS_MATCHES(
129 : s->add_alias("bad-error")
130 : , snaplogger::duplicate_error
131 : , Catch::Matchers::ExceptionMessage(
132 : "logger_error: severity \""
133 : "bad-error"
134 : "\" already has an alias \""
135 : "bad-error"
136 : "\"."));
137 :
138 1 : snaplogger::add_severity(s);
139 :
140 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
141 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
142 :
143 1 : s->add_alias("big-error");
144 :
145 : // duplicates are not allowed
146 : //
147 5 : CATCH_REQUIRE_THROWS_MATCHES(
148 : s->add_alias("big-error")
149 : , snaplogger::duplicate_error
150 : , Catch::Matchers::ExceptionMessage(
151 : "logger_error: severity \""
152 : "bad-error"
153 : "\" already has an alias \""
154 : "big-error"
155 : "\"."));
156 :
157 1 : CATCH_REQUIRE(s->get_all_names().size() == 2);
158 1 : CATCH_REQUIRE(s->get_all_names()[0] == "bad-error");
159 1 : CATCH_REQUIRE(s->get_all_names()[1] == "big-error");
160 :
161 1 : CATCH_REQUIRE(s->get_description() == "bad-error");
162 :
163 1 : s->set_description("bad error");
164 1 : CATCH_REQUIRE(s->get_description() == "bad error");
165 :
166 1 : s->set_description(std::string());
167 1 : CATCH_REQUIRE(s->get_description() == "bad-error");
168 :
169 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
170 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == s);
171 1 : CATCH_REQUIRE(snaplogger::get_severity(level) == s);
172 :
173 1 : s->set_styles("orange");
174 1 : CATCH_REQUIRE(s->get_styles() == "orange");
175 :
176 1 : snaplogger::severity_t const level_plus_one(static_cast<snaplogger::severity_t>(static_cast<int>(level) + 1));
177 1 : CATCH_REQUIRE(snaplogger::get_severity(level_plus_one) == nullptr);
178 :
179 1 : snaplogger::message msg(::snaplogger::severity_t::SEVERITY_ERROR);
180 1 : CATCH_REQUIRE(snaplogger::get_severity(msg, "bad-error") == s);
181 1 : CATCH_REQUIRE(snaplogger::get_severity(msg, "big-error") == s);
182 1 : }
183 :
184 : // verify that the "<name>"_sev syntax works as expected
185 : {
186 1 : snaplogger::severity_t const level(static_cast<snaplogger::severity_t>(25));
187 1 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(level, "remark"));
188 :
189 1 : snaplogger::add_severity(s);
190 :
191 1 : CATCH_REQUIRE(s->get_severity() == level);
192 1 : CATCH_REQUIRE(s->get_name() == "remark");
193 :
194 : #if SNAPDEV_CHECK_GCC_VERSION(7, 5, 0)
195 1 : snaplogger::severity::pointer_t r("remark"_sev);
196 1 : CATCH_REQUIRE(r == s);
197 :
198 1 : CATCH_REQUIRE(r->get_severity() == level);
199 1 : CATCH_REQUIRE(r->get_name() == "remark");
200 : #endif
201 1 : }
202 : }
203 3 : CATCH_END_SECTION()
204 :
205 3 : CATCH_START_SECTION("severity: Print Severity")
206 : {
207 : struct level_and_name_t
208 : {
209 : ::snaplogger::severity_t f_level = ::snaplogger::severity_t::SEVERITY_ERROR;
210 : std::string f_name = std::string();
211 : };
212 :
213 1 : std::vector<level_and_name_t> level_and_name =
214 : {
215 : { ::snaplogger::severity_t::SEVERITY_ALL, "all" },
216 : { ::snaplogger::severity_t::SEVERITY_TRACE, "trace" },
217 : { ::snaplogger::severity_t::SEVERITY_NOISY, "noisy" },
218 : { ::snaplogger::severity_t::SEVERITY_DEBUG, "debug" },
219 : { ::snaplogger::severity_t::SEVERITY_NOTICE, "notice" },
220 : { ::snaplogger::severity_t::SEVERITY_UNIMPORTANT, "unimportant" },
221 : { ::snaplogger::severity_t::SEVERITY_VERBOSE, "verbose" },
222 : { ::snaplogger::severity_t::SEVERITY_CONFIGURATION, "configuration" },
223 : { ::snaplogger::severity_t::SEVERITY_CONFIGURATION_WARNING, "configuration-warning" },
224 : { ::snaplogger::severity_t::SEVERITY_INFORMATION, "information" },
225 : { ::snaplogger::severity_t::SEVERITY_IMPORTANT, "important" },
226 : { ::snaplogger::severity_t::SEVERITY_MINOR, "minor" },
227 : { ::snaplogger::severity_t::SEVERITY_DEPRECATED, "deprecated" },
228 : { ::snaplogger::severity_t::SEVERITY_WARNING, "warning" },
229 : { ::snaplogger::severity_t::SEVERITY_MAJOR, "major" },
230 : { ::snaplogger::severity_t::SEVERITY_RECOVERABLE_ERROR, "recoverable-error" },
231 : { ::snaplogger::severity_t::SEVERITY_ERROR, "error" },
232 : { ::snaplogger::severity_t::SEVERITY_NOISY_ERROR, "noisy-error" },
233 : { ::snaplogger::severity_t::SEVERITY_SEVERE, "severe" },
234 : { ::snaplogger::severity_t::SEVERITY_EXCEPTION, "exception" },
235 : { ::snaplogger::severity_t::SEVERITY_CRITICAL, "critical" },
236 : { ::snaplogger::severity_t::SEVERITY_ALERT, "alert" },
237 : { ::snaplogger::severity_t::SEVERITY_EMERGENCY, "emergency" },
238 : { ::snaplogger::severity_t::SEVERITY_FATAL, "fatal" },
239 : { ::snaplogger::severity_t::SEVERITY_OFF, "off" },
240 53 : };
241 :
242 26 : for(auto const & ln : level_and_name)
243 : {
244 25 : std::stringstream buffer;
245 25 : buffer << ln.f_level;
246 25 : CATCH_REQUIRE(buffer.str() == ln.f_name);
247 25 : }
248 :
249 : {
250 1 : std::stringstream buffer;
251 1 : buffer << static_cast<::snaplogger::severity_t>(254);
252 1 : CATCH_REQUIRE(buffer.str() == "(unknown severity: 254)");
253 1 : }
254 1 : }
255 3 : CATCH_END_SECTION()
256 :
257 3 : CATCH_START_SECTION("severity: Severity by Level or Name")
258 : {
259 1 : snaplogger::severity_by_severity_t severities(snaplogger::get_severities_by_severity());
260 1 : snaplogger::severity_by_name_t names(snaplogger::get_severities_by_name());
261 :
262 : // this is not true, there are more names than severity levels
263 : //
264 : //CATCH_REQUIRE(severities.size() == names.size());
265 :
266 : // this does not hold true, that is, the map is properly sorted, but for
267 : // entries with an alias, the s->get_name() returns the base name, not the
268 : // alias, and thus, the order may be skewed for all aliases
269 : //
270 : // std::string previous_name;
271 : // for(auto const & s : names)
272 : // {
273 : // CATCH_REQUIRE(s.second->get_name() > previous_name);
274 : // previous_name = s.second->get_name();
275 : // }
276 :
277 1 : snaplogger::severity_t previous_severity(snaplogger::severity_t::SEVERITY_ALL - 1);
278 29 : for(auto const & s : severities)
279 : {
280 28 : CATCH_REQUIRE(s.second->get_severity() > previous_severity);
281 28 : previous_severity = s.second->get_severity();
282 : }
283 1 : }
284 3 : CATCH_END_SECTION()
285 3 : }
286 :
287 :
288 2 : CATCH_TEST_CASE("severity_error", "[severity][error]")
289 : {
290 2 : CATCH_START_SECTION("severity: too small")
291 : {
292 5 : CATCH_REQUIRE_THROWS_MATCHES(
293 : snaplogger::severity(snaplogger::severity_t::SEVERITY_MIN - 1, "TOO_SMALL")
294 : , snaplogger::invalid_severity
295 : , Catch::Matchers::ExceptionMessage(
296 : "logger_error: the severity level cannot be "
297 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MIN - 1))
298 : + ". The possible range is ["
299 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MIN))
300 : + ".."
301 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MAX))
302 : + "]."));
303 : }
304 2 : CATCH_END_SECTION()
305 :
306 2 : CATCH_START_SECTION("severity: too large")
307 : {
308 5 : CATCH_REQUIRE_THROWS_MATCHES(
309 : snaplogger::severity(snaplogger::severity_t::SEVERITY_MAX + 1, "TOO_LARGE")
310 : , snaplogger::invalid_severity
311 : , Catch::Matchers::ExceptionMessage(
312 : "logger_error: the severity level cannot be "
313 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MAX + 1))
314 : + ". The possible range is ["
315 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MIN))
316 : + ".."
317 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_MAX))
318 : + "]."));
319 : }
320 2 : CATCH_END_SECTION()
321 2 : }
322 :
323 :
324 :
325 : // vim: ts=4 sw=4 et
|