LCOV - code coverage report
Current view: top level - tests - catch_severity.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 93 93
Test Date: 2025-07-04 17:06:38 Functions: 100.0 % 2 2
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 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
      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            5 :             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            5 :             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            3 :             CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
     112            3 :             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            3 :             CATCH_REQUIRE(snaplogger::get_severity("bad-error") == nullptr);
     124            3 :             CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
     125              : 
     126              :             // duplicates are not allowed
     127              :             //
     128            7 :             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            3 :             CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
     141            3 :             CATCH_REQUIRE(snaplogger::get_severity("big-error") == nullptr);
     142              : 
     143            3 :             s->add_alias("big-error");
     144              : 
     145              :             // duplicates are not allowed
     146              :             //
     147            7 :             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            3 :             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            3 :             CATCH_REQUIRE(snaplogger::get_severity("bad-error") == s);
     170            3 :             CATCH_REQUIRE(snaplogger::get_severity("big-error") == s);
     171            1 :             CATCH_REQUIRE(snaplogger::get_severity(level) == s);
     172              : 
     173            3 :             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            3 :             CATCH_REQUIRE(snaplogger::get_severity(msg, "bad-error") == s);
     181            3 :             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           29 :         };
     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            6 : }
     286              : 
     287              : 
     288            2 : CATCH_TEST_CASE("severity_error", "[severity][error]")
     289              : {
     290            2 :     CATCH_START_SECTION("severity: too small")
     291              :     {
     292            6 :         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            6 :         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
        

Generated by: LCOV version 2.0-1

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