Refactor logger_test a bit
There was an obnoxious amount of duplicated code floating around.
Change-Id: Ib5508eb8138553321a35702d5b64731e8b3b26b1
diff --git a/aos/events/logging/logger_test.cc b/aos/events/logging/logger_test.cc
index b894bf7..7843647 100644
--- a/aos/events/logging/logger_test.cc
+++ b/aos/events/logging/logger_test.cc
@@ -212,8 +212,42 @@
event_loop_factory_(&config_.message()),
pi1_(
configuration::GetNode(event_loop_factory_.configuration(), "pi1")),
- pi2_(configuration::GetNode(event_loop_factory_.configuration(),
- "pi2")) {}
+ pi2_(
+ configuration::GetNode(event_loop_factory_.configuration(), "pi2")),
+ tmp_dir_(getenv("TEST_TMPDIR")),
+ logfile_base_(tmp_dir_ + "/multi_logfile"),
+ logfiles_({logfile_base_ + "_pi1_data.bfbs",
+ logfile_base_ + "_pi2_data/test/aos.examples.Pong.bfbs",
+ logfile_base_ + "_pi2_data.bfbs"}),
+ ping_event_loop_(event_loop_factory_.MakeEventLoop("ping", pi1_)),
+ ping_(ping_event_loop_.get()),
+ pong_event_loop_(event_loop_factory_.MakeEventLoop("pong", pi2_)),
+ pong_(pong_event_loop_.get()) {
+ // Go through and remove the logfiles if they already exist.
+ for (const auto file : logfiles_) {
+ unlink(file.c_str());
+ }
+
+ LOG(INFO) << "Logging data to " << logfiles_[0] << ", " << logfiles_[1]
+ << " and " << logfiles_[2];
+ }
+
+ struct LoggerState {
+ std::unique_ptr<EventLoop> event_loop;
+ std::unique_ptr<Logger> logger;
+ };
+
+ LoggerState MakeLogger(const Node *node) {
+ return {event_loop_factory_.MakeEventLoop("logger", node), {}};
+ }
+
+ void StartLogger(LoggerState *logger) {
+ logger->logger = std::make_unique<Logger>(
+ std::make_unique<MultiNodeLogNamer>(logfile_base_,
+ logger->event_loop->configuration(),
+ logger->event_loop->node()),
+ logger->event_loop.get(), chrono::milliseconds(100));
+ }
// Config and factory.
aos::FlatbufferDetachedBuffer<aos::Configuration> config_;
@@ -221,8 +255,18 @@
const Node *pi1_;
const Node *pi2_;
+
+ std::string tmp_dir_;
+ std::string logfile_base_;
+ std::array<std::string, 3> logfiles_;
+
+ std::unique_ptr<EventLoop> ping_event_loop_;
+ Ping ping_;
+ std::unique_ptr<EventLoop> pong_event_loop_;
+ Pong pong_;
};
+
// Counts the number of messages on a channel (returns channel, count) for every
// message matching matcher()
std::vector<std::pair<int, int>> CountChannelsMatching(
@@ -285,87 +329,52 @@
// Tests that we can write and read simple multi-node log files.
TEST_F(MultinodeLoggerTest, SimpleMultiNode) {
- const ::std::string tmpdir(getenv("TEST_TMPDIR"));
- const ::std::string logfile_base = tmpdir + "/multi_logfile";
- const ::std::string logfile1 = logfile_base + "_pi1_data.bfbs";
- const ::std::string logfile2 =
- logfile_base + "_pi2_data/test/aos.examples.Pong.bfbs";
- const ::std::string logfile3 = logfile_base + "_pi2_data.bfbs";
-
- // Remove them.
- unlink(logfile1.c_str());
- unlink(logfile2.c_str());
- unlink(logfile3.c_str());
-
- LOG(INFO) << "Logging data to " << logfile1 << ", " << logfile2 << " and "
- << logfile3;
-
{
- std::unique_ptr<EventLoop> ping_event_loop =
- event_loop_factory_.MakeEventLoop("ping", pi1_);
- Ping ping(ping_event_loop.get());
- std::unique_ptr<EventLoop> pong_event_loop =
- event_loop_factory_.MakeEventLoop("pong", pi2_);
- Pong pong(pong_event_loop.get());
-
- std::unique_ptr<EventLoop> pi1_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi1_);
- std::unique_ptr<LogNamer> pi1_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi1_logger_event_loop->configuration(),
- pi1_logger_event_loop->node());
-
- std::unique_ptr<EventLoop> pi2_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi2_);
- std::unique_ptr<LogNamer> pi2_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi2_logger_event_loop->configuration(),
- pi2_logger_event_loop->node());
+ LoggerState pi1_logger = MakeLogger(pi1_);
+ LoggerState pi2_logger = MakeLogger(pi2_);
event_loop_factory_.RunFor(chrono::milliseconds(95));
- Logger pi1_logger(std::move(pi1_log_namer), pi1_logger_event_loop.get(),
- chrono::milliseconds(100));
+ StartLogger(&pi1_logger);
+ StartLogger(&pi2_logger);
- Logger pi2_logger(std::move(pi2_log_namer), pi2_logger_event_loop.get(),
- chrono::milliseconds(100));
event_loop_factory_.RunFor(chrono::milliseconds(20000));
}
{
// Confirm that the headers are all for the correct nodes.
- FlatbufferVector<LogFileHeader> logheader1 = ReadHeader(logfile1);
+ FlatbufferVector<LogFileHeader> logheader1 = ReadHeader(logfiles_[0]);
EXPECT_EQ(logheader1.message().node()->name()->string_view(), "pi1");
- FlatbufferVector<LogFileHeader> logheader2 = ReadHeader(logfile2);
+ FlatbufferVector<LogFileHeader> logheader2 = ReadHeader(logfiles_[1]);
EXPECT_EQ(logheader2.message().node()->name()->string_view(), "pi2");
- FlatbufferVector<LogFileHeader> logheader3 = ReadHeader(logfile3);
+ FlatbufferVector<LogFileHeader> logheader3 = ReadHeader(logfiles_[2]);
EXPECT_EQ(logheader3.message().node()->name()->string_view(), "pi2");
// Timing reports, pings
- EXPECT_THAT(CountChannelsData(logfile1),
+ EXPECT_THAT(CountChannelsData(logfiles_[0]),
::testing::ElementsAre(::testing::Pair(1, 40),
::testing::Pair(4, 2001)));
// Timestamps for pong
- EXPECT_THAT(CountChannelsTimestamp(logfile1),
+ EXPECT_THAT(CountChannelsTimestamp(logfiles_[0]),
::testing::ElementsAre(::testing::Pair(5, 2001)));
// Pong data.
- EXPECT_THAT(CountChannelsData(logfile2),
+ EXPECT_THAT(CountChannelsData(logfiles_[1]),
::testing::ElementsAre(::testing::Pair(5, 2001)));
// No timestamps
- EXPECT_THAT(CountChannelsTimestamp(logfile2), ::testing::ElementsAre());
+ EXPECT_THAT(CountChannelsTimestamp(logfiles_[1]), ::testing::ElementsAre());
// Timing reports and pongs.
- EXPECT_THAT(CountChannelsData(logfile3),
+ EXPECT_THAT(CountChannelsData(logfiles_[2]),
::testing::ElementsAre(::testing::Pair(3, 40),
::testing::Pair(5, 2001)));
// And ping timestamps.
- EXPECT_THAT(CountChannelsTimestamp(logfile3),
+ EXPECT_THAT(CountChannelsTimestamp(logfiles_[2]),
::testing::ElementsAre(::testing::Pair(4, 2001)));
}
- LogReader reader(
- {std::vector<std::string>{logfile1}, std::vector<std::string>{logfile3}});
+ LogReader reader({std::vector<std::string>{logfiles_[0]},
+ std::vector<std::string>{logfiles_[2]}});
SimulatedEventLoopFactory log_reader_factory(reader.logged_configuration());
log_reader_factory.set_send_delay(chrono::microseconds(0));
@@ -510,50 +519,15 @@
// Test that if we feed the replay with a mismatched node list that we die on
// the LogReader constructor.
TEST_F(MultinodeLoggerDeathTest, MultiNodeBadReplayConfig) {
- const ::std::string tmpdir(getenv("TEST_TMPDIR"));
- const ::std::string logfile_base = tmpdir + "/multi_logfile";
- const ::std::string logfile1 = logfile_base + "_pi1_data.bfbs";
- const ::std::string logfile2 =
- logfile_base + "_pi2_data/test/aos.examples.Pong.bfbs";
- const ::std::string logfile3 = logfile_base + "_pi2_data.bfbs";
-
- // Remove them.
- unlink(logfile1.c_str());
- unlink(logfile2.c_str());
- unlink(logfile3.c_str());
-
- LOG(INFO) << "Logging data to " << logfile1 << ", " << logfile2 << " and "
- << logfile3;
-
{
- std::unique_ptr<EventLoop> ping_event_loop =
- event_loop_factory_.MakeEventLoop("ping", pi1_);
- Ping ping(ping_event_loop.get());
- std::unique_ptr<EventLoop> pong_event_loop =
- event_loop_factory_.MakeEventLoop("pong", pi2_);
- Pong pong(pong_event_loop.get());
-
- std::unique_ptr<EventLoop> pi1_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi1_);
- std::unique_ptr<LogNamer> pi1_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi1_logger_event_loop->configuration(),
- pi1_logger_event_loop->node());
-
- std::unique_ptr<EventLoop> pi2_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi2_);
- std::unique_ptr<LogNamer> pi2_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi2_logger_event_loop->configuration(),
- pi2_logger_event_loop->node());
+ LoggerState pi1_logger = MakeLogger(pi1_);
+ LoggerState pi2_logger = MakeLogger(pi2_);
event_loop_factory_.RunFor(chrono::milliseconds(95));
- Logger pi1_logger(std::move(pi1_log_namer), pi1_logger_event_loop.get(),
- chrono::milliseconds(100));
+ StartLogger(&pi1_logger);
+ StartLogger(&pi2_logger);
- Logger pi2_logger(std::move(pi2_log_namer), pi2_logger_event_loop.get(),
- chrono::milliseconds(100));
event_loop_factory_.RunFor(chrono::milliseconds(20000));
}
@@ -569,8 +543,8 @@
}
)");
- EXPECT_DEATH(LogReader({std::vector<std::string>{logfile1},
- std::vector<std::string>{logfile3}},
+ EXPECT_DEATH(LogReader({std::vector<std::string>{logfiles_[0]},
+ std::vector<std::string>{logfiles_[2]}},
&extra_nodes_config.message()),
"Log file and replay config need to have matching nodes lists.");
;
@@ -579,56 +553,23 @@
// Tests that we can read log files where they don't start at the same monotonic
// time.
TEST_F(MultinodeLoggerTest, StaggeredStart) {
- const ::std::string tmpdir(getenv("TEST_TMPDIR"));
- const ::std::string logfile_base = tmpdir + "/multi_logfile";
- const ::std::string logfile1 = logfile_base + "_pi1_data.bfbs";
- const ::std::string logfile2 =
- logfile_base + "_pi2_data/test/aos.examples.Pong.bfbs";
- const ::std::string logfile3 = logfile_base + "_pi2_data.bfbs";
-
- // Remove them.
- unlink(logfile1.c_str());
- unlink(logfile2.c_str());
- unlink(logfile3.c_str());
-
- LOG(INFO) << "Logging data to " << logfile1 << " and " << logfile3;
-
{
- std::unique_ptr<EventLoop> ping_event_loop =
- event_loop_factory_.MakeEventLoop("ping", pi1_);
- Ping ping(ping_event_loop.get());
- std::unique_ptr<EventLoop> pong_event_loop =
- event_loop_factory_.MakeEventLoop("pong", pi2_);
- Pong pong(pong_event_loop.get());
-
- std::unique_ptr<EventLoop> pi1_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi1_);
- std::unique_ptr<LogNamer> pi1_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi1_logger_event_loop->configuration(),
- pi1_logger_event_loop->node());
-
- std::unique_ptr<EventLoop> pi2_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi2_);
- std::unique_ptr<LogNamer> pi2_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi2_logger_event_loop->configuration(),
- pi2_logger_event_loop->node());
+ LoggerState pi1_logger = MakeLogger(pi1_);
+ LoggerState pi2_logger = MakeLogger(pi2_);
event_loop_factory_.RunFor(chrono::milliseconds(95));
- Logger pi1_logger(std::move(pi1_log_namer), pi1_logger_event_loop.get(),
- chrono::milliseconds(100));
+ StartLogger(&pi1_logger);
event_loop_factory_.RunFor(chrono::milliseconds(200));
- Logger pi2_logger(std::move(pi2_log_namer), pi2_logger_event_loop.get(),
- chrono::milliseconds(100));
+ StartLogger(&pi2_logger);
+
event_loop_factory_.RunFor(chrono::milliseconds(20000));
}
- LogReader reader(
- {std::vector<std::string>{logfile1}, std::vector<std::string>{logfile3}});
+ LogReader reader({std::vector<std::string>{logfiles_[0]},
+ std::vector<std::string>{logfiles_[2]}});
SimulatedEventLoopFactory log_reader_factory(reader.logged_configuration());
log_reader_factory.set_send_delay(chrono::microseconds(0));
@@ -714,21 +655,9 @@
// match correctly. While we are here, also test that different ending times
// also is readable.
TEST_F(MultinodeLoggerTest, MismatchedClocks) {
- const ::std::string tmpdir(getenv("TEST_TMPDIR"));
- const ::std::string logfile_base = tmpdir + "/multi_logfile";
- const ::std::string logfile1 = logfile_base + "_pi1_data.bfbs";
- const ::std::string logfile2 =
- logfile_base + "_pi2_data/test/aos.examples.Pong.bfbs";
- const ::std::string logfile3 = logfile_base + "_pi2_data.bfbs";
-
- // Remove them.
- unlink(logfile1.c_str());
- unlink(logfile2.c_str());
- unlink(logfile3.c_str());
-
- LOG(INFO) << "Logging data to " << logfile1 << " and " << logfile3;
-
{
+ LoggerState pi2_logger = MakeLogger(pi2_);
+
NodeEventLoopFactory *pi2 =
event_loop_factory_.GetNodeEventLoopFactory(pi2_);
LOG(INFO) << "pi2 times: " << pi2->monotonic_now() << " "
@@ -743,19 +672,6 @@
<< pi2->realtime_now() << " distributed "
<< pi2->ToDistributedClock(pi2->monotonic_now());
- std::unique_ptr<EventLoop> ping_event_loop =
- event_loop_factory_.MakeEventLoop("ping", pi1_);
- Ping ping(ping_event_loop.get());
- std::unique_ptr<EventLoop> pong_event_loop =
- event_loop_factory_.MakeEventLoop("pong", pi2_);
- Pong pong(pong_event_loop.get());
-
- std::unique_ptr<EventLoop> pi2_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi2_);
- std::unique_ptr<LogNamer> pi2_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi2_logger_event_loop->configuration(),
- pi2_logger_event_loop->node());
for (int i = 0; i < 95; ++i) {
pi2_offset += chrono::nanoseconds(200);
@@ -763,22 +679,16 @@
event_loop_factory_.RunFor(chrono::milliseconds(1));
}
- Logger pi2_logger(std::move(pi2_log_namer), pi2_logger_event_loop.get(),
- chrono::milliseconds(100));
+
+ StartLogger(&pi2_logger);
event_loop_factory_.RunFor(chrono::milliseconds(200));
{
// Run pi1's logger for only part of the time.
- std::unique_ptr<EventLoop> pi1_logger_event_loop =
- event_loop_factory_.MakeEventLoop("logger", pi1_);
- std::unique_ptr<LogNamer> pi1_log_namer =
- std::make_unique<MultiNodeLogNamer>(
- logfile_base, pi1_logger_event_loop->configuration(),
- pi1_logger_event_loop->node());
+ LoggerState pi1_logger = MakeLogger(pi1_);
- Logger pi1_logger(std::move(pi1_log_namer), pi1_logger_event_loop.get(),
- chrono::milliseconds(100));
+ StartLogger(&pi1_logger);
for (int i = 0; i < 20000; ++i) {
pi2_offset += chrono::nanoseconds(200);
@@ -801,8 +711,8 @@
event_loop_factory_.RunFor(chrono::milliseconds(400));
}
- LogReader reader(
- {std::vector<std::string>{logfile1}, std::vector<std::string>{logfile3}});
+ LogReader reader({std::vector<std::string>{logfiles_[0]},
+ std::vector<std::string>{logfiles_[2]}});
SimulatedEventLoopFactory log_reader_factory(reader.logged_configuration());
log_reader_factory.set_send_delay(chrono::microseconds(0));