Only schedule OnRun callbacks right after construction in aos

OnRun is meant to be a place to do work right before the event loop
starts to run.  On ShmEventLoop, this is the case, and restarting the
loop isn't all that well supported, so this doesn't make sense there
either.  A lot of our tests have used this behavior since it was easy
and not disallowed.

A follow-up commit will explicitly dis-allow this behavior.

Change-Id: If50dcc0e737725129ef36cb27e07be774d96c691
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/logging/logger_test.cc b/aos/events/logging/logger_test.cc
index 3f0b182..7799c57 100644
--- a/aos/events/logging/logger_test.cc
+++ b/aos/events/logging/logger_test.cc
@@ -77,11 +77,10 @@
   LOG(INFO) << "Logging data to " << logfile;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
@@ -141,11 +140,10 @@
   LOG(INFO) << "Logging data to " << logfile;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
@@ -202,11 +200,10 @@
   LOG(INFO) << "Logging data to " << logfile1 << " then " << logfile2;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_polling_period(std::chrono::milliseconds(100));
     logger_event_loop->OnRun([base_name1, base_name2, &logger_event_loop,
@@ -277,11 +274,10 @@
   LOG(INFO) << "Logging data to " << logfile;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
@@ -316,11 +312,10 @@
   LOG(INFO) << "Logging data to " << logfile1 << " then " << logfile2;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
@@ -385,11 +380,10 @@
   LOG(INFO) << "Logging data to " << logfile0 << " and " << logfile1;
 
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
diff --git a/aos/events/logging/multinode_logger_test_lib.cc b/aos/events/logging/multinode_logger_test_lib.cc
index ed62a2e..3bf6207 100644
--- a/aos/events/logging/multinode_logger_test_lib.cc
+++ b/aos/events/logging/multinode_logger_test_lib.cc
@@ -29,7 +29,8 @@
           configuration::GetNode(configuration, node->node()),
           nullptr,
           params,
-          file_strategy};
+          file_strategy,
+          nullptr};
 }
 
 std::unique_ptr<MultiNodeFilesLogNamer> LoggerState::MakeLogNamer(
@@ -56,12 +57,17 @@
       absl::StrCat("logger_sha1_", event_loop->node()->name()->str()));
   logger->set_logger_version(
       absl::StrCat("logger_version_", event_loop->node()->name()->str()));
-  event_loop->OnRun([this, logfile_base]() {
+  CHECK(start_timer == nullptr)
+      << ": Test fixture doesn't yet supporting starting a logger twice.";
+
+  // Use a timer for starting since OnRun can only happen at the actual startup.
+  start_timer = event_loop->AddTimer([this, logfile_base]() {
     std::unique_ptr<MultiNodeFilesLogNamer> namer = MakeLogNamer(logfile_base);
     log_namer = namer.get();
 
     logger->StartLogging(std::move(namer));
   });
+  start_timer->Schedule(event_loop->monotonic_now());
 }
 
 void LoggerState::AppendAllFilenames(std::vector<std::string> *filenames) {
diff --git a/aos/events/logging/multinode_logger_test_lib.h b/aos/events/logging/multinode_logger_test_lib.h
index adc41a3..a8e5969 100644
--- a/aos/events/logging/multinode_logger_test_lib.h
+++ b/aos/events/logging/multinode_logger_test_lib.h
@@ -69,6 +69,7 @@
   MultiNodeFilesLogNamer *log_namer;
   CompressionParams params;
   FileStrategy file_strategy;
+  aos::TimerHandler *start_timer;
 
   void AppendAllFilenames(std::vector<std::string> *filenames);
 
diff --git a/aos/events/logging/realtime_replay_test.cc b/aos/events/logging/realtime_replay_test.cc
index 4118550..dd4aaf0 100644
--- a/aos/events/logging/realtime_replay_test.cc
+++ b/aos/events/logging/realtime_replay_test.cc
@@ -88,11 +88,10 @@
 
 TEST_F(RealtimeLoggerTest, RealtimeReplay) {
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(std::chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
@@ -123,11 +122,10 @@
 // is included on a single node config
 TEST_F(RealtimeLoggerTest, SingleNodeReplayChannels) {
   {
-    std::unique_ptr<EventLoop> logger_event_loop =
-        event_loop_factory_.MakeEventLoop("logger");
-
     event_loop_factory_.RunFor(std::chrono::milliseconds(95));
 
+    std::unique_ptr<EventLoop> logger_event_loop =
+        event_loop_factory_.MakeEventLoop("logger");
     Logger logger(logger_event_loop.get());
     logger.set_separate_config(false);
     logger.set_polling_period(std::chrono::milliseconds(100));
diff --git a/aos/events/simulated_event_loop_test.cc b/aos/events/simulated_event_loop_test.cc
index f929165..745a273 100644
--- a/aos/events/simulated_event_loop_test.cc
+++ b/aos/events/simulated_event_loop_test.cc
@@ -2635,8 +2635,6 @@
   pi1->Disconnect(pi2->node());
   pi2->Disconnect(pi1->node());
 
-  std::unique_ptr<aos::EventLoop> pi1_event_loop = pi1->MakeEventLoop("sender");
-
   std::unique_ptr<aos::EventLoop> pi2_event_loop =
       pi2->MakeEventLoop("fetcher");
   aos::Fetcher<examples::Ping> pi2_reliable_fetcher =
@@ -2645,6 +2643,8 @@
   factory.RunFor(chrono::milliseconds(100));
 
   {
+    std::unique_ptr<aos::EventLoop> pi1_event_loop =
+        pi1->MakeEventLoop("sender");
     aos::Sender<examples::Ping> pi1_reliable_sender =
         pi1_event_loop->MakeSender<examples::Ping>("/reliable");
     FunctionScheduler run_at(pi1_event_loop.get());