blob: c8d16e092946e85d9e688d85ca55ad209215a926 [file] [log] [blame]
Austin Schuhc243b422020-10-11 15:35:08 -07001#include "aos/events/logging/logfile_utils.h"
2
Austin Schuhe243aaf2020-10-11 15:46:02 -07003#include <chrono>
Austin Schuhfa30c352022-10-16 11:12:02 -07004#include <random>
Austin Schuhe243aaf2020-10-11 15:46:02 -07005#include <string>
Austin Schuhc243b422020-10-11 15:35:08 -07006
Austin Schuhfa30c352022-10-16 11:12:02 -07007#include "absl/strings/escaping.h"
Austin Schuhc41603c2020-10-11 16:17:37 -07008#include "aos/events/logging/logfile_sorting.h"
Austin Schuhc243b422020-10-11 15:35:08 -07009#include "aos/events/logging/test_message_generated.h"
Austin Schuh4b5c22a2020-11-30 22:58:43 -080010#include "aos/flatbuffer_merge.h"
Austin Schuhe243aaf2020-10-11 15:46:02 -070011#include "aos/flatbuffers.h"
Austin Schuhc243b422020-10-11 15:35:08 -070012#include "aos/json_to_flatbuffer.h"
Austin Schuhfa30c352022-10-16 11:12:02 -070013#include "aos/testing/path.h"
14#include "aos/testing/random_seed.h"
Austin Schuhc243b422020-10-11 15:35:08 -070015#include "aos/testing/tmpdir.h"
Austin Schuhfa30c352022-10-16 11:12:02 -070016#include "aos/util/file.h"
17#include "external/com_github_google_flatbuffers/src/annotated_binary_text_gen.h"
18#include "external/com_github_google_flatbuffers/src/binary_annotator.h"
19#include "flatbuffers/reflection_generated.h"
Brian Smarttea913d42021-12-10 15:02:38 -080020#include "gflags/gflags.h"
Austin Schuhe243aaf2020-10-11 15:46:02 -070021#include "gtest/gtest.h"
Austin Schuhc243b422020-10-11 15:35:08 -070022
23namespace aos {
24namespace logger {
25namespace testing {
Austin Schuhe243aaf2020-10-11 15:46:02 -070026namespace chrono = std::chrono;
Austin Schuhfa30c352022-10-16 11:12:02 -070027using aos::testing::ArtifactPath;
Austin Schuhf2d0e682022-10-16 14:20:58 -070028using aos::message_bridge::RemoteMessage;
Austin Schuhc243b422020-10-11 15:35:08 -070029
Austin Schuhd863e6e2022-10-16 15:44:50 -070030// Adapter class to make it easy to test DetachedBufferWriter without adding
31// test only boilerplate to DetachedBufferWriter.
32class TestDetachedBufferWriter : public DetachedBufferWriter {
33 public:
34 TestDetachedBufferWriter(std::string_view filename)
35 : DetachedBufferWriter(filename, std::make_unique<DummyEncoder>()) {}
36 void WriteSizedFlatbuffer(flatbuffers::DetachedBuffer &&buffer) {
37 QueueSpan(absl::Span<const uint8_t>(buffer.data(), buffer.size()));
38 }
39};
40
Austin Schuhe243aaf2020-10-11 15:46:02 -070041// Creates a size prefixed flatbuffer from json.
Austin Schuhc243b422020-10-11 15:35:08 -070042template <typename T>
43SizePrefixedFlatbufferDetachedBuffer<T> JsonToSizedFlatbuffer(
44 const std::string_view data) {
45 flatbuffers::FlatBufferBuilder fbb;
46 fbb.ForceDefaults(true);
47 fbb.FinishSizePrefixed(JsonToFlatbuffer<T>(data, &fbb));
48 return fbb.Release();
49}
50
Austin Schuhe243aaf2020-10-11 15:46:02 -070051// Tests that we can write and read 2 flatbuffers to file.
Austin Schuhc243b422020-10-11 15:35:08 -070052TEST(SpanReaderTest, ReadWrite) {
53 const std::string logfile = aos::testing::TestTmpDir() + "/log.bfbs";
54 unlink(logfile.c_str());
55
56 const aos::SizePrefixedFlatbufferDetachedBuffer<TestMessage> m1 =
Austin Schuh4b5c22a2020-11-30 22:58:43 -080057 JsonToSizedFlatbuffer<TestMessage>(R"({ "value": 1 })");
Austin Schuhc243b422020-10-11 15:35:08 -070058 const aos::SizePrefixedFlatbufferDetachedBuffer<TestMessage> m2 =
Austin Schuh4b5c22a2020-11-30 22:58:43 -080059 JsonToSizedFlatbuffer<TestMessage>(R"({ "value": 2 })");
Austin Schuhc243b422020-10-11 15:35:08 -070060
61 {
Austin Schuhd863e6e2022-10-16 15:44:50 -070062 TestDetachedBufferWriter writer(logfile);
Austin Schuhadd6eb32020-11-09 21:24:26 -080063 writer.QueueSpan(m1.span());
64 writer.QueueSpan(m2.span());
Austin Schuhc243b422020-10-11 15:35:08 -070065 }
66
67 SpanReader reader(logfile);
68
69 EXPECT_EQ(reader.filename(), logfile);
Austin Schuhcf5f6442021-07-06 10:43:28 -070070 EXPECT_EQ(reader.PeekMessage(), m1.span());
71 EXPECT_EQ(reader.PeekMessage(), m1.span());
Austin Schuhadd6eb32020-11-09 21:24:26 -080072 EXPECT_EQ(reader.ReadMessage(), m1.span());
73 EXPECT_EQ(reader.ReadMessage(), m2.span());
Austin Schuhcf5f6442021-07-06 10:43:28 -070074 EXPECT_EQ(reader.PeekMessage(), absl::Span<const uint8_t>());
Austin Schuhc243b422020-10-11 15:35:08 -070075 EXPECT_EQ(reader.ReadMessage(), absl::Span<const uint8_t>());
76}
77
Austin Schuhe243aaf2020-10-11 15:46:02 -070078// Tests that we can actually parse the resulting messages at a basic level
79// through MessageReader.
80TEST(MessageReaderTest, ReadWrite) {
81 const std::string logfile = aos::testing::TestTmpDir() + "/log.bfbs";
82 unlink(logfile.c_str());
83
84 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config =
85 JsonToSizedFlatbuffer<LogFileHeader>(
86 R"({ "max_out_of_order_duration": 100000000 })");
87 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m1 =
88 JsonToSizedFlatbuffer<MessageHeader>(
89 R"({ "channel_index": 0, "monotonic_sent_time": 1 })");
90 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m2 =
91 JsonToSizedFlatbuffer<MessageHeader>(
92 R"({ "channel_index": 0, "monotonic_sent_time": 2 })");
93
94 {
Austin Schuhd863e6e2022-10-16 15:44:50 -070095 TestDetachedBufferWriter writer(logfile);
Austin Schuhadd6eb32020-11-09 21:24:26 -080096 writer.QueueSpan(config.span());
97 writer.QueueSpan(m1.span());
98 writer.QueueSpan(m2.span());
Austin Schuhe243aaf2020-10-11 15:46:02 -070099 }
100
101 MessageReader reader(logfile);
102
103 EXPECT_EQ(reader.filename(), logfile);
104
105 EXPECT_EQ(
106 reader.max_out_of_order_duration(),
107 std::chrono::nanoseconds(config.message().max_out_of_order_duration()));
108 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
109 EXPECT_TRUE(reader.ReadMessage());
110 EXPECT_EQ(reader.newest_timestamp(),
111 monotonic_clock::time_point(chrono::nanoseconds(1)));
112 EXPECT_TRUE(reader.ReadMessage());
113 EXPECT_EQ(reader.newest_timestamp(),
114 monotonic_clock::time_point(chrono::nanoseconds(2)));
115 EXPECT_FALSE(reader.ReadMessage());
116}
117
Austin Schuh32f68492020-11-08 21:45:51 -0800118// Tests that we explode when messages are too far out of order.
119TEST(PartsMessageReaderDeathTest, TooFarOutOfOrder) {
120 const std::string logfile0 = aos::testing::TestTmpDir() + "/log0.bfbs";
121 unlink(logfile0.c_str());
122
123 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config0 =
124 JsonToSizedFlatbuffer<LogFileHeader>(
125 R"({
126 "max_out_of_order_duration": 100000000,
Austin Schuh0ca51f32020-12-25 21:51:45 -0800127 "configuration": {},
Austin Schuh32f68492020-11-08 21:45:51 -0800128 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
129 "parts_uuid": "2a05d725-5d5c-4c0b-af42-88de2f3c3876",
130 "parts_index": 0
131})");
132
133 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m1 =
134 JsonToSizedFlatbuffer<MessageHeader>(
135 R"({ "channel_index": 0, "monotonic_sent_time": 100000000 })");
136 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m2 =
137 JsonToSizedFlatbuffer<MessageHeader>(
138 R"({ "channel_index": 0, "monotonic_sent_time": 0 })");
139 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m3 =
140 JsonToSizedFlatbuffer<MessageHeader>(
141 R"({ "channel_index": 0, "monotonic_sent_time": -1 })");
142
143 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700144 TestDetachedBufferWriter writer(logfile0);
Austin Schuhadd6eb32020-11-09 21:24:26 -0800145 writer.QueueSpan(config0.span());
146 writer.QueueSpan(m1.span());
147 writer.QueueSpan(m2.span());
148 writer.QueueSpan(m3.span());
Austin Schuh32f68492020-11-08 21:45:51 -0800149 }
150
151 const std::vector<LogFile> parts = SortParts({logfile0});
152
153 PartsMessageReader reader(parts[0].parts[0]);
154
155 EXPECT_TRUE(reader.ReadMessage());
156 EXPECT_TRUE(reader.ReadMessage());
157 EXPECT_DEATH({ reader.ReadMessage(); }, "-0.000000001sec vs. 0.000000000sec");
158}
159
Austin Schuhc41603c2020-10-11 16:17:37 -0700160// Tests that we can transparently re-assemble part files with a
161// PartsMessageReader.
162TEST(PartsMessageReaderTest, ReadWrite) {
163 const std::string logfile0 = aos::testing::TestTmpDir() + "/log0.bfbs";
164 const std::string logfile1 = aos::testing::TestTmpDir() + "/log1.bfbs";
165 unlink(logfile0.c_str());
166 unlink(logfile1.c_str());
167
168 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config0 =
169 JsonToSizedFlatbuffer<LogFileHeader>(
170 R"({
171 "max_out_of_order_duration": 100000000,
Austin Schuh0ca51f32020-12-25 21:51:45 -0800172 "configuration": {},
Austin Schuhc41603c2020-10-11 16:17:37 -0700173 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
174 "parts_uuid": "2a05d725-5d5c-4c0b-af42-88de2f3c3876",
175 "parts_index": 0
176})");
177 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config1 =
178 JsonToSizedFlatbuffer<LogFileHeader>(
179 R"({
180 "max_out_of_order_duration": 200000000,
181 "monotonic_start_time": 0,
182 "realtime_start_time": 0,
Austin Schuh0ca51f32020-12-25 21:51:45 -0800183 "configuration": {},
Austin Schuhc41603c2020-10-11 16:17:37 -0700184 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
185 "parts_uuid": "2a05d725-5d5c-4c0b-af42-88de2f3c3876",
186 "parts_index": 1
187})");
188
189 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m1 =
190 JsonToSizedFlatbuffer<MessageHeader>(
191 R"({ "channel_index": 0, "monotonic_sent_time": 1 })");
192 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m2 =
193 JsonToSizedFlatbuffer<MessageHeader>(
194 R"({ "channel_index": 0, "monotonic_sent_time": 2 })");
195
196 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700197 TestDetachedBufferWriter writer(logfile0);
Austin Schuhadd6eb32020-11-09 21:24:26 -0800198 writer.QueueSpan(config0.span());
199 writer.QueueSpan(m1.span());
Austin Schuhc41603c2020-10-11 16:17:37 -0700200 }
201 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700202 TestDetachedBufferWriter writer(logfile1);
Austin Schuhadd6eb32020-11-09 21:24:26 -0800203 writer.QueueSpan(config1.span());
204 writer.QueueSpan(m2.span());
Austin Schuhc41603c2020-10-11 16:17:37 -0700205 }
206
207 const std::vector<LogFile> parts = SortParts({logfile0, logfile1});
208
209 PartsMessageReader reader(parts[0].parts[0]);
210
211 EXPECT_EQ(reader.filename(), logfile0);
212
213 // Confirm that the timestamps track, and the filename also updates.
214 // Read the first message.
215 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
216 EXPECT_EQ(
217 reader.max_out_of_order_duration(),
218 std::chrono::nanoseconds(config0.message().max_out_of_order_duration()));
219 EXPECT_TRUE(reader.ReadMessage());
220 EXPECT_EQ(reader.filename(), logfile0);
221 EXPECT_EQ(reader.newest_timestamp(),
222 monotonic_clock::time_point(chrono::nanoseconds(1)));
223 EXPECT_EQ(
224 reader.max_out_of_order_duration(),
225 std::chrono::nanoseconds(config0.message().max_out_of_order_duration()));
226
227 // Read the second message.
228 EXPECT_TRUE(reader.ReadMessage());
229 EXPECT_EQ(reader.filename(), logfile1);
230 EXPECT_EQ(reader.newest_timestamp(),
231 monotonic_clock::time_point(chrono::nanoseconds(2)));
232 EXPECT_EQ(
233 reader.max_out_of_order_duration(),
234 std::chrono::nanoseconds(config1.message().max_out_of_order_duration()));
235
236 // And then confirm that reading again returns no message.
237 EXPECT_FALSE(reader.ReadMessage());
238 EXPECT_EQ(reader.filename(), logfile1);
239 EXPECT_EQ(
240 reader.max_out_of_order_duration(),
241 std::chrono::nanoseconds(config1.message().max_out_of_order_duration()));
Austin Schuh32f68492020-11-08 21:45:51 -0800242 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::max_time);
Austin Schuhc41603c2020-10-11 16:17:37 -0700243}
Austin Schuh32f68492020-11-08 21:45:51 -0800244
Austin Schuh1be0ce42020-11-29 22:43:26 -0800245// Tests that Message's operator < works as expected.
246TEST(MessageTest, Sorting) {
247 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
248
249 Message m1{.channel_index = 0,
Austin Schuh58646e22021-08-23 23:51:46 -0700250 .queue_index = BootQueueIndex{.boot = 0, .index = 0u},
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700251 .timestamp =
252 BootTimestamp{.boot = 0, .time = e + chrono::milliseconds(1)},
Austin Schuh48507722021-07-17 17:29:24 -0700253 .monotonic_remote_boot = 0xffffff,
254 .monotonic_timestamp_boot = 0xffffff,
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700255 .data = nullptr};
Austin Schuh1be0ce42020-11-29 22:43:26 -0800256 Message m2{.channel_index = 0,
Austin Schuh58646e22021-08-23 23:51:46 -0700257 .queue_index = BootQueueIndex{.boot = 0, .index = 0u},
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700258 .timestamp =
259 BootTimestamp{.boot = 0, .time = e + chrono::milliseconds(2)},
Austin Schuh48507722021-07-17 17:29:24 -0700260 .monotonic_remote_boot = 0xffffff,
261 .monotonic_timestamp_boot = 0xffffff,
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700262 .data = nullptr};
Austin Schuh1be0ce42020-11-29 22:43:26 -0800263
264 EXPECT_LT(m1, m2);
265 EXPECT_GE(m2, m1);
266
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700267 m1.timestamp.time = e;
268 m2.timestamp.time = e;
Austin Schuh1be0ce42020-11-29 22:43:26 -0800269
270 m1.channel_index = 1;
271 m2.channel_index = 2;
272
273 EXPECT_LT(m1, m2);
274 EXPECT_GE(m2, m1);
275
276 m1.channel_index = 0;
277 m2.channel_index = 0;
Austin Schuh58646e22021-08-23 23:51:46 -0700278 m1.queue_index.index = 0u;
279 m2.queue_index.index = 1u;
Austin Schuh1be0ce42020-11-29 22:43:26 -0800280
281 EXPECT_LT(m1, m2);
282 EXPECT_GE(m2, m1);
283}
284
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800285aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> MakeHeader(
286 const aos::FlatbufferDetachedBuffer<Configuration> &config,
287 const std::string_view json) {
288 flatbuffers::FlatBufferBuilder fbb;
Austin Schuh1034a832021-03-31 21:53:26 -0700289 fbb.ForceDefaults(true);
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800290 flatbuffers::Offset<Configuration> config_offset =
291 aos::CopyFlatBuffer(config, &fbb);
292 LogFileHeader::Builder header_builder(fbb);
293 header_builder.add_configuration(config_offset);
294 fbb.Finish(header_builder.Finish());
295 aos::FlatbufferDetachedBuffer<LogFileHeader> config_header(fbb.Release());
296
297 aos::FlatbufferDetachedBuffer<LogFileHeader> header_updates(
298 JsonToFlatbuffer<LogFileHeader>(json));
299 CHECK(header_updates.Verify());
300 flatbuffers::FlatBufferBuilder fbb2;
Austin Schuh1034a832021-03-31 21:53:26 -0700301 fbb2.ForceDefaults(true);
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800302 fbb2.FinishSizePrefixed(
303 aos::MergeFlatBuffers(config_header, header_updates, &fbb2));
304 return fbb2.Release();
305}
306
307class SortingElementTest : public ::testing::Test {
308 public:
309 SortingElementTest()
310 : config_(JsonToFlatbuffer<Configuration>(
311 R"({
312 "channels": [
313 {
314 "name": "/a",
315 "type": "aos.logger.testing.TestMessage",
316 "source_node": "pi1",
317 "destination_nodes": [
318 {
319 "name": "pi2"
320 },
321 {
322 "name": "pi3"
323 }
324 ]
325 },
326 {
327 "name": "/b",
328 "type": "aos.logger.testing.TestMessage",
329 "source_node": "pi1"
330 },
331 {
332 "name": "/c",
333 "type": "aos.logger.testing.TestMessage",
334 "source_node": "pi1"
Austin Schuh48507722021-07-17 17:29:24 -0700335 },
336 {
337 "name": "/d",
338 "type": "aos.logger.testing.TestMessage",
339 "source_node": "pi2",
340 "destination_nodes": [
341 {
342 "name": "pi1"
343 }
344 ]
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800345 }
346 ],
347 "nodes": [
348 {
349 "name": "pi1"
350 },
351 {
352 "name": "pi2"
353 },
354 {
355 "name": "pi3"
356 }
357 ]
358}
359)")),
360 config0_(MakeHeader(config_, R"({
361 /* 100ms */
362 "max_out_of_order_duration": 100000000,
363 "node": {
364 "name": "pi1"
365 },
366 "logger_node": {
367 "name": "pi1"
368 },
Austin Schuhd2f96102020-12-01 20:27:29 -0800369 "monotonic_start_time": 1000000,
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800370 "realtime_start_time": 1000000000000,
371 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
Austin Schuh48507722021-07-17 17:29:24 -0700372 "source_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
373 "logger_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
374 "boot_uuids": [
375 "1d782c63-b3c7-466e-bea9-a01308b43333",
376 "",
377 ""
378 ],
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800379 "parts_uuid": "2a05d725-5d5c-4c0b-af42-88de2f3c3876",
380 "parts_index": 0
381})")),
382 config1_(MakeHeader(config_,
383 R"({
384 /* 100ms */
385 "max_out_of_order_duration": 100000000,
386 "node": {
387 "name": "pi1"
388 },
389 "logger_node": {
390 "name": "pi1"
391 },
Austin Schuhd2f96102020-12-01 20:27:29 -0800392 "monotonic_start_time": 1000000,
393 "realtime_start_time": 1000000000000,
394 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
Austin Schuh48507722021-07-17 17:29:24 -0700395 "source_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
396 "logger_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
397 "boot_uuids": [
398 "1d782c63-b3c7-466e-bea9-a01308b43333",
399 "",
400 ""
401 ],
Austin Schuhd2f96102020-12-01 20:27:29 -0800402 "parts_uuid": "bafe9f8e-7dea-4bd9-95f5-3d8390e49208",
403 "parts_index": 0
404})")),
405 config2_(MakeHeader(config_,
406 R"({
407 /* 100ms */
408 "max_out_of_order_duration": 100000000,
409 "node": {
410 "name": "pi2"
411 },
412 "logger_node": {
413 "name": "pi2"
414 },
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800415 "monotonic_start_time": 0,
416 "realtime_start_time": 1000000000000,
Austin Schuh48507722021-07-17 17:29:24 -0700417 "source_node_boot_uuid": "6f4269ec-547f-4a1a-8281-37aca7fe5dc2",
418 "logger_node_boot_uuid": "6f4269ec-547f-4a1a-8281-37aca7fe5dc2",
419 "boot_uuids": [
420 "",
421 "6f4269ec-547f-4a1a-8281-37aca7fe5dc2",
422 ""
423 ],
Austin Schuhd2f96102020-12-01 20:27:29 -0800424 "log_event_uuid": "cb89a1ce-c4b6-4747-a647-051f09ac888c",
425 "parts_uuid": "e6bff6c6-757f-4675-90d8-3bfb642870e6",
426 "parts_index": 0
427})")),
428 config3_(MakeHeader(config_,
429 R"({
430 /* 100ms */
431 "max_out_of_order_duration": 100000000,
432 "node": {
433 "name": "pi1"
434 },
435 "logger_node": {
436 "name": "pi1"
437 },
438 "monotonic_start_time": 2000000,
439 "realtime_start_time": 1000000000,
440 "log_event_uuid": "cb26b86a-473e-4f74-8403-50eb92ed60ad",
Austin Schuh48507722021-07-17 17:29:24 -0700441 "source_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
442 "logger_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
443 "boot_uuids": [
444 "1d782c63-b3c7-466e-bea9-a01308b43333",
445 "",
446 ""
447 ],
Austin Schuhd2f96102020-12-01 20:27:29 -0800448 "parts_uuid": "1f098701-949f-4392-81f9-be463e2d7bd4",
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800449 "parts_index": 0
Austin Schuh8bf1e632021-01-02 22:41:04 -0800450})")),
451 config4_(MakeHeader(config_,
452 R"({
453 /* 100ms */
454 "max_out_of_order_duration": 100000000,
455 "node": {
456 "name": "pi2"
457 },
458 "logger_node": {
459 "name": "pi1"
460 },
461 "monotonic_start_time": 2000000,
462 "realtime_start_time": 1000000000,
463 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
464 "parts_uuid": "4e560a47-e2a6-4ce3-a925-490bebc947c5",
Austin Schuh48507722021-07-17 17:29:24 -0700465 "source_node_boot_uuid": "6f4269ec-547f-4a1a-8281-37aca7fe5dc2",
466 "logger_node_boot_uuid": "1d782c63-b3c7-466e-bea9-a01308b43333",
467 "boot_uuids": [
468 "1d782c63-b3c7-466e-bea9-a01308b43333",
469 "6f4269ec-547f-4a1a-8281-37aca7fe5dc2",
470 ""
471 ],
Austin Schuh8bf1e632021-01-02 22:41:04 -0800472 "parts_index": 0
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800473})")) {
474 unlink(logfile0_.c_str());
475 unlink(logfile1_.c_str());
Austin Schuhd2f96102020-12-01 20:27:29 -0800476 unlink(logfile2_.c_str());
Austin Schuh48507722021-07-17 17:29:24 -0700477 unlink(logfile3_.c_str());
Austin Schuh921b2562021-07-31 19:37:03 -0700478 queue_index_.resize(config_.message().channels()->size());
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800479 }
480
481 protected:
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800482 flatbuffers::DetachedBuffer MakeLogMessage(
483 const aos::monotonic_clock::time_point monotonic_now, int channel_index,
484 int value) {
485 flatbuffers::FlatBufferBuilder message_fbb;
486 message_fbb.ForceDefaults(true);
487 TestMessage::Builder test_message_builder(message_fbb);
488 test_message_builder.add_value(value);
489 message_fbb.Finish(test_message_builder.Finish());
490
491 aos::Context context;
492 context.monotonic_event_time = monotonic_now;
493 context.realtime_event_time = aos::realtime_clock::epoch() +
494 chrono::seconds(1000) +
495 monotonic_now.time_since_epoch();
Austin Schuh921b2562021-07-31 19:37:03 -0700496 CHECK_LT(static_cast<size_t>(channel_index), queue_index_.size());
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800497 context.queue_index = queue_index_[channel_index];
498 context.size = message_fbb.GetSize();
499 context.data = message_fbb.GetBufferPointer();
500
501 ++queue_index_[channel_index];
502
503 flatbuffers::FlatBufferBuilder fbb;
Austin Schuh53e3a812021-11-03 16:57:23 -0700504 fbb.ForceDefaults(true);
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800505 fbb.FinishSizePrefixed(
506 PackMessage(&fbb, context, channel_index, LogType::kLogMessage));
507
508 return fbb.Release();
509 }
510
511 flatbuffers::DetachedBuffer MakeTimestampMessage(
512 const aos::monotonic_clock::time_point sender_monotonic_now,
Austin Schuh8bf1e632021-01-02 22:41:04 -0800513 int channel_index, chrono::nanoseconds receiver_monotonic_offset,
514 monotonic_clock::time_point monotonic_timestamp_time =
515 monotonic_clock::min_time) {
516 const monotonic_clock::time_point monotonic_sent_time =
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800517 sender_monotonic_now + receiver_monotonic_offset;
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800518
519 flatbuffers::FlatBufferBuilder fbb;
Austin Schuh8bf1e632021-01-02 22:41:04 -0800520 fbb.ForceDefaults(true);
521
522 logger::MessageHeader::Builder message_header_builder(fbb);
523
524 message_header_builder.add_channel_index(channel_index);
525
526 message_header_builder.add_queue_index(queue_index_[channel_index] - 1 +
527 100);
528 message_header_builder.add_monotonic_sent_time(
529 monotonic_sent_time.time_since_epoch().count());
530 message_header_builder.add_realtime_sent_time(
531 (aos::realtime_clock::epoch() + chrono::seconds(1000) +
532 monotonic_sent_time.time_since_epoch())
533 .time_since_epoch()
534 .count());
535
536 message_header_builder.add_monotonic_remote_time(
537 sender_monotonic_now.time_since_epoch().count());
538 message_header_builder.add_realtime_remote_time(
539 (aos::realtime_clock::epoch() + chrono::seconds(1000) +
540 sender_monotonic_now.time_since_epoch())
541 .time_since_epoch()
542 .count());
543 message_header_builder.add_remote_queue_index(queue_index_[channel_index] -
544 1);
545
546 if (monotonic_timestamp_time != monotonic_clock::min_time) {
547 message_header_builder.add_monotonic_timestamp_time(
548 monotonic_timestamp_time.time_since_epoch().count());
549 }
550
551 fbb.FinishSizePrefixed(message_header_builder.Finish());
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800552 LOG(INFO) << aos::FlatbufferToJson(
553 aos::SizePrefixedFlatbufferSpan<MessageHeader>(
554 absl::Span<uint8_t>(fbb.GetBufferPointer(), fbb.GetSize())));
555
556 return fbb.Release();
557 }
558
559 const std::string logfile0_ = aos::testing::TestTmpDir() + "/log0.bfbs";
560 const std::string logfile1_ = aos::testing::TestTmpDir() + "/log1.bfbs";
Austin Schuhd2f96102020-12-01 20:27:29 -0800561 const std::string logfile2_ = aos::testing::TestTmpDir() + "/log2.bfbs";
Austin Schuh48507722021-07-17 17:29:24 -0700562 const std::string logfile3_ = aos::testing::TestTmpDir() + "/log3.bfbs";
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800563
564 const aos::FlatbufferDetachedBuffer<Configuration> config_;
565 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config0_;
566 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config1_;
Austin Schuhd2f96102020-12-01 20:27:29 -0800567 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config2_;
568 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config3_;
Austin Schuh8bf1e632021-01-02 22:41:04 -0800569 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config4_;
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800570
571 std::vector<uint32_t> queue_index_;
572};
573
574using LogPartsSorterTest = SortingElementTest;
575using LogPartsSorterDeathTest = LogPartsSorterTest;
Austin Schuh8f52ed52020-11-30 23:12:39 -0800576using NodeMergerTest = SortingElementTest;
Austin Schuhd2f96102020-12-01 20:27:29 -0800577using TimestampMapperTest = SortingElementTest;
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800578
579// Tests that we can pull messages out of a log sorted in order.
580TEST_F(LogPartsSorterTest, Pull) {
581 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
582 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700583 TestDetachedBufferWriter writer(logfile0_);
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800584 writer.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700585 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800586 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700587 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800588 MakeLogMessage(e + chrono::milliseconds(1000), 1, 0x105));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700589 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800590 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700591 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800592 MakeLogMessage(e + chrono::milliseconds(1901), 1, 0x107));
593 }
594
595 const std::vector<LogFile> parts = SortParts({logfile0_});
596
597 LogPartsSorter parts_sorter(parts[0].parts[0]);
598
599 // Confirm we aren't sorted until any time until the message is popped.
600 // Peeking shouldn't change the sorted until time.
601 EXPECT_EQ(parts_sorter.sorted_until(), monotonic_clock::min_time);
602
603 std::deque<Message> output;
604
605 ASSERT_TRUE(parts_sorter.Front() != nullptr);
606 output.emplace_back(std::move(*parts_sorter.Front()));
607 parts_sorter.PopFront();
608 EXPECT_EQ(parts_sorter.sorted_until(), e + chrono::milliseconds(1900));
609
610 ASSERT_TRUE(parts_sorter.Front() != nullptr);
611 output.emplace_back(std::move(*parts_sorter.Front()));
612 parts_sorter.PopFront();
613 EXPECT_EQ(parts_sorter.sorted_until(), e + chrono::milliseconds(1900));
614
615 ASSERT_TRUE(parts_sorter.Front() != nullptr);
616 output.emplace_back(std::move(*parts_sorter.Front()));
617 parts_sorter.PopFront();
618 EXPECT_EQ(parts_sorter.sorted_until(), monotonic_clock::max_time);
619
620 ASSERT_TRUE(parts_sorter.Front() != nullptr);
621 output.emplace_back(std::move(*parts_sorter.Front()));
622 parts_sorter.PopFront();
623 EXPECT_EQ(parts_sorter.sorted_until(), monotonic_clock::max_time);
624
625 ASSERT_TRUE(parts_sorter.Front() == nullptr);
626
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700627 EXPECT_EQ(output[0].timestamp.boot, 0);
628 EXPECT_EQ(output[0].timestamp.time, e + chrono::milliseconds(1000));
629 EXPECT_EQ(output[1].timestamp.boot, 0);
630 EXPECT_EQ(output[1].timestamp.time, e + chrono::milliseconds(1000));
631 EXPECT_EQ(output[2].timestamp.boot, 0);
632 EXPECT_EQ(output[2].timestamp.time, e + chrono::milliseconds(1901));
633 EXPECT_EQ(output[3].timestamp.boot, 0);
634 EXPECT_EQ(output[3].timestamp.time, e + chrono::milliseconds(2000));
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800635}
636
Austin Schuhb000de62020-12-03 22:00:40 -0800637// Tests that we can pull messages out of a log sorted in order.
638TEST_F(LogPartsSorterTest, WayBeforeStart) {
639 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
640 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700641 TestDetachedBufferWriter writer(logfile0_);
Austin Schuhb000de62020-12-03 22:00:40 -0800642 writer.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700643 writer.WriteSizedFlatbuffer(
Austin Schuhb000de62020-12-03 22:00:40 -0800644 MakeLogMessage(e - chrono::milliseconds(500), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700645 writer.WriteSizedFlatbuffer(
Austin Schuhb000de62020-12-03 22:00:40 -0800646 MakeLogMessage(e - chrono::milliseconds(10), 2, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700647 writer.WriteSizedFlatbuffer(
Austin Schuhb000de62020-12-03 22:00:40 -0800648 MakeLogMessage(e - chrono::milliseconds(1000), 1, 0x105));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700649 writer.WriteSizedFlatbuffer(
Austin Schuhb000de62020-12-03 22:00:40 -0800650 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700651 writer.WriteSizedFlatbuffer(
Austin Schuhb000de62020-12-03 22:00:40 -0800652 MakeLogMessage(e + chrono::milliseconds(1901), 1, 0x107));
653 }
654
655 const std::vector<LogFile> parts = SortParts({logfile0_});
656
657 LogPartsSorter parts_sorter(parts[0].parts[0]);
658
659 // Confirm we aren't sorted until any time until the message is popped.
660 // Peeking shouldn't change the sorted until time.
661 EXPECT_EQ(parts_sorter.sorted_until(), monotonic_clock::min_time);
662
663 std::deque<Message> output;
664
665 for (monotonic_clock::time_point t :
666 {e + chrono::milliseconds(1900), e + chrono::milliseconds(1900),
667 e + chrono::milliseconds(1900), monotonic_clock::max_time,
668 monotonic_clock::max_time}) {
669 ASSERT_TRUE(parts_sorter.Front() != nullptr);
670 output.emplace_back(std::move(*parts_sorter.Front()));
671 parts_sorter.PopFront();
672 EXPECT_EQ(parts_sorter.sorted_until(), t);
673 }
674
675 ASSERT_TRUE(parts_sorter.Front() == nullptr);
676
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700677 EXPECT_EQ(output[0].timestamp.boot, 0u);
678 EXPECT_EQ(output[0].timestamp.time, e - chrono::milliseconds(1000));
679 EXPECT_EQ(output[1].timestamp.boot, 0u);
680 EXPECT_EQ(output[1].timestamp.time, e - chrono::milliseconds(500));
681 EXPECT_EQ(output[2].timestamp.boot, 0u);
682 EXPECT_EQ(output[2].timestamp.time, e - chrono::milliseconds(10));
683 EXPECT_EQ(output[3].timestamp.boot, 0u);
684 EXPECT_EQ(output[3].timestamp.time, e + chrono::milliseconds(1901));
685 EXPECT_EQ(output[4].timestamp.boot, 0u);
686 EXPECT_EQ(output[4].timestamp.time, e + chrono::milliseconds(2000));
Austin Schuhb000de62020-12-03 22:00:40 -0800687}
688
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800689// Tests that messages too far out of order trigger death.
690TEST_F(LogPartsSorterDeathTest, Pull) {
691 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
692 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700693 TestDetachedBufferWriter writer(logfile0_);
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800694 writer.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700695 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800696 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700697 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800698 MakeLogMessage(e + chrono::milliseconds(1000), 1, 0x105));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700699 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800700 MakeLogMessage(e + chrono::milliseconds(2001), 0, 0x006));
701 // The following message is too far out of order and will trigger the CHECK.
Austin Schuhd863e6e2022-10-16 15:44:50 -0700702 writer.WriteSizedFlatbuffer(
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800703 MakeLogMessage(e + chrono::milliseconds(1900), 1, 0x107));
704 }
705
706 const std::vector<LogFile> parts = SortParts({logfile0_});
707
708 LogPartsSorter parts_sorter(parts[0].parts[0]);
709
710 // Confirm we aren't sorted until any time until the message is popped.
711 // Peeking shouldn't change the sorted until time.
712 EXPECT_EQ(parts_sorter.sorted_until(), monotonic_clock::min_time);
713 std::deque<Message> output;
714
715 ASSERT_TRUE(parts_sorter.Front() != nullptr);
716 parts_sorter.PopFront();
717 ASSERT_TRUE(parts_sorter.Front() != nullptr);
718 ASSERT_TRUE(parts_sorter.Front() != nullptr);
719 parts_sorter.PopFront();
720
Austin Schuh58646e22021-08-23 23:51:46 -0700721 EXPECT_DEATH({ parts_sorter.Front(); },
722 "Max out of order of 100000000ns exceeded.");
Austin Schuh4b5c22a2020-11-30 22:58:43 -0800723}
724
Austin Schuh8f52ed52020-11-30 23:12:39 -0800725// Tests that we can merge data from 2 separate files, including duplicate data.
726TEST_F(NodeMergerTest, TwoFileMerger) {
727 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
728 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700729 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh8f52ed52020-11-30 23:12:39 -0800730 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700731 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh8f52ed52020-11-30 23:12:39 -0800732 writer1.QueueSpan(config1_.span());
733
Austin Schuhd863e6e2022-10-16 15:44:50 -0700734 writer0.WriteSizedFlatbuffer(
Austin Schuh8f52ed52020-11-30 23:12:39 -0800735 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700736 writer1.WriteSizedFlatbuffer(
Austin Schuh8f52ed52020-11-30 23:12:39 -0800737 MakeLogMessage(e + chrono::milliseconds(1001), 1, 0x105));
738
Austin Schuhd863e6e2022-10-16 15:44:50 -0700739 writer0.WriteSizedFlatbuffer(
Austin Schuh8f52ed52020-11-30 23:12:39 -0800740 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700741 writer1.WriteSizedFlatbuffer(
Austin Schuh8f52ed52020-11-30 23:12:39 -0800742 MakeLogMessage(e + chrono::milliseconds(1002), 1, 0x106));
743
744 // Make a duplicate!
745 SizePrefixedFlatbufferDetachedBuffer<MessageHeader> msg(
746 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
747 writer0.QueueSpan(msg.span());
748 writer1.QueueSpan(msg.span());
749
Austin Schuhd863e6e2022-10-16 15:44:50 -0700750 writer1.WriteSizedFlatbuffer(
Austin Schuh8f52ed52020-11-30 23:12:39 -0800751 MakeLogMessage(e + chrono::milliseconds(3002), 1, 0x107));
752 }
753
754 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
Austin Schuhd2f96102020-12-01 20:27:29 -0800755 ASSERT_EQ(parts.size(), 1u);
Austin Schuh8f52ed52020-11-30 23:12:39 -0800756
Austin Schuhd2f96102020-12-01 20:27:29 -0800757 NodeMerger merger(FilterPartsForNode(parts, "pi1"));
Austin Schuh8f52ed52020-11-30 23:12:39 -0800758
759 EXPECT_EQ(merger.sorted_until(), monotonic_clock::min_time);
760
761 std::deque<Message> output;
762
763 EXPECT_EQ(merger.sorted_until(), monotonic_clock::min_time);
764 ASSERT_TRUE(merger.Front() != nullptr);
765 EXPECT_EQ(merger.sorted_until(), e + chrono::milliseconds(1900));
766
767 output.emplace_back(std::move(*merger.Front()));
768 merger.PopFront();
769 EXPECT_EQ(merger.sorted_until(), e + chrono::milliseconds(1900));
770
771 ASSERT_TRUE(merger.Front() != nullptr);
772 output.emplace_back(std::move(*merger.Front()));
773 merger.PopFront();
774 EXPECT_EQ(merger.sorted_until(), e + chrono::milliseconds(2900));
775
776 ASSERT_TRUE(merger.Front() != nullptr);
777 output.emplace_back(std::move(*merger.Front()));
778 merger.PopFront();
779 EXPECT_EQ(merger.sorted_until(), e + chrono::milliseconds(2900));
780
781 ASSERT_TRUE(merger.Front() != nullptr);
782 output.emplace_back(std::move(*merger.Front()));
783 merger.PopFront();
784 EXPECT_EQ(merger.sorted_until(), e + chrono::milliseconds(2900));
785
786 ASSERT_TRUE(merger.Front() != nullptr);
787 output.emplace_back(std::move(*merger.Front()));
788 merger.PopFront();
789 EXPECT_EQ(merger.sorted_until(), monotonic_clock::max_time);
790
791 ASSERT_TRUE(merger.Front() != nullptr);
792 output.emplace_back(std::move(*merger.Front()));
793 merger.PopFront();
794 EXPECT_EQ(merger.sorted_until(), monotonic_clock::max_time);
795
796 ASSERT_TRUE(merger.Front() == nullptr);
797
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700798 EXPECT_EQ(output[0].timestamp.boot, 0u);
799 EXPECT_EQ(output[0].timestamp.time, e + chrono::milliseconds(1000));
800 EXPECT_EQ(output[1].timestamp.boot, 0u);
801 EXPECT_EQ(output[1].timestamp.time, e + chrono::milliseconds(1001));
802 EXPECT_EQ(output[2].timestamp.boot, 0u);
803 EXPECT_EQ(output[2].timestamp.time, e + chrono::milliseconds(1002));
804 EXPECT_EQ(output[3].timestamp.boot, 0u);
805 EXPECT_EQ(output[3].timestamp.time, e + chrono::milliseconds(2000));
806 EXPECT_EQ(output[4].timestamp.boot, 0u);
807 EXPECT_EQ(output[4].timestamp.time, e + chrono::milliseconds(3000));
808 EXPECT_EQ(output[5].timestamp.boot, 0u);
809 EXPECT_EQ(output[5].timestamp.time, e + chrono::milliseconds(3002));
Austin Schuh8f52ed52020-11-30 23:12:39 -0800810}
811
Austin Schuh8bf1e632021-01-02 22:41:04 -0800812// Tests that we can merge timestamps with various combinations of
813// monotonic_timestamp_time.
814TEST_F(NodeMergerTest, TwoFileTimestampMerger) {
815 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
816 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700817 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh8bf1e632021-01-02 22:41:04 -0800818 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700819 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh8bf1e632021-01-02 22:41:04 -0800820 writer1.QueueSpan(config1_.span());
821
822 // Neither has it.
823 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005);
Austin Schuhd863e6e2022-10-16 15:44:50 -0700824 writer0.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800825 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700826 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800827 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
828
829 // First only has it.
830 MakeLogMessage(e + chrono::milliseconds(1001), 0, 0x006);
Austin Schuhd863e6e2022-10-16 15:44:50 -0700831 writer0.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800832 e + chrono::milliseconds(1001), 0, chrono::seconds(100),
833 e + chrono::nanoseconds(971)));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700834 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800835 e + chrono::milliseconds(1001), 0, chrono::seconds(100)));
836
837 // Second only has it.
838 MakeLogMessage(e + chrono::milliseconds(1002), 0, 0x007);
Austin Schuhd863e6e2022-10-16 15:44:50 -0700839 writer0.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800840 e + chrono::milliseconds(1002), 0, chrono::seconds(100)));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700841 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800842 e + chrono::milliseconds(1002), 0, chrono::seconds(100),
843 e + chrono::nanoseconds(972)));
844
845 // Both have it.
846 MakeLogMessage(e + chrono::milliseconds(1003), 0, 0x008);
Austin Schuhd863e6e2022-10-16 15:44:50 -0700847 writer0.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800848 e + chrono::milliseconds(1003), 0, chrono::seconds(100),
849 e + chrono::nanoseconds(973)));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700850 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -0800851 e + chrono::milliseconds(1003), 0, chrono::seconds(100),
852 e + chrono::nanoseconds(973)));
853 }
854
855 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
856 ASSERT_EQ(parts.size(), 1u);
857
858 NodeMerger merger(FilterPartsForNode(parts, "pi1"));
859
860 EXPECT_EQ(merger.sorted_until(), monotonic_clock::min_time);
861
862 std::deque<Message> output;
863
864 for (int i = 0; i < 4; ++i) {
865 ASSERT_TRUE(merger.Front() != nullptr);
866 output.emplace_back(std::move(*merger.Front()));
867 merger.PopFront();
868 }
869 ASSERT_TRUE(merger.Front() == nullptr);
870
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700871 EXPECT_EQ(output[0].timestamp.boot, 0u);
872 EXPECT_EQ(output[0].timestamp.time, e + chrono::milliseconds(101000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700873 EXPECT_FALSE(output[0].data->has_monotonic_timestamp_time);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700874
875 EXPECT_EQ(output[1].timestamp.boot, 0u);
876 EXPECT_EQ(output[1].timestamp.time, e + chrono::milliseconds(101001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700877 EXPECT_TRUE(output[1].data->has_monotonic_timestamp_time);
878 EXPECT_EQ(output[1].data->monotonic_timestamp_time,
879 monotonic_clock::time_point(std::chrono::nanoseconds(971)));
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700880
881 EXPECT_EQ(output[2].timestamp.boot, 0u);
882 EXPECT_EQ(output[2].timestamp.time, e + chrono::milliseconds(101002));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700883 EXPECT_TRUE(output[2].data->has_monotonic_timestamp_time);
884 EXPECT_EQ(output[2].data->monotonic_timestamp_time,
885 monotonic_clock::time_point(std::chrono::nanoseconds(972)));
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700886
887 EXPECT_EQ(output[3].timestamp.boot, 0u);
888 EXPECT_EQ(output[3].timestamp.time, e + chrono::milliseconds(101003));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700889 EXPECT_TRUE(output[3].data->has_monotonic_timestamp_time);
890 EXPECT_EQ(output[3].data->monotonic_timestamp_time,
891 monotonic_clock::time_point(std::chrono::nanoseconds(973)));
Austin Schuh8bf1e632021-01-02 22:41:04 -0800892}
893
Austin Schuhd2f96102020-12-01 20:27:29 -0800894// Tests that we can match timestamps on delivered messages.
895TEST_F(TimestampMapperTest, ReadNode0First) {
896 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
897 {
Austin Schuhd863e6e2022-10-16 15:44:50 -0700898 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -0800899 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -0700900 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -0800901 writer1.QueueSpan(config2_.span());
902
Austin Schuhd863e6e2022-10-16 15:44:50 -0700903 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -0800904 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700905 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -0800906 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
907
Austin Schuhd863e6e2022-10-16 15:44:50 -0700908 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -0800909 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700910 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -0800911 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
912
Austin Schuhd863e6e2022-10-16 15:44:50 -0700913 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -0800914 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -0700915 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -0800916 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
917 }
918
919 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
920
921 ASSERT_EQ(parts[0].logger_node, "pi1");
922 ASSERT_EQ(parts[1].logger_node, "pi2");
923
Austin Schuh79b30942021-01-24 22:32:21 -0800924 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -0800925 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -0800926 mapper0.set_timestamp_callback(
927 [&](TimestampedMessage *) { ++mapper0_count; });
928 size_t mapper1_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -0800929 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -0800930 mapper1.set_timestamp_callback(
931 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -0800932
933 mapper0.AddPeer(&mapper1);
934 mapper1.AddPeer(&mapper0);
935
936 {
937 std::deque<TimestampedMessage> output0;
938
Austin Schuh79b30942021-01-24 22:32:21 -0800939 EXPECT_EQ(mapper0_count, 0u);
940 EXPECT_EQ(mapper1_count, 0u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800941 ASSERT_TRUE(mapper0.Front() != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -0800942 EXPECT_EQ(mapper0_count, 1u);
943 EXPECT_EQ(mapper1_count, 0u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800944 output0.emplace_back(std::move(*mapper0.Front()));
945 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -0700946 EXPECT_TRUE(mapper0.started());
Austin Schuh79b30942021-01-24 22:32:21 -0800947 EXPECT_EQ(mapper0_count, 1u);
948 EXPECT_EQ(mapper1_count, 0u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800949
950 ASSERT_TRUE(mapper0.Front() != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -0800951 EXPECT_EQ(mapper0_count, 2u);
952 EXPECT_EQ(mapper1_count, 0u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800953 output0.emplace_back(std::move(*mapper0.Front()));
954 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -0700955 EXPECT_TRUE(mapper0.started());
Austin Schuhd2f96102020-12-01 20:27:29 -0800956
957 ASSERT_TRUE(mapper0.Front() != nullptr);
958 output0.emplace_back(std::move(*mapper0.Front()));
959 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -0700960 EXPECT_TRUE(mapper0.started());
Austin Schuhd2f96102020-12-01 20:27:29 -0800961
Austin Schuh79b30942021-01-24 22:32:21 -0800962 EXPECT_EQ(mapper0_count, 3u);
963 EXPECT_EQ(mapper1_count, 0u);
964
Austin Schuhd2f96102020-12-01 20:27:29 -0800965 ASSERT_TRUE(mapper0.Front() == nullptr);
966
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700967 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
968 EXPECT_EQ(output0[0].monotonic_event_time.time,
969 e + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700970 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700971
972 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
973 EXPECT_EQ(output0[1].monotonic_event_time.time,
974 e + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700975 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -0700976
977 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
978 EXPECT_EQ(output0[2].monotonic_event_time.time,
979 e + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -0700980 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -0800981 }
982
983 {
984 SCOPED_TRACE("Trying node1 now");
985 std::deque<TimestampedMessage> output1;
986
Austin Schuh79b30942021-01-24 22:32:21 -0800987 EXPECT_EQ(mapper0_count, 3u);
988 EXPECT_EQ(mapper1_count, 0u);
989
Austin Schuhd2f96102020-12-01 20:27:29 -0800990 ASSERT_TRUE(mapper1.Front() != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -0800991 EXPECT_EQ(mapper0_count, 3u);
992 EXPECT_EQ(mapper1_count, 1u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800993 output1.emplace_back(std::move(*mapper1.Front()));
994 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -0700995 EXPECT_TRUE(mapper1.started());
Austin Schuh79b30942021-01-24 22:32:21 -0800996 EXPECT_EQ(mapper0_count, 3u);
997 EXPECT_EQ(mapper1_count, 1u);
Austin Schuhd2f96102020-12-01 20:27:29 -0800998
999 ASSERT_TRUE(mapper1.Front() != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -08001000 EXPECT_EQ(mapper0_count, 3u);
1001 EXPECT_EQ(mapper1_count, 2u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001002 output1.emplace_back(std::move(*mapper1.Front()));
1003 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001004 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001005
1006 ASSERT_TRUE(mapper1.Front() != nullptr);
1007 output1.emplace_back(std::move(*mapper1.Front()));
1008 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001009 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001010
Austin Schuh79b30942021-01-24 22:32:21 -08001011 EXPECT_EQ(mapper0_count, 3u);
1012 EXPECT_EQ(mapper1_count, 3u);
1013
Austin Schuhd2f96102020-12-01 20:27:29 -08001014 ASSERT_TRUE(mapper1.Front() == nullptr);
1015
Austin Schuh79b30942021-01-24 22:32:21 -08001016 EXPECT_EQ(mapper0_count, 3u);
1017 EXPECT_EQ(mapper1_count, 3u);
1018
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001019 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1020 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001021 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001022 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001023
1024 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1025 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001026 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001027 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001028
1029 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1030 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001031 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001032 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001033 }
1034}
1035
Austin Schuh8bf1e632021-01-02 22:41:04 -08001036// Tests that a MessageHeader with monotonic_timestamp_time set gets properly
1037// returned.
1038TEST_F(TimestampMapperTest, MessageWithTimestampTime) {
1039 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1040 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001041 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh8bf1e632021-01-02 22:41:04 -08001042 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001043 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh8bf1e632021-01-02 22:41:04 -08001044 writer1.QueueSpan(config4_.span());
1045
Austin Schuhd863e6e2022-10-16 15:44:50 -07001046 writer0.WriteSizedFlatbuffer(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001047 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001048 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001049 e + chrono::milliseconds(1000), 0, chrono::seconds(100),
1050 e + chrono::nanoseconds(971)));
1051
Austin Schuhd863e6e2022-10-16 15:44:50 -07001052 writer0.WriteSizedFlatbuffer(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001053 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001054 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001055 e + chrono::milliseconds(2000), 0, chrono::seconds(100),
1056 e + chrono::nanoseconds(5458)));
1057
Austin Schuhd863e6e2022-10-16 15:44:50 -07001058 writer0.WriteSizedFlatbuffer(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001059 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001060 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh8bf1e632021-01-02 22:41:04 -08001061 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1062 }
1063
1064 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1065
1066 for (const auto &p : parts) {
1067 LOG(INFO) << p;
1068 }
1069
1070 ASSERT_EQ(parts.size(), 1u);
1071
Austin Schuh79b30942021-01-24 22:32:21 -08001072 size_t mapper0_count = 0;
Austin Schuh8bf1e632021-01-02 22:41:04 -08001073 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001074 mapper0.set_timestamp_callback(
1075 [&](TimestampedMessage *) { ++mapper0_count; });
1076 size_t mapper1_count = 0;
Austin Schuh8bf1e632021-01-02 22:41:04 -08001077 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001078 mapper1.set_timestamp_callback(
1079 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuh8bf1e632021-01-02 22:41:04 -08001080
1081 mapper0.AddPeer(&mapper1);
1082 mapper1.AddPeer(&mapper0);
1083
1084 {
1085 std::deque<TimestampedMessage> output0;
1086
1087 for (int i = 0; i < 3; ++i) {
1088 ASSERT_TRUE(mapper0.Front() != nullptr) << ": " << i;
1089 output0.emplace_back(std::move(*mapper0.Front()));
1090 mapper0.PopFront();
1091 }
1092
1093 ASSERT_TRUE(mapper0.Front() == nullptr);
1094
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001095 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
1096 EXPECT_EQ(output0[0].monotonic_event_time.time,
1097 e + chrono::milliseconds(1000));
1098 EXPECT_EQ(output0[0].monotonic_timestamp_time.boot, 0u);
1099 EXPECT_EQ(output0[0].monotonic_timestamp_time.time,
1100 monotonic_clock::min_time);
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001101 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001102
1103 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
1104 EXPECT_EQ(output0[1].monotonic_event_time.time,
1105 e + chrono::milliseconds(2000));
1106 EXPECT_EQ(output0[1].monotonic_timestamp_time.boot, 0u);
1107 EXPECT_EQ(output0[1].monotonic_timestamp_time.time,
1108 monotonic_clock::min_time);
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001109 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001110
1111 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
1112 EXPECT_EQ(output0[2].monotonic_event_time.time,
1113 e + chrono::milliseconds(3000));
1114 EXPECT_EQ(output0[2].monotonic_timestamp_time.boot, 0u);
1115 EXPECT_EQ(output0[2].monotonic_timestamp_time.time,
1116 monotonic_clock::min_time);
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001117 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuh8bf1e632021-01-02 22:41:04 -08001118 }
1119
1120 {
1121 SCOPED_TRACE("Trying node1 now");
1122 std::deque<TimestampedMessage> output1;
1123
1124 for (int i = 0; i < 3; ++i) {
1125 ASSERT_TRUE(mapper1.Front() != nullptr);
1126 output1.emplace_back(std::move(*mapper1.Front()));
1127 mapper1.PopFront();
1128 }
1129
1130 ASSERT_TRUE(mapper1.Front() == nullptr);
1131
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001132 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1133 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuh8bf1e632021-01-02 22:41:04 -08001134 e + chrono::seconds(100) + chrono::milliseconds(1000));
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001135 EXPECT_EQ(output1[0].monotonic_timestamp_time.boot, 0u);
1136 EXPECT_EQ(output1[0].monotonic_timestamp_time.time,
Austin Schuh8bf1e632021-01-02 22:41:04 -08001137 e + chrono::nanoseconds(971));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001138 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001139
1140 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1141 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuh8bf1e632021-01-02 22:41:04 -08001142 e + chrono::seconds(100) + chrono::milliseconds(2000));
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001143 EXPECT_EQ(output1[1].monotonic_timestamp_time.boot, 0u);
1144 EXPECT_EQ(output1[1].monotonic_timestamp_time.time,
Austin Schuh8bf1e632021-01-02 22:41:04 -08001145 e + chrono::nanoseconds(5458));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001146 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001147
1148 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1149 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuh8bf1e632021-01-02 22:41:04 -08001150 e + chrono::seconds(100) + chrono::milliseconds(3000));
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001151 EXPECT_EQ(output1[2].monotonic_timestamp_time.boot, 0u);
1152 EXPECT_EQ(output1[2].monotonic_timestamp_time.time,
1153 monotonic_clock::min_time);
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001154 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuh8bf1e632021-01-02 22:41:04 -08001155 }
Austin Schuh79b30942021-01-24 22:32:21 -08001156
1157 EXPECT_EQ(mapper0_count, 3u);
1158 EXPECT_EQ(mapper1_count, 3u);
Austin Schuh8bf1e632021-01-02 22:41:04 -08001159}
1160
Austin Schuhd2f96102020-12-01 20:27:29 -08001161// Tests that we can match timestamps on delivered messages. By doing this in
1162// the reverse order, the second node needs to queue data up from the first node
1163// to find the matching timestamp.
1164TEST_F(TimestampMapperTest, ReadNode1First) {
1165 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1166 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001167 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001168 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001169 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001170 writer1.QueueSpan(config2_.span());
1171
Austin Schuhd863e6e2022-10-16 15:44:50 -07001172 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001173 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001174 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001175 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1176
Austin Schuhd863e6e2022-10-16 15:44:50 -07001177 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001178 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001179 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001180 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1181
Austin Schuhd863e6e2022-10-16 15:44:50 -07001182 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001183 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001184 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001185 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1186 }
1187
1188 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1189
1190 ASSERT_EQ(parts[0].logger_node, "pi1");
1191 ASSERT_EQ(parts[1].logger_node, "pi2");
1192
Austin Schuh79b30942021-01-24 22:32:21 -08001193 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001194 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001195 mapper0.set_timestamp_callback(
1196 [&](TimestampedMessage *) { ++mapper0_count; });
1197 size_t mapper1_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001198 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001199 mapper1.set_timestamp_callback(
1200 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -08001201
1202 mapper0.AddPeer(&mapper1);
1203 mapper1.AddPeer(&mapper0);
1204
1205 {
1206 SCOPED_TRACE("Trying node1 now");
1207 std::deque<TimestampedMessage> output1;
1208
1209 ASSERT_TRUE(mapper1.Front() != nullptr);
1210 output1.emplace_back(std::move(*mapper1.Front()));
1211 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001212 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001213
1214 ASSERT_TRUE(mapper1.Front() != nullptr);
1215 output1.emplace_back(std::move(*mapper1.Front()));
1216 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001217 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001218
1219 ASSERT_TRUE(mapper1.Front() != nullptr);
1220 output1.emplace_back(std::move(*mapper1.Front()));
1221 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001222 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001223
1224 ASSERT_TRUE(mapper1.Front() == nullptr);
1225
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001226 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1227 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001228 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001229 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001230
1231 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1232 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001233 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001234 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001235
1236 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1237 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001238 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001239 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001240 }
1241
1242 {
1243 std::deque<TimestampedMessage> output0;
1244
1245 ASSERT_TRUE(mapper0.Front() != nullptr);
1246 output0.emplace_back(std::move(*mapper0.Front()));
1247 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001248 EXPECT_TRUE(mapper0.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001249
1250 ASSERT_TRUE(mapper0.Front() != nullptr);
1251 output0.emplace_back(std::move(*mapper0.Front()));
1252 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001253 EXPECT_TRUE(mapper0.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001254
1255 ASSERT_TRUE(mapper0.Front() != nullptr);
1256 output0.emplace_back(std::move(*mapper0.Front()));
1257 mapper0.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001258 EXPECT_TRUE(mapper0.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001259
1260 ASSERT_TRUE(mapper0.Front() == nullptr);
1261
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001262 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
1263 EXPECT_EQ(output0[0].monotonic_event_time.time,
1264 e + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001265 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001266
1267 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
1268 EXPECT_EQ(output0[1].monotonic_event_time.time,
1269 e + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001270 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001271
1272 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
1273 EXPECT_EQ(output0[2].monotonic_event_time.time,
1274 e + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001275 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001276 }
Austin Schuh79b30942021-01-24 22:32:21 -08001277
1278 EXPECT_EQ(mapper0_count, 3u);
1279 EXPECT_EQ(mapper1_count, 3u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001280}
1281
1282// Tests that we return just the timestamps if we couldn't find the data and the
1283// missing data was at the beginning of the file.
1284TEST_F(TimestampMapperTest, ReadMissingDataBefore) {
1285 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1286 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001287 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001288 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001289 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001290 writer1.QueueSpan(config2_.span());
1291
1292 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005);
Austin Schuhd863e6e2022-10-16 15:44:50 -07001293 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001294 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1295
Austin Schuhd863e6e2022-10-16 15:44:50 -07001296 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001297 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001298 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001299 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1300
Austin Schuhd863e6e2022-10-16 15:44:50 -07001301 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001302 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001303 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001304 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1305 }
1306
1307 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1308
1309 ASSERT_EQ(parts[0].logger_node, "pi1");
1310 ASSERT_EQ(parts[1].logger_node, "pi2");
1311
Austin Schuh79b30942021-01-24 22:32:21 -08001312 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001313 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001314 mapper0.set_timestamp_callback(
1315 [&](TimestampedMessage *) { ++mapper0_count; });
1316 size_t mapper1_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001317 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001318 mapper1.set_timestamp_callback(
1319 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -08001320
1321 mapper0.AddPeer(&mapper1);
1322 mapper1.AddPeer(&mapper0);
1323
1324 {
1325 SCOPED_TRACE("Trying node1 now");
1326 std::deque<TimestampedMessage> output1;
1327
1328 ASSERT_TRUE(mapper1.Front() != nullptr);
1329 output1.emplace_back(std::move(*mapper1.Front()));
1330 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001331 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001332
1333 ASSERT_TRUE(mapper1.Front() != nullptr);
1334 output1.emplace_back(std::move(*mapper1.Front()));
1335 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001336 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001337
1338 ASSERT_TRUE(mapper1.Front() != nullptr);
1339 output1.emplace_back(std::move(*mapper1.Front()));
1340 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001341 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001342
1343 ASSERT_TRUE(mapper1.Front() == nullptr);
1344
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001345 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1346 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001347 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001348 EXPECT_FALSE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001349
1350 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1351 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001352 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001353 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001354
1355 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1356 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001357 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001358 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001359 }
Austin Schuh79b30942021-01-24 22:32:21 -08001360
1361 EXPECT_EQ(mapper0_count, 0u);
1362 EXPECT_EQ(mapper1_count, 3u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001363}
1364
1365// Tests that we return just the timestamps if we couldn't find the data and the
1366// missing data was at the end of the file.
1367TEST_F(TimestampMapperTest, ReadMissingDataAfter) {
1368 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1369 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001370 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001371 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001372 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001373 writer1.QueueSpan(config2_.span());
1374
Austin Schuhd863e6e2022-10-16 15:44:50 -07001375 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001376 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001377 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001378 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1379
Austin Schuhd863e6e2022-10-16 15:44:50 -07001380 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001381 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001382 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001383 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1384
1385 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007);
Austin Schuhd863e6e2022-10-16 15:44:50 -07001386 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001387 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1388 }
1389
1390 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1391
1392 ASSERT_EQ(parts[0].logger_node, "pi1");
1393 ASSERT_EQ(parts[1].logger_node, "pi2");
1394
Austin Schuh79b30942021-01-24 22:32:21 -08001395 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001396 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001397 mapper0.set_timestamp_callback(
1398 [&](TimestampedMessage *) { ++mapper0_count; });
1399 size_t mapper1_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001400 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001401 mapper1.set_timestamp_callback(
1402 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -08001403
1404 mapper0.AddPeer(&mapper1);
1405 mapper1.AddPeer(&mapper0);
1406
1407 {
1408 SCOPED_TRACE("Trying node1 now");
1409 std::deque<TimestampedMessage> output1;
1410
1411 ASSERT_TRUE(mapper1.Front() != nullptr);
1412 output1.emplace_back(std::move(*mapper1.Front()));
1413 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001414 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001415
1416 ASSERT_TRUE(mapper1.Front() != nullptr);
1417 output1.emplace_back(std::move(*mapper1.Front()));
1418 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001419 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001420
1421 ASSERT_TRUE(mapper1.Front() != nullptr);
1422 output1.emplace_back(std::move(*mapper1.Front()));
1423 mapper1.PopFront();
Austin Schuh24bf4972021-06-29 22:09:08 -07001424 EXPECT_TRUE(mapper1.started());
Austin Schuhd2f96102020-12-01 20:27:29 -08001425
1426 ASSERT_TRUE(mapper1.Front() == nullptr);
1427
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001428 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1429 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001430 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001431 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001432
1433 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1434 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001435 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001436 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001437
1438 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1439 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001440 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001441 EXPECT_FALSE(output1[2].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001442 }
Austin Schuh79b30942021-01-24 22:32:21 -08001443
1444 EXPECT_EQ(mapper0_count, 0u);
1445 EXPECT_EQ(mapper1_count, 3u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001446}
1447
Austin Schuh993ccb52020-12-12 15:59:32 -08001448// Tests that we handle a message which failed to forward or be logged.
1449TEST_F(TimestampMapperTest, ReadMissingDataMiddle) {
1450 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1451 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001452 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh993ccb52020-12-12 15:59:32 -08001453 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001454 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh993ccb52020-12-12 15:59:32 -08001455 writer1.QueueSpan(config2_.span());
1456
Austin Schuhd863e6e2022-10-16 15:44:50 -07001457 writer0.WriteSizedFlatbuffer(
Austin Schuh993ccb52020-12-12 15:59:32 -08001458 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001459 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh993ccb52020-12-12 15:59:32 -08001460 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1461
1462 // Create both the timestamp and message, but don't log them, simulating a
1463 // forwarding drop.
1464 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006);
1465 MakeTimestampMessage(e + chrono::milliseconds(2000), 0,
1466 chrono::seconds(100));
1467
Austin Schuhd863e6e2022-10-16 15:44:50 -07001468 writer0.WriteSizedFlatbuffer(
Austin Schuh993ccb52020-12-12 15:59:32 -08001469 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001470 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh993ccb52020-12-12 15:59:32 -08001471 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1472 }
1473
1474 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1475
1476 ASSERT_EQ(parts[0].logger_node, "pi1");
1477 ASSERT_EQ(parts[1].logger_node, "pi2");
1478
Austin Schuh79b30942021-01-24 22:32:21 -08001479 size_t mapper0_count = 0;
Austin Schuh993ccb52020-12-12 15:59:32 -08001480 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001481 mapper0.set_timestamp_callback(
1482 [&](TimestampedMessage *) { ++mapper0_count; });
1483 size_t mapper1_count = 0;
Austin Schuh993ccb52020-12-12 15:59:32 -08001484 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001485 mapper1.set_timestamp_callback(
1486 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuh993ccb52020-12-12 15:59:32 -08001487
1488 mapper0.AddPeer(&mapper1);
1489 mapper1.AddPeer(&mapper0);
1490
1491 {
1492 std::deque<TimestampedMessage> output1;
1493
1494 ASSERT_TRUE(mapper1.Front() != nullptr);
1495 output1.emplace_back(std::move(*mapper1.Front()));
1496 mapper1.PopFront();
1497
1498 ASSERT_TRUE(mapper1.Front() != nullptr);
1499 output1.emplace_back(std::move(*mapper1.Front()));
1500
1501 ASSERT_FALSE(mapper1.Front() == nullptr);
1502
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001503 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1504 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuh993ccb52020-12-12 15:59:32 -08001505 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001506 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001507
1508 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1509 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuh993ccb52020-12-12 15:59:32 -08001510 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001511 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh993ccb52020-12-12 15:59:32 -08001512 }
Austin Schuh79b30942021-01-24 22:32:21 -08001513
1514 EXPECT_EQ(mapper0_count, 0u);
1515 EXPECT_EQ(mapper1_count, 2u);
Austin Schuh993ccb52020-12-12 15:59:32 -08001516}
1517
Austin Schuhd2f96102020-12-01 20:27:29 -08001518// Tests that we properly sort log files with duplicate timestamps.
1519TEST_F(TimestampMapperTest, ReadSameTimestamp) {
1520 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1521 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001522 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001523 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001524 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001525 writer1.QueueSpan(config2_.span());
1526
Austin Schuhd863e6e2022-10-16 15:44:50 -07001527 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001528 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001529 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001530 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1531
Austin Schuhd863e6e2022-10-16 15:44:50 -07001532 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001533 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001534 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001535 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1536
Austin Schuhd863e6e2022-10-16 15:44:50 -07001537 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001538 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001539 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001540 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1541
Austin Schuhd863e6e2022-10-16 15:44:50 -07001542 writer0.WriteSizedFlatbuffer(
Austin Schuhd2f96102020-12-01 20:27:29 -08001543 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x008));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001544 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhd2f96102020-12-01 20:27:29 -08001545 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1546 }
1547
1548 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1549
1550 ASSERT_EQ(parts[0].logger_node, "pi1");
1551 ASSERT_EQ(parts[1].logger_node, "pi2");
1552
Austin Schuh79b30942021-01-24 22:32:21 -08001553 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001554 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001555 mapper0.set_timestamp_callback(
1556 [&](TimestampedMessage *) { ++mapper0_count; });
1557 size_t mapper1_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001558 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001559 mapper1.set_timestamp_callback(
1560 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -08001561
1562 mapper0.AddPeer(&mapper1);
1563 mapper1.AddPeer(&mapper0);
1564
1565 {
1566 SCOPED_TRACE("Trying node1 now");
1567 std::deque<TimestampedMessage> output1;
1568
1569 for (int i = 0; i < 4; ++i) {
1570 ASSERT_TRUE(mapper1.Front() != nullptr);
1571 output1.emplace_back(std::move(*mapper1.Front()));
1572 mapper1.PopFront();
1573 }
1574 ASSERT_TRUE(mapper1.Front() == nullptr);
1575
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001576 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1577 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001578 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001579 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001580
1581 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1582 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001583 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001584 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001585
1586 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1587 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001588 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001589 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001590
1591 EXPECT_EQ(output1[3].monotonic_event_time.boot, 0u);
1592 EXPECT_EQ(output1[3].monotonic_event_time.time,
Austin Schuhd2f96102020-12-01 20:27:29 -08001593 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001594 EXPECT_TRUE(output1[3].data != nullptr);
Austin Schuhd2f96102020-12-01 20:27:29 -08001595 }
Austin Schuh79b30942021-01-24 22:32:21 -08001596
1597 EXPECT_EQ(mapper0_count, 0u);
1598 EXPECT_EQ(mapper1_count, 4u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001599}
1600
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001601// Tests that we properly produce a valid start time.
Austin Schuhd2f96102020-12-01 20:27:29 -08001602TEST_F(TimestampMapperTest, StartTime) {
1603 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1604 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001605 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001606 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001607 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001608 writer1.QueueSpan(config1_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001609 TestDetachedBufferWriter writer2(logfile2_);
Austin Schuhd2f96102020-12-01 20:27:29 -08001610 writer2.QueueSpan(config3_.span());
1611 }
1612
1613 const std::vector<LogFile> parts =
1614 SortParts({logfile0_, logfile1_, logfile2_});
1615
Austin Schuh79b30942021-01-24 22:32:21 -08001616 size_t mapper0_count = 0;
Austin Schuhd2f96102020-12-01 20:27:29 -08001617 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
Austin Schuh79b30942021-01-24 22:32:21 -08001618 mapper0.set_timestamp_callback(
1619 [&](TimestampedMessage *) { ++mapper0_count; });
Austin Schuhd2f96102020-12-01 20:27:29 -08001620
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001621 EXPECT_EQ(mapper0.monotonic_start_time(0), e + chrono::milliseconds(1));
1622 EXPECT_EQ(mapper0.realtime_start_time(0),
Austin Schuhd2f96102020-12-01 20:27:29 -08001623 realtime_clock::time_point(chrono::seconds(1000)));
Austin Schuh79b30942021-01-24 22:32:21 -08001624 EXPECT_EQ(mapper0_count, 0u);
Austin Schuhd2f96102020-12-01 20:27:29 -08001625}
1626
Austin Schuhfecf1d82020-12-19 16:57:28 -08001627// Tests that when a peer isn't registered, we treat that as if there was no
1628// data available.
1629TEST_F(TimestampMapperTest, NoPeer) {
1630 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1631 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001632 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuhfecf1d82020-12-19 16:57:28 -08001633 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001634 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuhfecf1d82020-12-19 16:57:28 -08001635 writer1.QueueSpan(config2_.span());
1636
1637 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005);
Austin Schuhd863e6e2022-10-16 15:44:50 -07001638 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhfecf1d82020-12-19 16:57:28 -08001639 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1640
Austin Schuhd863e6e2022-10-16 15:44:50 -07001641 writer0.WriteSizedFlatbuffer(
Austin Schuhfecf1d82020-12-19 16:57:28 -08001642 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001643 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhfecf1d82020-12-19 16:57:28 -08001644 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1645
Austin Schuhd863e6e2022-10-16 15:44:50 -07001646 writer0.WriteSizedFlatbuffer(
Austin Schuhfecf1d82020-12-19 16:57:28 -08001647 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001648 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuhfecf1d82020-12-19 16:57:28 -08001649 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1650 }
1651
1652 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1653
1654 ASSERT_EQ(parts[0].logger_node, "pi1");
1655 ASSERT_EQ(parts[1].logger_node, "pi2");
1656
Austin Schuh79b30942021-01-24 22:32:21 -08001657 size_t mapper1_count = 0;
Austin Schuhfecf1d82020-12-19 16:57:28 -08001658 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
Austin Schuh79b30942021-01-24 22:32:21 -08001659 mapper1.set_timestamp_callback(
1660 [&](TimestampedMessage *) { ++mapper1_count; });
Austin Schuhfecf1d82020-12-19 16:57:28 -08001661
1662 {
1663 std::deque<TimestampedMessage> output1;
1664
1665 ASSERT_TRUE(mapper1.Front() != nullptr);
1666 output1.emplace_back(std::move(*mapper1.Front()));
1667 mapper1.PopFront();
1668 ASSERT_TRUE(mapper1.Front() != nullptr);
1669 output1.emplace_back(std::move(*mapper1.Front()));
1670 mapper1.PopFront();
1671 ASSERT_TRUE(mapper1.Front() != nullptr);
1672 output1.emplace_back(std::move(*mapper1.Front()));
1673 mapper1.PopFront();
1674 ASSERT_TRUE(mapper1.Front() == nullptr);
1675
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001676 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1677 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuhfecf1d82020-12-19 16:57:28 -08001678 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001679 EXPECT_FALSE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001680
1681 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1682 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuhfecf1d82020-12-19 16:57:28 -08001683 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001684 EXPECT_FALSE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001685
1686 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1687 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuhfecf1d82020-12-19 16:57:28 -08001688 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001689 EXPECT_FALSE(output1[2].data != nullptr);
Austin Schuhfecf1d82020-12-19 16:57:28 -08001690 }
Austin Schuh79b30942021-01-24 22:32:21 -08001691 EXPECT_EQ(mapper1_count, 3u);
1692}
1693
1694// Tests that we can queue messages and call the timestamp callback for both
1695// nodes.
1696TEST_F(TimestampMapperTest, QueueUntilNode0) {
1697 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1698 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001699 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh79b30942021-01-24 22:32:21 -08001700 writer0.QueueSpan(config0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001701 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh79b30942021-01-24 22:32:21 -08001702 writer1.QueueSpan(config2_.span());
1703
Austin Schuhd863e6e2022-10-16 15:44:50 -07001704 writer0.WriteSizedFlatbuffer(
Austin Schuh79b30942021-01-24 22:32:21 -08001705 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001706 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh79b30942021-01-24 22:32:21 -08001707 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1708
Austin Schuhd863e6e2022-10-16 15:44:50 -07001709 writer0.WriteSizedFlatbuffer(
Austin Schuh79b30942021-01-24 22:32:21 -08001710 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001711 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh79b30942021-01-24 22:32:21 -08001712 e + chrono::milliseconds(1000), 0, chrono::seconds(100)));
1713
Austin Schuhd863e6e2022-10-16 15:44:50 -07001714 writer0.WriteSizedFlatbuffer(
Austin Schuh79b30942021-01-24 22:32:21 -08001715 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001716 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh79b30942021-01-24 22:32:21 -08001717 e + chrono::milliseconds(2000), 0, chrono::seconds(100)));
1718
Austin Schuhd863e6e2022-10-16 15:44:50 -07001719 writer0.WriteSizedFlatbuffer(
Austin Schuh79b30942021-01-24 22:32:21 -08001720 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x008));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001721 writer1.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh79b30942021-01-24 22:32:21 -08001722 e + chrono::milliseconds(3000), 0, chrono::seconds(100)));
1723 }
1724
1725 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1726
1727 ASSERT_EQ(parts[0].logger_node, "pi1");
1728 ASSERT_EQ(parts[1].logger_node, "pi2");
1729
1730 size_t mapper0_count = 0;
1731 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
1732 mapper0.set_timestamp_callback(
1733 [&](TimestampedMessage *) { ++mapper0_count; });
1734 size_t mapper1_count = 0;
1735 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
1736 mapper1.set_timestamp_callback(
1737 [&](TimestampedMessage *) { ++mapper1_count; });
1738
1739 mapper0.AddPeer(&mapper1);
1740 mapper1.AddPeer(&mapper0);
1741
1742 {
1743 std::deque<TimestampedMessage> output0;
1744
1745 EXPECT_EQ(mapper0_count, 0u);
1746 EXPECT_EQ(mapper1_count, 0u);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001747 mapper0.QueueUntil(
1748 BootTimestamp{.boot = 0, .time = e + chrono::milliseconds(1000)});
Austin Schuh79b30942021-01-24 22:32:21 -08001749 EXPECT_EQ(mapper0_count, 3u);
1750 EXPECT_EQ(mapper1_count, 0u);
1751
1752 ASSERT_TRUE(mapper0.Front() != nullptr);
1753 EXPECT_EQ(mapper0_count, 3u);
1754 EXPECT_EQ(mapper1_count, 0u);
1755
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001756 mapper0.QueueUntil(
1757 BootTimestamp{.boot = 0, .time = e + chrono::milliseconds(1500)});
Austin Schuh79b30942021-01-24 22:32:21 -08001758 EXPECT_EQ(mapper0_count, 3u);
1759 EXPECT_EQ(mapper1_count, 0u);
1760
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001761 mapper0.QueueUntil(
1762 BootTimestamp{.boot = 0, .time = e + chrono::milliseconds(2500)});
Austin Schuh79b30942021-01-24 22:32:21 -08001763 EXPECT_EQ(mapper0_count, 4u);
1764 EXPECT_EQ(mapper1_count, 0u);
1765
1766 output0.emplace_back(std::move(*mapper0.Front()));
1767 mapper0.PopFront();
1768 output0.emplace_back(std::move(*mapper0.Front()));
1769 mapper0.PopFront();
1770 output0.emplace_back(std::move(*mapper0.Front()));
1771 mapper0.PopFront();
1772 output0.emplace_back(std::move(*mapper0.Front()));
1773 mapper0.PopFront();
1774
1775 EXPECT_EQ(mapper0_count, 4u);
1776 EXPECT_EQ(mapper1_count, 0u);
1777
1778 ASSERT_TRUE(mapper0.Front() == nullptr);
1779
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001780 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
1781 EXPECT_EQ(output0[0].monotonic_event_time.time,
1782 e + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001783 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001784
1785 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
1786 EXPECT_EQ(output0[1].monotonic_event_time.time,
1787 e + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001788 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001789
1790 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
1791 EXPECT_EQ(output0[2].monotonic_event_time.time,
1792 e + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001793 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001794
1795 EXPECT_EQ(output0[3].monotonic_event_time.boot, 0u);
1796 EXPECT_EQ(output0[3].monotonic_event_time.time,
1797 e + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001798 EXPECT_TRUE(output0[3].data != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -08001799 }
1800
1801 {
1802 SCOPED_TRACE("Trying node1 now");
1803 std::deque<TimestampedMessage> output1;
1804
1805 EXPECT_EQ(mapper0_count, 4u);
1806 EXPECT_EQ(mapper1_count, 0u);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001807 mapper1.QueueUntil(BootTimestamp{
1808 .boot = 0,
1809 .time = e + chrono::seconds(100) + chrono::milliseconds(1000)});
Austin Schuh79b30942021-01-24 22:32:21 -08001810 EXPECT_EQ(mapper0_count, 4u);
1811 EXPECT_EQ(mapper1_count, 3u);
1812
1813 ASSERT_TRUE(mapper1.Front() != nullptr);
1814 EXPECT_EQ(mapper0_count, 4u);
1815 EXPECT_EQ(mapper1_count, 3u);
1816
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001817 mapper1.QueueUntil(BootTimestamp{
1818 .boot = 0,
1819 .time = e + chrono::seconds(100) + chrono::milliseconds(1500)});
Austin Schuh79b30942021-01-24 22:32:21 -08001820 EXPECT_EQ(mapper0_count, 4u);
1821 EXPECT_EQ(mapper1_count, 3u);
1822
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001823 mapper1.QueueUntil(BootTimestamp{
1824 .boot = 0,
1825 .time = e + chrono::seconds(100) + chrono::milliseconds(2500)});
Austin Schuh79b30942021-01-24 22:32:21 -08001826 EXPECT_EQ(mapper0_count, 4u);
1827 EXPECT_EQ(mapper1_count, 4u);
1828
1829 ASSERT_TRUE(mapper1.Front() != nullptr);
1830 EXPECT_EQ(mapper0_count, 4u);
1831 EXPECT_EQ(mapper1_count, 4u);
1832
1833 output1.emplace_back(std::move(*mapper1.Front()));
1834 mapper1.PopFront();
1835 ASSERT_TRUE(mapper1.Front() != nullptr);
1836 output1.emplace_back(std::move(*mapper1.Front()));
1837 mapper1.PopFront();
1838 ASSERT_TRUE(mapper1.Front() != nullptr);
1839 output1.emplace_back(std::move(*mapper1.Front()));
1840 mapper1.PopFront();
1841 ASSERT_TRUE(mapper1.Front() != nullptr);
1842 output1.emplace_back(std::move(*mapper1.Front()));
1843 mapper1.PopFront();
1844
1845 EXPECT_EQ(mapper0_count, 4u);
1846 EXPECT_EQ(mapper1_count, 4u);
1847
1848 ASSERT_TRUE(mapper1.Front() == nullptr);
1849
1850 EXPECT_EQ(mapper0_count, 4u);
1851 EXPECT_EQ(mapper1_count, 4u);
1852
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001853 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
1854 EXPECT_EQ(output1[0].monotonic_event_time.time,
Austin Schuh79b30942021-01-24 22:32:21 -08001855 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001856 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001857
1858 EXPECT_EQ(output1[1].monotonic_event_time.boot, 0u);
1859 EXPECT_EQ(output1[1].monotonic_event_time.time,
Austin Schuh79b30942021-01-24 22:32:21 -08001860 e + chrono::seconds(100) + chrono::milliseconds(1000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001861 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001862
1863 EXPECT_EQ(output1[2].monotonic_event_time.boot, 0u);
1864 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuh79b30942021-01-24 22:32:21 -08001865 e + chrono::seconds(100) + chrono::milliseconds(2000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001866 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07001867
1868 EXPECT_EQ(output1[3].monotonic_event_time.boot, 0u);
1869 EXPECT_EQ(output1[3].monotonic_event_time.time,
Austin Schuh79b30942021-01-24 22:32:21 -08001870 e + chrono::seconds(100) + chrono::milliseconds(3000));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07001871 EXPECT_TRUE(output1[3].data != nullptr);
Austin Schuh79b30942021-01-24 22:32:21 -08001872 }
Austin Schuhfecf1d82020-12-19 16:57:28 -08001873}
1874
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001875class BootMergerTest : public SortingElementTest {
1876 public:
1877 BootMergerTest()
1878 : SortingElementTest(),
1879 boot0_(MakeHeader(config_, R"({
Austin Schuh8bee6882021-06-28 21:03:28 -07001880 /* 100ms */
1881 "max_out_of_order_duration": 100000000,
1882 "node": {
1883 "name": "pi2"
1884 },
1885 "logger_node": {
1886 "name": "pi1"
1887 },
1888 "monotonic_start_time": 1000000,
1889 "realtime_start_time": 1000000000000,
1890 "logger_monotonic_start_time": 1000000,
1891 "logger_realtime_start_time": 1000000000000,
1892 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
1893 "parts_uuid": "1a9e5ca2-31b2-475b-8282-88f6d1ce5109",
1894 "parts_index": 0,
1895 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
1896 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
Austin Schuh48507722021-07-17 17:29:24 -07001897 "source_node_boot_uuid": "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
1898 "boot_uuids": [
1899 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
1900 "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
1901 ""
1902 ]
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001903})")),
1904 boot1_(MakeHeader(config_, R"({
Austin Schuh8bee6882021-06-28 21:03:28 -07001905 /* 100ms */
1906 "max_out_of_order_duration": 100000000,
1907 "node": {
1908 "name": "pi2"
1909 },
1910 "logger_node": {
1911 "name": "pi1"
1912 },
1913 "monotonic_start_time": 1000000,
1914 "realtime_start_time": 1000000000000,
1915 "logger_monotonic_start_time": 1000000,
1916 "logger_realtime_start_time": 1000000000000,
1917 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
1918 "parts_uuid": "2a05d725-5d5c-4c0b-af42-88de2f3c3876",
1919 "parts_index": 1,
1920 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
1921 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
Austin Schuh48507722021-07-17 17:29:24 -07001922 "source_node_boot_uuid": "b728d27a-9181-4eac-bfc1-5d09b80469d2",
1923 "boot_uuids": [
1924 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
1925 "b728d27a-9181-4eac-bfc1-5d09b80469d2",
1926 ""
1927 ]
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001928})")) {}
Austin Schuh8bee6882021-06-28 21:03:28 -07001929
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001930 protected:
1931 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot0_;
1932 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot1_;
1933};
1934
1935// This tests that we can properly sort a multi-node log file which has the old
1936// (and buggy) timestamps in the header, and the non-resetting parts_index.
1937// These make it so we can just bairly figure out what happened first and what
1938// happened second, but not in a way that is robust to multiple nodes rebooting.
1939TEST_F(BootMergerTest, OldReboot) {
Austin Schuh8bee6882021-06-28 21:03:28 -07001940 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001941 TestDetachedBufferWriter writer(logfile0_);
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001942 writer.QueueSpan(boot0_.span());
Austin Schuh8bee6882021-06-28 21:03:28 -07001943 }
1944 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001945 TestDetachedBufferWriter writer(logfile1_);
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001946 writer.QueueSpan(boot1_.span());
Austin Schuh8bee6882021-06-28 21:03:28 -07001947 }
1948
1949 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1950
1951 ASSERT_EQ(parts.size(), 1u);
1952 ASSERT_EQ(parts[0].parts.size(), 2u);
1953
1954 EXPECT_EQ(parts[0].parts[0].boot_count, 0);
1955 EXPECT_EQ(parts[0].parts[0].source_boot_uuid,
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001956 boot0_.message().source_node_boot_uuid()->string_view());
Austin Schuh8bee6882021-06-28 21:03:28 -07001957
1958 EXPECT_EQ(parts[0].parts[1].boot_count, 1);
1959 EXPECT_EQ(parts[0].parts[1].source_boot_uuid,
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001960 boot1_.message().source_node_boot_uuid()->string_view());
1961}
1962
1963// This tests that we can produce messages ordered across a reboot.
1964TEST_F(BootMergerTest, SortAcrossReboot) {
1965 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
1966 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001967 TestDetachedBufferWriter writer(logfile0_);
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001968 writer.QueueSpan(boot0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001969 writer.WriteSizedFlatbuffer(
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001970 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001971 writer.WriteSizedFlatbuffer(
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001972 MakeLogMessage(e + chrono::milliseconds(2000), 1, 0x105));
1973 }
1974 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07001975 TestDetachedBufferWriter writer(logfile1_);
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001976 writer.QueueSpan(boot1_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07001977 writer.WriteSizedFlatbuffer(
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001978 MakeLogMessage(e + chrono::milliseconds(100), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07001979 writer.WriteSizedFlatbuffer(
Austin Schuhf16ef6a2021-06-30 21:48:17 -07001980 MakeLogMessage(e + chrono::milliseconds(200), 1, 0x106));
1981 }
1982
1983 const std::vector<LogFile> parts = SortParts({logfile0_, logfile1_});
1984 ASSERT_EQ(parts.size(), 1u);
1985 ASSERT_EQ(parts[0].parts.size(), 2u);
1986
1987 BootMerger merger(FilterPartsForNode(parts, "pi2"));
1988
1989 EXPECT_EQ(merger.node(), 1u);
1990
1991 std::vector<Message> output;
1992 for (int i = 0; i < 4; ++i) {
1993 ASSERT_TRUE(merger.Front() != nullptr);
1994 output.emplace_back(std::move(*merger.Front()));
1995 merger.PopFront();
1996 }
1997
1998 ASSERT_TRUE(merger.Front() == nullptr);
1999
Austin Schuh2dc8c7d2021-07-01 17:41:28 -07002000 EXPECT_EQ(output[0].timestamp.boot, 0u);
2001 EXPECT_EQ(output[0].timestamp.time, e + chrono::milliseconds(1000));
2002 EXPECT_EQ(output[1].timestamp.boot, 0u);
2003 EXPECT_EQ(output[1].timestamp.time, e + chrono::milliseconds(2000));
2004
2005 EXPECT_EQ(output[2].timestamp.boot, 1u);
2006 EXPECT_EQ(output[2].timestamp.time, e + chrono::milliseconds(100));
2007 EXPECT_EQ(output[3].timestamp.boot, 1u);
2008 EXPECT_EQ(output[3].timestamp.time, e + chrono::milliseconds(200));
Austin Schuh8bee6882021-06-28 21:03:28 -07002009}
2010
Austin Schuh48507722021-07-17 17:29:24 -07002011class RebootTimestampMapperTest : public SortingElementTest {
2012 public:
2013 RebootTimestampMapperTest()
2014 : SortingElementTest(),
2015 boot0a_(MakeHeader(config_, R"({
2016 /* 100ms */
2017 "max_out_of_order_duration": 100000000,
2018 "node": {
2019 "name": "pi1"
2020 },
2021 "logger_node": {
2022 "name": "pi1"
2023 },
2024 "monotonic_start_time": 1000000,
2025 "realtime_start_time": 1000000000000,
2026 "logger_monotonic_start_time": 1000000,
2027 "logger_realtime_start_time": 1000000000000,
2028 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2029 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2030 "parts_index": 0,
2031 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2032 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2033 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2034 "boot_uuids": [
2035 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2036 "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
2037 ""
2038 ]
2039})")),
2040 boot0b_(MakeHeader(config_, R"({
2041 /* 100ms */
2042 "max_out_of_order_duration": 100000000,
2043 "node": {
2044 "name": "pi1"
2045 },
2046 "logger_node": {
2047 "name": "pi1"
2048 },
2049 "monotonic_start_time": 1000000,
2050 "realtime_start_time": 1000000000000,
2051 "logger_monotonic_start_time": 1000000,
2052 "logger_realtime_start_time": 1000000000000,
2053 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2054 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2055 "parts_index": 1,
2056 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2057 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2058 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2059 "boot_uuids": [
2060 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2061 "b728d27a-9181-4eac-bfc1-5d09b80469d2",
2062 ""
2063 ]
2064})")),
2065 boot1a_(MakeHeader(config_, R"({
2066 /* 100ms */
2067 "max_out_of_order_duration": 100000000,
2068 "node": {
2069 "name": "pi2"
2070 },
2071 "logger_node": {
2072 "name": "pi1"
2073 },
2074 "monotonic_start_time": 1000000,
2075 "realtime_start_time": 1000000000000,
2076 "logger_monotonic_start_time": 1000000,
2077 "logger_realtime_start_time": 1000000000000,
2078 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2079 "parts_uuid": "f6ab0cdc-a654-456d-bfd9-2bbc09098edf",
2080 "parts_index": 0,
2081 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2082 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2083 "source_node_boot_uuid": "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
2084 "boot_uuids": [
2085 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2086 "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
2087 ""
2088 ]
2089})")),
2090 boot1b_(MakeHeader(config_, R"({
2091 /* 100ms */
2092 "max_out_of_order_duration": 100000000,
2093 "node": {
2094 "name": "pi2"
2095 },
2096 "logger_node": {
2097 "name": "pi1"
2098 },
2099 "monotonic_start_time": 1000000,
2100 "realtime_start_time": 1000000000000,
2101 "logger_monotonic_start_time": 1000000,
2102 "logger_realtime_start_time": 1000000000000,
2103 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2104 "parts_uuid": "3a9d0445-f520-43ca-93f5-e2cc7f54d40a",
2105 "parts_index": 1,
2106 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2107 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2108 "source_node_boot_uuid": "b728d27a-9181-4eac-bfc1-5d09b80469d2",
2109 "boot_uuids": [
2110 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2111 "b728d27a-9181-4eac-bfc1-5d09b80469d2",
2112 ""
2113 ]
2114})")) {}
2115
2116 protected:
2117 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot0a_;
2118 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot0b_;
2119 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot1a_;
2120 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> boot1b_;
2121};
2122
Austin Schuh48507722021-07-17 17:29:24 -07002123// Tests that we can match timestamps on delivered messages in the presence of
2124// reboots on the node receiving timestamps.
2125TEST_F(RebootTimestampMapperTest, ReadNode0First) {
2126 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
2127 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07002128 TestDetachedBufferWriter writer0a(logfile0_);
Austin Schuh48507722021-07-17 17:29:24 -07002129 writer0a.QueueSpan(boot0a_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002130 TestDetachedBufferWriter writer0b(logfile1_);
Austin Schuh48507722021-07-17 17:29:24 -07002131 writer0b.QueueSpan(boot0b_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002132 TestDetachedBufferWriter writer1a(logfile2_);
Austin Schuh48507722021-07-17 17:29:24 -07002133 writer1a.QueueSpan(boot1a_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002134 TestDetachedBufferWriter writer1b(logfile3_);
Austin Schuh48507722021-07-17 17:29:24 -07002135 writer1b.QueueSpan(boot1b_.span());
2136
Austin Schuhd863e6e2022-10-16 15:44:50 -07002137 writer0a.WriteSizedFlatbuffer(
Austin Schuh48507722021-07-17 17:29:24 -07002138 MakeLogMessage(e + chrono::milliseconds(1000), 0, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002139 writer1a.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002140 e + chrono::milliseconds(1000), 0, chrono::seconds(100),
2141 e + chrono::milliseconds(1001)));
2142
Austin Schuhd863e6e2022-10-16 15:44:50 -07002143 writer1b.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh58646e22021-08-23 23:51:46 -07002144 e + chrono::milliseconds(1000), 0, chrono::seconds(21),
2145 e + chrono::milliseconds(2001)));
2146
Austin Schuhd863e6e2022-10-16 15:44:50 -07002147 writer0b.WriteSizedFlatbuffer(
Austin Schuh48507722021-07-17 17:29:24 -07002148 MakeLogMessage(e + chrono::milliseconds(2000), 0, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002149 writer1b.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002150 e + chrono::milliseconds(2000), 0, chrono::seconds(20),
2151 e + chrono::milliseconds(2001)));
2152
Austin Schuhd863e6e2022-10-16 15:44:50 -07002153 writer0b.WriteSizedFlatbuffer(
Austin Schuh48507722021-07-17 17:29:24 -07002154 MakeLogMessage(e + chrono::milliseconds(3000), 0, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002155 writer1b.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002156 e + chrono::milliseconds(3000), 0, chrono::seconds(20),
2157 e + chrono::milliseconds(3001)));
2158 }
2159
Austin Schuh58646e22021-08-23 23:51:46 -07002160 const std::vector<LogFile> parts =
2161 SortParts({logfile0_, logfile1_, logfile2_, logfile3_});
Austin Schuh48507722021-07-17 17:29:24 -07002162
2163 for (const auto &x : parts) {
2164 LOG(INFO) << x;
2165 }
2166 ASSERT_EQ(parts.size(), 1u);
2167 ASSERT_EQ(parts[0].logger_node, "pi1");
2168
2169 size_t mapper0_count = 0;
2170 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
2171 mapper0.set_timestamp_callback(
2172 [&](TimestampedMessage *) { ++mapper0_count; });
2173 size_t mapper1_count = 0;
2174 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
2175 mapper1.set_timestamp_callback(
2176 [&](TimestampedMessage *) { ++mapper1_count; });
2177
2178 mapper0.AddPeer(&mapper1);
2179 mapper1.AddPeer(&mapper0);
2180
2181 {
2182 std::deque<TimestampedMessage> output0;
2183
2184 EXPECT_EQ(mapper0_count, 0u);
2185 EXPECT_EQ(mapper1_count, 0u);
2186 ASSERT_TRUE(mapper0.Front() != nullptr);
2187 EXPECT_EQ(mapper0_count, 1u);
2188 EXPECT_EQ(mapper1_count, 0u);
2189 output0.emplace_back(std::move(*mapper0.Front()));
2190 mapper0.PopFront();
2191 EXPECT_TRUE(mapper0.started());
2192 EXPECT_EQ(mapper0_count, 1u);
2193 EXPECT_EQ(mapper1_count, 0u);
2194
2195 ASSERT_TRUE(mapper0.Front() != nullptr);
2196 EXPECT_EQ(mapper0_count, 2u);
2197 EXPECT_EQ(mapper1_count, 0u);
2198 output0.emplace_back(std::move(*mapper0.Front()));
2199 mapper0.PopFront();
2200 EXPECT_TRUE(mapper0.started());
2201
2202 ASSERT_TRUE(mapper0.Front() != nullptr);
2203 output0.emplace_back(std::move(*mapper0.Front()));
2204 mapper0.PopFront();
2205 EXPECT_TRUE(mapper0.started());
2206
2207 EXPECT_EQ(mapper0_count, 3u);
2208 EXPECT_EQ(mapper1_count, 0u);
2209
2210 ASSERT_TRUE(mapper0.Front() == nullptr);
2211
2212 LOG(INFO) << output0[0];
2213 LOG(INFO) << output0[1];
2214 LOG(INFO) << output0[2];
2215
2216 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
2217 EXPECT_EQ(output0[0].monotonic_event_time.time,
2218 e + chrono::milliseconds(1000));
Austin Schuh58646e22021-08-23 23:51:46 -07002219 EXPECT_EQ(output0[0].queue_index,
2220 (BootQueueIndex{.boot = 0u, .index = 0u}));
Austin Schuh48507722021-07-17 17:29:24 -07002221 EXPECT_EQ(output0[0].monotonic_remote_time, BootTimestamp::min_time());
2222 EXPECT_EQ(output0[0].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002223 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002224
2225 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
2226 EXPECT_EQ(output0[1].monotonic_event_time.time,
2227 e + chrono::milliseconds(2000));
Austin Schuh58646e22021-08-23 23:51:46 -07002228 EXPECT_EQ(output0[1].queue_index,
2229 (BootQueueIndex{.boot = 0u, .index = 1u}));
Austin Schuh48507722021-07-17 17:29:24 -07002230 EXPECT_EQ(output0[1].monotonic_remote_time, BootTimestamp::min_time());
2231 EXPECT_EQ(output0[1].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002232 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002233
2234 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
2235 EXPECT_EQ(output0[2].monotonic_event_time.time,
2236 e + chrono::milliseconds(3000));
Austin Schuh58646e22021-08-23 23:51:46 -07002237 EXPECT_EQ(output0[2].queue_index,
2238 (BootQueueIndex{.boot = 0u, .index = 2u}));
Austin Schuh48507722021-07-17 17:29:24 -07002239 EXPECT_EQ(output0[2].monotonic_remote_time, BootTimestamp::min_time());
2240 EXPECT_EQ(output0[2].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002241 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002242 }
2243
2244 {
2245 SCOPED_TRACE("Trying node1 now");
2246 std::deque<TimestampedMessage> output1;
2247
2248 EXPECT_EQ(mapper0_count, 3u);
2249 EXPECT_EQ(mapper1_count, 0u);
2250
2251 ASSERT_TRUE(mapper1.Front() != nullptr);
2252 EXPECT_EQ(mapper0_count, 3u);
2253 EXPECT_EQ(mapper1_count, 1u);
2254 output1.emplace_back(std::move(*mapper1.Front()));
2255 mapper1.PopFront();
2256 EXPECT_TRUE(mapper1.started());
2257 EXPECT_EQ(mapper0_count, 3u);
2258 EXPECT_EQ(mapper1_count, 1u);
2259
2260 ASSERT_TRUE(mapper1.Front() != nullptr);
2261 EXPECT_EQ(mapper0_count, 3u);
2262 EXPECT_EQ(mapper1_count, 2u);
2263 output1.emplace_back(std::move(*mapper1.Front()));
2264 mapper1.PopFront();
2265 EXPECT_TRUE(mapper1.started());
2266
2267 ASSERT_TRUE(mapper1.Front() != nullptr);
2268 output1.emplace_back(std::move(*mapper1.Front()));
2269 mapper1.PopFront();
2270 EXPECT_TRUE(mapper1.started());
2271
Austin Schuh58646e22021-08-23 23:51:46 -07002272 ASSERT_TRUE(mapper1.Front() != nullptr);
2273 output1.emplace_back(std::move(*mapper1.Front()));
2274 mapper1.PopFront();
2275 EXPECT_TRUE(mapper1.started());
2276
Austin Schuh48507722021-07-17 17:29:24 -07002277 EXPECT_EQ(mapper0_count, 3u);
Austin Schuh58646e22021-08-23 23:51:46 -07002278 EXPECT_EQ(mapper1_count, 4u);
Austin Schuh48507722021-07-17 17:29:24 -07002279
2280 ASSERT_TRUE(mapper1.Front() == nullptr);
2281
2282 EXPECT_EQ(mapper0_count, 3u);
Austin Schuh58646e22021-08-23 23:51:46 -07002283 EXPECT_EQ(mapper1_count, 4u);
Austin Schuh48507722021-07-17 17:29:24 -07002284
2285 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
2286 EXPECT_EQ(output1[0].monotonic_event_time.time,
2287 e + chrono::seconds(100) + chrono::milliseconds(1000));
2288 EXPECT_EQ(output1[0].monotonic_remote_time.boot, 0u);
2289 EXPECT_EQ(output1[0].monotonic_remote_time.time,
2290 e + chrono::milliseconds(1000));
Austin Schuh58646e22021-08-23 23:51:46 -07002291 EXPECT_EQ(output1[0].remote_queue_index,
2292 (BootQueueIndex{.boot = 0u, .index = 0u}));
Austin Schuh48507722021-07-17 17:29:24 -07002293 EXPECT_EQ(output1[0].monotonic_timestamp_time.boot, 0u);
2294 EXPECT_EQ(output1[0].monotonic_timestamp_time.time,
2295 e + chrono::milliseconds(1001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002296 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002297
2298 EXPECT_EQ(output1[1].monotonic_event_time.boot, 1u);
2299 EXPECT_EQ(output1[1].monotonic_event_time.time,
2300 e + chrono::seconds(20) + chrono::milliseconds(2000));
Austin Schuh58646e22021-08-23 23:51:46 -07002301 EXPECT_EQ(output1[1].remote_queue_index,
2302 (BootQueueIndex{.boot = 0u, .index = 0u}));
Austin Schuh48507722021-07-17 17:29:24 -07002303 EXPECT_EQ(output1[1].monotonic_remote_time.boot, 0u);
2304 EXPECT_EQ(output1[1].monotonic_remote_time.time,
Austin Schuh58646e22021-08-23 23:51:46 -07002305 e + chrono::milliseconds(1000));
Austin Schuh48507722021-07-17 17:29:24 -07002306 EXPECT_EQ(output1[1].monotonic_timestamp_time.boot, 0u);
2307 EXPECT_EQ(output1[1].monotonic_timestamp_time.time,
2308 e + chrono::milliseconds(2001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002309 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002310
2311 EXPECT_EQ(output1[2].monotonic_event_time.boot, 1u);
2312 EXPECT_EQ(output1[2].monotonic_event_time.time,
Austin Schuh58646e22021-08-23 23:51:46 -07002313 e + chrono::seconds(20) + chrono::milliseconds(2000));
Austin Schuh48507722021-07-17 17:29:24 -07002314 EXPECT_EQ(output1[2].monotonic_remote_time.boot, 0u);
2315 EXPECT_EQ(output1[2].monotonic_remote_time.time,
Austin Schuh58646e22021-08-23 23:51:46 -07002316 e + chrono::milliseconds(2000));
2317 EXPECT_EQ(output1[2].remote_queue_index,
2318 (BootQueueIndex{.boot = 0u, .index = 1u}));
Austin Schuh48507722021-07-17 17:29:24 -07002319 EXPECT_EQ(output1[2].monotonic_timestamp_time.boot, 0u);
2320 EXPECT_EQ(output1[2].monotonic_timestamp_time.time,
Austin Schuh58646e22021-08-23 23:51:46 -07002321 e + chrono::milliseconds(2001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002322 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002323
Austin Schuh58646e22021-08-23 23:51:46 -07002324 EXPECT_EQ(output1[3].monotonic_event_time.boot, 1u);
2325 EXPECT_EQ(output1[3].monotonic_event_time.time,
2326 e + chrono::seconds(20) + chrono::milliseconds(3000));
2327 EXPECT_EQ(output1[3].monotonic_remote_time.boot, 0u);
2328 EXPECT_EQ(output1[3].monotonic_remote_time.time,
2329 e + chrono::milliseconds(3000));
2330 EXPECT_EQ(output1[3].remote_queue_index,
2331 (BootQueueIndex{.boot = 0u, .index = 2u}));
2332 EXPECT_EQ(output1[3].monotonic_timestamp_time.boot, 0u);
2333 EXPECT_EQ(output1[3].monotonic_timestamp_time.time,
2334 e + chrono::milliseconds(3001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002335 EXPECT_TRUE(output1[3].data != nullptr);
Austin Schuh58646e22021-08-23 23:51:46 -07002336
Austin Schuh48507722021-07-17 17:29:24 -07002337 LOG(INFO) << output1[0];
2338 LOG(INFO) << output1[1];
2339 LOG(INFO) << output1[2];
Austin Schuh58646e22021-08-23 23:51:46 -07002340 LOG(INFO) << output1[3];
Austin Schuh48507722021-07-17 17:29:24 -07002341 }
2342}
2343
2344TEST_F(RebootTimestampMapperTest, Node2Reboot) {
2345 const aos::monotonic_clock::time_point e = monotonic_clock::epoch();
2346 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07002347 TestDetachedBufferWriter writer0a(logfile0_);
Austin Schuh48507722021-07-17 17:29:24 -07002348 writer0a.QueueSpan(boot0a_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002349 TestDetachedBufferWriter writer0b(logfile1_);
Austin Schuh48507722021-07-17 17:29:24 -07002350 writer0b.QueueSpan(boot0b_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002351 TestDetachedBufferWriter writer1a(logfile2_);
Austin Schuh48507722021-07-17 17:29:24 -07002352 writer1a.QueueSpan(boot1a_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002353 TestDetachedBufferWriter writer1b(logfile3_);
Austin Schuh48507722021-07-17 17:29:24 -07002354 writer1b.QueueSpan(boot1b_.span());
2355
Austin Schuhd863e6e2022-10-16 15:44:50 -07002356 writer1a.WriteSizedFlatbuffer(MakeLogMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002357 e + chrono::seconds(100) + chrono::milliseconds(1000), 3, 0x005));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002358 writer0a.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002359 e + chrono::seconds(100) + chrono::milliseconds(1000), 3,
2360 chrono::seconds(-100),
2361 e + chrono::seconds(100) + chrono::milliseconds(1001)));
2362
Austin Schuhd863e6e2022-10-16 15:44:50 -07002363 writer1b.WriteSizedFlatbuffer(MakeLogMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002364 e + chrono::seconds(20) + chrono::milliseconds(2000), 3, 0x006));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002365 writer0b.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002366 e + chrono::seconds(20) + chrono::milliseconds(2000), 3,
2367 chrono::seconds(-20),
2368 e + chrono::seconds(20) + chrono::milliseconds(2001)));
2369
Austin Schuhd863e6e2022-10-16 15:44:50 -07002370 writer1b.WriteSizedFlatbuffer(MakeLogMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002371 e + chrono::seconds(20) + chrono::milliseconds(3000), 3, 0x007));
Austin Schuhd863e6e2022-10-16 15:44:50 -07002372 writer0b.WriteSizedFlatbuffer(MakeTimestampMessage(
Austin Schuh48507722021-07-17 17:29:24 -07002373 e + chrono::seconds(20) + chrono::milliseconds(3000), 3,
2374 chrono::seconds(-20),
2375 e + chrono::seconds(20) + chrono::milliseconds(3001)));
2376 }
2377
2378 const std::vector<LogFile> parts =
2379 SortParts({logfile0_, logfile1_, logfile2_, logfile3_});
2380
2381 for (const auto &x : parts) {
2382 LOG(INFO) << x;
2383 }
2384 ASSERT_EQ(parts.size(), 1u);
2385 ASSERT_EQ(parts[0].logger_node, "pi1");
2386
2387 size_t mapper0_count = 0;
2388 TimestampMapper mapper0(FilterPartsForNode(parts, "pi1"));
2389 mapper0.set_timestamp_callback(
2390 [&](TimestampedMessage *) { ++mapper0_count; });
2391 size_t mapper1_count = 0;
2392 TimestampMapper mapper1(FilterPartsForNode(parts, "pi2"));
2393 mapper1.set_timestamp_callback(
2394 [&](TimestampedMessage *) { ++mapper1_count; });
2395
2396 mapper0.AddPeer(&mapper1);
2397 mapper1.AddPeer(&mapper0);
2398
2399 {
2400 std::deque<TimestampedMessage> output0;
2401
2402 EXPECT_EQ(mapper0_count, 0u);
2403 EXPECT_EQ(mapper1_count, 0u);
2404 ASSERT_TRUE(mapper0.Front() != nullptr);
2405 EXPECT_EQ(mapper0_count, 1u);
2406 EXPECT_EQ(mapper1_count, 0u);
2407 output0.emplace_back(std::move(*mapper0.Front()));
2408 mapper0.PopFront();
2409 EXPECT_TRUE(mapper0.started());
2410 EXPECT_EQ(mapper0_count, 1u);
2411 EXPECT_EQ(mapper1_count, 0u);
2412
2413 ASSERT_TRUE(mapper0.Front() != nullptr);
2414 EXPECT_EQ(mapper0_count, 2u);
2415 EXPECT_EQ(mapper1_count, 0u);
2416 output0.emplace_back(std::move(*mapper0.Front()));
2417 mapper0.PopFront();
2418 EXPECT_TRUE(mapper0.started());
2419
2420 ASSERT_TRUE(mapper0.Front() != nullptr);
2421 output0.emplace_back(std::move(*mapper0.Front()));
2422 mapper0.PopFront();
2423 EXPECT_TRUE(mapper0.started());
2424
2425 EXPECT_EQ(mapper0_count, 3u);
2426 EXPECT_EQ(mapper1_count, 0u);
2427
2428 ASSERT_TRUE(mapper0.Front() == nullptr);
2429
2430 LOG(INFO) << output0[0];
2431 LOG(INFO) << output0[1];
2432 LOG(INFO) << output0[2];
2433
2434 EXPECT_EQ(output0[0].monotonic_event_time.boot, 0u);
2435 EXPECT_EQ(output0[0].monotonic_event_time.time,
2436 e + chrono::milliseconds(1000));
2437 EXPECT_EQ(output0[0].monotonic_remote_time.boot, 0u);
2438 EXPECT_EQ(output0[0].monotonic_remote_time.time,
2439 e + chrono::seconds(100) + chrono::milliseconds(1000));
2440 EXPECT_EQ(output0[0].monotonic_timestamp_time.boot, 0u);
2441 EXPECT_EQ(output0[0].monotonic_timestamp_time.time,
2442 e + chrono::seconds(100) + chrono::milliseconds(1001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002443 EXPECT_TRUE(output0[0].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002444
2445 EXPECT_EQ(output0[1].monotonic_event_time.boot, 0u);
2446 EXPECT_EQ(output0[1].monotonic_event_time.time,
2447 e + chrono::milliseconds(2000));
2448 EXPECT_EQ(output0[1].monotonic_remote_time.boot, 1u);
2449 EXPECT_EQ(output0[1].monotonic_remote_time.time,
2450 e + chrono::seconds(20) + chrono::milliseconds(2000));
2451 EXPECT_EQ(output0[1].monotonic_timestamp_time.boot, 0u);
2452 EXPECT_EQ(output0[1].monotonic_timestamp_time.time,
2453 e + chrono::seconds(20) + chrono::milliseconds(2001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002454 EXPECT_TRUE(output0[1].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002455
2456 EXPECT_EQ(output0[2].monotonic_event_time.boot, 0u);
2457 EXPECT_EQ(output0[2].monotonic_event_time.time,
2458 e + chrono::milliseconds(3000));
2459 EXPECT_EQ(output0[2].monotonic_remote_time.boot, 1u);
2460 EXPECT_EQ(output0[2].monotonic_remote_time.time,
2461 e + chrono::seconds(20) + chrono::milliseconds(3000));
2462 EXPECT_EQ(output0[2].monotonic_timestamp_time.boot, 0u);
2463 EXPECT_EQ(output0[2].monotonic_timestamp_time.time,
2464 e + chrono::seconds(20) + chrono::milliseconds(3001));
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002465 EXPECT_TRUE(output0[2].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002466 }
2467
2468 {
2469 SCOPED_TRACE("Trying node1 now");
2470 std::deque<TimestampedMessage> output1;
2471
2472 EXPECT_EQ(mapper0_count, 3u);
2473 EXPECT_EQ(mapper1_count, 0u);
2474
2475 ASSERT_TRUE(mapper1.Front() != nullptr);
2476 EXPECT_EQ(mapper0_count, 3u);
2477 EXPECT_EQ(mapper1_count, 1u);
2478 output1.emplace_back(std::move(*mapper1.Front()));
2479 mapper1.PopFront();
2480 EXPECT_TRUE(mapper1.started());
2481 EXPECT_EQ(mapper0_count, 3u);
2482 EXPECT_EQ(mapper1_count, 1u);
2483
2484 ASSERT_TRUE(mapper1.Front() != nullptr);
2485 EXPECT_EQ(mapper0_count, 3u);
2486 EXPECT_EQ(mapper1_count, 2u);
2487 output1.emplace_back(std::move(*mapper1.Front()));
2488 mapper1.PopFront();
2489 EXPECT_TRUE(mapper1.started());
2490
2491 ASSERT_TRUE(mapper1.Front() != nullptr);
2492 output1.emplace_back(std::move(*mapper1.Front()));
2493 mapper1.PopFront();
2494 EXPECT_TRUE(mapper1.started());
2495
2496 EXPECT_EQ(mapper0_count, 3u);
2497 EXPECT_EQ(mapper1_count, 3u);
2498
2499 ASSERT_TRUE(mapper1.Front() == nullptr);
2500
2501 EXPECT_EQ(mapper0_count, 3u);
2502 EXPECT_EQ(mapper1_count, 3u);
2503
2504 EXPECT_EQ(output1[0].monotonic_event_time.boot, 0u);
2505 EXPECT_EQ(output1[0].monotonic_event_time.time,
2506 e + chrono::seconds(100) + chrono::milliseconds(1000));
2507 EXPECT_EQ(output1[0].monotonic_remote_time, BootTimestamp::min_time());
2508 EXPECT_EQ(output1[0].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002509 EXPECT_TRUE(output1[0].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002510
2511 EXPECT_EQ(output1[1].monotonic_event_time.boot, 1u);
2512 EXPECT_EQ(output1[1].monotonic_event_time.time,
2513 e + chrono::seconds(20) + chrono::milliseconds(2000));
2514 EXPECT_EQ(output1[1].monotonic_remote_time, BootTimestamp::min_time());
2515 EXPECT_EQ(output1[1].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002516 EXPECT_TRUE(output1[1].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002517
2518 EXPECT_EQ(output1[2].monotonic_event_time.boot, 1u);
2519 EXPECT_EQ(output1[2].monotonic_event_time.time,
2520 e + chrono::seconds(20) + chrono::milliseconds(3000));
2521 EXPECT_EQ(output1[2].monotonic_remote_time, BootTimestamp::min_time());
2522 EXPECT_EQ(output1[2].monotonic_timestamp_time, BootTimestamp::min_time());
Tyler Chatowb7c6eba2021-07-28 14:43:23 -07002523 EXPECT_TRUE(output1[2].data != nullptr);
Austin Schuh48507722021-07-17 17:29:24 -07002524
2525 LOG(INFO) << output1[0];
2526 LOG(INFO) << output1[1];
2527 LOG(INFO) << output1[2];
2528 }
2529}
2530
Austin Schuh44c61472021-11-22 21:04:10 -08002531class SortingDeathTest : public SortingElementTest {
2532 public:
2533 SortingDeathTest()
2534 : SortingElementTest(),
2535 part0_(MakeHeader(config_, R"({
2536 /* 100ms */
2537 "max_out_of_order_duration": 100000000,
2538 "node": {
2539 "name": "pi1"
2540 },
2541 "logger_node": {
2542 "name": "pi1"
2543 },
2544 "monotonic_start_time": 1000000,
2545 "realtime_start_time": 1000000000000,
2546 "logger_monotonic_start_time": 1000000,
2547 "logger_realtime_start_time": 1000000000000,
2548 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2549 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2550 "parts_index": 0,
2551 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2552 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2553 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2554 "boot_uuids": [
2555 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2556 "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
2557 ""
2558 ],
2559 "oldest_remote_monotonic_timestamps": [
2560 9223372036854775807,
2561 9223372036854775807,
2562 9223372036854775807
2563 ],
2564 "oldest_local_monotonic_timestamps": [
2565 9223372036854775807,
2566 9223372036854775807,
2567 9223372036854775807
2568 ],
2569 "oldest_remote_unreliable_monotonic_timestamps": [
2570 9223372036854775807,
2571 0,
2572 9223372036854775807
2573 ],
2574 "oldest_local_unreliable_monotonic_timestamps": [
2575 9223372036854775807,
2576 0,
2577 9223372036854775807
2578 ]
2579})")),
2580 part1_(MakeHeader(config_, R"({
2581 /* 100ms */
2582 "max_out_of_order_duration": 100000000,
2583 "node": {
2584 "name": "pi1"
2585 },
2586 "logger_node": {
2587 "name": "pi1"
2588 },
2589 "monotonic_start_time": 1000000,
2590 "realtime_start_time": 1000000000000,
2591 "logger_monotonic_start_time": 1000000,
2592 "logger_realtime_start_time": 1000000000000,
2593 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2594 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2595 "parts_index": 1,
2596 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2597 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2598 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2599 "boot_uuids": [
2600 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2601 "b728d27a-9181-4eac-bfc1-5d09b80469d2",
2602 ""
2603 ],
2604 "oldest_remote_monotonic_timestamps": [
2605 9223372036854775807,
2606 9223372036854775807,
2607 9223372036854775807
2608 ],
2609 "oldest_local_monotonic_timestamps": [
2610 9223372036854775807,
2611 9223372036854775807,
2612 9223372036854775807
2613 ],
2614 "oldest_remote_unreliable_monotonic_timestamps": [
2615 9223372036854775807,
2616 100000,
2617 9223372036854775807
2618 ],
2619 "oldest_local_unreliable_monotonic_timestamps": [
2620 9223372036854775807,
2621 100000,
2622 9223372036854775807
2623 ]
2624})")),
2625 part2_(MakeHeader(config_, R"({
2626 /* 100ms */
2627 "max_out_of_order_duration": 100000000,
2628 "node": {
2629 "name": "pi1"
2630 },
2631 "logger_node": {
2632 "name": "pi1"
2633 },
2634 "monotonic_start_time": 1000000,
2635 "realtime_start_time": 1000000000000,
2636 "logger_monotonic_start_time": 1000000,
2637 "logger_realtime_start_time": 1000000000000,
2638 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2639 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2640 "parts_index": 2,
2641 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2642 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2643 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2644 "boot_uuids": [
2645 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2646 "6ba4f28d-21a2-4d7f-83f4-ee365cf86464",
2647 ""
2648 ],
2649 "oldest_remote_monotonic_timestamps": [
2650 9223372036854775807,
2651 9223372036854775807,
2652 9223372036854775807
2653 ],
2654 "oldest_local_monotonic_timestamps": [
2655 9223372036854775807,
2656 9223372036854775807,
2657 9223372036854775807
2658 ],
2659 "oldest_remote_unreliable_monotonic_timestamps": [
2660 9223372036854775807,
2661 200000,
2662 9223372036854775807
2663 ],
2664 "oldest_local_unreliable_monotonic_timestamps": [
2665 9223372036854775807,
2666 200000,
2667 9223372036854775807
2668 ]
2669})")),
2670 part3_(MakeHeader(config_, R"({
2671 /* 100ms */
2672 "max_out_of_order_duration": 100000000,
2673 "node": {
2674 "name": "pi1"
2675 },
2676 "logger_node": {
2677 "name": "pi1"
2678 },
2679 "monotonic_start_time": 1000000,
2680 "realtime_start_time": 1000000000000,
2681 "logger_monotonic_start_time": 1000000,
2682 "logger_realtime_start_time": 1000000000000,
2683 "log_event_uuid": "30ef1283-81d7-4004-8c36-1c162dbcb2b2",
2684 "parts_uuid": "ee4f5a98-77d0-4e01-af2f-bbb29e098ede",
2685 "parts_index": 3,
2686 "logger_instance_uuid": "1c3142ad-10a5-408d-a760-b63b73d3b904",
2687 "logger_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2688 "source_node_boot_uuid": "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2689 "boot_uuids": [
2690 "a570df8b-5cc2-4dbe-89bd-286f9ddd02b7",
2691 "b728d27a-9181-4eac-bfc1-5d09b80469d2",
2692 ""
2693 ],
2694 "oldest_remote_monotonic_timestamps": [
2695 9223372036854775807,
2696 9223372036854775807,
2697 9223372036854775807
2698 ],
2699 "oldest_local_monotonic_timestamps": [
2700 9223372036854775807,
2701 9223372036854775807,
2702 9223372036854775807
2703 ],
2704 "oldest_remote_unreliable_monotonic_timestamps": [
2705 9223372036854775807,
2706 300000,
2707 9223372036854775807
2708 ],
2709 "oldest_local_unreliable_monotonic_timestamps": [
2710 9223372036854775807,
2711 300000,
2712 9223372036854775807
2713 ]
2714})")) {}
2715
2716 protected:
2717 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> part0_;
2718 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> part1_;
2719 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> part2_;
2720 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> part3_;
2721};
2722
2723// Tests that if 2 computers go back and forth trying to be the same node, we
2724// die in sorting instead of failing to estimate time.
2725TEST_F(SortingDeathTest, FightingNodes) {
2726 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07002727 TestDetachedBufferWriter writer0(logfile0_);
Austin Schuh44c61472021-11-22 21:04:10 -08002728 writer0.QueueSpan(part0_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002729 TestDetachedBufferWriter writer1(logfile1_);
Austin Schuh44c61472021-11-22 21:04:10 -08002730 writer1.QueueSpan(part1_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002731 TestDetachedBufferWriter writer2(logfile2_);
Austin Schuh44c61472021-11-22 21:04:10 -08002732 writer2.QueueSpan(part2_.span());
Austin Schuhd863e6e2022-10-16 15:44:50 -07002733 TestDetachedBufferWriter writer3(logfile3_);
Austin Schuh44c61472021-11-22 21:04:10 -08002734 writer3.QueueSpan(part3_.span());
2735 }
2736
2737 EXPECT_DEATH(
2738 {
2739 const std::vector<LogFile> parts =
2740 SortParts({logfile0_, logfile1_, logfile2_, logfile3_});
2741 },
Austin Schuh22cf7862022-09-19 19:09:42 -07002742 "found overlapping boots on");
Austin Schuh44c61472021-11-22 21:04:10 -08002743}
2744
Brian Smarttea913d42021-12-10 15:02:38 -08002745// Tests that we MessageReader blows up on a bad message.
2746TEST(MessageReaderConfirmCrash, ReadWrite) {
2747 const std::string logfile = aos::testing::TestTmpDir() + "/log.bfbs";
2748 unlink(logfile.c_str());
2749
2750 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config =
2751 JsonToSizedFlatbuffer<LogFileHeader>(
2752 R"({ "max_out_of_order_duration": 100000000 })");
2753 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m1 =
2754 JsonToSizedFlatbuffer<MessageHeader>(
2755 R"({ "channel_index": 0, "monotonic_sent_time": 1 })");
2756 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m2 =
2757 JsonToSizedFlatbuffer<MessageHeader>(
2758 R"({ "channel_index": 0, "monotonic_sent_time": 2 })");
2759 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m4 =
2760 JsonToSizedFlatbuffer<MessageHeader>(
2761 R"({ "channel_index": 0, "monotonic_sent_time": 4 })");
2762
2763 // Starts out like a proper flat buffer header, but it breaks down ...
2764 std::vector<uint8_t> garbage{8, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0};
2765 absl::Span<uint8_t> m3_span(garbage);
2766
2767 {
Austin Schuhd863e6e2022-10-16 15:44:50 -07002768 TestDetachedBufferWriter writer(logfile);
Brian Smarttea913d42021-12-10 15:02:38 -08002769 writer.QueueSpan(config.span());
2770 writer.QueueSpan(m1.span());
2771 writer.QueueSpan(m2.span());
2772 writer.QueueSpan(m3_span);
2773 writer.QueueSpan(m4.span()); // This message is "hidden"
2774 }
2775
2776 {
2777 MessageReader reader(logfile);
2778
2779 EXPECT_EQ(reader.filename(), logfile);
2780
2781 EXPECT_EQ(
2782 reader.max_out_of_order_duration(),
2783 std::chrono::nanoseconds(config.message().max_out_of_order_duration()));
2784 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
2785 EXPECT_TRUE(reader.ReadMessage());
2786 EXPECT_EQ(reader.newest_timestamp(),
2787 monotonic_clock::time_point(chrono::nanoseconds(1)));
2788 EXPECT_TRUE(reader.ReadMessage());
2789 EXPECT_EQ(reader.newest_timestamp(),
2790 monotonic_clock::time_point(chrono::nanoseconds(2)));
2791 // Confirm default crashing behavior
2792 EXPECT_DEATH(reader.ReadMessage(), "Corrupted message at offset");
2793 }
2794
2795 {
2796 gflags::FlagSaver fs;
2797
2798 MessageReader reader(logfile);
2799 reader.set_crash_on_corrupt_message_flag(false);
2800
2801 EXPECT_EQ(reader.filename(), logfile);
2802
2803 EXPECT_EQ(
2804 reader.max_out_of_order_duration(),
2805 std::chrono::nanoseconds(config.message().max_out_of_order_duration()));
2806 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
2807 EXPECT_TRUE(reader.ReadMessage());
2808 EXPECT_EQ(reader.newest_timestamp(),
2809 monotonic_clock::time_point(chrono::nanoseconds(1)));
2810 EXPECT_TRUE(reader.ReadMessage());
2811 EXPECT_EQ(reader.newest_timestamp(),
2812 monotonic_clock::time_point(chrono::nanoseconds(2)));
2813 // Confirm avoiding the corrupted message crash, stopping instead.
2814 EXPECT_FALSE(reader.ReadMessage());
2815 }
2816
2817 {
2818 gflags::FlagSaver fs;
2819
2820 MessageReader reader(logfile);
2821 reader.set_crash_on_corrupt_message_flag(false);
2822 reader.set_ignore_corrupt_messages_flag(true);
2823
2824 EXPECT_EQ(reader.filename(), logfile);
2825
2826 EXPECT_EQ(
2827 reader.max_out_of_order_duration(),
2828 std::chrono::nanoseconds(config.message().max_out_of_order_duration()));
2829 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
2830 EXPECT_TRUE(reader.ReadMessage());
2831 EXPECT_EQ(reader.newest_timestamp(),
2832 monotonic_clock::time_point(chrono::nanoseconds(1)));
2833 EXPECT_TRUE(reader.ReadMessage());
2834 EXPECT_EQ(reader.newest_timestamp(),
2835 monotonic_clock::time_point(chrono::nanoseconds(2)));
2836 // Confirm skipping of the corrupted message to read the hidden one.
2837 EXPECT_TRUE(reader.ReadMessage());
2838 EXPECT_EQ(reader.newest_timestamp(),
2839 monotonic_clock::time_point(chrono::nanoseconds(4)));
2840 EXPECT_FALSE(reader.ReadMessage());
2841 }
2842}
2843
Austin Schuhfa30c352022-10-16 11:12:02 -07002844class InlinePackMessage : public ::testing::Test {
2845 protected:
2846 aos::Context RandomContext() {
2847 data_ = RandomData();
2848 std::uniform_int_distribution<uint32_t> uint32_distribution(
2849 std::numeric_limits<uint32_t>::min(),
2850 std::numeric_limits<uint32_t>::max());
2851
2852 std::uniform_int_distribution<int64_t> time_distribution(
2853 std::numeric_limits<int64_t>::min(),
2854 std::numeric_limits<int64_t>::max());
2855
2856 aos::Context context;
2857 context.monotonic_event_time =
2858 aos::monotonic_clock::epoch() +
2859 chrono::nanoseconds(time_distribution(random_number_generator_));
2860 context.realtime_event_time =
2861 aos::realtime_clock::epoch() +
2862 chrono::nanoseconds(time_distribution(random_number_generator_));
2863
2864 context.monotonic_remote_time =
2865 aos::monotonic_clock::epoch() +
2866 chrono::nanoseconds(time_distribution(random_number_generator_));
2867 context.realtime_remote_time =
2868 aos::realtime_clock::epoch() +
2869 chrono::nanoseconds(time_distribution(random_number_generator_));
2870
2871 context.queue_index = uint32_distribution(random_number_generator_);
2872 context.remote_queue_index = uint32_distribution(random_number_generator_);
2873 context.size = data_.size();
2874 context.data = data_.data();
2875 return context;
2876 }
2877
Austin Schuhf2d0e682022-10-16 14:20:58 -07002878 aos::monotonic_clock::time_point RandomMonotonic() {
2879 std::uniform_int_distribution<int64_t> time_distribution(
2880 0, std::numeric_limits<int64_t>::max());
2881 return aos::monotonic_clock::epoch() +
2882 chrono::nanoseconds(time_distribution(random_number_generator_));
2883 }
2884
2885 aos::SizePrefixedFlatbufferDetachedBuffer<message_bridge::RemoteMessage>
2886 RandomRemoteMessage() {
2887 std::uniform_int_distribution<uint8_t> uint8_distribution(
2888 std::numeric_limits<uint8_t>::min(),
2889 std::numeric_limits<uint8_t>::max());
2890
2891 std::uniform_int_distribution<int64_t> time_distribution(
2892 std::numeric_limits<int64_t>::min(),
2893 std::numeric_limits<int64_t>::max());
2894
2895 flatbuffers::FlatBufferBuilder fbb;
2896 message_bridge::RemoteMessage::Builder builder(fbb);
2897 builder.add_queue_index(uint8_distribution(random_number_generator_));
2898
2899 builder.add_monotonic_sent_time(
2900 time_distribution(random_number_generator_));
2901 builder.add_realtime_sent_time(time_distribution(random_number_generator_));
2902 builder.add_monotonic_remote_time(
2903 time_distribution(random_number_generator_));
2904 builder.add_realtime_remote_time(
2905 time_distribution(random_number_generator_));
2906
2907 builder.add_remote_queue_index(
2908 uint8_distribution(random_number_generator_));
2909
2910 fbb.FinishSizePrefixed(builder.Finish());
2911 return fbb.Release();
2912 }
2913
Austin Schuhfa30c352022-10-16 11:12:02 -07002914 std::vector<uint8_t> RandomData() {
2915 std::vector<uint8_t> result;
2916 std::uniform_int_distribution<int> length_distribution(1, 32);
2917 std::uniform_int_distribution<uint8_t> data_distribution(
2918 std::numeric_limits<uint8_t>::min(),
2919 std::numeric_limits<uint8_t>::max());
2920
2921 const size_t length = length_distribution(random_number_generator_);
2922
2923 result.reserve(length);
2924 for (size_t i = 0; i < length; ++i) {
2925 result.emplace_back(data_distribution(random_number_generator_));
2926 }
2927 return result;
2928 }
2929
2930 std::mt19937 random_number_generator_{
2931 std::mt19937(::aos::testing::RandomSeed())};
2932
2933 std::vector<uint8_t> data_;
2934};
2935
2936// Uses the binary schema to annotate a provided flatbuffer. Returns the
2937// annotated flatbuffer.
2938std::string AnnotateBinaries(
2939 const aos::NonSizePrefixedFlatbuffer<reflection::Schema> &schema,
2940 const std::string &schema_filename,
2941 flatbuffers::span<uint8_t> binary_data) {
2942 flatbuffers::BinaryAnnotator binary_annotator(
2943 schema.span().data(), schema.span().size(), binary_data.data(),
2944 binary_data.size());
2945
2946 auto annotations = binary_annotator.Annotate();
2947
2948 flatbuffers::AnnotatedBinaryTextGenerator text_generator(
2949 flatbuffers::AnnotatedBinaryTextGenerator::Options{}, annotations,
2950 binary_data.data(), binary_data.size());
2951
2952 text_generator.Generate(aos::testing::TestTmpDir() + "/foo.bfbs",
2953 schema_filename);
2954
2955 return aos::util::ReadFileToStringOrDie(aos::testing::TestTmpDir() +
2956 "/foo.afb");
2957}
2958
2959// Tests that all variations of PackMessage are equivalent to the inline
2960// PackMessage used to avoid allocations.
2961TEST_F(InlinePackMessage, Equivilent) {
2962 std::uniform_int_distribution<uint32_t> uint32_distribution(
2963 std::numeric_limits<uint32_t>::min(),
2964 std::numeric_limits<uint32_t>::max());
2965 aos::FlatbufferVector<reflection::Schema> schema =
2966 FileToFlatbuffer<reflection::Schema>(
2967 ArtifactPath("aos/events/logging/logger.bfbs"));
2968
2969 for (const LogType type :
2970 {LogType::kLogMessage, LogType::kLogDeliveryTimeOnly,
2971 LogType::kLogMessageAndDeliveryTime, LogType::kLogRemoteMessage}) {
2972 for (int i = 0; i < 100; ++i) {
2973 aos::Context context = RandomContext();
2974 const uint32_t channel_index =
2975 uint32_distribution(random_number_generator_);
2976
2977 flatbuffers::FlatBufferBuilder fbb;
2978 fbb.ForceDefaults(true);
2979 fbb.FinishSizePrefixed(PackMessage(&fbb, context, channel_index, type));
2980
2981 VLOG(1) << absl::BytesToHexString(std::string_view(
2982 reinterpret_cast<const char *>(fbb.GetBufferSpan().data()),
2983 fbb.GetBufferSpan().size()));
2984
2985 // Make sure that both the builder and inline method agree on sizes.
2986 ASSERT_EQ(fbb.GetSize(), PackMessageSize(type, context))
2987 << "log type " << static_cast<int>(type);
2988
2989 // Initialize the buffer to something nonzero to make sure all the padding
2990 // bytes are set to 0.
2991 std::vector<uint8_t> repacked_message(PackMessageSize(type, context), 67);
2992
2993 // And verify packing inline works as expected.
2994 EXPECT_EQ(repacked_message.size(),
2995 PackMessageInline(repacked_message.data(), context,
2996 channel_index, type));
2997 EXPECT_EQ(absl::Span<uint8_t>(repacked_message),
2998 absl::Span<uint8_t>(fbb.GetBufferSpan().data(),
2999 fbb.GetBufferSpan().size()))
3000 << AnnotateBinaries(schema, "aos/events/logging/logger.bfbs",
3001 fbb.GetBufferSpan());
3002 }
3003 }
3004}
3005
Austin Schuhf2d0e682022-10-16 14:20:58 -07003006// Tests that all variations of PackMessage are equivilent to the inline
3007// PackMessage used to avoid allocations.
3008TEST_F(InlinePackMessage, RemoteEquivilent) {
3009 aos::FlatbufferVector<reflection::Schema> schema =
3010 FileToFlatbuffer<reflection::Schema>(
3011 ArtifactPath("aos/events/logging/logger.bfbs"));
3012 std::uniform_int_distribution<uint8_t> uint8_distribution(
3013 std::numeric_limits<uint8_t>::min(), std::numeric_limits<uint8_t>::max());
3014
3015 for (int i = 0; i < 100; ++i) {
3016 aos::SizePrefixedFlatbufferDetachedBuffer<RemoteMessage> random_msg =
3017 RandomRemoteMessage();
3018 const size_t channel_index = uint8_distribution(random_number_generator_);
3019 const monotonic_clock::time_point monotonic_timestamp_time =
3020 RandomMonotonic();
3021
3022 flatbuffers::FlatBufferBuilder fbb;
3023 fbb.ForceDefaults(true);
3024 fbb.FinishSizePrefixed(PackRemoteMessage(
3025 &fbb, &random_msg.message(), channel_index, monotonic_timestamp_time));
3026
3027 VLOG(1) << absl::BytesToHexString(std::string_view(
3028 reinterpret_cast<const char *>(fbb.GetBufferSpan().data()),
3029 fbb.GetBufferSpan().size()));
3030
3031 // Make sure that both the builder and inline method agree on sizes.
3032 ASSERT_EQ(fbb.GetSize(), PackRemoteMessageSize());
3033
3034 // Initialize the buffer to something nonzer to make sure all the padding
3035 // bytes are set to 0.
3036 std::vector<uint8_t> repacked_message(PackRemoteMessageSize(), 67);
3037
3038 // And verify packing inline works as expected.
3039 EXPECT_EQ(
3040 repacked_message.size(),
3041 PackRemoteMessageInline(repacked_message.data(), &random_msg.message(),
3042 channel_index, monotonic_timestamp_time));
3043 EXPECT_EQ(absl::Span<uint8_t>(repacked_message),
3044 absl::Span<uint8_t>(fbb.GetBufferSpan().data(),
3045 fbb.GetBufferSpan().size()))
3046 << AnnotateBinaries(schema, "aos/events/logging/logger.bfbs",
3047 fbb.GetBufferSpan());
3048 }
3049}
Austin Schuhfa30c352022-10-16 11:12:02 -07003050
Austin Schuhc243b422020-10-11 15:35:08 -07003051} // namespace testing
3052} // namespace logger
3053} // namespace aos