Only add node to the log file when needed

We were adding an empty node to the log file when run in a single-node
setup.  Add a test and don't add a node instead.

Change-Id: I9c579140705adb7e85aaf3e17e1dea75bf75776d
diff --git a/aos/configuration.cc b/aos/configuration.cc
index 65c218e..46f07ac 100644
--- a/aos/configuration.cc
+++ b/aos/configuration.cc
@@ -603,7 +603,10 @@
 }
 
 const Node *GetNode(const Configuration *config, std::string_view name) {
+  CHECK(config->has_nodes())
+      << ": Asking for a node from a single node configuration.";
   for (const Node *node : *config->nodes()) {
+    CHECK(node->has_name()) << ": Malformed node " << FlatbufferToJson(node);
     if (node->name()->string_view() == name) {
       return node;
     }
diff --git a/aos/events/logging/logger.cc b/aos/events/logging/logger.cc
index 6eae9e9..2942ab7 100644
--- a/aos/events/logging/logger.cc
+++ b/aos/events/logging/logger.cc
@@ -164,15 +164,20 @@
       flatbuffers::Offset<flatbuffers::String> string_offset =
           fbb.CreateString(network::GetHostname());
 
-      flatbuffers::Offset<Node> node_offset =
-          CopyFlatBuffer(event_loop_->node(), &fbb);
+      flatbuffers::Offset<Node> node_offset;
+      if (event_loop_->node() != nullptr) {
+        node_offset = CopyFlatBuffer(event_loop_->node(), &fbb);
+      }
       LOG(INFO) << "Logging node as " << FlatbufferToJson(event_loop_->node());
 
       aos::logger::LogFileHeader::Builder log_file_header_builder(fbb);
 
       log_file_header_builder.add_name(string_offset);
 
-      log_file_header_builder.add_node(node_offset);
+      // Only add the node if we are running in a multinode configuration.
+      if (event_loop_->node() != nullptr) {
+        log_file_header_builder.add_node(node_offset);
+      }
 
       log_file_header_builder.add_configuration(configuration_offset);
       // The worst case theoretical out of order is the polling period times 2.
@@ -448,12 +453,24 @@
 }
 
 const Node *LogReader::node() const {
-  return configuration::GetNode(
-      configuration(),
-      flatbuffers::GetSizePrefixedRoot<LogFileHeader>(configuration_.data())
-          ->node()
-          ->name()
-          ->string_view());
+  if (configuration()->has_nodes()) {
+    CHECK(flatbuffers::GetSizePrefixedRoot<LogFileHeader>(configuration_.data())
+              ->has_node());
+    CHECK(flatbuffers::GetSizePrefixedRoot<LogFileHeader>(configuration_.data())
+              ->node()
+              ->has_name());
+    return configuration::GetNode(
+        configuration(),
+        flatbuffers::GetSizePrefixedRoot<LogFileHeader>(configuration_.data())
+            ->node()
+            ->name()
+            ->string_view());
+  } else {
+    CHECK(
+        !flatbuffers::GetSizePrefixedRoot<LogFileHeader>(configuration_.data())
+             ->has_node());
+    return nullptr;
+  }
 }
 
 monotonic_clock::time_point LogReader::monotonic_start_time() {
diff --git a/aos/events/logging/logger_test.cc b/aos/events/logging/logger_test.cc
index 02a9a14..4feb401 100644
--- a/aos/events/logging/logger_test.cc
+++ b/aos/events/logging/logger_test.cc
@@ -62,6 +62,7 @@
   LogReader reader(logfile);
 
   LOG(INFO) << "Config " << FlatbufferToJson(reader.configuration());
+  EXPECT_EQ(reader.node(), nullptr);
 
   SimulatedEventLoopFactory log_reader_factory(reader.configuration());