blob: 255826ef7ae8a20e47b0e49f8a883228a54acca9 [file] [log] [blame]
Austin Schuha9abc032021-01-01 16:46:19 -08001#include "aos/network/testing_time_converter.h"
2
3#include <chrono>
4#include <deque>
5#include <optional>
6#include <tuple>
7
8#include "aos/events/event_scheduler.h"
9#include "aos/network/multinode_timestamp_filter.h"
10#include "aos/time/time.h"
11
Stephan Pleinesf63bde82024-01-13 15:59:33 -080012namespace aos::message_bridge {
Austin Schuha9abc032021-01-01 16:46:19 -080013
14namespace chrono = std::chrono;
15
16TestingTimeConverter ::TestingTimeConverter(size_t node_count)
17 : InterpolatedTimeConverter(node_count),
Austin Schuh66168842021-08-17 19:42:21 -070018 last_monotonic_(node_count, logger::BootTimestamp::epoch()) {
Austin Schuha9abc032021-01-01 16:46:19 -080019 CHECK_GE(node_count, 1u);
20}
21
22TestingTimeConverter::~TestingTimeConverter() {
23 if (at_end_) {
James Kuszmaulbeaa3c82023-09-07 11:11:27 -070024 auto next_timestamp = NextTimestamp();
25 CHECK(next_timestamp.has_value()) << ": Unexpected error";
26 CHECK(!next_timestamp.value().has_value())
27 << ": At the end but there is more data.";
Austin Schuha9abc032021-01-01 16:46:19 -080028 }
29}
30
31void TestingTimeConverter::StartEqual() {
32 CHECK(first_);
33 first_ = false;
34 ts_.emplace_back(std::make_tuple(last_distributed_, last_monotonic_));
35}
36
37chrono::nanoseconds TestingTimeConverter::AddMonotonic(
38 std::vector<monotonic_clock::duration> times) {
39 CHECK_EQ(times.size(), last_monotonic_.size());
40 for (size_t i = 0; i < times.size(); ++i) {
41 CHECK_GT(times[i].count(), 0);
Austin Schuh66168842021-08-17 19:42:21 -070042 last_monotonic_[i].time += times[i];
Austin Schuha9abc032021-01-01 16:46:19 -080043 }
44 chrono::nanoseconds dt(0);
45 if (!first_) {
46 dt = *std::max_element(times.begin(), times.end());
47 last_distributed_ += dt;
48 } else {
49 first_ = false;
50 }
51 ts_.emplace_back(std::make_tuple(last_distributed_, last_monotonic_));
52 return dt;
53}
54
55chrono::nanoseconds TestingTimeConverter::AddMonotonic(
Austin Schuh66168842021-08-17 19:42:21 -070056 std::vector<logger::BootTimestamp> times) {
Austin Schuha9abc032021-01-01 16:46:19 -080057 CHECK_EQ(times.size(), last_monotonic_.size());
58 chrono::nanoseconds dt(0);
59 if (!first_) {
Austin Schuh66168842021-08-17 19:42:21 -070060 CHECK_EQ(times[0].boot, last_monotonic_[0].boot);
61 dt = times[0].time - last_monotonic_[0].time;
Austin Schuha9abc032021-01-01 16:46:19 -080062 for (size_t i = 0; i < times.size(); ++i) {
63 CHECK_GT(times[i], last_monotonic_[i]);
Austin Schuh66168842021-08-17 19:42:21 -070064 dt = std::max(dt, times[i].time - times[0].time);
Austin Schuha9abc032021-01-01 16:46:19 -080065 }
66 last_distributed_ += dt;
67 last_monotonic_ = times;
68 } else {
69 first_ = false;
70 last_monotonic_ = times;
71 }
72 ts_.emplace_back(std::make_tuple(last_distributed_, std::move(times)));
73 return dt;
74}
75
Austin Schuh58646e22021-08-23 23:51:46 -070076void TestingTimeConverter::RebootAt(size_t node_index,
77 distributed_clock::time_point t) {
78 CHECK(!first_);
79 const chrono::nanoseconds dt = t - last_distributed_;
80
81 for (size_t i = 0; i < last_monotonic_.size(); ++i) {
82 last_monotonic_[i].time += dt;
83 }
84
85 ++last_monotonic_[node_index].boot;
86 last_monotonic_[node_index].time = monotonic_clock::epoch();
87
88 last_distributed_ = t;
89 ts_.emplace_back(std::make_tuple(last_distributed_, last_monotonic_));
90}
91
Austin Schuha9abc032021-01-01 16:46:19 -080092void TestingTimeConverter::AddNextTimestamp(
93 distributed_clock::time_point time,
Austin Schuh66168842021-08-17 19:42:21 -070094 std::vector<logger::BootTimestamp> times) {
Austin Schuha9abc032021-01-01 16:46:19 -080095 CHECK_EQ(times.size(), last_monotonic_.size());
96 if (!first_) {
97 CHECK_GT(time, last_distributed_);
98 for (size_t i = 0; i < times.size(); ++i) {
99 CHECK_GT(times[i], last_monotonic_[i]);
100 }
101 } else {
102 first_ = false;
103 }
104 last_distributed_ = time;
105 last_monotonic_ = times;
106
107 ts_.emplace_back(std::make_tuple(time, std::move(times)));
108}
109
James Kuszmaulbeaa3c82023-09-07 11:11:27 -0700110std::optional<std::optional<std::tuple<distributed_clock::time_point,
111 std::vector<logger::BootTimestamp>>>>
Austin Schuha9abc032021-01-01 16:46:19 -0800112TestingTimeConverter::NextTimestamp() {
113 CHECK(!first_) << ": Tried to pull a timestamp before one was added. This "
114 "is unlikely to be what you want.";
115 if (ts_.empty()) {
James Kuszmaulbeaa3c82023-09-07 11:11:27 -0700116 std::optional<std::optional<std::tuple<distributed_clock::time_point,
117 std::vector<logger::BootTimestamp>>>>
118 result;
119 result.emplace(std::nullopt);
120 return result;
Austin Schuha9abc032021-01-01 16:46:19 -0800121 }
122 auto result = ts_.front();
123 ts_.pop_front();
124 return result;
125}
126
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800127} // namespace aos::message_bridge