Belle II Software  release-05-01-25
Fixtures.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2019 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Martin Ritter *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <framework/utilities/testhelpers/Fixtures.h>
12 #include <framework/logging/LogConnectionBase.h>
13 #include <framework/logging/LogConnectionConsole.h>
14 
15 #include <boost/algorithm/string.hpp>
16 #include <boost/range/adaptors.hpp>
17 
18 namespace Belle2::TestHelpers {
19  namespace {
21  class LogInterceptor final: public Belle2::LogConnectionBase {
23  std::vector<Belle2::LogMessage>& m_messages;
24  public:
26  explicit LogInterceptor(std::vector<Belle2::LogMessage>& messages): m_messages(messages) {}
28  bool isConnected() override { return true; }
30  bool sendMessage(Belle2::LogMessage const& message) override {m_messages.push_back(message); return false; }
31  };
32  }
33 
36  {
37  m_messages.clear();
39  LogSystem::Instance().addLogConnection(new LogInterceptor(m_messages));
40  LogSystem::Instance().addLogConnection(new LogConnectionConsole(STDOUT_FILENO));
41  }
42 
45  {
47  }
48 
49  void LogMessageTest::expectMessage(LogConfig::ELogLevel level, int count, bool strict)
50  {
51  int messages = std::count_if(m_messages.begin(), m_messages.end(), [level](const LogMessage & m) {
52  return m.getLogLevel() == level;
53  });
54  EXPECT_EQ(count, messages) << "Expected " << count << " messages of loglevel " << LogConfig::logLevelToString(level)
55  << ", found " << messages;
56  if (strict) {
57  EXPECT_EQ(messages, m_messages.size());
58  }
59  }
60 
61  void LogMessageTest::expectMessageVariables(std::map<std::string, std::string>&& variables, bool strict)
62  {
63  ASSERT_FALSE(m_messages.empty()) << "No message available to check";
64  const auto& msg = m_messages.back();
65  for (const auto& var : msg.getLogVariables()) {
66  // cppcheck-suppress stlIfFind ; cppcheck apparently cannot cope with if with initializer yet
67  if (auto it = variables.find(var.getName()); it != variables.end()) {
68  EXPECT_EQ(it->second, var.getValue());
69  variables.erase(it);
70  } else {
71  EXPECT_FALSE(strict) << "extra variable: " << var.getName() << std::endl;
72  }
73  }
74  EXPECT_TRUE(variables.empty()) << "Some requested log variables were not present in the log message: "
75  << boost::algorithm::join(variables | boost::adaptors::map_keys, ", ");
76  }
77 
78  void LogMessageTest::expectErrorWithVariables(std::map<std::string, std::string>&& variables, bool strict)
79  {
81  expectMessageVariables(std::move(variables), strict);
82  clearMessages();
83  }
84 
85  void LogMessageTest::expectMessageContent(LogConfig::ELogLevel level, const std::string& message)
86  {
87  ASSERT_FALSE(m_messages.empty()) << "No message available to check";
88  const auto& msg = m_messages.back();
89  EXPECT_EQ(msg.getLogLevel(), level);
90  EXPECT_EQ(msg.getMessage(), message);
91  }
92 } // namespace Belle2::TestHelpers
Belle2::LogSystem::resetLogConnections
void resetLogConnections()
Removes all log connections.
Definition: LogSystem.cc:46
Belle2::LogSystem::resetLogging
void resetLogging()
Reset logging system to defaults: empty all log messages and reset connections to the default.
Definition: LogSystem.cc:184
Belle2::LogConfig::logLevelToString
static const char * logLevelToString(ELogLevel logLevelType)
Converts a log level type to a string.
Definition: LogConfig.cc:44
Belle2::TestHelpers::LogMessageTest::expectMessageVariables
void expectMessageVariables(std::map< std::string, std::string > &&variables, bool strict=false)
check if the last message emitted contains the given variables and their values.
Definition: Fixtures.cc:69
Belle2::TestHelpers::LogMessageTest::SetUp
void SetUp() override
Add a log message interceptor.
Definition: Fixtures.cc:43
Belle2::TestHelpers::LogMessageTest::TearDown
void TearDown() override
And try to reset logging system to default.
Definition: Fixtures.cc:52
Belle2::LogConfig::ELogLevel
ELogLevel
Definition of the supported log levels.
Definition: LogConfig.h:36
Belle2::LogConnectionBase
Abstract base class for the different types of log connections.
Definition: LogConnectionBase.h:31
Belle2::TestHelpers::LogMessageTest::m_messages
std::vector< LogMessage > m_messages
list of log messages
Definition: Fixtures.h:44
Belle2::TestHelpers
Some utilities to help with writing unit tests.
Definition: Helix.cc:24
Belle2::LogConfig::c_Error
@ c_Error
Error: for things that went wrong and have to be fixed.
Definition: LogConfig.h:40
Belle2::TestHelpers::LogMessageTest::expectMessage
void expectMessage(LogConfig::ELogLevel level=LogConfig::c_Error, int count=1, bool strict=false)
check if there is a certain number of log messages of a given level
Definition: Fixtures.cc:57
Belle2::LogSystem::Instance
static LogSystem & Instance()
Static method to get a reference to the LogSystem instance.
Definition: LogSystem.cc:33
Belle2::LogSystem::addLogConnection
void addLogConnection(LogConnectionBase *logConnection)
Adds a log connection object which is used to the send the logging messages.
Definition: LogSystem.cc:40
Belle2::TestHelpers::LogMessageTest::expectErrorWithVariables
void expectErrorWithVariables(std::map< std::string, std::string > &&variables, bool strict=false)
Expect an error with variables: This is a shorthand to check that there is exactly one error message ...
Definition: Fixtures.cc:86
Belle2::TestHelpers::LogMessageTest::clearMessages
void clearMessages()
clear the list of save log messages
Definition: Fixtures.h:80
Belle2::LogMessage
The LogMessage class.
Definition: LogMessage.h:39
Belle2::TestHelpers::LogMessageTest::expectMessageContent
void expectMessageContent(LogConfig::ELogLevel level, const std::string &message)
check the content of the last log message against the given values
Definition: Fixtures.cc:93