added support for using logging in tests
diff --git a/aos/common/queue_testutils.cc b/aos/common/queue_testutils.cc
index d35dc45..7db5a6e 100644
--- a/aos/common/queue_testutils.cc
+++ b/aos/common/queue_testutils.cc
@@ -2,11 +2,92 @@
 
 #include <string.h>
 
+#include "gtest/gtest.h"
+
 #include "aos/common/queue.h"
+#include "aos/common/logging/logging_impl.h"
+#include "aos/common/once.h"
+
+using ::aos::logging::LogMessage;
 
 namespace aos {
 namespace common {
 namespace testing {
+namespace {
+
+class TestLogImplementation : public logging::LogImplementation {
+ public:
+  const ::std::vector<LogMessage> &messages() { return messages_; }
+
+  // This class has to be a singleton so that everybody can get access to the
+  // same instance to read out the messages etc.
+  static TestLogImplementation *GetInstance() {
+    static Once<TestLogImplementation> once(CreateInstance);
+    return once.Get();
+  }
+
+  // Clears out all of the messages already recorded.
+  void ClearMessages() {
+    messages_.clear();
+  }
+
+  // Prints out all of the messages (like when a test fails).
+  void PrintAllMessages() {
+    for (auto it = messages_.begin(); it != messages_.end(); ++it) {
+      logging::internal::PrintMessage(stdout, *it);
+    }
+  }
+
+ private:
+  TestLogImplementation() {}
+
+  static TestLogImplementation *CreateInstance() {
+    return new TestLogImplementation();
+  }
+
+  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)) {
+      logging::internal::PrintMessage(stdout, message);
+    }
+
+    messages_.push_back(message);
+  }
+
+  ::std::vector<LogMessage> messages_;
+};
+
+class MyTestEventListener : public ::testing::EmptyTestEventListener {
+  virtual void OnTestStart(const ::testing::TestInfo &/*test_info*/) {
+    TestLogImplementation::GetInstance()->ClearMessages();
+  }
+  virtual void OnTestEnd(const ::testing::TestInfo &test_info) {
+    if (test_info.result()->Failed()) {
+      printf("Test %s failed. Printing out all log messages.\n",
+             test_info.name());
+      fputs("\tThis will include already printed WARNING and up messages.\n",
+            stdout);
+      TestLogImplementation::GetInstance()->PrintAllMessages();
+    }
+  }
+};
+
+void *DoEnableTestLogging() {
+  logging::Init();
+  logging::AddImplementation(TestLogImplementation::GetInstance());
+
+  ::testing::UnitTest::GetInstance()->listeners().Append(
+      new MyTestEventListener());
+
+  return NULL;
+}
+
+Once<void> enable_test_logging_once(DoEnableTestLogging);
+
+}  // namespace
 
 GlobalCoreInstance::GlobalCoreInstance() {
   const size_t kCoreSize = 0x100000;
@@ -17,6 +98,8 @@
   memset(memory, 0, kCoreSize);
 
   assert(aos_core_use_address_as_shared_mem(memory, kCoreSize) == 0);
+
+  EnableTestLogging();
 }
 
 GlobalCoreInstance::~GlobalCoreInstance() {
@@ -24,6 +107,10 @@
   global_core = NULL;
 }
 
+void EnableTestLogging() {
+  enable_test_logging_once.Get();
+}
+
 }  // namespace testing
 }  // namespace common
 }  // namespace aos