Line data Source code
1 : // Copyright (c) 2006-2022 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 lib
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 : // C lib
38 : //
39 : #include <unistd.h>
40 : #include <netdb.h>
41 : #include <sys/param.h>
42 :
43 :
44 :
45 :
46 4 : CATCH_TEST_CASE("severity", "[severity]")
47 : {
48 4 : CATCH_START_SECTION("severity: Create Severity")
49 : {
50 1 : snaplogger::severity_t const err_plus_one(static_cast<snaplogger::severity_t>(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR) + 1));
51 :
52 : // user severity by name
53 : {
54 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(err_plus_one, "error"));
55 :
56 1 : CATCH_REQUIRE_THROWS_MATCHES(
57 : snaplogger::add_severity(s)
58 : , snaplogger::duplicate_error
59 : , Catch::Matchers::ExceptionMessage(
60 : "logger_error: a system severity (error) cannot be replaced (same name)."));
61 : }
62 :
63 : // system severity by name
64 : {
65 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(err_plus_one, "error", true));
66 :
67 1 : CATCH_REQUIRE_THROWS_MATCHES(
68 : snaplogger::add_severity(s)
69 : , snaplogger::duplicate_error
70 : , Catch::Matchers::ExceptionMessage(
71 : "logger_error: a system severity (error) cannot be replaced (same name)."));
72 : }
73 :
74 : // user severity by severity
75 : {
76 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(snaplogger::severity_t::SEVERITY_ERROR, "bad-error"));
77 :
78 1 : CATCH_REQUIRE_THROWS_MATCHES(
79 : snaplogger::add_severity(s)
80 : , snaplogger::duplicate_error
81 : , Catch::Matchers::ExceptionMessage(
82 : "logger_error: a system severity ("
83 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
84 : + ") cannot be replaced (same severity level: "
85 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
86 : + ")."));
87 : }
88 :
89 : // user severity by severity
90 : {
91 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(snaplogger::severity_t::SEVERITY_ERROR, "bad-error", true));
92 :
93 1 : CATCH_REQUIRE_THROWS_MATCHES(
94 : snaplogger::add_severity(s)
95 : , snaplogger::duplicate_error
96 : , Catch::Matchers::ExceptionMessage(
97 : "logger_error: a system severity ("
98 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
99 : + ") cannot be replaced (same severity level: "
100 : + std::to_string(static_cast<int>(snaplogger::severity_t::SEVERITY_ERROR))
101 : + ")."));
102 : }
103 :
104 : // actually create a valid severity
105 : {
106 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
107 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
108 :
109 1 : snaplogger::severity_t const level(static_cast<snaplogger::severity_t>(205));
110 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(level, "bad-error"));
111 :
112 1 : CATCH_REQUIRE(s->get_severity() == level);
113 1 : CATCH_REQUIRE(s->get_name() == "bad-error");
114 :
115 1 : CATCH_REQUIRE(s->get_all_names().size() == 1);
116 1 : CATCH_REQUIRE(s->get_all_names()[0] == "bad-error");
117 :
118 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
119 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
120 :
121 1 : snaplogger::add_severity(s);
122 :
123 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
124 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
125 :
126 1 : s->add_alias("big-error");
127 :
128 1 : CATCH_REQUIRE(s->get_all_names().size() == 2);
129 1 : CATCH_REQUIRE(s->get_all_names()[0] == "bad-error");
130 1 : CATCH_REQUIRE(s->get_all_names()[1] == "big-error");
131 :
132 1 : CATCH_REQUIRE(s->get_description() == "bad-error");
133 :
134 1 : s->set_description("bad error");
135 1 : CATCH_REQUIRE(s->get_description() == "bad error");
136 :
137 1 : s->set_description(std::string());
138 1 : CATCH_REQUIRE(s->get_description() == "bad-error");
139 :
140 1 : CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
141 1 : CATCH_REQUIRE(snaplogger::get_severity("big-error") == s);
142 1 : CATCH_REQUIRE(snaplogger::get_severity(level) == s);
143 :
144 1 : s->set_styles("orange");
145 1 : CATCH_REQUIRE(s->get_styles() == "orange");
146 :
147 1 : snaplogger::severity_t const level_plus_one(static_cast<snaplogger::severity_t>(static_cast<int>(level) + 1));
148 1 : CATCH_REQUIRE(snaplogger::get_severity(level_plus_one) == nullptr);
149 :
150 2 : snaplogger::message msg(::snaplogger::severity_t::SEVERITY_ERROR, __FILE__, __func__, __LINE__);
151 1 : CATCH_REQUIRE(snaplogger::get_severity(msg, "bad-error") == s);
152 1 : CATCH_REQUIRE(snaplogger::get_severity(msg, "big-error") == s);
153 : }
154 :
155 : // verify that the "<name>"_sev syntax works as expected
156 : {
157 1 : snaplogger::severity_t const level(static_cast<snaplogger::severity_t>(25));
158 2 : snaplogger::severity::pointer_t s(std::make_shared<snaplogger::severity>(level, "remark"));
159 :
160 1 : snaplogger::add_severity(s);
161 :
162 1 : CATCH_REQUIRE(s->get_severity() == level);
163 1 : CATCH_REQUIRE(s->get_name() == "remark");
164 :
165 : #if defined(__GNUC__) && __GNUC__ >= 7 && __GNUC_MINOR__ >= 5 && __GNUC_PATCHLEVEL__ >= 0
166 2 : snaplogger::severity::pointer_t r("remark"_sev);
167 1 : CATCH_REQUIRE(r == s);
168 :
169 1 : CATCH_REQUIRE(r->get_severity() == level);
170 1 : CATCH_REQUIRE(r->get_name() == "remark");
171 : #endif
172 : }
173 : }
174 : CATCH_END_SECTION()
175 :
176 4 : CATCH_START_SECTION("severity: Print Severity")
177 : {
178 57 : struct level_and_name_t
179 : {
180 : ::snaplogger::severity_t f_level = ::snaplogger::severity_t::SEVERITY_ERROR;
181 : std::string f_name = std::string();
182 : };
183 :
184 1 : std::vector<level_and_name_t> level_and_name =
185 : {
186 : { ::snaplogger::severity_t::SEVERITY_ALL, "all" },
187 : { ::snaplogger::severity_t::SEVERITY_TRACE, "trace" },
188 : { ::snaplogger::severity_t::SEVERITY_DEBUG, "debug" },
189 : { ::snaplogger::severity_t::SEVERITY_NOTICE, "notice" },
190 : { ::snaplogger::severity_t::SEVERITY_UNIMPORTANT, "unimportant" },
191 : { ::snaplogger::severity_t::SEVERITY_VERBOSE, "verbose" },
192 : { ::snaplogger::severity_t::SEVERITY_INFORMATION, "information" },
193 : { ::snaplogger::severity_t::SEVERITY_IMPORTANT, "important" },
194 : { ::snaplogger::severity_t::SEVERITY_MINOR, "minor" },
195 : { ::snaplogger::severity_t::SEVERITY_DEPRECATED, "deprecated" },
196 : { ::snaplogger::severity_t::SEVERITY_WARNING, "warning" },
197 : { ::snaplogger::severity_t::SEVERITY_MAJOR, "major" },
198 : { ::snaplogger::severity_t::SEVERITY_RECOVERABLE_ERROR, "recoverable-error" },
199 : { ::snaplogger::severity_t::SEVERITY_ERROR, "error" },
200 : { ::snaplogger::severity_t::SEVERITY_CRITICAL, "critical" },
201 : { ::snaplogger::severity_t::SEVERITY_ALERT, "alert" },
202 : { ::snaplogger::severity_t::SEVERITY_EMERGENCY, "emergency" },
203 : { ::snaplogger::severity_t::SEVERITY_FATAL, "fatal" },
204 : { ::snaplogger::severity_t::SEVERITY_OFF, "off" },
205 2 : };
206 :
207 20 : for(auto const & ln : level_and_name)
208 : {
209 38 : std::stringstream buffer;
210 19 : buffer << ln.f_level;
211 19 : CATCH_REQUIRE(buffer.str() == ln.f_name);
212 : }
213 :
214 : {
215 2 : std::stringstream buffer;
216 1 : buffer << static_cast<::snaplogger::severity_t>(254);
217 1 : CATCH_REQUIRE(buffer.str() == "(unknown severity: 254)");
218 : }
219 : }
220 : CATCH_END_SECTION()
221 8 : }
222 :
223 :
224 :
225 : // vim: ts=4 sw=4 et
|