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 
61  ASSERT_EQ(uavcan::protocol::debug::LogLevel::ERROR, logger.getLevel());
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
uavcan::ILogSink
Definition: logger.hpp:27
uavcan::DefaultDataTypeRegistrator
Definition: global_data_type_registry.hpp:186
LogSink::popMatchByLevelAndText
bool popMatchByLevelAndText(int level, const std::string &source, const std::string &text)
Definition: logger.cpp:39
SubscriberWithCollector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:33
uavcan::DurationBase< MonotonicDuration >::fromMSec
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
LogSink::log
void log(const uavcan::protocol::debug::LogMessage &message)
Definition: logger.cpp:21
SubscriberWithCollector::start
int start()
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:45
LogSink::msgs
std::queue< uavcan::protocol::debug::LogMessage > msgs
Definition: logger.cpp:12
LogSink::LogSink
LogSink()
Definition: logger.cpp:15
A
Definition: comparison.cpp:95
LogSink
Definition: logger.cpp:10
helpers.hpp
TEST
TEST(Logger, Basic)
Definition: logger.cpp:55
LogSink::pop
uavcan::protocol::debug::LogMessage pop()
Definition: logger.cpp:27
InterlinkedTestNodes
Definition: test_node.hpp:149
SubscriberWithCollector::collector
Collector collector
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:38
ERROR
@ ERROR
Definition: lpc_types.h:74
libuavcan_dsdl_compiler.logger
logger
Definition: libuavcan_dsdl_compiler/__init__.py:35
LogSink::getLogLevel
LogLevel getLogLevel() const
Definition: logger.cpp:19
InterlinkedTestNodes::a
TestNode a
Definition: test_node.hpp:155
uavcan::Logger
Definition: logger.hpp:58
SubscriptionCollector::msg
std::unique_ptr< DataType > msg
Definition: libuavcan/libuavcan/test/protocol/helpers.hpp:23
InterlinkedTestNodes::spinBoth
int spinBoth(uavcan::MonotonicDuration duration)
Definition: test_node.hpp:176
logger.hpp
LogSink::level
LogLevel level
Definition: logger.cpp:13
uavcan::GlobalDataTypeRegistry::instance
static GlobalDataTypeRegistry & instance()
Definition: uc_global_data_type_registry.cpp:128
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
InterlinkedTestNodes::b
TestNode b
Definition: test_node.hpp:156


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:02