Prototype event-loop.h for queue dependency injection.

Change-Id: I1af3f71a5b0cca741641f872f55dab10474ee064
diff --git a/aos/events/event-loop_param_test.cc b/aos/events/event-loop_param_test.cc
new file mode 100644
index 0000000..6f04a7d
--- /dev/null
+++ b/aos/events/event-loop_param_test.cc
@@ -0,0 +1,92 @@
+#include "aos/events/event-loop_param_test.h"
+
+namespace aos {
+namespace testing {
+
+struct TestMessage : public ::aos::Message {
+  enum { kQueueLength = 100, kHash = 0x696c0cdc };
+  int msg_value;
+
+  void Zero() { msg_value = 0; }
+  static size_t Size() { return 1 + ::aos::Message::Size(); }
+  size_t Print(char *buffer, size_t length) const;
+  TestMessage() { Zero(); }
+};
+
+// Tests that watcher and fetcher can fetch from a sender.
+// Also tests that OnRun() works.
+TEST_P(AbstractEventLoopTest, Basic) {
+  auto loop1 = Make();
+  auto loop2 = Make();
+  auto loop3 = Make();
+
+  auto sender = loop1->MakeSender<TestMessage>("/test");
+
+  auto fetcher = loop2->MakeFetcher<TestMessage>("/test");
+
+  auto msg = sender.MakeMessage();
+
+  msg->msg_value = 200;
+
+  msg.Send();
+
+  EXPECT_TRUE(fetcher.Fetch());
+  ASSERT_FALSE(fetcher.get() == nullptr);
+  EXPECT_EQ(fetcher->msg_value, 200);
+
+  bool happened = false;
+
+  loop3->OnRun([&]() { happened = true; });
+
+  loop3->MakeWatcher("/test", [&](const TestMessage &message) {
+    EXPECT_EQ(message.msg_value, 200);
+    loop3->Exit();
+  });
+
+  EXPECT_FALSE(happened);
+  loop3->Run();
+  EXPECT_TRUE(happened);
+}
+
+// Verify that making a fetcher and handler for "/test" dies.
+TEST_P(AbstractEventLoopTest, FetcherAndHandler) {
+  auto loop = Make();
+  auto fetcher = loop->MakeFetcher<TestMessage>("/test");
+  EXPECT_DEATH(loop->MakeWatcher("/test", [&](const TestMessage &) {}), "/test");
+}
+
+// Verify that making 2 fetchers for "/test" fails.
+TEST_P(AbstractEventLoopTest, TwoFetcher) {
+  auto loop = Make();
+  auto fetcher = loop->MakeFetcher<TestMessage>("/test");
+  EXPECT_DEATH(loop->MakeFetcher<TestMessage>("/test"), "/test");
+}
+
+// Verify that registering a handler twice for "/test" fails.
+TEST_P(AbstractEventLoopTest, TwoHandler) {
+  auto loop = Make();
+  loop->MakeWatcher("/test", [&](const TestMessage &) {});
+  EXPECT_DEATH(loop->MakeWatcher("/test", [&](const TestMessage &) {}), "/test");
+}
+
+// Verify that Quit() works when there are multiple watchers.
+TEST_P(AbstractEventLoopTest, MultipleFetcherQuit) {
+  auto loop = Make();
+
+  auto sender = loop->MakeSender<TestMessage>("/test2");
+  {
+    auto msg = sender.MakeMessage();
+    msg->msg_value = 200;
+    msg.Send();
+  }
+
+  loop->MakeWatcher("/test1", [&](const TestMessage &) {});
+  loop->MakeWatcher("/test2", [&](const TestMessage &message) {
+    EXPECT_EQ(message.msg_value, 200);
+    loop->Exit();
+  });
+  loop->Run();
+}
+
+}  // namespace testing
+}  // namespace aos