blob: f6412c373b15c91d68cd9b043d615b210b2f1bf9 [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>
4#include <string>
Austin Schuhc243b422020-10-11 15:35:08 -07005
6#include "aos/events/logging/test_message_generated.h"
Austin Schuhe243aaf2020-10-11 15:46:02 -07007#include "aos/flatbuffers.h"
Austin Schuhc243b422020-10-11 15:35:08 -07008#include "aos/json_to_flatbuffer.h"
9#include "aos/testing/tmpdir.h"
Austin Schuhe243aaf2020-10-11 15:46:02 -070010#include "gtest/gtest.h"
Austin Schuhc243b422020-10-11 15:35:08 -070011
12namespace aos {
13namespace logger {
14namespace testing {
Austin Schuhe243aaf2020-10-11 15:46:02 -070015namespace chrono = std::chrono;
Austin Schuhc243b422020-10-11 15:35:08 -070016
Austin Schuhe243aaf2020-10-11 15:46:02 -070017// Creates a size prefixed flatbuffer from json.
Austin Schuhc243b422020-10-11 15:35:08 -070018template <typename T>
19SizePrefixedFlatbufferDetachedBuffer<T> JsonToSizedFlatbuffer(
20 const std::string_view data) {
21 flatbuffers::FlatBufferBuilder fbb;
22 fbb.ForceDefaults(true);
23 fbb.FinishSizePrefixed(JsonToFlatbuffer<T>(data, &fbb));
24 return fbb.Release();
25}
26
Austin Schuhe243aaf2020-10-11 15:46:02 -070027// Tests that we can write and read 2 flatbuffers to file.
Austin Schuhc243b422020-10-11 15:35:08 -070028TEST(SpanReaderTest, ReadWrite) {
29 const std::string logfile = aos::testing::TestTmpDir() + "/log.bfbs";
30 unlink(logfile.c_str());
31
32 const aos::SizePrefixedFlatbufferDetachedBuffer<TestMessage> m1 =
33 JsonToSizedFlatbuffer<TestMessage>(
34 R"({ "value": 1 })");
35 const aos::SizePrefixedFlatbufferDetachedBuffer<TestMessage> m2 =
36 JsonToSizedFlatbuffer<TestMessage>(
37 R"({ "value": 2 })");
38
39 {
40 DetachedBufferWriter writer(logfile, std::make_unique<DummyEncoder>());
41 writer.QueueSpan(m1.full_span());
42 writer.QueueSpan(m2.full_span());
43 }
44
45 SpanReader reader(logfile);
46
47 EXPECT_EQ(reader.filename(), logfile);
48 EXPECT_EQ(reader.ReadMessage(), m1.full_span());
49 EXPECT_EQ(reader.ReadMessage(), m2.full_span());
50 EXPECT_EQ(reader.ReadMessage(), absl::Span<const uint8_t>());
51}
52
Austin Schuhe243aaf2020-10-11 15:46:02 -070053// Tests that we can actually parse the resulting messages at a basic level
54// through MessageReader.
55TEST(MessageReaderTest, ReadWrite) {
56 const std::string logfile = aos::testing::TestTmpDir() + "/log.bfbs";
57 unlink(logfile.c_str());
58
59 const aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> config =
60 JsonToSizedFlatbuffer<LogFileHeader>(
61 R"({ "max_out_of_order_duration": 100000000 })");
62 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m1 =
63 JsonToSizedFlatbuffer<MessageHeader>(
64 R"({ "channel_index": 0, "monotonic_sent_time": 1 })");
65 const aos::SizePrefixedFlatbufferDetachedBuffer<MessageHeader> m2 =
66 JsonToSizedFlatbuffer<MessageHeader>(
67 R"({ "channel_index": 0, "monotonic_sent_time": 2 })");
68
69 {
70 DetachedBufferWriter writer(logfile, std::make_unique<DummyEncoder>());
71 writer.QueueSpan(config.full_span());
72 writer.QueueSpan(m1.full_span());
73 writer.QueueSpan(m2.full_span());
74 }
75
76 MessageReader reader(logfile);
77
78 EXPECT_EQ(reader.filename(), logfile);
79
80 EXPECT_EQ(
81 reader.max_out_of_order_duration(),
82 std::chrono::nanoseconds(config.message().max_out_of_order_duration()));
83 EXPECT_EQ(reader.newest_timestamp(), monotonic_clock::min_time);
84 EXPECT_TRUE(reader.ReadMessage());
85 EXPECT_EQ(reader.newest_timestamp(),
86 monotonic_clock::time_point(chrono::nanoseconds(1)));
87 EXPECT_TRUE(reader.ReadMessage());
88 EXPECT_EQ(reader.newest_timestamp(),
89 monotonic_clock::time_point(chrono::nanoseconds(2)));
90 EXPECT_FALSE(reader.ReadMessage());
91}
92
Austin Schuhc243b422020-10-11 15:35:08 -070093} // namespace testing
94} // namespace logger
95} // namespace aos