LCOV - code coverage report
Current view: top level - tests - catch_appender.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 65 65
Test Date: 2025-09-07 15:22:28 Functions: 100.0 % 1 1
Legend: Lines: hit not hit

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

Generated by: LCOV version 2.0-1

Snap C++ | List of projects | List of versions