Add RunFor to SimulatedEventLoopFactory

Turns out we really want to be able to run for short periods of time in
simulation. So add support and tests for it.

Change-Id: I9276e1330a0d4eaea717f949516b290b1a01ed89
diff --git a/aos/events/simulated-event-loop.cc b/aos/events/simulated-event-loop.cc
index 02d15a6..5a9960e 100644
--- a/aos/events/simulated-event-loop.cc
+++ b/aos/events/simulated-event-loop.cc
@@ -124,8 +124,10 @@
       EventScheduler *scheduler,
       ::std::map<::std::pair<::std::string, QueueTypeInfo>, SimulatedQueue>
           *queues)
-      : scheduler_(scheduler), queues_(queues) {}
-  ~SimulatedEventLoop() override {};
+      : scheduler_(scheduler), queues_(queues) {
+    scheduler_->AddRawEventLoop(this);
+  }
+  ~SimulatedEventLoop() override { scheduler_->RemoveRawEventLoop(this); };
 
   ::aos::monotonic_clock::time_point monotonic_now() override {
     return scheduler_->monotonic_now();
@@ -150,11 +152,10 @@
     scheduler_->Schedule(scheduler_->monotonic_now(), on_run);
   }
   void Run() override {
-    set_is_running(true);
+    LOG(FATAL, "Run from the factory instead\n");
     scheduler_->Run();
   }
   void Exit() override {
-    set_is_running(false);
     scheduler_->Exit();
   }
 
@@ -180,7 +181,36 @@
   events_list_.erase(token);
 }
 
+void EventScheduler::RunFor(monotonic_clock::duration duration) {
+  const ::aos::monotonic_clock::time_point end_time =
+      monotonic_now() + duration;
+  for (RawEventLoop *event_loop : raw_event_loops_) {
+    event_loop->set_is_running(true);
+  }
+  is_running_ = true;
+  while (!events_list_.empty() && is_running_) {
+    auto iter = events_list_.begin();
+    ::aos::monotonic_clock::time_point next_time = iter->first;
+    if (next_time > end_time) {
+      break;
+    }
+    now_ = iter->first;
+    ::std::function<void()> callback = ::std::move(iter->second);
+    events_list_.erase(iter);
+    callback();
+  }
+  now_ = end_time;
+  if (!is_running_) {
+    for (RawEventLoop *event_loop : raw_event_loops_) {
+      event_loop->set_is_running(false);
+    }
+  }
+}
+
 void EventScheduler::Run() {
+  for (RawEventLoop *event_loop : raw_event_loops_) {
+    event_loop->set_is_running(true);
+  }
   is_running_ = true;
   while (!events_list_.empty() && is_running_) {
     auto iter = events_list_.begin();
@@ -189,6 +219,11 @@
     events_list_.erase(iter);
     callback();
   }
+  if (!is_running_) {
+    for (RawEventLoop *event_loop : raw_event_loops_) {
+      event_loop->set_is_running(false);
+    }
+  }
 }
 
 void SimulatedEventLoop::MakeRawWatcher(