Make logger tests more robust to file changes

This sets us up to put data in different file groupings to test out
different code paths.

Change-Id: I4e1dd38ec30c729b8dd77fb4f74f30f5fa229013
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/logging/multinode_logger_test.cc b/aos/events/logging/multinode_logger_test.cc
index 64abfe7..290b312 100644
--- a/aos/events/logging/multinode_logger_test.cc
+++ b/aos/events/logging/multinode_logger_test.cc
@@ -509,7 +509,7 @@
     pi2_logger.AppendAllFilenames(&actual_filenames);
   }
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(actual_filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
 
   LogReader reader(sorted_parts, &config_.message());
@@ -583,7 +583,7 @@
     pi2_logger.AppendAllFilenames(&actual_filenames);
   }
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(actual_filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
 
   LogReader reader(sorted_parts, &config_.message());
@@ -638,6 +638,8 @@
 // is forwarded
 TEST_P(MultinodeLoggerTest, OnlyDoBeforeSendCallbackOnSenderNode) {
   time_converter_.StartEqual();
+
+  std::vector<std::string> filenames;
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
     LoggerState pi2_logger = MakeLogger(pi2_);
@@ -648,9 +650,12 @@
     StartLogger(&pi2_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(20000));
+
+    pi1_logger.AppendAllFilenames(&filenames);
+    pi2_logger.AppendAllFilenames(&filenames);
   }
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
   LogReader reader(sorted_parts);
 
@@ -725,7 +730,7 @@
     pi2_logger.AppendAllFilenames(&actual_filenames);
   }
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(actual_filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
 
   LogReader reader(sorted_parts, &config_.message());
@@ -745,6 +750,8 @@
 // the LogReader constructor.
 TEST_P(MultinodeLoggerDeathTest, MultiNodeBadReplayConfig) {
   time_converter_.StartEqual();
+
+  std::vector<std::string> filenames;
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
     LoggerState pi2_logger = MakeLogger(pi2_);
@@ -755,6 +762,9 @@
     StartLogger(&pi2_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(20000));
+
+    pi1_logger.AppendAllFilenames(&filenames);
+    pi2_logger.AppendAllFilenames(&filenames);
   }
 
   // Test that, if we add an additional node to the replay config that the
@@ -769,7 +779,7 @@
         }
       )");
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
   EXPECT_DEATH(LogReader(sorted_parts, &extra_nodes_config.message()),
                "Log file and replay config need to have matching nodes lists.");
@@ -915,6 +925,7 @@
   const chrono::nanoseconds logger_run3 = time_converter_.AddMonotonic(
       {chrono::milliseconds(400), chrono::milliseconds(400)});
 
+  std::vector<std::string> actual_filenames;
   {
     LoggerState pi2_logger = MakeLogger(pi2_);
 
@@ -955,14 +966,17 @@
           (pi2_->monotonic_now() - pi1_->monotonic_now()) - initial_pi2_offset,
           event_loop_factory_.send_delay() +
               event_loop_factory_.network_delay());
+
+      pi1_logger.AppendAllFilenames(&actual_filenames);
     }
 
     // And log a bit more on pi2.
     event_loop_factory_.RunFor(logger_run3);
+
+    pi2_logger.AppendAllFilenames(&actual_filenames);
   }
 
-  const std::vector<LogFile> sorted_parts =
-      SortParts(MakeLogFiles(logfile_base1_, logfile_base2_, 1, 1, 2, 2));
+  const std::vector<LogFile> sorted_parts = SortParts(actual_filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
   LogReader reader(sorted_parts);
 
@@ -1088,6 +1102,8 @@
 // Tests that we can sort a bunch of parts with an empty part.  We should ignore
 // it and remove it from the sorted list.
 TEST_P(MultinodeLoggerTest, SortEmptyParts) {
+  std::vector<std::string> actual_filenames;
+
   time_converter_.StartEqual();
   // Make a bunch of parts.
   {
@@ -1100,15 +1116,17 @@
     StartLogger(&pi2_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(2000));
+    pi1_logger.AppendAllFilenames(&actual_filenames);
+    pi2_logger.AppendAllFilenames(&actual_filenames);
   }
 
   // TODO(austin): Should we flip out if the file can't open?
   const std::string kEmptyFile("foobarinvalidfiledoesnotexist" + Extension());
 
   aos::util::WriteStringToFileOrDie(kEmptyFile, "");
-  logfiles_.emplace_back(kEmptyFile);
+  actual_filenames.emplace_back(kEmptyFile);
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(actual_filenames);
   VerifyParts(sorted_parts, {kEmptyFile});
 }
 
@@ -1153,6 +1171,8 @@
 // Tests that if we remap a logged channel, it shows up correctly.
 TEST_P(MultinodeLoggerTest, RemapLoggedChannel) {
   time_converter_.StartEqual();
+
+  std::vector<std::string> filenames;
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
     LoggerState pi2_logger = MakeLogger(pi2_);
@@ -1163,9 +1183,12 @@
     StartLogger(&pi2_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(20000));
+
+    pi1_logger.AppendAllFilenames(&filenames);
+    pi2_logger.AppendAllFilenames(&filenames);
   }
 
-  const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
+  const std::vector<LogFile> sorted_parts = SortParts(filenames);
   EXPECT_TRUE(AllPartsMatchOutOfOrderDuration(sorted_parts));
   LogReader reader(sorted_parts);
 
@@ -1534,6 +1557,8 @@
 TEST_P(MultinodeLoggerTest, SingleNodeReplay) {
   time_converter_.StartEqual();
   constexpr chrono::milliseconds kStartupDelay(95);
+  std::vector<std::string> filenames;
+
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
     LoggerState pi2_logger = MakeLogger(pi2_);
@@ -1544,10 +1569,13 @@
     StartLogger(&pi2_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(20000));
+
+    pi1_logger.AppendAllFilenames(&filenames);
+    pi2_logger.AppendAllFilenames(&filenames);
   }
 
-  LogReader full_reader(SortParts(logfiles_));
-  LogReader single_node_reader(SortParts(logfiles_));
+  LogReader full_reader(SortParts(filenames));
+  LogReader single_node_reader(SortParts(filenames));
 
   SimulatedEventLoopFactory full_factory(full_reader.configuration());
   SimulatedEventLoopFactory single_node_factory(
@@ -1927,8 +1955,8 @@
     LoggerState pi2_logger = MakeLogger(
         log_reader_factory.GetNodeEventLoopFactory("pi2"), &log_reader_factory);
 
-    StartLogger(&pi1_logger, tmp_dir_ + "/relogged1");
-    StartLogger(&pi2_logger, tmp_dir_ + "/relogged2");
+    StartLogger(&pi1_logger, tmp_dir_ + "/logs/relogged1");
+    StartLogger(&pi2_logger, tmp_dir_ + "/logs/relogged2");
 
     log_reader_factory.Run();
   }
@@ -1938,8 +1966,9 @@
   // And verify that we can run the LogReader over the relogged files without
   // hitting any fatal errors.
   {
-    LogReader relogged_reader(SortParts(MakeLogFiles(
-        tmp_dir_ + "/relogged1", tmp_dir_ + "/relogged2", 1, 1, 2, 2, true)));
+    LogReader relogged_reader(SortParts(
+        MakeLogFiles(tmp_dir_ + "/logs/relogged1", tmp_dir_ + "/logs/relogged2",
+                     1, 1, 2, 2, true)));
     relogged_reader.Register();
 
     relogged_reader.event_loop_factory()->Run();
@@ -1948,8 +1977,8 @@
   // configuration.
   {
     LogReader relogged_reader(
-        SortParts(MakeLogFiles(tmp_dir_ + "/relogged1", tmp_dir_ + "/relogged2",
-                               1, 1, 2, 2, true)),
+        SortParts(MakeLogFiles(tmp_dir_ + "/logs/relogged1",
+                               tmp_dir_ + "/logs/relogged2", 1, 1, 2, 2, true)),
         reader.configuration());
     relogged_reader.Register();
 
@@ -1979,7 +2008,7 @@
   ASSERT_THAT(actual_filenames,
               ::testing::UnorderedElementsAreArray(logfiles_));
 
-  for (const LogFile &log_file : SortParts(logfiles_)) {
+  for (const LogFile &log_file : SortParts(actual_filenames)) {
     for (const LogParts &log_part : log_file.parts) {
       if (log_part.node == log_file.logger_node) {
         EXPECT_EQ(log_part.logger_monotonic_start_time,
@@ -2003,13 +2032,11 @@
 
 // Test that renaming the base, renames the folder.
 TEST_P(MultinodeLoggerTest, LoggerRenameFolder) {
-  util::UnlinkRecursive(tmp_dir_ + "/renamefolder");
-  util::UnlinkRecursive(tmp_dir_ + "/new-good");
   time_converter_.AddMonotonic(
       {BootTimestamp::epoch(), BootTimestamp::epoch() + chrono::seconds(1000)});
-  logfile_base1_ = tmp_dir_ + "/renamefolder/multi_logfile1";
-  logfile_base2_ = tmp_dir_ + "/renamefolder/multi_logfile2";
-  logfiles_ = MakeLogFiles(logfile_base1_, logfile_base2_);
+  logfile_base1_ = tmp_dir_ + "/logs/renamefolder/multi_logfile1";
+  logfile_base2_ = tmp_dir_ + "/logs/renamefolder/multi_logfile2";
+
   LoggerState pi1_logger = MakeLogger(pi1_);
   LoggerState pi2_logger = MakeLogger(pi2_);
 
@@ -2017,8 +2044,8 @@
   StartLogger(&pi2_logger);
 
   event_loop_factory_.RunFor(chrono::milliseconds(10000));
-  logfile_base1_ = tmp_dir_ + "/new-good/multi_logfile1";
-  logfile_base2_ = tmp_dir_ + "/new-good/multi_logfile2";
+  logfile_base1_ = tmp_dir_ + "/logs/new-good/multi_logfile1";
+  logfile_base2_ = tmp_dir_ + "/logs/new-good/multi_logfile2";
   logfiles_ = MakeLogFiles(logfile_base1_, logfile_base2_);
 
   // Sequence of set_base_name and Rotate simulates rename operation. Since
@@ -2040,14 +2067,13 @@
 TEST_P(MultinodeLoggerDeathTest, LoggerRenameFile) {
   time_converter_.AddMonotonic(
       {BootTimestamp::epoch(), BootTimestamp::epoch() + chrono::seconds(1000)});
-  util::UnlinkRecursive(tmp_dir_ + "/renamefile");
-  logfile_base1_ = tmp_dir_ + "/renamefile/multi_logfile1";
-  logfile_base2_ = tmp_dir_ + "/renamefile/multi_logfile2";
-  logfiles_ = MakeLogFiles(logfile_base1_, logfile_base2_);
+  logfile_base1_ = tmp_dir_ + "/logs/renamefile/multi_logfile1";
+  logfile_base2_ = tmp_dir_ + "/logs/renamefile/multi_logfile2";
+
   LoggerState pi1_logger = MakeLogger(pi1_);
   StartLogger(&pi1_logger);
   event_loop_factory_.RunFor(chrono::milliseconds(10000));
-  logfile_base1_ = tmp_dir_ + "/new-renamefile/new_multi_logfile1";
+  logfile_base1_ = tmp_dir_ + "/logs/new-renamefile/new_multi_logfile1";
   EXPECT_DEATH({ pi1_logger.log_namer->set_base_name(logfile_base1_); },
                "Rename of file base from");
 }
@@ -2818,6 +2844,8 @@
 // Tests that we properly handle one direction of message_bridge being
 // unavailable.
 TEST_P(MultinodeLoggerTest, OneDirectionWithNegativeSlope) {
+  std::vector<std::string> actual_filenames;
+
   pi1_->Disconnect(pi2_->node());
   time_converter_.AddMonotonic(
       {BootTimestamp::epoch(), BootTimestamp::epoch() + chrono::seconds(1000)});
@@ -2833,11 +2861,12 @@
     StartLogger(&pi1_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(10000));
+    pi1_logger.AppendAllFilenames(&actual_filenames);
   }
 
   // Confirm that we can parse the result.  LogReader has enough internal
   // CHECKs to confirm the right thing happened.
-  ConfirmReadable(pi1_single_direction_logfiles_);
+  ConfirmReadable(actual_filenames);
 }
 
 // Tests that we properly handle one direction of message_bridge being
@@ -2850,6 +2879,8 @@
   time_converter_.AddMonotonic(
       {chrono::milliseconds(10000),
        chrono::milliseconds(10000) + chrono::milliseconds(1)});
+
+  std::vector<std::string> filenames;
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
 
@@ -2858,11 +2889,12 @@
     StartLogger(&pi1_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(10000));
+    pi1_logger.AppendAllFilenames(&filenames);
   }
 
   // Confirm that we can parse the result.  LogReader has enough internal
   // CHECKs to confirm the right thing happened.
-  ConfirmReadable(pi1_single_direction_logfiles_);
+  ConfirmReadable(filenames);
 }
 
 // Tests that we explode if someone passes in a part file twice with a better
@@ -2870,6 +2902,8 @@
 TEST_P(MultinodeLoggerTest, DuplicateLogFiles) {
   time_converter_.AddMonotonic(
       {BootTimestamp::epoch(), BootTimestamp::epoch() + chrono::seconds(1000)});
+
+  std::vector<std::string> filenames;
   {
     LoggerState pi1_logger = MakeLogger(pi1_);
 
@@ -2878,10 +2912,12 @@
     StartLogger(&pi1_logger);
 
     event_loop_factory_.RunFor(chrono::milliseconds(10000));
+
+    pi1_logger.AppendAllFilenames(&filenames);
   }
 
   std::vector<std::string> duplicates;
-  for (const std::string &f : pi1_single_direction_logfiles_) {
+  for (const std::string &f : filenames) {
     duplicates.emplace_back(f);
     duplicates.emplace_back(f);
   }
@@ -3058,17 +3094,14 @@
       event_loop_factory.configuration(), pi3->node());
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
   const std::string kLogfile2_2 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.2/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.2/";
   const std::string kLogfile3_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile3/";
-  util::UnlinkRecursive(kLogfile1_1);
-  util::UnlinkRecursive(kLogfile2_1);
-  util::UnlinkRecursive(kLogfile2_2);
-  util::UnlinkRecursive(kLogfile3_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile3/";
+
   const UUID pi1_boot0 = UUID::Random();
   const UUID pi2_boot0 = UUID::Random();
   const UUID pi2_boot1 = UUID::Random();
@@ -3228,17 +3261,13 @@
       event_loop_factory.configuration(), pi3->node());
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
   const std::string kLogfile2_2 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.2/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.2/";
   const std::string kLogfile3_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile3/";
-  util::UnlinkRecursive(kLogfile1_1);
-  util::UnlinkRecursive(kLogfile2_1);
-  util::UnlinkRecursive(kLogfile2_2);
-  util::UnlinkRecursive(kLogfile3_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile3/";
   const UUID pi1_boot0 = UUID::Random();
   const UUID pi2_boot0 = UUID::Random();
   const UUID pi2_boot1 = UUID::Random();
@@ -3405,17 +3434,13 @@
       event_loop_factory.configuration(), pi3->node());
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
   const std::string kLogfile2_2 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.2/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.2/";
   const std::string kLogfile3_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile3/";
-  util::UnlinkRecursive(kLogfile1_1);
-  util::UnlinkRecursive(kLogfile2_1);
-  util::UnlinkRecursive(kLogfile2_2);
-  util::UnlinkRecursive(kLogfile3_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile3/";
   {
     CHECK_EQ(pi1_index, 0u);
     CHECK_EQ(pi2_index, 1u);
@@ -3576,11 +3601,9 @@
   }
 
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1.1/";
-  util::UnlinkRecursive(kLogfile2_1);
-  util::UnlinkRecursive(kLogfile1_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1.1/";
 
   pi2->Disconnect(pi1->node());
 
@@ -3650,8 +3673,7 @@
   }
 
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
-  util::UnlinkRecursive(kLogfile2_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
 
   pi1->AlwaysStart<Ping>("ping");
 
@@ -3720,8 +3742,7 @@
   }
 
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
-  util::UnlinkRecursive(kLogfile2_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
 
   pi1->AlwaysStart<Ping>("ping");
 
@@ -3790,8 +3811,7 @@
   }
 
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
-  util::UnlinkRecursive(kLogfile2_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
 
   // The following sequence using the above reference config creates
   // a reliable message timestamp < unreliable message timestamp.
@@ -3861,8 +3881,7 @@
   }
 
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
-  util::UnlinkRecursive(kLogfile2_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
 
   // The following sequence using the above reference config creates
   // an unreliable message timestamp < reliable message timestamp.
@@ -3926,8 +3945,7 @@
            chrono::milliseconds(10000) + chrono::milliseconds(5)});
 
   const std::string kLogfile =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
-  util::UnlinkRecursive(kLogfile);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
 
   {
     LoggerState pi2_logger = MakeLogger(pi2_);
@@ -3969,7 +3987,7 @@
       {chrono::milliseconds(10000), chrono::milliseconds(10000)});
 
   const std::string kLogfile =
-      aos::testing::TestTmpDir() + "/multi_logfile2.1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2.1/";
   util::UnlinkRecursive(kLogfile);
 
   pi2_->Disconnect(pi1_->node());
@@ -4036,14 +4054,11 @@
       event_loop_factory.GetNodeEventLoopFactory("pi3");
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
   const std::string kLogfile2_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile2/";
+      aos::testing::TestTmpDir() + "/logs/multi_logfile2/";
   const std::string kLogfile3_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile3/";
-  util::UnlinkRecursive(kLogfile1_1);
-  util::UnlinkRecursive(kLogfile2_1);
-  util::UnlinkRecursive(kLogfile3_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile3/";
 
   {
     // Make pi1 boot before everything else.
@@ -4159,6 +4174,9 @@
 // Tests that when we have evidence of 2 boots, and then start logging, the
 // max_out_of_order_duration ends up reasonable on the boot with the start time.
 TEST(MultinodeLoggerLoopTest, PreviousBootData) {
+  util::UnlinkRecursive(aos::testing::TestTmpDir() + "/logs");
+  std::filesystem::create_directory(aos::testing::TestTmpDir() + "/logs");
+
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
       aos::configuration::ReadConfig(ArtifactPath(
           "aos/events/logging/multinode_pingpong_reboot_ooo_config.json"));
@@ -4172,8 +4190,7 @@
   const UUID pi2_boot1 = UUID::Random();
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
-  util::UnlinkRecursive(kLogfile1_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
 
   {
     constexpr size_t kPi1Index = 0;
@@ -4272,6 +4289,9 @@
 // Tests that when we start without a connection, and then start logging, the
 // max_out_of_order_duration ends up reasonable.
 TEST(MultinodeLoggerLoopTest, StartDisconnected) {
+  util::UnlinkRecursive(aos::testing::TestTmpDir() + "/logs");
+  std::filesystem::create_directory(aos::testing::TestTmpDir() + "/logs");
+
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
       aos::configuration::ReadConfig(ArtifactPath(
           "aos/events/logging/multinode_pingpong_reboot_ooo_config.json"));
@@ -4283,8 +4303,7 @@
   time_converter.StartEqual();
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
-  util::UnlinkRecursive(kLogfile1_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
 
   NodeEventLoopFactory *const pi1 =
       event_loop_factory.GetNodeEventLoopFactory("pi1");
@@ -4395,6 +4414,9 @@
 
 // Tests that we log correctly as nodes connect slowly.
 TEST(MultinodeLoggerLoopTest, StaggeredConnect) {
+  util::UnlinkRecursive(aos::testing::TestTmpDir() + "/logs");
+  std::filesystem::create_directory(aos::testing::TestTmpDir() + "/logs");
+
   aos::FlatbufferDetachedBuffer<aos::Configuration> config =
       aos::configuration::ReadConfig(ArtifactPath(
           "aos/events/logging/multinode_pingpong_pi3_pingpong_config.json"));
@@ -4406,8 +4428,7 @@
   time_converter.StartEqual();
 
   const std::string kLogfile1_1 =
-      aos::testing::TestTmpDir() + "/multi_logfile1/";
-  util::UnlinkRecursive(kLogfile1_1);
+      aos::testing::TestTmpDir() + "/logs/multi_logfile1/";
 
   NodeEventLoopFactory *const pi1 =
       event_loop_factory.GetNodeEventLoopFactory("pi1");