made logging output from tests work better
Previously, it didn't handle long structs etc well.
diff --git a/aos/common/logging/logging_impl.cc b/aos/common/logging/logging_impl.cc
index 714aaf1..f520b35 100644
--- a/aos/common/logging/logging_impl.cc
+++ b/aos/common/logging/logging_impl.cc
@@ -150,7 +150,7 @@
static_cast<int>(message.message_length), message.message);
break;
case LogMessage::Type::kStruct: {
- char buffer[1024];
+ char buffer[2048];
size_t output_length = sizeof(buffer);
size_t input_length = message.message_length;
if (!PrintMessage(
@@ -244,13 +244,35 @@
static_cast<int>(sizeof(printed) - printed_bytes), printed);
}
+void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
+ va_list ap) {
+ LogMessage message;
+ internal::FillInMessage(level, format, ap, &message);
+ HandleMessage(message);
+}
+
+void HandleMessageLogImplementation::LogStruct(
+ log_level level, const ::std::string &message_string, size_t size,
+ const MessageType *type, const ::std::function<size_t(char *)> &serialize) {
+ LogMessage message;
+ internal::FillInMessageStructure(level, message_string, size, type, serialize,
+ &message);
+ HandleMessage(message);
+}
+
+void HandleMessageLogImplementation::LogMatrix(
+ log_level level, const ::std::string &message_string, uint32_t type_id,
+ int rows, int cols, const void *data) {
+ LogMessage message;
+ internal::FillInMessageMatrix(level, message_string, type_id, rows, cols,
+ data, &message);
+ HandleMessage(message);
+}
+
StreamLogImplementation::StreamLogImplementation(FILE *stream)
: stream_(stream) {}
-void StreamLogImplementation::DoLog(log_level level, const char *format,
- va_list ap) {
- LogMessage message;
- internal::FillInMessage(level, format, ap, &message);
+void StreamLogImplementation::HandleMessage(const LogMessage &message) {
internal::PrintMessage(stream_, message);
}
diff --git a/aos/common/logging/logging_impl.h b/aos/common/logging/logging_impl.h
index 57f09ec..a55e768 100644
--- a/aos/common/logging/logging_impl.h
+++ b/aos/common/logging/logging_impl.h
@@ -196,14 +196,30 @@
LogImplementation *next_;
};
+// Implements all of the DoLog* methods in terms of a (pure virtual in this
+// class) HandleMessage method that takes a pointer to the message.
+class HandleMessageLogImplementation : public LogImplementation {
+ public:
+ __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
+ virtual void DoLog(log_level level, const char *format, va_list ap) override;
+ virtual void LogStruct(log_level level, const ::std::string &message_string,
+ size_t size, const MessageType *type,
+ const ::std::function<size_t(char *)> &serialize)
+ override;
+ virtual void LogMatrix(log_level level, const ::std::string &message_string,
+ uint32_t type_id, int rows, int cols, const void *data)
+ override;
+
+ virtual void HandleMessage(const LogMessage &message) = 0;
+};
+
// A log implementation that dumps all messages to a C stdio stream.
-class StreamLogImplementation : public LogImplementation {
+class StreamLogImplementation : public HandleMessageLogImplementation {
public:
StreamLogImplementation(FILE *stream);
private:
- __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
- virtual void DoLog(log_level level, const char *format, va_list ap);
+ virtual void HandleMessage(const LogMessage &message) override;
FILE *const stream_;
};
diff --git a/aos/common/queue_testutils.cc b/aos/common/queue_testutils.cc
index 5455859..4e62dcd 100644
--- a/aos/common/queue_testutils.cc
+++ b/aos/common/queue_testutils.cc
@@ -19,7 +19,7 @@
namespace testing {
namespace {
-class TestLogImplementation : public logging::LogImplementation {
+class TestLogImplementation : public logging::HandleMessageLogImplementation {
public:
const ::std::vector<LogMessage> &messages() { return messages_; }
@@ -49,13 +49,8 @@
return new TestLogImplementation();
}
- __attribute__((format(GOOD_PRINTF_FORMAT_TYPE, 3, 0)))
- virtual void DoLog(log_level level, const char *format, va_list ap) {
- LogMessage message;
-
- logging::internal::FillInMessage(level, format, ap, &message);
-
- if (!logging::log_gt_important(WARNING, level)) {
+ virtual void HandleMessage(const LogMessage &message) override {
+ if (!logging::log_gt_important(WARNING, message.level)) {
logging::internal::PrintMessage(stdout, message);
}