|
|
|
@ -1,5 +1,6 @@ |
|
|
|
|
#include "catch2/catch.hpp" |
|
|
|
|
#include "system/loggerd/logger.h" |
|
|
|
|
#include "system/loggerd/loggerd.h" |
|
|
|
|
|
|
|
|
|
typedef cereal::Sentinel::SentinelType SentinelType; |
|
|
|
|
|
|
|
|
@ -73,3 +74,111 @@ TEST_CASE("logger") { |
|
|
|
|
verify_segment(log_root + "/" + route_name, i, segment_cnt, 1); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_CASE("RemoteEncoder::syncSegment robustness", "[sync]") { |
|
|
|
|
LoggerdState state; |
|
|
|
|
RemoteEncoder encoder; |
|
|
|
|
std::string name = "test_encoder"; |
|
|
|
|
|
|
|
|
|
SECTION("Matching segment after offset set") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 5, 5) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); // 5 - 5 = 0
|
|
|
|
|
REQUIRE(encoder.current_segment == 5); |
|
|
|
|
REQUIRE(encoder.seen_first_packet == true); |
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 7, 7) == true); // 7 - 0 = 7 == 7
|
|
|
|
|
REQUIRE(encoder.current_segment == 7); |
|
|
|
|
REQUIRE(encoder.recording == false); |
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Encoder restarts and sends segment 0") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 1, 1) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); // 1 - 1 = 0
|
|
|
|
|
REQUIRE(encoder.current_segment == 1); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 2) == false); // 0 - 0 = 0 < 2
|
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == -2); // Adjusted to 0 - 2
|
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 2) == true); // 0 - (-2) = 2 == 2
|
|
|
|
|
REQUIRE(encoder.current_segment == 2); |
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Encoder restarts and sends segment greater than 0") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 0) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); // 0 - 0 = 0
|
|
|
|
|
REQUIRE(encoder.current_segment == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 2, 3) == false); // 2 - 0 = 2 < 3
|
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == -1); // Adjusted to 2 - 3
|
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 2, 3) == true); // 2 - (-1) = 3 == 3
|
|
|
|
|
REQUIRE(encoder.current_segment == 3); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Logger restarts to lower segment") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 5, 5) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); |
|
|
|
|
REQUIRE(encoder.current_segment == 5); |
|
|
|
|
|
|
|
|
|
// Logger restarts to segment 0, encoder continues at 6
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 6, 0) == false); // 6 - 0 = 6 > 0
|
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == true); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); |
|
|
|
|
REQUIRE(encoder.current_segment == 5); // Unchanged until sync
|
|
|
|
|
|
|
|
|
|
// Subsequent call with next segment
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 7, 0) == false); // 7 - 0 = 7 > 0
|
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); // No further increment
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Encoder is ahead by more than one segment") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 0) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); |
|
|
|
|
REQUIRE(encoder.current_segment == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 2, 0) == false); // 2 - 0 = 2 > 0
|
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == true); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 3, 0) == false); // 3 - 0 = 3 > 0
|
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); // No additional increment
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Sync after rotation") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 0) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); |
|
|
|
|
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 1, 0) == false); // 1 - 0 = 1 > 0
|
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == true); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); |
|
|
|
|
|
|
|
|
|
// Simulate rotation: logger catches up to encoder
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 1, 1) == true); // 1 - 0 = 1 == 1
|
|
|
|
|
REQUIRE(encoder.current_segment == 1); |
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
REQUIRE(state.ready_to_rotate == 1); // Not decremented here
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SECTION("Encoder catches up after being behind") { |
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 0) == true); |
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == 0); |
|
|
|
|
|
|
|
|
|
// Logger advances to 1, encoder sends 0
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 0, 1) == false); // 0 - 0 = 0 < 1
|
|
|
|
|
REQUIRE(encoder.encoderd_segment_offset == -1); // Adjusted to 0 - 1
|
|
|
|
|
|
|
|
|
|
// Logger advances to 2, encoder sends 1
|
|
|
|
|
REQUIRE(encoder.syncSegment(&state, name, 1, 2) == true); // 1 - (-1) = 2 == 2
|
|
|
|
|
REQUIRE(encoder.current_segment == 2); |
|
|
|
|
REQUIRE(encoder.marked_ready_to_rotate == false); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|