blob: 0e9e4fcb606b4476a25f505140b5a19b58596f29 [file] [log] [blame]
Victor Boivieb2d539b2021-04-01 21:36:031/*
2 * Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include "net/dcsctp/rx/data_tracker.h"
11
12#include <cstdint>
13#include <initializer_list>
14#include <memory>
15
16#include "absl/types/optional.h"
17#include "api/array_view.h"
Henrik Boströmb951dc62022-01-26 17:38:1318#include "api/task_queue/task_queue_base.h"
Sergey Sukhanov38526982021-09-20 09:35:5919#include "net/dcsctp/common/handover_testing.h"
Victor Boivieb2d539b2021-04-01 21:36:0320#include "net/dcsctp/packet/chunk/sack_chunk.h"
21#include "net/dcsctp/timer/fake_timeout.h"
22#include "net/dcsctp/timer/timer.h"
23#include "rtc_base/gunit.h"
24#include "test/gmock.h"
25
26namespace dcsctp {
27namespace {
28using ::testing::ElementsAre;
29using ::testing::IsEmpty;
Victor Boiviec09c5812021-05-19 12:03:2230using ::testing::SizeIs;
Victor Boivie3a45d322021-05-19 11:40:5531using ::testing::UnorderedElementsAre;
Victor Boivie82cbbcc2023-11-08 15:31:4432using ::webrtc::TimeDelta;
33using ::webrtc::Timestamp;
Victor Boivieb2d539b2021-04-01 21:36:0334
35constexpr size_t kArwnd = 10000;
Victor Boiviec54f6722021-04-13 09:23:1636constexpr TSN kInitialTSN(11);
Victor Boivieb2d539b2021-04-01 21:36:0337
38class DataTrackerTest : public testing::Test {
39 protected:
40 DataTrackerTest()
41 : timeout_manager_([this]() { return now_; }),
Henrik Boströmb951dc62022-01-26 17:38:1342 timer_manager_([this](webrtc::TaskQueueBase::DelayPrecision precision) {
43 return timeout_manager_.CreateTimeout(precision);
44 }),
Victor Boivieb2d539b2021-04-01 21:36:0345 timer_(timer_manager_.CreateTimer(
46 "test/delayed_ack",
Victor Boivie43974822023-10-26 14:24:3047 []() { return TimeDelta::Zero(); },
48 TimerOptions(TimeDelta::Zero()))),
Sergey Sukhanov225cd472021-09-14 20:08:5349 tracker_(
50 std::make_unique<DataTracker>("log: ", timer_.get(), kInitialTSN)) {
51 }
Victor Boivieb2d539b2021-04-01 21:36:0352
Victor Boivie568bc232022-03-20 18:59:0353 void Observer(std::initializer_list<uint32_t> tsns,
54 bool expect_as_duplicate = false) {
Victor Boivieb2d539b2021-04-01 21:36:0355 for (const uint32_t tsn : tsns) {
Victor Boivie568bc232022-03-20 18:59:0356 if (expect_as_duplicate) {
57 EXPECT_FALSE(
58 tracker_->Observe(TSN(tsn), AnyDataChunk::ImmediateAckFlag(false)));
59 } else {
60 EXPECT_TRUE(
61 tracker_->Observe(TSN(tsn), AnyDataChunk::ImmediateAckFlag(false)));
62 }
Victor Boivieb2d539b2021-04-01 21:36:0363 }
64 }
65
Sergey Sukhanov225cd472021-09-14 20:08:5366 void HandoverTracker() {
67 EXPECT_TRUE(tracker_->GetHandoverReadiness().IsReady());
68 DcSctpSocketHandoverState state;
69 tracker_->AddHandoverState(state);
Sergey Sukhanov38526982021-09-20 09:35:5970 g_handover_state_transformer_for_test(&state);
Victor Boivie2cffde72022-06-27 20:35:3771 tracker_ =
72 std::make_unique<DataTracker>("log: ", timer_.get(), kInitialTSN);
73 tracker_->RestoreFromState(state);
Sergey Sukhanov225cd472021-09-14 20:08:5374 }
75
Victor Boivie82cbbcc2023-11-08 15:31:4476 Timestamp now_ = Timestamp::Zero();
Victor Boivieb2d539b2021-04-01 21:36:0377 FakeTimeoutManager timeout_manager_;
78 TimerManager timer_manager_;
79 std::unique_ptr<Timer> timer_;
Sergey Sukhanov225cd472021-09-14 20:08:5380 std::unique_ptr<DataTracker> tracker_;
Victor Boivieb2d539b2021-04-01 21:36:0381};
82
83TEST_F(DataTrackerTest, Empty) {
Sergey Sukhanov225cd472021-09-14 20:08:5384 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:0385 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
86 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
87 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
88}
89
90TEST_F(DataTrackerTest, ObserverSingleInOrderPacket) {
91 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:5392 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:0393 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(11));
94 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
95 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
96}
97
98TEST_F(DataTrackerTest, ObserverManyInOrderMovesCumulativeTsnAck) {
99 Observer({11, 12, 13});
Sergey Sukhanov225cd472021-09-14 20:08:53100 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03101 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(13));
102 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
103 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
104}
105
106TEST_F(DataTrackerTest, ObserveOutOfOrderMovesCumulativeTsnAck) {
107 Observer({12, 13, 14, 11});
Sergey Sukhanov225cd472021-09-14 20:08:53108 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03109 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(14));
110 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
111 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
112}
113
114TEST_F(DataTrackerTest, SingleGap) {
115 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53116 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03117 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
118 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2)));
119 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
120}
121
122TEST_F(DataTrackerTest, ExampleFromRFC4960Section334) {
123 Observer({11, 12, 14, 15, 17});
Sergey Sukhanov225cd472021-09-14 20:08:53124 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03125 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(12));
126 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 3),
127 SackChunk::GapAckBlock(5, 5)));
128 EXPECT_THAT(sack.duplicate_tsns(), IsEmpty());
129}
130
131TEST_F(DataTrackerTest, AckAlreadyReceivedChunk) {
132 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:53133 SackChunk sack1 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03134 EXPECT_EQ(sack1.cumulative_tsn_ack(), TSN(11));
135 EXPECT_THAT(sack1.gap_ack_blocks(), IsEmpty());
136
137 // Receive old chunk
Victor Boivie568bc232022-03-20 18:59:03138 Observer({8}, /*expect_as_duplicate=*/true);
Sergey Sukhanov225cd472021-09-14 20:08:53139 SackChunk sack2 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03140 EXPECT_EQ(sack2.cumulative_tsn_ack(), TSN(11));
141 EXPECT_THAT(sack2.gap_ack_blocks(), IsEmpty());
142}
143
144TEST_F(DataTrackerTest, DoubleSendRetransmittedChunk) {
145 Observer({11, 13, 14, 15});
Sergey Sukhanov225cd472021-09-14 20:08:53146 SackChunk sack1 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03147 EXPECT_EQ(sack1.cumulative_tsn_ack(), TSN(11));
148 EXPECT_THAT(sack1.gap_ack_blocks(),
149 ElementsAre(SackChunk::GapAckBlock(2, 4)));
150
151 // Fill in the hole.
152 Observer({12, 16, 17, 18});
Sergey Sukhanov225cd472021-09-14 20:08:53153 SackChunk sack2 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03154 EXPECT_EQ(sack2.cumulative_tsn_ack(), TSN(18));
155 EXPECT_THAT(sack2.gap_ack_blocks(), IsEmpty());
156
157 // Receive chunk 12 again.
Victor Boivie568bc232022-03-20 18:59:03158 Observer({12}, /*expect_as_duplicate=*/true);
159 Observer({19, 20, 21});
Sergey Sukhanov225cd472021-09-14 20:08:53160 SackChunk sack3 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03161 EXPECT_EQ(sack3.cumulative_tsn_ack(), TSN(21));
162 EXPECT_THAT(sack3.gap_ack_blocks(), IsEmpty());
163}
164
165TEST_F(DataTrackerTest, ForwardTsnSimple) {
166 // Messages (11, 12, 13), (14, 15) - first message expires.
167 Observer({11, 12, 15});
168
Sergey Sukhanov225cd472021-09-14 20:08:53169 tracker_->HandleForwardTsn(TSN(13));
Victor Boivieb2d539b2021-04-01 21:36:03170
Sergey Sukhanov225cd472021-09-14 20:08:53171 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03172 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(13));
173 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2)));
174}
175
176TEST_F(DataTrackerTest, ForwardTsnSkipsFromGapBlock) {
177 // Messages (11, 12, 13), (14, 15) - first message expires.
178 Observer({11, 12, 14});
179
Sergey Sukhanov225cd472021-09-14 20:08:53180 tracker_->HandleForwardTsn(TSN(13));
Victor Boivieb2d539b2021-04-01 21:36:03181
Sergey Sukhanov225cd472021-09-14 20:08:53182 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03183 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(14));
184 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
185}
186
187TEST_F(DataTrackerTest, ExampleFromRFC3758) {
Sergey Sukhanov225cd472021-09-14 20:08:53188 tracker_->HandleForwardTsn(TSN(102));
Victor Boivieb2d539b2021-04-01 21:36:03189
Victor Boivie568bc232022-03-20 18:59:03190 Observer({102}, /*expect_as_duplicate=*/true);
191 Observer({104, 105, 107});
Victor Boivieb2d539b2021-04-01 21:36:03192
Sergey Sukhanov225cd472021-09-14 20:08:53193 tracker_->HandleForwardTsn(TSN(103));
Victor Boivieb2d539b2021-04-01 21:36:03194
Sergey Sukhanov225cd472021-09-14 20:08:53195 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03196 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(105));
197 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2)));
198}
199
200TEST_F(DataTrackerTest, EmptyAllAcks) {
201 Observer({11, 13, 14, 15});
202
Sergey Sukhanov225cd472021-09-14 20:08:53203 tracker_->HandleForwardTsn(TSN(100));
Victor Boivieb2d539b2021-04-01 21:36:03204
Sergey Sukhanov225cd472021-09-14 20:08:53205 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivieb2d539b2021-04-01 21:36:03206 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(100));
207 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
208}
209
210TEST_F(DataTrackerTest, SetsArwndCorrectly) {
Sergey Sukhanov225cd472021-09-14 20:08:53211 SackChunk sack1 = tracker_->CreateSelectiveAck(/*a_rwnd=*/100);
Victor Boivieb2d539b2021-04-01 21:36:03212 EXPECT_EQ(sack1.a_rwnd(), 100u);
213
Sergey Sukhanov225cd472021-09-14 20:08:53214 SackChunk sack2 = tracker_->CreateSelectiveAck(/*a_rwnd=*/101);
Victor Boivieb2d539b2021-04-01 21:36:03215 EXPECT_EQ(sack2.a_rwnd(), 101u);
216}
217
218TEST_F(DataTrackerTest, WillIncreaseCumAckTsn) {
Sergey Sukhanov225cd472021-09-14 20:08:53219 EXPECT_EQ(tracker_->last_cumulative_acked_tsn(), TSN(10));
220 EXPECT_FALSE(tracker_->will_increase_cum_ack_tsn(TSN(10)));
221 EXPECT_TRUE(tracker_->will_increase_cum_ack_tsn(TSN(11)));
222 EXPECT_FALSE(tracker_->will_increase_cum_ack_tsn(TSN(12)));
Victor Boivieb2d539b2021-04-01 21:36:03223
224 Observer({11, 12, 13, 14, 15});
Sergey Sukhanov225cd472021-09-14 20:08:53225 EXPECT_EQ(tracker_->last_cumulative_acked_tsn(), TSN(15));
226 EXPECT_FALSE(tracker_->will_increase_cum_ack_tsn(TSN(15)));
227 EXPECT_TRUE(tracker_->will_increase_cum_ack_tsn(TSN(16)));
228 EXPECT_FALSE(tracker_->will_increase_cum_ack_tsn(TSN(17)));
Victor Boivieb2d539b2021-04-01 21:36:03229}
230
231TEST_F(DataTrackerTest, ForceShouldSendSackImmediately) {
Sergey Sukhanov225cd472021-09-14 20:08:53232 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivieb2d539b2021-04-01 21:36:03233
Sergey Sukhanov225cd472021-09-14 20:08:53234 tracker_->ForceImmediateSack();
Victor Boivieb2d539b2021-04-01 21:36:03235
Sergey Sukhanov225cd472021-09-14 20:08:53236 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivieb2d539b2021-04-01 21:36:03237}
Victor Boiviec54f6722021-04-13 09:23:16238
239TEST_F(DataTrackerTest, WillAcceptValidTSNs) {
240 // The initial TSN is always one more than the last, which is our base.
241 TSN last_tsn = TSN(*kInitialTSN - 1);
242 int limit = static_cast<int>(DataTracker::kMaxAcceptedOutstandingFragments);
243
244 for (int i = -limit; i <= limit; ++i) {
Sergey Sukhanov225cd472021-09-14 20:08:53245 EXPECT_TRUE(tracker_->IsTSNValid(TSN(*last_tsn + i)));
Victor Boiviec54f6722021-04-13 09:23:16246 }
247}
248
249TEST_F(DataTrackerTest, WillNotAcceptInvalidTSNs) {
250 // The initial TSN is always one more than the last, which is our base.
251 TSN last_tsn = TSN(*kInitialTSN - 1);
252
253 size_t limit = DataTracker::kMaxAcceptedOutstandingFragments;
Sergey Sukhanov225cd472021-09-14 20:08:53254 EXPECT_FALSE(tracker_->IsTSNValid(TSN(*last_tsn + limit + 1)));
255 EXPECT_FALSE(tracker_->IsTSNValid(TSN(*last_tsn - (limit + 1))));
256 EXPECT_FALSE(tracker_->IsTSNValid(TSN(*last_tsn + 0x8000000)));
257 EXPECT_FALSE(tracker_->IsTSNValid(TSN(*last_tsn - 0x8000000)));
Victor Boiviec54f6722021-04-13 09:23:16258}
259
Victor Boivie3a45d322021-05-19 11:40:55260TEST_F(DataTrackerTest, ReportSingleDuplicateTsns) {
Victor Boivie568bc232022-03-20 18:59:03261 Observer({11, 12});
262 Observer({11}, /*expect_as_duplicate=*/true);
Sergey Sukhanov225cd472021-09-14 20:08:53263 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie3a45d322021-05-19 11:40:55264 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(12));
265 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
266 EXPECT_THAT(sack.duplicate_tsns(), UnorderedElementsAre(TSN(11)));
267}
268
269TEST_F(DataTrackerTest, ReportMultipleDuplicateTsns) {
Victor Boivie568bc232022-03-20 18:59:03270 Observer({11, 12, 13, 14});
271 Observer({12, 13, 12, 13}, /*expect_as_duplicate=*/true);
272 Observer({15, 16});
Sergey Sukhanov225cd472021-09-14 20:08:53273 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie3a45d322021-05-19 11:40:55274 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(16));
275 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
276 EXPECT_THAT(sack.duplicate_tsns(), UnorderedElementsAre(TSN(12), TSN(13)));
277}
278
279TEST_F(DataTrackerTest, ReportDuplicateTsnsInGapAckBlocks) {
Victor Boivie568bc232022-03-20 18:59:03280 Observer({11, /*12,*/ 13, 14});
281 Observer({13, 14}, /*expect_as_duplicate=*/true);
282 Observer({15, 16});
Sergey Sukhanov225cd472021-09-14 20:08:53283 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie3a45d322021-05-19 11:40:55284 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(11));
285 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 5)));
286 EXPECT_THAT(sack.duplicate_tsns(), UnorderedElementsAre(TSN(13), TSN(14)));
287}
288
289TEST_F(DataTrackerTest, ClearsDuplicateTsnsAfterCreatingSack) {
Victor Boivie568bc232022-03-20 18:59:03290 Observer({11, 12, 13, 14});
291 Observer({12, 13, 12, 13}, /*expect_as_duplicate=*/true);
292 Observer({15, 16});
Sergey Sukhanov225cd472021-09-14 20:08:53293 SackChunk sack1 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie3a45d322021-05-19 11:40:55294 EXPECT_EQ(sack1.cumulative_tsn_ack(), TSN(16));
295 EXPECT_THAT(sack1.gap_ack_blocks(), IsEmpty());
296 EXPECT_THAT(sack1.duplicate_tsns(), UnorderedElementsAre(TSN(12), TSN(13)));
297
298 Observer({17});
Sergey Sukhanov225cd472021-09-14 20:08:53299 SackChunk sack2 = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie3a45d322021-05-19 11:40:55300 EXPECT_EQ(sack2.cumulative_tsn_ack(), TSN(17));
301 EXPECT_THAT(sack2.gap_ack_blocks(), IsEmpty());
302 EXPECT_THAT(sack2.duplicate_tsns(), IsEmpty());
303}
304
Victor Boiviec09c5812021-05-19 12:03:22305TEST_F(DataTrackerTest, LimitsNumberOfDuplicatesReported) {
306 for (size_t i = 0; i < DataTracker::kMaxDuplicateTsnReported + 10; ++i) {
307 TSN tsn(11 + i);
Sergey Sukhanov225cd472021-09-14 20:08:53308 tracker_->Observe(tsn, AnyDataChunk::ImmediateAckFlag(false));
309 tracker_->Observe(tsn, AnyDataChunk::ImmediateAckFlag(false));
Victor Boiviec09c5812021-05-19 12:03:22310 }
311
Sergey Sukhanov225cd472021-09-14 20:08:53312 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boiviec09c5812021-05-19 12:03:22313 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
314 EXPECT_THAT(sack.duplicate_tsns(),
315 SizeIs(DataTracker::kMaxDuplicateTsnReported));
316}
317
318TEST_F(DataTrackerTest, LimitsNumberOfGapAckBlocksReported) {
319 for (size_t i = 0; i < DataTracker::kMaxGapAckBlocksReported + 10; ++i) {
320 TSN tsn(11 + i * 2);
Sergey Sukhanov225cd472021-09-14 20:08:53321 tracker_->Observe(tsn, AnyDataChunk::ImmediateAckFlag(false));
Victor Boiviec09c5812021-05-19 12:03:22322 }
323
Sergey Sukhanov225cd472021-09-14 20:08:53324 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boiviec09c5812021-05-19 12:03:22325 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(11));
326 EXPECT_THAT(sack.gap_ack_blocks(),
327 SizeIs(DataTracker::kMaxGapAckBlocksReported));
328}
329
Victor Boivie5d4c3c52021-05-28 15:21:39330TEST_F(DataTrackerTest, SendsSackForFirstPacketObserved) {
331 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:53332 tracker_->ObservePacketEnd();
333 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39334 EXPECT_FALSE(timer_->is_running());
335}
336
337TEST_F(DataTrackerTest, SendsSackEverySecondPacketWhenThereIsNoPacketLoss) {
338 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:53339 tracker_->ObservePacketEnd();
340 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39341 EXPECT_FALSE(timer_->is_running());
342 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53343 tracker_->ObservePacketEnd();
344 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39345 EXPECT_TRUE(timer_->is_running());
346 Observer({13});
Sergey Sukhanov225cd472021-09-14 20:08:53347 tracker_->ObservePacketEnd();
348 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39349 EXPECT_FALSE(timer_->is_running());
350 Observer({14});
Sergey Sukhanov225cd472021-09-14 20:08:53351 tracker_->ObservePacketEnd();
352 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39353 EXPECT_TRUE(timer_->is_running());
354 Observer({15});
Sergey Sukhanov225cd472021-09-14 20:08:53355 tracker_->ObservePacketEnd();
356 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39357 EXPECT_FALSE(timer_->is_running());
358}
359
360TEST_F(DataTrackerTest, SendsSackEveryPacketOnPacketLoss) {
361 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:53362 tracker_->ObservePacketEnd();
363 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39364 EXPECT_FALSE(timer_->is_running());
365 Observer({13});
Sergey Sukhanov225cd472021-09-14 20:08:53366 tracker_->ObservePacketEnd();
367 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39368 EXPECT_FALSE(timer_->is_running());
369 Observer({14});
Sergey Sukhanov225cd472021-09-14 20:08:53370 tracker_->ObservePacketEnd();
371 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39372 EXPECT_FALSE(timer_->is_running());
373 Observer({15});
Sergey Sukhanov225cd472021-09-14 20:08:53374 tracker_->ObservePacketEnd();
375 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39376 EXPECT_FALSE(timer_->is_running());
377 Observer({16});
Sergey Sukhanov225cd472021-09-14 20:08:53378 tracker_->ObservePacketEnd();
379 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39380 EXPECT_FALSE(timer_->is_running());
381 // Fill the hole.
382 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53383 tracker_->ObservePacketEnd();
384 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39385 EXPECT_TRUE(timer_->is_running());
386 // Goes back to every second packet
387 Observer({17});
Sergey Sukhanov225cd472021-09-14 20:08:53388 tracker_->ObservePacketEnd();
389 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39390 EXPECT_FALSE(timer_->is_running());
391 Observer({18});
Sergey Sukhanov225cd472021-09-14 20:08:53392 tracker_->ObservePacketEnd();
393 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39394 EXPECT_TRUE(timer_->is_running());
395}
396
397TEST_F(DataTrackerTest, SendsSackOnDuplicateDataChunks) {
398 Observer({11});
Sergey Sukhanov225cd472021-09-14 20:08:53399 tracker_->ObservePacketEnd();
400 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39401 EXPECT_FALSE(timer_->is_running());
Victor Boivie568bc232022-03-20 18:59:03402 Observer({11}, /*expect_as_duplicate=*/true);
Sergey Sukhanov225cd472021-09-14 20:08:53403 tracker_->ObservePacketEnd();
404 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39405 EXPECT_FALSE(timer_->is_running());
406 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53407 tracker_->ObservePacketEnd();
408 EXPECT_FALSE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39409 EXPECT_TRUE(timer_->is_running());
410 // Goes back to every second packet
411 Observer({13});
Sergey Sukhanov225cd472021-09-14 20:08:53412 tracker_->ObservePacketEnd();
413 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39414 EXPECT_FALSE(timer_->is_running());
415 // Duplicate again
Victor Boivie568bc232022-03-20 18:59:03416 Observer({12}, /*expect_as_duplicate=*/true);
Sergey Sukhanov225cd472021-09-14 20:08:53417 tracker_->ObservePacketEnd();
418 EXPECT_TRUE(tracker_->ShouldSendAck());
Victor Boivie5d4c3c52021-05-28 15:21:39419 EXPECT_FALSE(timer_->is_running());
420}
421
Victor Boivie27d2be32021-05-29 19:20:12422TEST_F(DataTrackerTest, GapAckBlockAddSingleBlock) {
423 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53424 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12425 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
426 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2)));
427}
428
429TEST_F(DataTrackerTest, GapAckBlockAddsAnother) {
430 Observer({12});
431 Observer({14});
Sergey Sukhanov225cd472021-09-14 20:08:53432 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12433 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
434 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2),
435 SackChunk::GapAckBlock(4, 4)));
436}
437
438TEST_F(DataTrackerTest, GapAckBlockAddsDuplicate) {
439 Observer({12});
Victor Boivie568bc232022-03-20 18:59:03440 Observer({12}, /*expect_as_duplicate=*/true);
Sergey Sukhanov225cd472021-09-14 20:08:53441 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12442 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
443 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 2)));
444 EXPECT_THAT(sack.duplicate_tsns(), ElementsAre(TSN(12)));
445}
446
447TEST_F(DataTrackerTest, GapAckBlockExpandsToRight) {
448 Observer({12});
449 Observer({13});
Sergey Sukhanov225cd472021-09-14 20:08:53450 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12451 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
452 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 3)));
453}
454
455TEST_F(DataTrackerTest, GapAckBlockExpandsToRightWithOther) {
456 Observer({12});
457 Observer({20});
458 Observer({30});
459 Observer({21});
Sergey Sukhanov225cd472021-09-14 20:08:53460 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12461 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
462 EXPECT_THAT(sack.gap_ack_blocks(),
463 ElementsAre(SackChunk::GapAckBlock(2, 2), //
464 SackChunk::GapAckBlock(10, 11), //
465 SackChunk::GapAckBlock(20, 20)));
466}
467
468TEST_F(DataTrackerTest, GapAckBlockExpandsToLeft) {
469 Observer({13});
470 Observer({12});
Sergey Sukhanov225cd472021-09-14 20:08:53471 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12472 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
473 EXPECT_THAT(sack.gap_ack_blocks(), ElementsAre(SackChunk::GapAckBlock(2, 3)));
474}
475
476TEST_F(DataTrackerTest, GapAckBlockExpandsToLeftWithOther) {
477 Observer({12});
478 Observer({21});
479 Observer({30});
480 Observer({20});
Sergey Sukhanov225cd472021-09-14 20:08:53481 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12482 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
483 EXPECT_THAT(sack.gap_ack_blocks(),
484 ElementsAre(SackChunk::GapAckBlock(2, 2), //
485 SackChunk::GapAckBlock(10, 11), //
486 SackChunk::GapAckBlock(20, 20)));
487}
488
489TEST_F(DataTrackerTest, GapAckBlockExpandsToLRightAndMerges) {
490 Observer({12});
491 Observer({20});
492 Observer({22});
493 Observer({30});
494 Observer({21});
Sergey Sukhanov225cd472021-09-14 20:08:53495 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
Victor Boivie27d2be32021-05-29 19:20:12496 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(10));
497 EXPECT_THAT(sack.gap_ack_blocks(),
498 ElementsAre(SackChunk::GapAckBlock(2, 2), //
499 SackChunk::GapAckBlock(10, 12), //
500 SackChunk::GapAckBlock(20, 20)));
501}
502
503TEST_F(DataTrackerTest, GapAckBlockMergesManyBlocksIntoOne) {
504 Observer({22});
Sergey Sukhanov225cd472021-09-14 20:08:53505 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12506 ElementsAre(SackChunk::GapAckBlock(12, 12)));
507 Observer({30});
Sergey Sukhanov225cd472021-09-14 20:08:53508 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12509 ElementsAre(SackChunk::GapAckBlock(12, 12), //
510 SackChunk::GapAckBlock(20, 20)));
511 Observer({24});
Sergey Sukhanov225cd472021-09-14 20:08:53512 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12513 ElementsAre(SackChunk::GapAckBlock(12, 12), //
514 SackChunk::GapAckBlock(14, 14), //
515 SackChunk::GapAckBlock(20, 20)));
516 Observer({28});
Sergey Sukhanov225cd472021-09-14 20:08:53517 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12518 ElementsAre(SackChunk::GapAckBlock(12, 12), //
519 SackChunk::GapAckBlock(14, 14), //
520 SackChunk::GapAckBlock(18, 18), //
521 SackChunk::GapAckBlock(20, 20)));
522 Observer({26});
Sergey Sukhanov225cd472021-09-14 20:08:53523 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12524 ElementsAre(SackChunk::GapAckBlock(12, 12), //
525 SackChunk::GapAckBlock(14, 14), //
526 SackChunk::GapAckBlock(16, 16), //
527 SackChunk::GapAckBlock(18, 18), //
528 SackChunk::GapAckBlock(20, 20)));
529 Observer({29});
Sergey Sukhanov225cd472021-09-14 20:08:53530 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12531 ElementsAre(SackChunk::GapAckBlock(12, 12), //
532 SackChunk::GapAckBlock(14, 14), //
533 SackChunk::GapAckBlock(16, 16), //
534 SackChunk::GapAckBlock(18, 20)));
535 Observer({23});
Sergey Sukhanov225cd472021-09-14 20:08:53536 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12537 ElementsAre(SackChunk::GapAckBlock(12, 14), //
538 SackChunk::GapAckBlock(16, 16), //
539 SackChunk::GapAckBlock(18, 20)));
540 Observer({27});
Sergey Sukhanov225cd472021-09-14 20:08:53541 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12542 ElementsAre(SackChunk::GapAckBlock(12, 14), //
543 SackChunk::GapAckBlock(16, 20)));
544
545 Observer({25});
Sergey Sukhanov225cd472021-09-14 20:08:53546 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12547 ElementsAre(SackChunk::GapAckBlock(12, 20)));
548 Observer({20});
Sergey Sukhanov225cd472021-09-14 20:08:53549 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12550 ElementsAre(SackChunk::GapAckBlock(10, 10), //
551 SackChunk::GapAckBlock(12, 20)));
552 Observer({32});
Sergey Sukhanov225cd472021-09-14 20:08:53553 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12554 ElementsAre(SackChunk::GapAckBlock(10, 10), //
555 SackChunk::GapAckBlock(12, 20), //
556 SackChunk::GapAckBlock(22, 22)));
557 Observer({21});
Sergey Sukhanov225cd472021-09-14 20:08:53558 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12559 ElementsAre(SackChunk::GapAckBlock(10, 20), //
560 SackChunk::GapAckBlock(22, 22)));
561 Observer({31});
Sergey Sukhanov225cd472021-09-14 20:08:53562 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12563 ElementsAre(SackChunk::GapAckBlock(10, 22)));
564}
565
566TEST_F(DataTrackerTest, GapAckBlockRemoveBeforeCumAckTsn) {
567 Observer({12, 13, 14, 20, 21, 22, 30, 31});
568
Sergey Sukhanov225cd472021-09-14 20:08:53569 tracker_->HandleForwardTsn(TSN(8));
570 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(10));
571 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12572 ElementsAre(SackChunk::GapAckBlock(2, 4), //
573 SackChunk::GapAckBlock(10, 12),
574 SackChunk::GapAckBlock(20, 21)));
575}
576
577TEST_F(DataTrackerTest, GapAckBlockRemoveBeforeFirstBlock) {
578 Observer({12, 13, 14, 20, 21, 22, 30, 31});
579
Sergey Sukhanov225cd472021-09-14 20:08:53580 tracker_->HandleForwardTsn(TSN(11));
581 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(14));
582 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12583 ElementsAre(SackChunk::GapAckBlock(6, 8), //
584 SackChunk::GapAckBlock(16, 17)));
585}
586
587TEST_F(DataTrackerTest, GapAckBlockRemoveAtBeginningOfFirstBlock) {
588 Observer({12, 13, 14, 20, 21, 22, 30, 31});
589
Sergey Sukhanov225cd472021-09-14 20:08:53590 tracker_->HandleForwardTsn(TSN(12));
591 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(14));
592 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12593 ElementsAre(SackChunk::GapAckBlock(6, 8), //
594 SackChunk::GapAckBlock(16, 17)));
595}
596
597TEST_F(DataTrackerTest, GapAckBlockRemoveAtMiddleOfFirstBlock) {
598 Observer({12, 13, 14, 20, 21, 22, 30, 31});
Sergey Sukhanov225cd472021-09-14 20:08:53599 tracker_->HandleForwardTsn(TSN(13));
600 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(14));
601 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12602 ElementsAre(SackChunk::GapAckBlock(6, 8), //
603 SackChunk::GapAckBlock(16, 17)));
604}
605
606TEST_F(DataTrackerTest, GapAckBlockRemoveAtEndOfFirstBlock) {
607 Observer({12, 13, 14, 20, 21, 22, 30, 31});
Sergey Sukhanov225cd472021-09-14 20:08:53608 tracker_->HandleForwardTsn(TSN(14));
609 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(14));
610 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12611 ElementsAre(SackChunk::GapAckBlock(6, 8), //
612 SackChunk::GapAckBlock(16, 17)));
613}
614
615TEST_F(DataTrackerTest, GapAckBlockRemoveRightAfterFirstBlock) {
616 Observer({12, 13, 14, 20, 21, 22, 30, 31});
617
Sergey Sukhanov225cd472021-09-14 20:08:53618 tracker_->HandleForwardTsn(TSN(18));
619 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(18));
620 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12621 ElementsAre(SackChunk::GapAckBlock(2, 4), //
622 SackChunk::GapAckBlock(12, 13)));
623}
624
625TEST_F(DataTrackerTest, GapAckBlockRemoveRightBeforeSecondBlock) {
626 Observer({12, 13, 14, 20, 21, 22, 30, 31});
627
Sergey Sukhanov225cd472021-09-14 20:08:53628 tracker_->HandleForwardTsn(TSN(19));
629 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(22));
630 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12631 ElementsAre(SackChunk::GapAckBlock(8, 9)));
632}
633
634TEST_F(DataTrackerTest, GapAckBlockRemoveRightAtStartOfSecondBlock) {
635 Observer({12, 13, 14, 20, 21, 22, 30, 31});
636
Sergey Sukhanov225cd472021-09-14 20:08:53637 tracker_->HandleForwardTsn(TSN(20));
638 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(22));
639 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12640 ElementsAre(SackChunk::GapAckBlock(8, 9)));
641}
642
643TEST_F(DataTrackerTest, GapAckBlockRemoveRightAtMiddleOfSecondBlock) {
644 Observer({12, 13, 14, 20, 21, 22, 30, 31});
645
Sergey Sukhanov225cd472021-09-14 20:08:53646 tracker_->HandleForwardTsn(TSN(21));
647 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(22));
648 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12649 ElementsAre(SackChunk::GapAckBlock(8, 9)));
650}
651
652TEST_F(DataTrackerTest, GapAckBlockRemoveRightAtEndOfSecondBlock) {
653 Observer({12, 13, 14, 20, 21, 22, 30, 31});
654
Sergey Sukhanov225cd472021-09-14 20:08:53655 tracker_->HandleForwardTsn(TSN(22));
656 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(22));
657 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(),
Victor Boivie27d2be32021-05-29 19:20:12658 ElementsAre(SackChunk::GapAckBlock(8, 9)));
659}
660
661TEST_F(DataTrackerTest, GapAckBlockRemoveeFarAfterAllBlocks) {
662 Observer({12, 13, 14, 20, 21, 22, 30, 31});
663
Sergey Sukhanov225cd472021-09-14 20:08:53664 tracker_->HandleForwardTsn(TSN(40));
665 EXPECT_EQ(tracker_->CreateSelectiveAck(kArwnd).cumulative_tsn_ack(), TSN(40));
666 EXPECT_THAT(tracker_->CreateSelectiveAck(kArwnd).gap_ack_blocks(), IsEmpty());
Victor Boivie27d2be32021-05-29 19:20:12667}
668
Sergey Sukhanov225cd472021-09-14 20:08:53669TEST_F(DataTrackerTest, HandoverEmpty) {
670 HandoverTracker();
671 Observer({11});
672 SackChunk sack = tracker_->CreateSelectiveAck(kArwnd);
673 EXPECT_EQ(sack.cumulative_tsn_ack(), TSN(11));
674 EXPECT_THAT(sack.gap_ack_blocks(), IsEmpty());
675}
676
677TEST_F(DataTrackerTest,
678 HandoverWhileSendingSackEverySecondPacketWhenThereIsNoPacketLoss) {
679 Observer({11});
680 tracker_->ObservePacketEnd();
681 EXPECT_TRUE(tracker_->ShouldSendAck());
682
683 HandoverTracker();
684
685 Observer({12});
686 tracker_->ObservePacketEnd();
687 EXPECT_FALSE(tracker_->ShouldSendAck());
688 Observer({13});
689 tracker_->ObservePacketEnd();
690 EXPECT_TRUE(tracker_->ShouldSendAck());
691 EXPECT_FALSE(timer_->is_running());
692 Observer({14});
693 tracker_->ObservePacketEnd();
694 EXPECT_FALSE(tracker_->ShouldSendAck());
695 EXPECT_TRUE(timer_->is_running());
696 Observer({15});
697 tracker_->ObservePacketEnd();
698 EXPECT_TRUE(tracker_->ShouldSendAck());
699 EXPECT_FALSE(timer_->is_running());
700}
701
702TEST_F(DataTrackerTest, HandoverWhileSendingSackEveryPacketOnPacketLoss) {
703 Observer({11});
704 tracker_->ObservePacketEnd();
705 EXPECT_TRUE(tracker_->ShouldSendAck());
706 Observer({13});
707 EXPECT_EQ(tracker_->GetHandoverReadiness(),
708 HandoverReadinessStatus().Add(
709 HandoverUnreadinessReason::kDataTrackerTsnBlocksPending));
710 tracker_->ObservePacketEnd();
711 EXPECT_TRUE(tracker_->ShouldSendAck());
712 Observer({14});
713 tracker_->ObservePacketEnd();
714 EXPECT_TRUE(tracker_->ShouldSendAck());
715 EXPECT_EQ(tracker_->GetHandoverReadiness(),
716 HandoverReadinessStatus(
717 HandoverUnreadinessReason::kDataTrackerTsnBlocksPending));
718 Observer({15});
719 tracker_->ObservePacketEnd();
720 EXPECT_TRUE(tracker_->ShouldSendAck());
721 Observer({16});
722 tracker_->ObservePacketEnd();
723 EXPECT_TRUE(tracker_->ShouldSendAck());
724 // Fill the hole.
725 Observer({12});
726 tracker_->ObservePacketEnd();
727 EXPECT_FALSE(tracker_->ShouldSendAck());
728 // Goes back to every second packet
729 Observer({17});
730 tracker_->ObservePacketEnd();
731 EXPECT_TRUE(tracker_->ShouldSendAck());
732
733 HandoverTracker();
734
735 Observer({18});
736 tracker_->ObservePacketEnd();
737 EXPECT_FALSE(tracker_->ShouldSendAck());
738 EXPECT_TRUE(timer_->is_running());
739}
Victor Boiviea5574682023-09-25 11:32:59740
741TEST_F(DataTrackerTest, DoesNotAcceptDataBeforeForwardTsn) {
742 Observer({12, 13, 14, 15, 17});
743 tracker_->ObservePacketEnd();
744
745 tracker_->HandleForwardTsn(TSN(13));
746
747 EXPECT_FALSE(tracker_->Observe(TSN(11)));
748}
749
750TEST_F(DataTrackerTest, DoesNotAcceptDataAtForwardTsn) {
751 Observer({12, 13, 14, 15, 17});
752 tracker_->ObservePacketEnd();
753
754 tracker_->HandleForwardTsn(TSN(16));
755
756 EXPECT_FALSE(tracker_->Observe(TSN(16)));
757}
758
759TEST_F(DataTrackerTest, DoesNotAcceptDataBeforeCumAckTsn) {
760 EXPECT_EQ(kInitialTSN, TSN(11));
761 EXPECT_FALSE(tracker_->Observe(TSN(10)));
762}
763
764TEST_F(DataTrackerTest, DoesNotAcceptContiguousDuplicateData) {
765 EXPECT_EQ(kInitialTSN, TSN(11));
766 EXPECT_TRUE(tracker_->Observe(TSN(11)));
767 EXPECT_FALSE(tracker_->Observe(TSN(11)));
768 EXPECT_TRUE(tracker_->Observe(TSN(12)));
769 EXPECT_FALSE(tracker_->Observe(TSN(12)));
770 EXPECT_FALSE(tracker_->Observe(TSN(11)));
771 EXPECT_FALSE(tracker_->Observe(TSN(10)));
772}
773
774TEST_F(DataTrackerTest, DoesNotAcceptGapsWithDuplicateData) {
775 EXPECT_EQ(kInitialTSN, TSN(11));
776 EXPECT_TRUE(tracker_->Observe(TSN(11)));
777 EXPECT_FALSE(tracker_->Observe(TSN(11)));
778
779 EXPECT_TRUE(tracker_->Observe(TSN(14)));
780 EXPECT_FALSE(tracker_->Observe(TSN(14)));
781
782 EXPECT_TRUE(tracker_->Observe(TSN(13)));
783 EXPECT_FALSE(tracker_->Observe(TSN(13)));
784
785 EXPECT_TRUE(tracker_->Observe(TSN(12)));
786 EXPECT_FALSE(tracker_->Observe(TSN(12)));
787}
788
Victor Boivieb506d682023-11-30 12:06:03789TEST_F(DataTrackerTest, NotReadyForHandoverWhenHavingTsnGaps) {
790 tracker_->Observe(TSN(10));
791 tracker_->Observe(TSN(12));
792 EXPECT_EQ(tracker_->GetHandoverReadiness(),
793 HandoverReadinessStatus().Add(
794 HandoverUnreadinessReason::kDataTrackerTsnBlocksPending));
795
796 tracker_->Observe(TSN(11));
797 EXPECT_EQ(tracker_->GetHandoverReadiness(), HandoverReadinessStatus());
798}
799
Victor Boivieb2d539b2021-04-01 21:36:03800} // namespace
801} // namespace dcsctp