Move log reader and writer over to split timestamp channels
Reuse TimestampChannel (and split it up further) to implement naming and
finding channels for log reader and writer. Test both the old and new
timestamp configuration.
Once the config changes go in for y2020, this should fix reading the log
file James broke.
Change-Id: I6b09eec69c064ded3b3c149e0fdf23162bd352cf
diff --git a/aos/events/logging/logger_test.cc b/aos/events/logging/logger_test.cc
index bd41663..cf8a373 100644
--- a/aos/events/logging/logger_test.cc
+++ b/aos/events/logging/logger_test.cc
@@ -30,8 +30,6 @@
constexpr std::string_view kSingleConfigSha1(
"bc8c9c2e31589eae6f0e36d766f6a437643e861d9568b7483106841cf7504dea");
-constexpr std::string_view kConfigSha1(
- "47511a1906dbb59cf9f8ad98ad08e568c718a4deb204c8bbce81ff76cef9095c");
std::vector<std::vector<std::string>> ToLogReaderVector(
const std::vector<LogFile> &log_files) {
@@ -412,38 +410,23 @@
}
}
-std::vector<std::string> MakeLogFiles(std::string logfile_base1,
- std::string logfile_base2) {
- return std::vector<std::string>(
- {logfile_base1 + "_pi1_data.part0.bfbs",
- logfile_base1 + "_pi2_data/test/aos.examples.Pong.part0.bfbs",
- logfile_base1 + "_pi2_data/test/aos.examples.Pong.part1.bfbs",
- logfile_base2 + "_pi2_data.part0.bfbs",
- logfile_base1 + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part0.bfbs",
- logfile_base1 + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part1.bfbs",
- logfile_base2 + "_timestamps/pi2/aos/remote_timestamps/pi1/"
- "aos.message_bridge.RemoteMessage.part0.bfbs",
- logfile_base2 + "_timestamps/pi2/aos/remote_timestamps/pi1/"
- "aos.message_bridge.RemoteMessage.part1.bfbs",
- logfile_base2 +
- "_pi1_data/pi1/aos/aos.message_bridge.Timestamp.part0.bfbs",
- logfile_base2 +
- "_pi1_data/pi1/aos/aos.message_bridge.Timestamp.part1.bfbs",
- logfile_base1 +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs",
- logfile_base1 +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part1.bfbs",
- absl::StrCat(logfile_base1, "_", kConfigSha1, ".bfbs"),
- absl::StrCat(logfile_base2, "_", kConfigSha1, ".bfbs")});
-}
+// Parameters to run all the tests with.
+struct Param {
+ // The config file to use.
+ std::string config;
+ // If true, the RemoteMessage channel should be shared between all the remote
+ // channels. If false, there will be 1 RemoteMessage channel per remote
+ // channel.
+ bool shared;
+ // sha256 of the config.
+ std::string sha256;
+};
-class MultinodeLoggerTest : public ::testing::Test {
+class MultinodeLoggerTest : public ::testing::TestWithParam<struct Param> {
public:
MultinodeLoggerTest()
: config_(aos::configuration::ReadConfig(
- "aos/events/logging/multinode_pingpong_config.json")),
+ absl::StrCat("aos/events/logging/", GetParam().config))),
time_converter_(configuration::NodesCount(&config_.message())),
event_loop_factory_(&config_.message()),
pi1_(
@@ -457,45 +440,15 @@
tmp_dir_(aos::testing::TestTmpDir()),
logfile_base1_(tmp_dir_ + "/multi_logfile1"),
logfile_base2_(tmp_dir_ + "/multi_logfile2"),
- pi1_reboot_logfiles_(
- {logfile_base1_ + "_pi1_data.part0.bfbs",
- logfile_base1_ + "_pi2_data/test/aos.examples.Pong.part0.bfbs",
- logfile_base1_ + "_pi2_data/test/aos.examples.Pong.part1.bfbs",
- logfile_base1_ + "_pi2_data/test/aos.examples.Pong.part2.bfbs",
- logfile_base1_ + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part0.bfbs",
- logfile_base1_ + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part1.bfbs",
- logfile_base1_ + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part2.bfbs",
- logfile_base1_ +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs",
- logfile_base1_ +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part1.bfbs",
- logfile_base1_ +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part2.bfbs",
- absl::StrCat(logfile_base1_, "_", kConfigSha1, ".bfbs")}),
+ pi1_reboot_logfiles_(MakePi1RebootLogfiles()),
logfiles_(MakeLogFiles(logfile_base1_, logfile_base2_)),
- pi1_single_direction_logfiles_(
- {logfile_base1_ + "_pi1_data.part0.bfbs",
- logfile_base1_ + "_pi2_data/test/aos.examples.Pong.part0.bfbs",
- logfile_base1_ + "_timestamps/pi1/aos/remote_timestamps/pi2/"
- "aos.message_bridge.RemoteMessage.part0.bfbs",
- logfile_base1_ +
- "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs",
- absl::StrCat(logfile_base1_, "_", kConfigSha1, ".bfbs")}),
- structured_logfiles_{
- std::vector<std::string>{logfiles_[0]},
- std::vector<std::string>{logfiles_[1], logfiles_[2]},
- std::vector<std::string>{logfiles_[3]},
- std::vector<std::string>{logfiles_[4], logfiles_[5]},
- std::vector<std::string>{logfiles_[6], logfiles_[7]},
- std::vector<std::string>{logfiles_[8], logfiles_[9]},
- std::vector<std::string>{logfiles_[10], logfiles_[11]}},
+ pi1_single_direction_logfiles_(MakePi1SingleDirectionLogfiles()),
+ structured_logfiles_(StructureLogFiles()),
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()) {
+ LOG(INFO) << "Config " << GetParam().config;
event_loop_factory_.SetTimeConverter(&time_converter_);
// Go through and remove the logfiles if they already exist.
@@ -517,6 +470,182 @@
<< " and " << logfiles_[2];
}
+ bool shared() const { return GetParam().shared; }
+
+ std::vector<std::string> MakeLogFiles(std::string logfile_base1,
+ std::string logfile_base2) {
+ std::vector<std::string> result;
+ result.emplace_back(
+ absl::StrCat(logfile_base1, "_", GetParam().sha256, ".bfbs"));
+ result.emplace_back(
+ absl::StrCat(logfile_base2, "_", GetParam().sha256, ".bfbs"));
+ result.emplace_back(logfile_base1 + "_pi1_data.part0.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_pi2_data/test/aos.examples.Pong.part0.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_pi2_data/test/aos.examples.Pong.part1.bfbs");
+ result.emplace_back(logfile_base2 + "_pi2_data.part0.bfbs");
+ result.emplace_back(
+ logfile_base2 +
+ "_pi1_data/pi1/aos/aos.message_bridge.Timestamp.part0.bfbs");
+ result.emplace_back(
+ logfile_base2 +
+ "_pi1_data/pi1/aos/aos.message_bridge.Timestamp.part1.bfbs");
+ result.emplace_back(
+ logfile_base1 +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs");
+ result.emplace_back(
+ logfile_base1 +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part1.bfbs");
+ if (shared()) {
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base2 +
+ "_timestamps/pi2/aos/remote_timestamps/pi1/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base2 +
+ "_timestamps/pi2/aos/remote_timestamps/pi1/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ } else {
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base2 +
+ "_timestamps/pi2/aos/remote_timestamps/pi1/pi2/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base2 +
+ "_timestamps/pi2/aos/remote_timestamps/pi1/pi2/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1 +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ }
+
+ return result;
+ }
+
+ std::vector<std::string> MakePi1RebootLogfiles() {
+ std::vector<std::string> result;
+ result.emplace_back(logfile_base1_ + "_pi1_data.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_pi2_data/test/aos.examples.Pong.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_pi2_data/test/aos.examples.Pong.part1.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_pi2_data/test/aos.examples.Pong.part2.bfbs");
+ result.emplace_back(
+ logfile_base1_ +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs");
+ result.emplace_back(
+ logfile_base1_ +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part1.bfbs");
+ result.emplace_back(
+ logfile_base1_ +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part2.bfbs");
+ result.emplace_back(
+ absl::StrCat(logfile_base1_, "_", GetParam().sha256, ".bfbs"));
+ if (shared()) {
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part2.bfbs");
+ } else {
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part2.bfbs");
+
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part1.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part2.bfbs");
+ }
+ return result;
+ }
+
+ std::vector<std::string> MakePi1SingleDirectionLogfiles() {
+ std::vector<std::string> result;
+ result.emplace_back(logfile_base1_ + "_pi1_data.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_pi2_data/test/aos.examples.Pong.part0.bfbs");
+ result.emplace_back(
+ logfile_base1_ +
+ "_pi2_data/pi2/aos/aos.message_bridge.Timestamp.part0.bfbs");
+ result.emplace_back(
+ absl::StrCat(logfile_base1_, "_", GetParam().sha256, ".bfbs"));
+
+ if (shared()) {
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ } else {
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ result.emplace_back(logfile_base1_ +
+ "_timestamps/pi1/aos/remote_timestamps/pi2/test/"
+ "aos-examples-Ping/"
+ "aos.message_bridge.RemoteMessage.part0.bfbs");
+ }
+ return result;
+ }
+
+ std::vector<std::vector<std::string>> StructureLogFiles() {
+ std::vector<std::vector<std::string>> result{
+ std::vector<std::string>{logfiles_[2]},
+ std::vector<std::string>{logfiles_[3], logfiles_[4]},
+ std::vector<std::string>{logfiles_[5]},
+ std::vector<std::string>{logfiles_[6], logfiles_[7]},
+ std::vector<std::string>{logfiles_[8], logfiles_[9]},
+ std::vector<std::string>{logfiles_[10], logfiles_[11]},
+ std::vector<std::string>{logfiles_[12], logfiles_[13]}};
+
+ if (!shared()) {
+ result.emplace_back(
+ std::vector<std::string>{logfiles_[14], logfiles_[15]});
+ }
+
+ return result;
+ }
+
struct LoggerState {
std::unique_ptr<EventLoop> event_loop;
std::unique_ptr<Logger> logger;
@@ -600,10 +729,13 @@
}
}
- // We won't have RT timestamps for 5 log files. We don't log the RT start
- // time on remote nodes because we don't know it and would be guessing. And
- // the log reader can actually do a better job.
- EXPECT_EQ(missing_rt_count, 5u);
+ // We won't have RT timestamps for 5 or 6 log files. We don't log the RT
+ // start time on remote nodes because we don't know it and would be
+ // guessing. And the log reader can actually do a better job. The number
+ // depends on if we have the remote timestamps split across 2 files, or just
+ // across 1, depending on if we are using a split or combined timestamp
+ // channel config.
+ EXPECT_EQ(missing_rt_count, shared() ? 5u : 6u);
EXPECT_EQ(log_event_uuids.size(), 2u);
EXPECT_EQ(parts_uuids.size(), ToLogReaderVector(sorted_parts).size());
@@ -749,7 +881,7 @@
}
// Tests that we can write and read simple multi-node log files.
-TEST_F(MultinodeLoggerTest, SimpleMultiNode) {
+TEST_P(MultinodeLoggerTest, SimpleMultiNode) {
time_converter_.StartEqual();
{
LoggerState pi1_logger = MakeLogger(pi1_);
@@ -779,35 +911,47 @@
}
EXPECT_EQ(logfile_uuids.size(), 2u);
- EXPECT_EQ(parts_uuids.size(), 7u);
+ if (shared()) {
+ EXPECT_EQ(parts_uuids.size(), 7u);
+ } else {
+ EXPECT_EQ(parts_uuids.size(), 8u);
+ }
// And confirm everything is on the correct node.
- EXPECT_EQ(log_header[0].message().node()->name()->string_view(), "pi1");
- EXPECT_EQ(log_header[1].message().node()->name()->string_view(), "pi2");
- EXPECT_EQ(log_header[2].message().node()->name()->string_view(), "pi2");
+ EXPECT_EQ(log_header[2].message().node()->name()->string_view(), "pi1");
EXPECT_EQ(log_header[3].message().node()->name()->string_view(), "pi2");
EXPECT_EQ(log_header[4].message().node()->name()->string_view(), "pi2");
EXPECT_EQ(log_header[5].message().node()->name()->string_view(), "pi2");
EXPECT_EQ(log_header[6].message().node()->name()->string_view(), "pi1");
EXPECT_EQ(log_header[7].message().node()->name()->string_view(), "pi1");
- EXPECT_EQ(log_header[8].message().node()->name()->string_view(), "pi1");
- EXPECT_EQ(log_header[9].message().node()->name()->string_view(), "pi1");
+ EXPECT_EQ(log_header[8].message().node()->name()->string_view(), "pi2");
+ EXPECT_EQ(log_header[9].message().node()->name()->string_view(), "pi2");
EXPECT_EQ(log_header[10].message().node()->name()->string_view(), "pi2");
EXPECT_EQ(log_header[11].message().node()->name()->string_view(), "pi2");
+ EXPECT_EQ(log_header[12].message().node()->name()->string_view(), "pi1");
+ EXPECT_EQ(log_header[13].message().node()->name()->string_view(), "pi1");
+ if (!shared()) {
+ EXPECT_EQ(log_header[14].message().node()->name()->string_view(), "pi2");
+ EXPECT_EQ(log_header[15].message().node()->name()->string_view(), "pi2");
+ }
// And the parts index matches.
- EXPECT_EQ(log_header[0].message().parts_index(), 0);
- EXPECT_EQ(log_header[1].message().parts_index(), 0);
- EXPECT_EQ(log_header[2].message().parts_index(), 1);
+ EXPECT_EQ(log_header[2].message().parts_index(), 0);
EXPECT_EQ(log_header[3].message().parts_index(), 0);
- EXPECT_EQ(log_header[4].message().parts_index(), 0);
- EXPECT_EQ(log_header[5].message().parts_index(), 1);
+ EXPECT_EQ(log_header[4].message().parts_index(), 1);
+ EXPECT_EQ(log_header[5].message().parts_index(), 0);
EXPECT_EQ(log_header[6].message().parts_index(), 0);
EXPECT_EQ(log_header[7].message().parts_index(), 1);
EXPECT_EQ(log_header[8].message().parts_index(), 0);
EXPECT_EQ(log_header[9].message().parts_index(), 1);
EXPECT_EQ(log_header[10].message().parts_index(), 0);
EXPECT_EQ(log_header[11].message().parts_index(), 1);
+ EXPECT_EQ(log_header[12].message().parts_index(), 0);
+ EXPECT_EQ(log_header[13].message().parts_index(), 1);
+ if (!shared()) {
+ EXPECT_EQ(log_header[14].message().parts_index(), 0);
+ EXPECT_EQ(log_header[15].message().parts_index(), 1);
+ }
}
const std::vector<LogFile> sorted_log_files = SortParts(logfiles_);
@@ -818,7 +962,7 @@
// Timing reports, pings
EXPECT_THAT(
- CountChannelsData(config, logfiles_[0]),
+ CountChannelsData(config, logfiles_[2]),
UnorderedElementsAre(
std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 200),
std::make_tuple("/pi1/aos", "aos.message_bridge.ServerStatistics",
@@ -827,36 +971,36 @@
200),
std::make_tuple("/pi1/aos", "aos.timing.Report", 40),
std::make_tuple("/test", "aos.examples.Ping", 2001)))
- << " : " << logfiles_[0];
+ << " : " << logfiles_[2];
// Timestamps for pong
EXPECT_THAT(
- CountChannelsTimestamp(config, logfiles_[0]),
+ CountChannelsTimestamp(config, logfiles_[2]),
UnorderedElementsAre(
std::make_tuple("/test", "aos.examples.Pong", 2001),
std::make_tuple("/pi2/aos", "aos.message_bridge.Timestamp", 200)))
- << " : " << logfiles_[0];
+ << " : " << logfiles_[2];
// Pong data.
EXPECT_THAT(
- CountChannelsData(config, logfiles_[1]),
+ CountChannelsData(config, logfiles_[3]),
UnorderedElementsAre(std::make_tuple("/test", "aos.examples.Pong", 91)))
- << " : " << logfiles_[1];
- EXPECT_THAT(CountChannelsData(config, logfiles_[2]),
+ << " : " << logfiles_[3];
+ EXPECT_THAT(CountChannelsData(config, logfiles_[4]),
UnorderedElementsAre(
std::make_tuple("/test", "aos.examples.Pong", 1910)))
- << " : " << logfiles_[1];
+ << " : " << logfiles_[3];
// No timestamps
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[1]),
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[3]),
UnorderedElementsAre())
- << " : " << logfiles_[1];
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[2]),
+ << " : " << logfiles_[3];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[4]),
UnorderedElementsAre())
- << " : " << logfiles_[2];
+ << " : " << logfiles_[4];
// Timing reports and pongs.
EXPECT_THAT(
- CountChannelsData(config, logfiles_[3]),
+ CountChannelsData(config, logfiles_[5]),
UnorderedElementsAre(
std::make_tuple("/pi2/aos", "aos.message_bridge.Timestamp", 200),
std::make_tuple("/pi2/aos", "aos.message_bridge.ServerStatistics",
@@ -865,77 +1009,117 @@
200),
std::make_tuple("/pi2/aos", "aos.timing.Report", 40),
std::make_tuple("/test", "aos.examples.Pong", 2001)))
- << " : " << logfiles_[3];
- // And ping timestamps.
- EXPECT_THAT(
- CountChannelsTimestamp(config, logfiles_[3]),
- UnorderedElementsAre(
- std::make_tuple("/test", "aos.examples.Ping", 2001),
- std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 200)))
- << " : " << logfiles_[3];
-
- // Timestamps from pi2 on pi1, and the other way.
- EXPECT_THAT(CountChannelsData(config, logfiles_[4]), UnorderedElementsAre())
- << " : " << logfiles_[4];
- EXPECT_THAT(CountChannelsData(config, logfiles_[5]), UnorderedElementsAre())
<< " : " << logfiles_[5];
- EXPECT_THAT(CountChannelsData(config, logfiles_[6]), UnorderedElementsAre())
- << " : " << logfiles_[6];
- EXPECT_THAT(CountChannelsData(config, logfiles_[7]), UnorderedElementsAre())
- << " : " << logfiles_[7];
- EXPECT_THAT(
- CountChannelsTimestamp(config, logfiles_[4]),
- UnorderedElementsAre(
- std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 9),
- std::make_tuple("/test", "aos.examples.Ping", 91)))
- << " : " << logfiles_[4];
+ // And ping timestamps.
EXPECT_THAT(
CountChannelsTimestamp(config, logfiles_[5]),
UnorderedElementsAre(
- std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 191),
- std::make_tuple("/test", "aos.examples.Ping", 1910)))
+ std::make_tuple("/test", "aos.examples.Ping", 2001),
+ std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 200)))
<< " : " << logfiles_[5];
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[6]),
- UnorderedElementsAre(std::make_tuple(
- "/pi2/aos", "aos.message_bridge.Timestamp", 9)))
- << " : " << logfiles_[6];
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[7]),
- UnorderedElementsAre(std::make_tuple(
- "/pi2/aos", "aos.message_bridge.Timestamp", 191)))
- << " : " << logfiles_[7];
// And then test that the remotely logged timestamp data files only have
// timestamps in them.
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[6]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[6];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[7]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[7];
EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[8]),
UnorderedElementsAre())
<< " : " << logfiles_[8];
EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[9]),
UnorderedElementsAre())
<< " : " << logfiles_[9];
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[10]),
- UnorderedElementsAre())
- << " : " << logfiles_[10];
- EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[11]),
- UnorderedElementsAre())
- << " : " << logfiles_[11];
+
+ EXPECT_THAT(CountChannelsData(config, logfiles_[6]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi1/aos", "aos.message_bridge.Timestamp", 9)))
+ << " : " << logfiles_[6];
+ EXPECT_THAT(CountChannelsData(config, logfiles_[7]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi1/aos", "aos.message_bridge.Timestamp", 191)))
+ << " : " << logfiles_[7];
EXPECT_THAT(CountChannelsData(config, logfiles_[8]),
UnorderedElementsAre(std::make_tuple(
- "/pi1/aos", "aos.message_bridge.Timestamp", 9)))
+ "/pi2/aos", "aos.message_bridge.Timestamp", 9)))
<< " : " << logfiles_[8];
EXPECT_THAT(CountChannelsData(config, logfiles_[9]),
UnorderedElementsAre(std::make_tuple(
- "/pi1/aos", "aos.message_bridge.Timestamp", 191)))
+ "/pi2/aos", "aos.message_bridge.Timestamp", 191)))
<< " : " << logfiles_[9];
+ // Timestamps from pi2 on pi1, and the other way.
EXPECT_THAT(CountChannelsData(config, logfiles_[10]),
- UnorderedElementsAre(std::make_tuple(
- "/pi2/aos", "aos.message_bridge.Timestamp", 9)))
+ UnorderedElementsAre())
<< " : " << logfiles_[10];
EXPECT_THAT(CountChannelsData(config, logfiles_[11]),
- UnorderedElementsAre(std::make_tuple(
- "/pi2/aos", "aos.message_bridge.Timestamp", 191)))
+ UnorderedElementsAre())
<< " : " << logfiles_[11];
+ EXPECT_THAT(CountChannelsData(config, logfiles_[12]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[12];
+ EXPECT_THAT(CountChannelsData(config, logfiles_[13]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[13];
+ if (!shared()) {
+ EXPECT_THAT(CountChannelsData(config, logfiles_[14]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[14];
+ EXPECT_THAT(CountChannelsData(config, logfiles_[15]),
+ UnorderedElementsAre())
+ << " : " << logfiles_[15];
+ }
+
+ if (shared()) {
+ EXPECT_THAT(
+ CountChannelsTimestamp(config, logfiles_[10]),
+ UnorderedElementsAre(
+ std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 9),
+ std::make_tuple("/test", "aos.examples.Ping", 91)))
+ << " : " << logfiles_[10];
+ EXPECT_THAT(
+ CountChannelsTimestamp(config, logfiles_[11]),
+ UnorderedElementsAre(
+ std::make_tuple("/pi1/aos", "aos.message_bridge.Timestamp", 191),
+ std::make_tuple("/test", "aos.examples.Ping", 1910)))
+ << " : " << logfiles_[11];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[12]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi2/aos", "aos.message_bridge.Timestamp", 9)))
+ << " : " << logfiles_[12];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[13]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi2/aos", "aos.message_bridge.Timestamp", 191)))
+ << " : " << logfiles_[13];
+ } else {
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[10]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi1/aos", "aos.message_bridge.Timestamp", 9)))
+ << " : " << logfiles_[10];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[11]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi1/aos", "aos.message_bridge.Timestamp", 191)))
+ << " : " << logfiles_[11];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[12]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi2/aos", "aos.message_bridge.Timestamp", 9)))
+ << " : " << logfiles_[12];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[13]),
+ UnorderedElementsAre(std::make_tuple(
+ "/pi2/aos", "aos.message_bridge.Timestamp", 191)))
+ << " : " << logfiles_[13];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[14]),
+ UnorderedElementsAre(
+ std::make_tuple("/test", "aos.examples.Ping", 91)))
+ << " : " << logfiles_[14];
+ EXPECT_THAT(CountChannelsTimestamp(config, logfiles_[15]),
+ UnorderedElementsAre(
+ std::make_tuple("/test", "aos.examples.Ping", 1910)))
+ << " : " << logfiles_[15];
+ }
}
LogReader reader(sorted_log_files);
@@ -1092,7 +1276,7 @@
// Test that if we feed the replay with a mismatched node list that we die on
// the LogReader constructor.
-TEST_F(MultinodeLoggerDeathTest, MultiNodeBadReplayConfig) {
+TEST_P(MultinodeLoggerDeathTest, MultiNodeBadReplayConfig) {
time_converter_.StartEqual();
{
LoggerState pi1_logger = MakeLogger(pi1_);
@@ -1125,7 +1309,7 @@
// Tests that we can read log files where they don't start at the same monotonic
// time.
-TEST_F(MultinodeLoggerTest, StaggeredStart) {
+TEST_P(MultinodeLoggerTest, StaggeredStart) {
time_converter_.StartEqual();
{
LoggerState pi1_logger = MakeLogger(pi1_);
@@ -1230,7 +1414,7 @@
// Tests that we can read log files where the monotonic clocks drift and don't
// match correctly. While we are here, also test that different ending times
// also is readable.
-TEST_F(MultinodeLoggerTest, MismatchedClocks) {
+TEST_P(MultinodeLoggerTest, MismatchedClocks) {
// TODO(austin): Negate...
const chrono::nanoseconds initial_pi2_offset = chrono::seconds(1000);
@@ -1407,7 +1591,7 @@
}
// Tests that we can sort a bunch of parts into the pre-determined sorted parts.
-TEST_F(MultinodeLoggerTest, SortParts) {
+TEST_P(MultinodeLoggerTest, SortParts) {
time_converter_.StartEqual();
// Make a bunch of parts.
{
@@ -1428,7 +1612,7 @@
// 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_F(MultinodeLoggerTest, SortEmptyParts) {
+TEST_P(MultinodeLoggerTest, SortEmptyParts) {
time_converter_.StartEqual();
// Make a bunch of parts.
{
@@ -1456,7 +1640,7 @@
#ifdef LZMA
// Tests that we can sort a bunch of parts with an empty .xz file in there. The
// empty file should be ignored.
-TEST_F(MultinodeLoggerTest, SortEmptyCompressedParts) {
+TEST_P(MultinodeLoggerTest, SortEmptyCompressedParts) {
time_converter_.StartEqual();
// Make a bunch of parts.
{
@@ -1485,7 +1669,7 @@
// Tests that we can sort a bunch of parts with the end missing off a compressed
// file. We should use the part we can read.
-TEST_F(MultinodeLoggerTest, SortTruncatedCompressedParts) {
+TEST_P(MultinodeLoggerTest, SortTruncatedCompressedParts) {
time_converter_.StartEqual();
// Make a bunch of parts.
{
@@ -1505,10 +1689,10 @@
// Strip off the end of one of the files. Pick one with a lot of data.
::std::string compressed_contents =
- aos::util::ReadFileToStringOrDie(logfiles_[0]);
+ aos::util::ReadFileToStringOrDie(logfiles_[2]);
aos::util::WriteStringToFileOrDie(
- logfiles_[0],
+ logfiles_[2],
compressed_contents.substr(0, compressed_contents.size() - 100));
const std::vector<LogFile> sorted_parts = SortParts(logfiles_);
@@ -1517,7 +1701,7 @@
#endif
// Tests that if we remap a remapped channel, it shows up correctly.
-TEST_F(MultinodeLoggerTest, RemapLoggedChannel) {
+TEST_P(MultinodeLoggerTest, RemapLoggedChannel) {
time_converter_.StartEqual();
{
LoggerState pi1_logger = MakeLogger(pi1_);
@@ -1584,7 +1768,7 @@
// Tests that we properly recreate forwarded timestamps when replaying a log.
// This should be enough that we can then re-run the logger and get a valid log
// back.
-TEST_F(MultinodeLoggerTest, MessageHeader) {
+TEST_P(MultinodeLoggerTest, MessageHeader) {
time_converter_.StartEqual();
{
LoggerState pi1_logger = MakeLogger(pi1_);
@@ -1664,134 +1848,168 @@
const chrono::nanoseconds network_delay = event_loop_factory_.network_delay();
const chrono::nanoseconds send_delay = event_loop_factory_.send_delay();
- pi1_event_loop->MakeWatcher(
- "/aos/remote_timestamps/pi2",
- [&pi1_event_loop, &pi2_event_loop, pi1_timestamp_channel,
- ping_timestamp_channel, &pi1_timestamp_on_pi1_fetcher,
- &pi1_timestamp_on_pi2_fetcher, &ping_on_pi1_fetcher,
- &ping_on_pi2_fetcher, network_delay,
- send_delay](const RemoteMessage &header) {
- const aos::monotonic_clock::time_point header_monotonic_sent_time(
- chrono::nanoseconds(header.monotonic_sent_time()));
- const aos::realtime_clock::time_point header_realtime_sent_time(
- chrono::nanoseconds(header.realtime_sent_time()));
- const aos::monotonic_clock::time_point header_monotonic_remote_time(
- chrono::nanoseconds(header.monotonic_remote_time()));
- const aos::realtime_clock::time_point header_realtime_remote_time(
- chrono::nanoseconds(header.realtime_remote_time()));
+ for (std::pair<int, std::string> channel :
+ shared()
+ ? std::vector<
+ std::pair<int, std::string>>{{-1,
+ "/aos/remote_timestamps/pi2"}}
+ : std::vector<std::pair<int, std::string>>{
+ {pi1_timestamp_channel,
+ "/aos/remote_timestamps/pi2/pi1/aos/"
+ "aos-message_bridge-Timestamp"},
+ {ping_timestamp_channel,
+ "/aos/remote_timestamps/pi2/test/aos-examples-Ping"}}) {
+ pi1_event_loop->MakeWatcher(
+ channel.second,
+ [&pi1_event_loop, &pi2_event_loop, pi1_timestamp_channel,
+ ping_timestamp_channel, &pi1_timestamp_on_pi1_fetcher,
+ &pi1_timestamp_on_pi2_fetcher, &ping_on_pi1_fetcher,
+ &ping_on_pi2_fetcher, network_delay, send_delay,
+ channel_index = channel.first](const RemoteMessage &header) {
+ const aos::monotonic_clock::time_point header_monotonic_sent_time(
+ chrono::nanoseconds(header.monotonic_sent_time()));
+ const aos::realtime_clock::time_point header_realtime_sent_time(
+ chrono::nanoseconds(header.realtime_sent_time()));
+ const aos::monotonic_clock::time_point header_monotonic_remote_time(
+ chrono::nanoseconds(header.monotonic_remote_time()));
+ const aos::realtime_clock::time_point header_realtime_remote_time(
+ chrono::nanoseconds(header.realtime_remote_time()));
- const Context *pi1_context = nullptr;
- const Context *pi2_context = nullptr;
+ if (channel_index != -1) {
+ ASSERT_EQ(channel_index, header.channel_index());
+ }
- if (header.channel_index() == pi1_timestamp_channel) {
- ASSERT_TRUE(pi1_timestamp_on_pi1_fetcher.FetchNext());
- ASSERT_TRUE(pi1_timestamp_on_pi2_fetcher.FetchNext());
- pi1_context = &pi1_timestamp_on_pi1_fetcher.context();
- pi2_context = &pi1_timestamp_on_pi2_fetcher.context();
- } else if (header.channel_index() == ping_timestamp_channel) {
- ASSERT_TRUE(ping_on_pi1_fetcher.FetchNext());
- ASSERT_TRUE(ping_on_pi2_fetcher.FetchNext());
- pi1_context = &ping_on_pi1_fetcher.context();
- pi2_context = &ping_on_pi2_fetcher.context();
- } else {
- LOG(FATAL) << "Unknown channel " << FlatbufferToJson(&header) << " "
- << configuration::CleanedChannelToString(
- pi1_event_loop->configuration()->channels()->Get(
- header.channel_index()));
- }
+ const Context *pi1_context = nullptr;
+ const Context *pi2_context = nullptr;
- ASSERT_TRUE(header.has_boot_uuid());
- EXPECT_EQ(header.boot_uuid()->string_view(),
- pi2_event_loop->boot_uuid().string_view());
+ if (header.channel_index() == pi1_timestamp_channel) {
+ ASSERT_TRUE(pi1_timestamp_on_pi1_fetcher.FetchNext());
+ ASSERT_TRUE(pi1_timestamp_on_pi2_fetcher.FetchNext());
+ pi1_context = &pi1_timestamp_on_pi1_fetcher.context();
+ pi2_context = &pi1_timestamp_on_pi2_fetcher.context();
+ } else if (header.channel_index() == ping_timestamp_channel) {
+ ASSERT_TRUE(ping_on_pi1_fetcher.FetchNext());
+ ASSERT_TRUE(ping_on_pi2_fetcher.FetchNext());
+ pi1_context = &ping_on_pi1_fetcher.context();
+ pi2_context = &ping_on_pi2_fetcher.context();
+ } else {
+ LOG(FATAL) << "Unknown channel " << FlatbufferToJson(&header) << " "
+ << configuration::CleanedChannelToString(
+ pi1_event_loop->configuration()->channels()->Get(
+ header.channel_index()));
+ }
- EXPECT_EQ(pi1_context->queue_index, header.remote_queue_index());
- EXPECT_EQ(pi2_context->remote_queue_index, header.remote_queue_index());
- EXPECT_EQ(pi2_context->queue_index, header.queue_index());
+ ASSERT_TRUE(header.has_boot_uuid());
+ EXPECT_EQ(header.boot_uuid()->string_view(),
+ pi2_event_loop->boot_uuid().string_view());
- EXPECT_EQ(pi2_context->monotonic_event_time,
- header_monotonic_sent_time);
- EXPECT_EQ(pi2_context->realtime_event_time, header_realtime_sent_time);
- EXPECT_EQ(pi2_context->realtime_remote_time,
- header_realtime_remote_time);
- EXPECT_EQ(pi2_context->monotonic_remote_time,
- header_monotonic_remote_time);
+ EXPECT_EQ(pi1_context->queue_index, header.remote_queue_index());
+ EXPECT_EQ(pi2_context->remote_queue_index,
+ header.remote_queue_index());
+ EXPECT_EQ(pi2_context->queue_index, header.queue_index());
- EXPECT_EQ(pi1_context->realtime_event_time,
- header_realtime_remote_time);
- EXPECT_EQ(pi1_context->monotonic_event_time,
- header_monotonic_remote_time);
+ EXPECT_EQ(pi2_context->monotonic_event_time,
+ header_monotonic_sent_time);
+ EXPECT_EQ(pi2_context->realtime_event_time,
+ header_realtime_sent_time);
+ EXPECT_EQ(pi2_context->realtime_remote_time,
+ header_realtime_remote_time);
+ EXPECT_EQ(pi2_context->monotonic_remote_time,
+ header_monotonic_remote_time);
- // Time estimation isn't perfect, but we know the clocks were identical
- // when logged, so we know when this should have come back. Confirm we
- // got it when we expected.
- EXPECT_EQ(
- pi1_event_loop->context().monotonic_event_time,
- pi1_context->monotonic_event_time + 2 * network_delay + send_delay);
- });
- pi2_event_loop->MakeWatcher(
- "/aos/remote_timestamps/pi1",
- [&pi2_event_loop, &pi1_event_loop, pi2_timestamp_channel,
- pong_timestamp_channel, &pi2_timestamp_on_pi2_fetcher,
- &pi2_timestamp_on_pi1_fetcher, &pong_on_pi2_fetcher,
- &pong_on_pi1_fetcher, network_delay,
- send_delay](const RemoteMessage &header) {
- const aos::monotonic_clock::time_point header_monotonic_sent_time(
- chrono::nanoseconds(header.monotonic_sent_time()));
- const aos::realtime_clock::time_point header_realtime_sent_time(
- chrono::nanoseconds(header.realtime_sent_time()));
- const aos::monotonic_clock::time_point header_monotonic_remote_time(
- chrono::nanoseconds(header.monotonic_remote_time()));
- const aos::realtime_clock::time_point header_realtime_remote_time(
- chrono::nanoseconds(header.realtime_remote_time()));
+ EXPECT_EQ(pi1_context->realtime_event_time,
+ header_realtime_remote_time);
+ EXPECT_EQ(pi1_context->monotonic_event_time,
+ header_monotonic_remote_time);
- const Context *pi2_context = nullptr;
- const Context *pi1_context = nullptr;
+ // Time estimation isn't perfect, but we know the clocks were
+ // identical when logged, so we know when this should have come back.
+ // Confirm we got it when we expected.
+ EXPECT_EQ(pi1_event_loop->context().monotonic_event_time,
+ pi1_context->monotonic_event_time + 2 * network_delay +
+ send_delay);
+ });
+ }
+ for (std::pair<int, std::string> channel :
+ shared()
+ ? std::vector<
+ std::pair<int, std::string>>{{-1,
+ "/aos/remote_timestamps/pi1"}}
+ : std::vector<std::pair<int, std::string>>{
+ {pi2_timestamp_channel,
+ "/aos/remote_timestamps/pi1/pi2/aos/"
+ "aos-message_bridge-Timestamp"}}) {
+ pi2_event_loop->MakeWatcher(
+ channel.second,
+ [&pi2_event_loop, &pi1_event_loop, pi2_timestamp_channel,
+ pong_timestamp_channel, &pi2_timestamp_on_pi2_fetcher,
+ &pi2_timestamp_on_pi1_fetcher, &pong_on_pi2_fetcher,
+ &pong_on_pi1_fetcher, network_delay, send_delay,
+ channel_index = channel.first](const RemoteMessage &header) {
+ const aos::monotonic_clock::time_point header_monotonic_sent_time(
+ chrono::nanoseconds(header.monotonic_sent_time()));
+ const aos::realtime_clock::time_point header_realtime_sent_time(
+ chrono::nanoseconds(header.realtime_sent_time()));
+ const aos::monotonic_clock::time_point header_monotonic_remote_time(
+ chrono::nanoseconds(header.monotonic_remote_time()));
+ const aos::realtime_clock::time_point header_realtime_remote_time(
+ chrono::nanoseconds(header.realtime_remote_time()));
- if (header.channel_index() == pi2_timestamp_channel) {
- ASSERT_TRUE(pi2_timestamp_on_pi2_fetcher.FetchNext());
- ASSERT_TRUE(pi2_timestamp_on_pi1_fetcher.FetchNext());
- pi2_context = &pi2_timestamp_on_pi2_fetcher.context();
- pi1_context = &pi2_timestamp_on_pi1_fetcher.context();
- } else if (header.channel_index() == pong_timestamp_channel) {
- ASSERT_TRUE(pong_on_pi2_fetcher.FetchNext());
- ASSERT_TRUE(pong_on_pi1_fetcher.FetchNext());
- pi2_context = &pong_on_pi2_fetcher.context();
- pi1_context = &pong_on_pi1_fetcher.context();
- } else {
- LOG(FATAL) << "Unknown channel " << FlatbufferToJson(&header) << " "
- << configuration::CleanedChannelToString(
- pi2_event_loop->configuration()->channels()->Get(
- header.channel_index()));
- }
+ if (channel_index != -1) {
+ ASSERT_EQ(channel_index, header.channel_index());
+ }
- ASSERT_TRUE(header.has_boot_uuid());
- EXPECT_EQ(header.boot_uuid()->string_view(),
- pi1_event_loop->boot_uuid().string_view());
+ const Context *pi2_context = nullptr;
+ const Context *pi1_context = nullptr;
- EXPECT_EQ(pi2_context->queue_index, header.remote_queue_index());
- EXPECT_EQ(pi1_context->remote_queue_index, header.remote_queue_index());
- EXPECT_EQ(pi1_context->queue_index, header.queue_index());
+ if (header.channel_index() == pi2_timestamp_channel) {
+ ASSERT_TRUE(pi2_timestamp_on_pi2_fetcher.FetchNext());
+ ASSERT_TRUE(pi2_timestamp_on_pi1_fetcher.FetchNext());
+ pi2_context = &pi2_timestamp_on_pi2_fetcher.context();
+ pi1_context = &pi2_timestamp_on_pi1_fetcher.context();
+ } else if (header.channel_index() == pong_timestamp_channel) {
+ ASSERT_TRUE(pong_on_pi2_fetcher.FetchNext());
+ ASSERT_TRUE(pong_on_pi1_fetcher.FetchNext());
+ pi2_context = &pong_on_pi2_fetcher.context();
+ pi1_context = &pong_on_pi1_fetcher.context();
+ } else {
+ LOG(FATAL) << "Unknown channel " << FlatbufferToJson(&header) << " "
+ << configuration::CleanedChannelToString(
+ pi2_event_loop->configuration()->channels()->Get(
+ header.channel_index()));
+ }
- EXPECT_EQ(pi1_context->monotonic_event_time,
- header_monotonic_sent_time);
- EXPECT_EQ(pi1_context->realtime_event_time, header_realtime_sent_time);
- EXPECT_EQ(pi1_context->realtime_remote_time,
- header_realtime_remote_time);
- EXPECT_EQ(pi1_context->monotonic_remote_time,
- header_monotonic_remote_time);
+ ASSERT_TRUE(header.has_boot_uuid());
+ EXPECT_EQ(header.boot_uuid()->string_view(),
+ pi1_event_loop->boot_uuid().string_view());
- EXPECT_EQ(pi2_context->realtime_event_time,
- header_realtime_remote_time);
- EXPECT_EQ(pi2_context->monotonic_event_time,
- header_monotonic_remote_time);
+ EXPECT_EQ(pi2_context->queue_index, header.remote_queue_index());
+ EXPECT_EQ(pi1_context->remote_queue_index,
+ header.remote_queue_index());
+ EXPECT_EQ(pi1_context->queue_index, header.queue_index());
- // Time estimation isn't perfect, but we know the clocks were identical
- // when logged, so we know when this should have come back. Confirm we
- // got it when we expected.
- EXPECT_EQ(
- pi2_event_loop->context().monotonic_event_time,
- pi2_context->monotonic_event_time + 2 * network_delay + send_delay);
- });
+ EXPECT_EQ(pi1_context->monotonic_event_time,
+ header_monotonic_sent_time);
+ EXPECT_EQ(pi1_context->realtime_event_time,
+ header_realtime_sent_time);
+ EXPECT_EQ(pi1_context->realtime_remote_time,
+ header_realtime_remote_time);
+ EXPECT_EQ(pi1_context->monotonic_remote_time,
+ header_monotonic_remote_time);
+
+ EXPECT_EQ(pi2_context->realtime_event_time,
+ header_realtime_remote_time);
+ EXPECT_EQ(pi2_context->monotonic_event_time,
+ header_monotonic_remote_time);
+
+ // Time estimation isn't perfect, but we know the clocks were
+ // identical when logged, so we know when this should have come back.
+ // Confirm we got it when we expected.
+ EXPECT_EQ(pi2_event_loop->context().monotonic_event_time,
+ pi2_context->monotonic_event_time + 2 * network_delay +
+ send_delay);
+ });
+ }
// And confirm we can re-create a log again, while checking the contents.
{
@@ -1823,7 +2041,7 @@
// Tests that we properly populate and extract the logger_start time by setting
// up a clock difference between 2 nodes and looking at the resulting parts.
-TEST_F(MultinodeLoggerTest, LoggerStartTime) {
+TEST_P(MultinodeLoggerTest, LoggerStartTime) {
time_converter_.AddMonotonic(
{monotonic_clock::epoch(),
monotonic_clock::epoch() + chrono::seconds(1000)});
@@ -1865,7 +2083,7 @@
// Tests that we properly recreate forwarded timestamps when replaying a log.
// This should be enough that we can then re-run the logger and get a valid log
// back.
-TEST_F(MultinodeLoggerDeathTest, RemoteReboot) {
+TEST_P(MultinodeLoggerDeathTest, RemoteReboot) {
time_converter_.StartEqual();
std::string pi2_boot1;
std::string pi2_boot2;
@@ -1908,7 +2126,7 @@
// Tests that we properly handle one direction of message_bridge being
// unavailable.
-TEST_F(MultinodeLoggerTest, OneDirectionWithNegativeSlope) {
+TEST_P(MultinodeLoggerTest, OneDirectionWithNegativeSlope) {
event_loop_factory_.GetNodeEventLoopFactory(pi1_)->Disconnect(pi2_);
time_converter_.AddMonotonic(
{monotonic_clock::epoch(),
@@ -1934,7 +2152,7 @@
// Tests that we properly handle one direction of message_bridge being
// unavailable.
-TEST_F(MultinodeLoggerTest, OneDirectionWithPositiveSlope) {
+TEST_P(MultinodeLoggerTest, OneDirectionWithPositiveSlope) {
event_loop_factory_.GetNodeEventLoopFactory(pi1_)->Disconnect(pi2_);
time_converter_.AddMonotonic(
{monotonic_clock::epoch(),
@@ -1960,7 +2178,7 @@
// Tests that we properly handle a dead node. Do this by just disconnecting it
// and only using one nodes of logs.
-TEST_F(MultinodeLoggerTest, DeadNode) {
+TEST_P(MultinodeLoggerTest, DeadNode) {
event_loop_factory_.GetNodeEventLoopFactory(pi1_)->Disconnect(pi2_);
event_loop_factory_.GetNodeEventLoopFactory(pi2_)->Disconnect(pi1_);
time_converter_.AddMonotonic(
@@ -1981,6 +2199,26 @@
ConfirmReadable(pi1_single_direction_logfiles_);
}
+INSTANTIATE_TEST_CASE_P(
+ All, MultinodeLoggerTest,
+ ::testing::Values(
+ Param{
+ "multinode_pingpong_combined_config.json", true,
+ "47511a1906dbb59cf9f8ad98ad08e568c718a4deb204c8bbce81ff76cef9095c"},
+ Param{"multinode_pingpong_split_config.json", false,
+ "ce3ec411a089e5b80d6868bdb2ff8ce86467053b41469e50a09edf3c0110d80"
+ "f"}));
+
+INSTANTIATE_TEST_CASE_P(
+ All, MultinodeLoggerDeathTest,
+ ::testing::Values(
+ Param{
+ "multinode_pingpong_combined_config.json", true,
+ "47511a1906dbb59cf9f8ad98ad08e568c718a4deb204c8bbce81ff76cef9095c"},
+ Param{"multinode_pingpong_split_config.json", false,
+ "ce3ec411a089e5b80d6868bdb2ff8ce86467053b41469e50a09edf3c0110d80"
+ "f"}));
+
// TODO(austin): Make a log file where the remote node has no start time.
} // namespace testing