logger.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
7 #include "helpers.hpp"
8 
9 
10 struct LogSink : public uavcan::ILogSink
11 {
12  std::queue<uavcan::protocol::debug::LogMessage> msgs;
14 
16  : level(uavcan::protocol::debug::LogLevel::ERROR)
17  { }
18 
19  LogLevel getLogLevel() const { return level; }
20 
21  void log(const uavcan::protocol::debug::LogMessage& message)
22  {
23  msgs.push(message);
24  std::cout << message << std::endl;
25  }
26 
27  uavcan::protocol::debug::LogMessage pop()
28  {
29  if (msgs.empty())
30  {
31  std::cout << "LogSink is empty" << std::endl;
32  std::abort();
33  }
34  const uavcan::protocol::debug::LogMessage m = msgs.front();
35  msgs.pop();
36  return m;
37  }
38 
39  bool popMatchByLevelAndText(int level, const std::string& source, const std::string& text)
40  {
41  if (msgs.empty())
42  {
43  std::cout << "LogSink is empty" << std::endl;
44  return false;
45  }
46  const uavcan::protocol::debug::LogMessage m = pop();
47  return
48  level == m.level.value &&
49  source == m.source &&
50  text == m.text;
51  }
52 };
53 
54 
55 TEST(Logger, Basic)
56 {
58 
59  uavcan::Logger logger(nodes.a);
60 
62 
63  LogSink sink;
64 
65  // Will fail - types are not registered
67  ASSERT_GT(0, logger.logError("foo", "Error (fail - type is not registered)"));
68  ASSERT_EQ(0, logger.logDebug("foo", "Debug (ignored - low logging level)"));
69 
70  ASSERT_FALSE(logger.getExternalSink());
71  logger.setExternalSink(&sink);
72  ASSERT_EQ(&sink, logger.getExternalSink());
73 
76 
78  ASSERT_LE(0, log_sub.start());
79 
80  // Sink test
81  ASSERT_EQ(0, logger.logDebug("foo", "Debug (ignored due to low logging level)"));
82  ASSERT_TRUE(sink.msgs.empty());
83 
84  sink.level = uavcan::protocol::debug::LogLevel::DEBUG;
85  ASSERT_EQ(0, logger.logDebug("foo", "Debug (sink only)"));
86  ASSERT_TRUE(sink.popMatchByLevelAndText(uavcan::protocol::debug::LogLevel::DEBUG, "foo", "Debug (sink only)"));
87 
88  ASSERT_LE(0, logger.logError("foo", "Error"));
90  ASSERT_TRUE(log_sub.collector.msg.get());
91  ASSERT_EQ(log_sub.collector.msg->level.value, uavcan::protocol::debug::LogLevel::ERROR);
92  ASSERT_EQ(log_sub.collector.msg->source, "foo");
93  ASSERT_EQ(log_sub.collector.msg->text, "Error");
94 
95  logger.setLevel(uavcan::protocol::debug::LogLevel::DEBUG);
96  ASSERT_LE(0, logger.logWarning("foo", "Warning"));
98  ASSERT_EQ(log_sub.collector.msg->level.value, uavcan::protocol::debug::LogLevel::WARNING);
99  ASSERT_EQ(log_sub.collector.msg->source, "foo");
100  ASSERT_EQ(log_sub.collector.msg->text, "Warning");
101 
102  ASSERT_LE(0, logger.logInfo("foo", "Info"));
104  ASSERT_EQ(log_sub.collector.msg->level.value, uavcan::protocol::debug::LogLevel::INFO);
105  ASSERT_EQ(log_sub.collector.msg->source, "foo");
106  ASSERT_EQ(log_sub.collector.msg->text, "Info");
107 
108  ASSERT_LE(0, logger.logDebug("foo", "Debug"));
110  ASSERT_EQ(log_sub.collector.msg->level.value, uavcan::protocol::debug::LogLevel::DEBUG);
111  ASSERT_EQ(log_sub.collector.msg->source, "foo");
112  ASSERT_EQ(log_sub.collector.msg->text, "Debug");
113 
114  ASSERT_TRUE(sink.popMatchByLevelAndText(uavcan::protocol::debug::LogLevel::ERROR, "foo", "Error"));
115  ASSERT_TRUE(sink.popMatchByLevelAndText(uavcan::protocol::debug::LogLevel::WARNING, "foo", "Warning"));
116  ASSERT_TRUE(sink.popMatchByLevelAndText(uavcan::protocol::debug::LogLevel::INFO, "foo", "Info"));
117  ASSERT_TRUE(sink.popMatchByLevelAndText(uavcan::protocol::debug::LogLevel::DEBUG, "foo", "Debug"));
118 }
119 
120 #if !defined(UAVCAN_CPP_VERSION) || !defined(UAVCAN_CPP11)
121 # error UAVCAN_CPP_VERSION
122 #endif
123 
124 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
125 
126 TEST(Logger, Cpp11Formatting)
127 {
129 
130  uavcan::Logger logger(nodes.a);
131  logger.setLevel(uavcan::protocol::debug::LogLevel::DEBUG);
132 
134  ASSERT_LE(0, log_sub.start());
135 
136  ASSERT_LE(0, logger.logWarning("foo", "char='%*', %* is %*", '$', "double", 12.34));
138  ASSERT_TRUE(log_sub.collector.msg.get());
139  ASSERT_EQ(log_sub.collector.msg->level.value, uavcan::protocol::debug::LogLevel::WARNING);
140  ASSERT_EQ(log_sub.collector.msg->source, "foo");
141  ASSERT_EQ(log_sub.collector.msg->text, "char='$', double is 12.34");
142 }
143 
144 #endif
void setExternalSink(ILogSink *sink)
Definition: logger.hpp:148
int logDebug(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:180
int logWarning(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:192
ILogSink * getExternalSink() const
Definition: logger.hpp:147
StorageType< typename protocol::debug::LogLevel::FieldTypes::value >::Type LogLevel
Definition: logger.hpp:30
LogLevel getLogLevel() const
Definition: logger.cpp:19
LogLevel level
Definition: logger.cpp:13
bool popMatchByLevelAndText(int level, const std::string &source, const std::string &text)
Definition: logger.cpp:39
void log(const uavcan::protocol::debug::LogMessage &message)
Definition: logger.cpp:21
int logError(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:198
TEST(Logger, Basic)
Definition: logger.cpp:55
int logInfo(const char *source, const char *format, Args... args) UAVCAN_NOEXCEPT
Definition: logger.hpp:186
void setLevel(LogLevel level)
Definition: logger.hpp:139
static GlobalDataTypeRegistry & instance()
std::queue< uavcan::protocol::debug::LogMessage > msgs
Definition: logger.cpp:12
uavcan::protocol::debug::LogMessage pop()
Definition: logger.cpp:27
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
int spinBoth(uavcan::MonotonicDuration duration)
Definition: test_node.hpp:176
LogSink()
Definition: logger.cpp:15
LogLevel getLevel() const
Definition: logger.hpp:138


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39