Add simulated version of the event loop

Change-Id: Id61ae7e72d71a52c59497ba13caa6f8267abec34
diff --git a/aos/events/simulated-event-loop_test.cc b/aos/events/simulated-event-loop_test.cc
new file mode 100644
index 0000000..7c11b4a
--- /dev/null
+++ b/aos/events/simulated-event-loop_test.cc
@@ -0,0 +1,50 @@
+#include "aos/events/simulated-event-loop.h"
+#include "aos/events/event-loop_param_test.h"
+#include "gtest/gtest.h"
+
+namespace aos {
+namespace testing {
+
+class SimulatedEventLoopTestFactory : public EventLoopTestFactory {
+ public:
+  std::unique_ptr<EventLoop> Make() override {
+    return event_loop.CreateEventLoop();
+  }
+ private:
+   SimulatedEventLoopFactory event_loop;
+};
+
+INSTANTIATE_TEST_CASE_P(SimulatedEventLoopTest, AbstractEventLoopTest,
+                        ::testing::Values([]() {
+                          return new SimulatedEventLoopTestFactory();
+                        }));
+
+// Test that creating an event and running the scheduler runs the event.
+TEST(EventSchedulerTest, ScheduleEvent) {
+  int counter = 0;
+  EventScheduler scheduler;
+
+  scheduler.Schedule(::aos::monotonic_clock::now(),
+                      [&counter]() { counter += 1; });
+  scheduler.Run();
+  EXPECT_EQ(counter, 1);
+  auto token = scheduler.Schedule(::aos::monotonic_clock::now(),
+                                   [&counter]() { counter += 1; });
+  scheduler.Deschedule(token);
+  scheduler.Run();
+  EXPECT_EQ(counter, 1);
+}
+
+// Test that descheduling an already scheduled event doesn't run the event.
+TEST(EventSchedulerTest, DescheduleEvent) {
+  int counter = 0;
+  EventScheduler scheduler;
+
+  auto token = scheduler.Schedule(::aos::monotonic_clock::now(),
+                                   [&counter]() { counter += 1; });
+  scheduler.Deschedule(token);
+  scheduler.Run();
+  EXPECT_EQ(counter, 0);
+}
+}  // namespace testing
+}  // namespace aos