LCOV - code coverage report
Current view: top level - elsa/logging/tests - test_Logger.cpp (source / functions) Hit Total Coverage
Test: coverage-all.lcov Lines: 102 102 100.0 %
Date: 2022-08-25 03:05:39 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /**
       2             :  * @file test_Logger.cpp
       3             :  *
       4             :  * @brief Tests for the Logger class
       5             :  *
       6             :  * @author Tobias Lasser - initial code
       7             :  */
       8             : 
       9             : #include "doctest/doctest.h"
      10             : #include "Logger.h"
      11             : #include <sstream>
      12             : 
      13             : using namespace elsa;
      14             : using namespace doctest;
      15             : 
      16             : using namespace std::string_literals;
      17             : 
      18             : TEST_SUITE_BEGIN("logging");
      19             : 
      20             : TEST_CASE("Logger: Use test")
      21           9 : {
      22           9 :     GIVEN("a logger")
      23           9 :     {
      24           7 :         std::string name{"test"};
      25           7 :         auto testLogger = Logger::get(name);
      26             : 
      27           7 :         WHEN("checking the logger")
      28           7 :         {
      29           1 :             THEN("the parameters fit")
      30           1 :             {
      31           1 :                 REQUIRE(testLogger->name() == name);
      32           1 :                 REQUIRE(testLogger->level() == spdlog::level::info);
      33           1 :                 REQUIRE(testLogger->sinks().size() == 1);
      34           1 :             }
      35           1 :         }
      36             : 
      37           7 :         WHEN("getting the logger again")
      38           7 :         {
      39           1 :             auto sameLogger = Logger::get(name);
      40             : 
      41           1 :             THEN("it has the same settings")
      42           1 :             {
      43           1 :                 REQUIRE(sameLogger->name() == name);
      44           1 :                 REQUIRE(sameLogger->level() == spdlog::level::info);
      45           1 :                 REQUIRE(sameLogger->sinks().size() == 1);
      46           1 :             }
      47           1 :         }
      48             : 
      49           7 :         WHEN("setting the log level")
      50           7 :         {
      51           2 :             Logger::setLevel(Logger::LogLevel::ERR);
      52             : 
      53           2 :             THEN("our logger is updated to that level")
      54           2 :             {
      55           1 :                 REQUIRE(testLogger->level() == spdlog::level::err);
      56           1 :             }
      57             : 
      58           2 :             THEN("new loggers have the correct level")
      59           2 :             {
      60           1 :                 auto newLogger = Logger::get("newLogger");
      61           1 :                 REQUIRE(newLogger->level() == spdlog::level::err);
      62           1 :             }
      63           2 :         }
      64             : 
      65           7 :         WHEN("adding file logging")
      66           7 :         {
      67           3 :             std::string filename = "log.txt";
      68           3 :             Logger::enableFileLogging(filename);
      69             : 
      70           3 :             THEN("We still should only have one sink") { REQUIRE(testLogger->sinks().size() == 1); }
      71             : 
      72           3 :             THEN("a new logger has file logging enabled")
      73           3 :             {
      74           1 :                 auto newLogger = Logger::get("fileLogger");
      75           1 :                 REQUIRE(newLogger->sinks().size() == 1);
      76             : 
      77           1 :                 newLogger->info("This is an info");
      78           1 :                 REQUIRE(true);
      79           1 :             }
      80             : 
      81           3 :             THEN("actually logging works")
      82           3 :             {
      83           1 :                 testLogger->info("This is another warning");
      84           1 :                 REQUIRE(true);
      85           1 :             }
      86           3 :         }
      87           7 :     }
      88             : 
      89             :     // Add buffer as sink to test the logging
      90           9 :     std::stringstream buffer;
      91             : 
      92             :     // Keep this flat, as it would at everything multiple times, which duplicates the messages
      93           9 :     GIVEN("A logger at info level")
      94           9 :     {
      95           1 :         Logger::addSink(buffer);
      96             : 
      97           1 :         Logger::setLevel(Logger::LogLevel::INFO);
      98           1 :         auto logger = Logger::get("logger");
      99             : 
     100             :         // Set pattern that we can easily check it
     101           1 :         logger->set_pattern("%v");
     102             : 
     103             :         // we expect there to be exactly 1 sink
     104           1 :         REQUIRE(logger->sinks().size() == 1);
     105             : 
     106           1 :         auto msg = "This is a test"s;
     107           1 :         logger->info(msg);
     108             : 
     109             :         // Get string from buffer
     110           1 :         auto resultString = buffer.str();
     111           1 :         REQUIRE(resultString == (msg + '\n'));
     112             : 
     113             :         // reset buffer
     114           1 :         buffer = std::stringstream();
     115             : 
     116           1 :         msg = "This is a test"s;
     117           1 :         logger->debug(msg);
     118             : 
     119             :         // Get string from buffer
     120           1 :         resultString = buffer.str();
     121           1 :         REQUIRE(resultString == "");
     122             : 
     123             :         // reset buffer
     124           1 :         buffer = std::stringstream();
     125             : 
     126           1 :         msg = "This is a warning"s;
     127           1 :         logger->warn(msg);
     128             : 
     129           1 :         resultString = buffer.str();
     130           1 :         REQUIRE(resultString == (msg + '\n'));
     131           1 :     }
     132             : 
     133           9 :     GIVEN("A logger at debug level")
     134           9 :     {
     135             :         // reset buffer
     136           1 :         buffer = std::stringstream();
     137             : 
     138           1 :         Logger::setLevel(Logger::LogLevel::DEBUG);
     139           1 :         auto logger = Logger::get("logger");
     140             : 
     141             :         // Set pattern that we can easily check it
     142           1 :         logger->set_pattern("%v");
     143             : 
     144             :         // we expect there to be exactly 1 sink
     145           1 :         REQUIRE(logger->sinks().size() == 1);
     146             : 
     147           1 :         auto msg = "This is a test"s;
     148           1 :         logger->info(msg);
     149             : 
     150             :         // Get string from buffer
     151           1 :         auto resultString = buffer.str();
     152           1 :         REQUIRE(resultString == (msg + '\n'));
     153             : 
     154             :         // reset buffer
     155           1 :         buffer = std::stringstream();
     156             : 
     157           1 :         msg = "This is a debug"s;
     158           1 :         logger->debug(msg);
     159             : 
     160             :         // Get string from buffer
     161           1 :         resultString = buffer.str();
     162           1 :         REQUIRE(resultString == (msg + '\n'));
     163             : 
     164             :         // reset buffer
     165           1 :         buffer = std::stringstream();
     166             : 
     167           1 :         msg = "This is a warning"s;
     168           1 :         logger->warn(msg);
     169             : 
     170           1 :         resultString = buffer.str();
     171           1 :         REQUIRE(resultString == (msg + '\n'));
     172           1 :     }
     173           9 : }
     174             : 
     175             : TEST_SUITE_END();

Generated by: LCOV version 1.14