Line data Source code
1 : // Copyright (c) 2006-2025 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 : // C
38 : //
39 : #include <unistd.h>
40 : #include <netdb.h>
41 : #include <sys/param.h>
42 :
43 :
44 :
45 :
46 :
47 1 : CATCH_TEST_CASE("appender", "[appender]")
48 : {
49 1 : CATCH_START_SECTION("appender: Create")
50 : {
51 5 : snaplogger::set_diagnostic(snaplogger::DIAG_KEY_PROGNAME, "appender");
52 :
53 5 : snaplogger::appender::pointer_t unknown(snaplogger::create_appender("unknown", "test-buffer"));
54 1 : CATCH_REQUIRE(unknown == nullptr);
55 :
56 5 : snaplogger::appender::pointer_t buffer(snaplogger::create_appender("buffer", "test-buffer"));
57 1 : CATCH_REQUIRE(buffer != nullptr);
58 1 : CATCH_REQUIRE(buffer->get_type() == "buffer");
59 1 : CATCH_REQUIRE(buffer->get_name() == "test-buffer");
60 :
61 : // the name cannot be changed because it is not "console" or "syslog"
62 : //
63 7 : CATCH_REQUIRE_THROWS_MATCHES(
64 : buffer->set_name("not-available")
65 : , snaplogger::invalid_parameter
66 : , Catch::Matchers::ExceptionMessage(
67 : "logger_error: the appender set_name() can only be used for the console & syslog appenders to rename them to your own appender name (and done internally only)."));
68 :
69 1 : char const * cargv[] =
70 : {
71 : "/usr/bin/daemon",
72 : nullptr
73 : };
74 1 : int const argc(sizeof(cargv) / sizeof(cargv[0]) - 1);
75 1 : char ** argv = const_cast<char **>(cargv);
76 :
77 1 : advgetopt::options_environment environment_options;
78 1 : environment_options.f_project_name = "test-logger";
79 1 : environment_options.f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_SYSTEM_PARAMETERS;
80 1 : advgetopt::getopt opts(environment_options);
81 1 : opts.parse_program_name(argv);
82 1 : opts.parse_arguments(argc, argv, advgetopt::option_source_t::SOURCE_COMMAND_LINE);
83 1 : buffer->set_config(opts);
84 :
85 1 : snaplogger::format::pointer_t f(std::make_shared<snaplogger::format>("${severity}: ${message}"));
86 1 : buffer->set_format(f);
87 1 : CATCH_REQUIRE(buffer->get_format() == f);
88 :
89 1 : CATCH_REQUIRE(buffer->get_bytes_per_minute() == 0);
90 1 : CATCH_REQUIRE(buffer->get_bitrate_dropped_messages() == 0);
91 :
92 1 : snaplogger::logger::pointer_t l(snaplogger::logger::get_instance());
93 1 : l->add_appender(buffer);
94 :
95 1 : CATCH_REQUIRE(buffer->is_enabled());
96 :
97 2 : SNAP_LOG_FATAL << "Appender created by name" << SNAP_LOG_SEND;
98 1 : CATCH_REQUIRE(std::dynamic_pointer_cast<snaplogger::buffer_appender>(buffer)->str() == "fatal: Appender created by name\n");
99 :
100 1 : buffer->set_enabled(false);
101 1 : CATCH_REQUIRE_FALSE(buffer->is_enabled());
102 :
103 2 : SNAP_LOG_FATAL << "Another message when disabled does not make it" << SNAP_LOG_SEND;
104 1 : CATCH_REQUIRE(std::dynamic_pointer_cast<snaplogger::buffer_appender>(buffer)->str() == "fatal: Appender created by name\n");
105 :
106 1 : CATCH_REQUIRE_FALSE(buffer->unique());
107 :
108 : // nothing happens by default
109 : //
110 1 : buffer->reopen();
111 :
112 : // change severity
113 : //
114 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_INFORMATION);
115 1 : buffer->set_severity(snaplogger::severity_t::SEVERITY_ERROR);
116 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_ERROR);
117 :
118 1 : buffer->set_enabled(true);
119 1 : CATCH_REQUIRE(buffer->is_enabled());
120 :
121 2 : SNAP_LOG_INFORMATION << "Severity prevents this message from going in" << SNAP_LOG_SEND;
122 1 : CATCH_REQUIRE(std::dynamic_pointer_cast<snaplogger::buffer_appender>(buffer)->str() == "fatal: Appender created by name\n");
123 :
124 1 : buffer->reduce_severity(snaplogger::severity_t::SEVERITY_FATAL);
125 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_ERROR);
126 1 : buffer->reduce_severity(snaplogger::severity_t::SEVERITY_INFORMATION);
127 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_INFORMATION);
128 :
129 1 : snaplogger::format::pointer_t g(std::make_shared<snaplogger::format>("appender[${severity}]:${line}: ${message}"));
130 1 : std::shared_ptr<snaplogger::safe_format> safe(std::make_shared<snaplogger::safe_format>(buffer, g));
131 1 : CATCH_REQUIRE(buffer->get_format() == g);
132 :
133 : // the format includes the line number so we need to save that as it can
134 : // move each time we edit this file...
135 : //
136 1 : int const line = __LINE__;
137 2 : SNAP_LOG_TODO << "Complete the tests to 100%." << SNAP_LOG_SEND;
138 :
139 1 : CATCH_REQUIRE(std::dynamic_pointer_cast<snaplogger::buffer_appender>(buffer)->str()
140 : == "fatal: Appender created by name\n"
141 : "appender[uncompleted task]:" + std::to_string(line + 1) + ": Complete the tests to 100%.\n");
142 :
143 1 : safe.reset();
144 1 : CATCH_REQUIRE(buffer->get_format() == f);
145 :
146 1 : buffer->increase_severity(snaplogger::severity_t::SEVERITY_DEBUG);
147 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_INFORMATION);
148 1 : buffer->increase_severity(snaplogger::severity_t::SEVERITY_MAJOR);
149 1 : CATCH_REQUIRE(buffer->get_severity() == snaplogger::severity_t::SEVERITY_MAJOR);
150 :
151 5 : snaplogger::appender::pointer_t other_buffer(snaplogger::create_appender("buffer", "other-buffer"));
152 1 : CATCH_REQUIRE(*other_buffer < *buffer);
153 :
154 1 : l->reset();
155 1 : }
156 1 : CATCH_END_SECTION()
157 1 : }
158 :
159 :
160 :
161 : // vim: ts=4 sw=4 et
|