blob: 86ac933d0ff2126d1e92664c9f1059d847e3f9cc [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_received_packet_manager.h"
6
7#include <algorithm>
8#include <ostream>
9#include <vector>
10
11#include "net/third_party/quiche/src/quic/core/congestion_control/rtt_stats.h"
12#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
13#include "net/third_party/quiche/src/quic/core/quic_connection_stats.h"
14#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
15#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
16#include "net/third_party/quiche/src/quic/test_tools/mock_clock.h"
17
18namespace quic {
19namespace test {
20
21class QuicReceivedPacketManagerPeer {
22 public:
23 static void SetAckMode(QuicReceivedPacketManager* manager, AckMode ack_mode) {
24 manager->ack_mode_ = ack_mode;
25 }
26
27 static void SetFastAckAfterQuiescence(QuicReceivedPacketManager* manager,
28 bool fast_ack_after_quiescence) {
29 manager->fast_ack_after_quiescence_ = fast_ack_after_quiescence;
30 }
31
32 static void SetAckDecimationDelay(QuicReceivedPacketManager* manager,
33 float ack_decimation_delay) {
34 manager->ack_decimation_delay_ = ack_decimation_delay;
35 }
36};
37
38namespace {
39
40const bool kInstigateAck = true;
41const QuicTime::Delta kMinRttMs = QuicTime::Delta::FromMilliseconds(40);
42const QuicTime::Delta kDelayedAckTime =
43 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
44
45struct TestParams {
46 explicit TestParams(QuicTransportVersion version) : version(version) {}
47
48 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
49 os << "{ version: " << QuicVersionToString(p.version) << " }";
50 return os;
51 }
52
53 QuicTransportVersion version;
54};
55
56std::vector<TestParams> GetTestParams() {
57 std::vector<TestParams> params;
58 QuicTransportVersionVector all_supported_versions =
59 AllSupportedTransportVersions();
60 for (size_t i = 0; i < all_supported_versions.size(); ++i) {
61 params.push_back(TestParams(all_supported_versions[i]));
62 }
63 return params;
64}
65
66class QuicReceivedPacketManagerTest : public QuicTestWithParam<TestParams> {
67 protected:
68 QuicReceivedPacketManagerTest() : received_manager_(&stats_) {
69 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
70 rtt_stats_.UpdateRtt(kMinRttMs, QuicTime::Delta::Zero(), QuicTime::Zero());
71 received_manager_.set_save_timestamps(true);
72 }
73
74 void RecordPacketReceipt(uint64_t packet_number) {
75 RecordPacketReceipt(packet_number, QuicTime::Zero());
76 }
77
78 void RecordPacketReceipt(uint64_t packet_number, QuicTime receipt_time) {
79 QuicPacketHeader header;
80 header.packet_number = QuicPacketNumber(packet_number);
81 received_manager_.RecordPacketReceived(header, receipt_time);
82 }
83
84 bool HasPendingAck() {
QUICHE teama6ef0a62019-03-07 20:34:33 -050085 return received_manager_.ack_timeout().IsInitialized();
86 }
87
88 void MaybeUpdateAckTimeout(bool should_last_packet_instigate_acks,
89 uint64_t last_received_packet_number) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050090 received_manager_.MaybeUpdateAckTimeout(
91 should_last_packet_instigate_acks,
92 QuicPacketNumber(last_received_packet_number), clock_.ApproximateNow(),
93 clock_.ApproximateNow(), &rtt_stats_, kDelayedAckTime);
94 }
95
96 void CheckAckTimeout(QuicTime time) {
97 DCHECK(HasPendingAck() && received_manager_.ack_timeout() == time);
98 if (time <= clock_.ApproximateNow()) {
99 // ACK timeout expires, send an ACK.
100 received_manager_.ResetAckStates();
101 DCHECK(!HasPendingAck());
102 }
103 }
104
105 MockClock clock_;
106 RttStats rtt_stats_;
107 QuicConnectionStats stats_;
108 QuicReceivedPacketManager received_manager_;
109};
110
111INSTANTIATE_TEST_SUITE_P(QuicReceivedPacketManagerTest,
112 QuicReceivedPacketManagerTest,
113 ::testing::ValuesIn(GetTestParams()));
114
115TEST_P(QuicReceivedPacketManagerTest, DontWaitForPacketsBefore) {
116 QuicPacketHeader header;
117 header.packet_number = QuicPacketNumber(2u);
118 received_manager_.RecordPacketReceived(header, QuicTime::Zero());
119 header.packet_number = QuicPacketNumber(7u);
120 received_manager_.RecordPacketReceived(header, QuicTime::Zero());
121 EXPECT_TRUE(received_manager_.IsAwaitingPacket(QuicPacketNumber(3u)));
122 EXPECT_TRUE(received_manager_.IsAwaitingPacket(QuicPacketNumber(6u)));
123 received_manager_.DontWaitForPacketsBefore(QuicPacketNumber(4));
124 EXPECT_FALSE(received_manager_.IsAwaitingPacket(QuicPacketNumber(3u)));
125 EXPECT_TRUE(received_manager_.IsAwaitingPacket(QuicPacketNumber(6u)));
126}
127
128TEST_P(QuicReceivedPacketManagerTest, GetUpdatedAckFrame) {
129 QuicPacketHeader header;
130 header.packet_number = QuicPacketNumber(2u);
131 QuicTime two_ms = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
132 EXPECT_FALSE(received_manager_.ack_frame_updated());
133 received_manager_.RecordPacketReceived(header, two_ms);
134 EXPECT_TRUE(received_manager_.ack_frame_updated());
135
136 QuicFrame ack = received_manager_.GetUpdatedAckFrame(QuicTime::Zero());
fayangf477f732019-06-20 07:03:06 -0700137 received_manager_.ResetAckStates();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500138 EXPECT_FALSE(received_manager_.ack_frame_updated());
139 // When UpdateReceivedPacketInfo with a time earlier than the time of the
140 // largest observed packet, make sure that the delta is 0, not negative.
141 EXPECT_EQ(QuicTime::Delta::Zero(), ack.ack_frame->ack_delay_time);
142 EXPECT_EQ(1u, ack.ack_frame->received_packet_times.size());
143
144 QuicTime four_ms = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(4);
145 ack = received_manager_.GetUpdatedAckFrame(four_ms);
fayangf477f732019-06-20 07:03:06 -0700146 received_manager_.ResetAckStates();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500147 EXPECT_FALSE(received_manager_.ack_frame_updated());
148 // When UpdateReceivedPacketInfo after not having received a new packet,
149 // the delta should still be accurate.
150 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(2),
151 ack.ack_frame->ack_delay_time);
152 // And received packet times won't have change.
153 EXPECT_EQ(1u, ack.ack_frame->received_packet_times.size());
154
155 header.packet_number = QuicPacketNumber(999u);
156 received_manager_.RecordPacketReceived(header, two_ms);
157 header.packet_number = QuicPacketNumber(4u);
158 received_manager_.RecordPacketReceived(header, two_ms);
159 header.packet_number = QuicPacketNumber(1000u);
160 received_manager_.RecordPacketReceived(header, two_ms);
161 EXPECT_TRUE(received_manager_.ack_frame_updated());
162 ack = received_manager_.GetUpdatedAckFrame(two_ms);
fayangf477f732019-06-20 07:03:06 -0700163 received_manager_.ResetAckStates();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500164 EXPECT_FALSE(received_manager_.ack_frame_updated());
165 // UpdateReceivedPacketInfo should discard any times which can't be
166 // expressed on the wire.
167 EXPECT_EQ(2u, ack.ack_frame->received_packet_times.size());
168}
169
170TEST_P(QuicReceivedPacketManagerTest, UpdateReceivedConnectionStats) {
171 EXPECT_FALSE(received_manager_.ack_frame_updated());
172 RecordPacketReceipt(1);
173 EXPECT_TRUE(received_manager_.ack_frame_updated());
174 RecordPacketReceipt(6);
175 RecordPacketReceipt(2,
176 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1));
177
178 EXPECT_EQ(4u, stats_.max_sequence_reordering);
179 EXPECT_EQ(1000, stats_.max_time_reordering_us);
180 EXPECT_EQ(1u, stats_.packets_reordered);
181}
182
183TEST_P(QuicReceivedPacketManagerTest, LimitAckRanges) {
184 received_manager_.set_max_ack_ranges(10);
185 EXPECT_FALSE(received_manager_.ack_frame_updated());
186 for (int i = 0; i < 100; ++i) {
187 RecordPacketReceipt(1 + 2 * i);
188 EXPECT_TRUE(received_manager_.ack_frame_updated());
189 received_manager_.GetUpdatedAckFrame(QuicTime::Zero());
190 EXPECT_GE(10u, received_manager_.ack_frame().packets.NumIntervals());
191 EXPECT_EQ(QuicPacketNumber(1u + 2 * i),
192 received_manager_.ack_frame().packets.Max());
193 for (int j = 0; j < std::min(10, i + 1); ++j) {
194 ASSERT_GE(i, j);
195 EXPECT_TRUE(received_manager_.ack_frame().packets.Contains(
196 QuicPacketNumber(1 + (i - j) * 2)));
197 if (i > j) {
198 EXPECT_FALSE(received_manager_.ack_frame().packets.Contains(
199 QuicPacketNumber((i - j) * 2)));
200 }
201 }
202 }
203}
204
205TEST_P(QuicReceivedPacketManagerTest, IgnoreOutOfOrderTimestamps) {
206 EXPECT_FALSE(received_manager_.ack_frame_updated());
207 RecordPacketReceipt(1, QuicTime::Zero());
208 EXPECT_TRUE(received_manager_.ack_frame_updated());
209 EXPECT_EQ(1u, received_manager_.ack_frame().received_packet_times.size());
210 RecordPacketReceipt(2,
211 QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1));
212 EXPECT_EQ(2u, received_manager_.ack_frame().received_packet_times.size());
213 RecordPacketReceipt(3, QuicTime::Zero());
214 EXPECT_EQ(2u, received_manager_.ack_frame().received_packet_times.size());
215}
216
217TEST_P(QuicReceivedPacketManagerTest, HasMissingPackets) {
fayang6dba4902019-06-17 10:04:23 -0700218 EXPECT_QUIC_BUG(received_manager_.PeerFirstSendingPacketNumber(),
219 "No packets have been received yet");
QUICHE teama6ef0a62019-03-07 20:34:33 -0500220 RecordPacketReceipt(4, QuicTime::Zero());
fayang6dba4902019-06-17 10:04:23 -0700221 EXPECT_EQ(QuicPacketNumber(4),
222 received_manager_.PeerFirstSendingPacketNumber());
223 EXPECT_FALSE(received_manager_.HasMissingPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500224 RecordPacketReceipt(3, QuicTime::Zero());
fayang6dba4902019-06-17 10:04:23 -0700225 EXPECT_FALSE(received_manager_.HasMissingPackets());
226 EXPECT_EQ(QuicPacketNumber(3),
227 received_manager_.PeerFirstSendingPacketNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500228 RecordPacketReceipt(1, QuicTime::Zero());
229 EXPECT_EQ(QuicPacketNumber(1),
230 received_manager_.PeerFirstSendingPacketNumber());
231 EXPECT_TRUE(received_manager_.HasMissingPackets());
232 RecordPacketReceipt(2, QuicTime::Zero());
233 EXPECT_EQ(QuicPacketNumber(1),
234 received_manager_.PeerFirstSendingPacketNumber());
235 EXPECT_FALSE(received_manager_.HasMissingPackets());
236}
237
238TEST_P(QuicReceivedPacketManagerTest, OutOfOrderReceiptCausesAckSent) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500239 EXPECT_FALSE(HasPendingAck());
240
241 RecordPacketReceipt(3, clock_.ApproximateNow());
242 MaybeUpdateAckTimeout(kInstigateAck, 3);
fayang6dba4902019-06-17 10:04:23 -0700243 // Delayed ack is scheduled.
244 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500245
246 RecordPacketReceipt(2, clock_.ApproximateNow());
247 MaybeUpdateAckTimeout(kInstigateAck, 2);
248 CheckAckTimeout(clock_.ApproximateNow());
249
250 RecordPacketReceipt(1, clock_.ApproximateNow());
251 MaybeUpdateAckTimeout(kInstigateAck, 1);
252 // Should ack immediately, since this fills the last hole.
253 CheckAckTimeout(clock_.ApproximateNow());
254
255 RecordPacketReceipt(4, clock_.ApproximateNow());
256 MaybeUpdateAckTimeout(kInstigateAck, 4);
257 // Delayed ack is scheduled.
258 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
259}
260
261TEST_P(QuicReceivedPacketManagerTest, OutOfOrderAckReceiptCausesNoAck) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500262 EXPECT_FALSE(HasPendingAck());
263
264 RecordPacketReceipt(2, clock_.ApproximateNow());
265 MaybeUpdateAckTimeout(!kInstigateAck, 2);
266 EXPECT_FALSE(HasPendingAck());
267
268 RecordPacketReceipt(1, clock_.ApproximateNow());
269 MaybeUpdateAckTimeout(!kInstigateAck, 1);
270 EXPECT_FALSE(HasPendingAck());
271}
272
273TEST_P(QuicReceivedPacketManagerTest, AckReceiptCausesAckSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274 EXPECT_FALSE(HasPendingAck());
275
276 RecordPacketReceipt(1, clock_.ApproximateNow());
277 MaybeUpdateAckTimeout(!kInstigateAck, 1);
278 EXPECT_FALSE(HasPendingAck());
279
280 RecordPacketReceipt(2, clock_.ApproximateNow());
281 MaybeUpdateAckTimeout(!kInstigateAck, 2);
282 EXPECT_FALSE(HasPendingAck());
283
284 RecordPacketReceipt(3, clock_.ApproximateNow());
285 MaybeUpdateAckTimeout(kInstigateAck, 3);
286 // Delayed ack is scheduled.
287 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
288 clock_.AdvanceTime(kDelayedAckTime);
289 CheckAckTimeout(clock_.ApproximateNow());
290
291 RecordPacketReceipt(4, clock_.ApproximateNow());
292 MaybeUpdateAckTimeout(!kInstigateAck, 4);
293 EXPECT_FALSE(HasPendingAck());
294
295 RecordPacketReceipt(5, clock_.ApproximateNow());
296 MaybeUpdateAckTimeout(!kInstigateAck, 5);
297 EXPECT_FALSE(HasPendingAck());
298}
299
300TEST_P(QuicReceivedPacketManagerTest, AckSentEveryNthPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500301 EXPECT_FALSE(HasPendingAck());
302 received_manager_.set_ack_frequency_before_ack_decimation(3);
303
304 // Receives packets 1 - 39.
305 for (size_t i = 1; i <= 39; ++i) {
306 RecordPacketReceipt(i, clock_.ApproximateNow());
307 MaybeUpdateAckTimeout(kInstigateAck, i);
308 if (i % 3 == 0) {
309 CheckAckTimeout(clock_.ApproximateNow());
310 } else {
311 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
312 }
313 }
314}
315
316TEST_P(QuicReceivedPacketManagerTest, AckDecimationReducesAcks) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500317 EXPECT_FALSE(HasPendingAck());
318 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_,
319 ACK_DECIMATION_WITH_REORDERING);
320
321 // Start ack decimation from 10th packet.
322 received_manager_.set_min_received_before_ack_decimation(10);
323
324 // Receives packets 1 - 29.
325 for (size_t i = 1; i <= 29; ++i) {
326 RecordPacketReceipt(i, clock_.ApproximateNow());
327 MaybeUpdateAckTimeout(kInstigateAck, i);
328 if (i <= 10) {
329 // For packets 1-10, ack every 2 packets.
330 if (i % 2 == 0) {
331 CheckAckTimeout(clock_.ApproximateNow());
332 } else {
333 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
334 }
335 continue;
336 }
337 // ack at 20.
338 if (i == 20) {
339 CheckAckTimeout(clock_.ApproximateNow());
340 } else {
341 CheckAckTimeout(clock_.ApproximateNow() + kMinRttMs * 0.25);
342 }
343 }
344
345 // We now receive the 30th packet, and so we send an ack.
346 RecordPacketReceipt(30, clock_.ApproximateNow());
347 MaybeUpdateAckTimeout(kInstigateAck, 30);
348 CheckAckTimeout(clock_.ApproximateNow());
349}
350
351TEST_P(QuicReceivedPacketManagerTest, SendDelayedAfterQuiescence) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500352 EXPECT_FALSE(HasPendingAck());
353 QuicReceivedPacketManagerPeer::SetFastAckAfterQuiescence(&received_manager_,
354 true);
355 // The beginning of the connection counts as quiescence.
356 QuicTime ack_time =
357 clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(1);
358
359 RecordPacketReceipt(1, clock_.ApproximateNow());
360 MaybeUpdateAckTimeout(kInstigateAck, 1);
361 CheckAckTimeout(ack_time);
362 // Simulate delayed ack alarm firing.
363 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
364 CheckAckTimeout(clock_.ApproximateNow());
365
366 // Process another packet immediately after sending the ack and expect the
367 // ack timeout to be set delayed ack time in the future.
368 ack_time = clock_.ApproximateNow() + kDelayedAckTime;
369 RecordPacketReceipt(2, clock_.ApproximateNow());
370 MaybeUpdateAckTimeout(kInstigateAck, 2);
371 CheckAckTimeout(ack_time);
372 // Simulate delayed ack alarm firing.
373 clock_.AdvanceTime(kDelayedAckTime);
374 CheckAckTimeout(clock_.ApproximateNow());
375
376 // Wait 1 second and enesure the ack timeout is set to 1ms in the future.
377 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
378 ack_time = clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(1);
379 RecordPacketReceipt(3, clock_.ApproximateNow());
380 MaybeUpdateAckTimeout(kInstigateAck, 3);
381 CheckAckTimeout(ack_time);
382}
383
384TEST_P(QuicReceivedPacketManagerTest, SendDelayedAckDecimation) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500385 EXPECT_FALSE(HasPendingAck());
386 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_, ACK_DECIMATION);
387 // The ack time should be based on min_rtt * 1/4, since it's less than the
388 // default delayed ack time.
389 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
390
391 // Process all the packets in order so there aren't missing packets.
392 uint64_t kFirstDecimatedPacket = 101;
393 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
394 RecordPacketReceipt(i, clock_.ApproximateNow());
395 MaybeUpdateAckTimeout(kInstigateAck, i);
396 if (i % 2 == 0) {
397 // Ack every 2 packets by default.
398 CheckAckTimeout(clock_.ApproximateNow());
399 } else {
400 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
401 }
402 }
403
404 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
405 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
406 CheckAckTimeout(ack_time);
407
408 // The 10th received packet causes an ack to be sent.
409 for (uint64_t i = 1; i < 10; ++i) {
410 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
411 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
412 }
413 CheckAckTimeout(clock_.ApproximateNow());
414}
415
416TEST_P(QuicReceivedPacketManagerTest,
417 SendDelayedAckAckDecimationAfterQuiescence) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500418 EXPECT_FALSE(HasPendingAck());
419 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_, ACK_DECIMATION);
420 QuicReceivedPacketManagerPeer::SetFastAckAfterQuiescence(&received_manager_,
421 true);
422 // The beginning of the connection counts as quiescence.
423 QuicTime ack_time =
424 clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(1);
425 RecordPacketReceipt(1, clock_.ApproximateNow());
426 MaybeUpdateAckTimeout(kInstigateAck, 1);
427 CheckAckTimeout(ack_time);
428 // Simulate delayed ack alarm firing.
429 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
430 CheckAckTimeout(clock_.ApproximateNow());
431
432 // Process another packet immedately after sending the ack and expect the
433 // ack timeout to be set delayed ack time in the future.
434 ack_time = clock_.ApproximateNow() + kDelayedAckTime;
435 RecordPacketReceipt(2, clock_.ApproximateNow());
436 MaybeUpdateAckTimeout(kInstigateAck, 2);
437 CheckAckTimeout(ack_time);
438 // Simulate delayed ack alarm firing.
439 clock_.AdvanceTime(kDelayedAckTime);
440 CheckAckTimeout(clock_.ApproximateNow());
441
442 // Wait 1 second and enesure the ack timeout is set to 1ms in the future.
443 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
444 ack_time = clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(1);
445 RecordPacketReceipt(3, clock_.ApproximateNow());
446 MaybeUpdateAckTimeout(kInstigateAck, 3);
447 CheckAckTimeout(ack_time);
448 // Process enough packets to get into ack decimation behavior.
449 // The ack time should be based on min_rtt/4, since it's less than the
450 // default delayed ack time.
451 ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
452 uint64_t kFirstDecimatedPacket = 101;
453 for (uint64_t i = 4; i < kFirstDecimatedPacket; ++i) {
454 RecordPacketReceipt(i, clock_.ApproximateNow());
455 MaybeUpdateAckTimeout(kInstigateAck, i);
456 if (i % 2 == 0) {
457 // Ack every 2 packets by default.
458 CheckAckTimeout(clock_.ApproximateNow());
459 } else {
460 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
461 }
462 }
463 EXPECT_FALSE(HasPendingAck());
464 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
465 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
466 CheckAckTimeout(ack_time);
467
468 // The 10th received packet causes an ack to be sent.
469 for (uint64_t i = 1; i < 10; ++i) {
470 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
471 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
472 }
473 CheckAckTimeout(clock_.ApproximateNow());
474
475 // Wait 1 second and enesure the ack timeout is set to 1ms in the future.
476 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
477 ack_time = clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(1);
478 RecordPacketReceipt(kFirstDecimatedPacket + 10, clock_.ApproximateNow());
479 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 10);
480 CheckAckTimeout(ack_time);
481}
482
483TEST_P(QuicReceivedPacketManagerTest,
484 SendDelayedAckDecimationUnlimitedAggregation) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500485 EXPECT_FALSE(HasPendingAck());
486 QuicConfig config;
487 QuicTagVector connection_options;
488 connection_options.push_back(kACKD);
489 // No limit on the number of packets received before sending an ack.
490 connection_options.push_back(kAKDU);
491 config.SetConnectionOptionsToSend(connection_options);
492 received_manager_.SetFromConfig(config, Perspective::IS_CLIENT);
493
494 // The ack time should be based on min_rtt/4, since it's less than the
495 // default delayed ack time.
496 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
497
498 // Process all the initial packets in order so there aren't missing packets.
499 uint64_t kFirstDecimatedPacket = 101;
500 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
501 RecordPacketReceipt(i, clock_.ApproximateNow());
502 MaybeUpdateAckTimeout(kInstigateAck, i);
503 if (i % 2 == 0) {
504 // Ack every 2 packets by default.
505 CheckAckTimeout(clock_.ApproximateNow());
506 } else {
507 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
508 }
509 }
510
511 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
512 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
513 CheckAckTimeout(ack_time);
514
515 // 18 packets will not cause an ack to be sent. 19 will because when
516 // stop waiting frames are in use, we ack every 20 packets no matter what.
517 for (int i = 1; i <= 18; ++i) {
518 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
519 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
520 }
521 CheckAckTimeout(ack_time);
522}
523
524TEST_P(QuicReceivedPacketManagerTest, SendDelayedAckDecimationEighthRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500525 EXPECT_FALSE(HasPendingAck());
526 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_, ACK_DECIMATION);
527 QuicReceivedPacketManagerPeer::SetAckDecimationDelay(&received_manager_,
528 0.125);
529
530 // The ack time should be based on min_rtt/8, since it's less than the
531 // default delayed ack time.
532 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.125;
533
534 // Process all the packets in order so there aren't missing packets.
535 uint64_t kFirstDecimatedPacket = 101;
536 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
537 RecordPacketReceipt(i, clock_.ApproximateNow());
538 MaybeUpdateAckTimeout(kInstigateAck, i);
539 if (i % 2 == 0) {
540 // Ack every 2 packets by default.
541 CheckAckTimeout(clock_.ApproximateNow());
542 } else {
543 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
544 }
545 }
546
547 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
548 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
549 CheckAckTimeout(ack_time);
550
551 // The 10th received packet causes an ack to be sent.
552 for (uint64_t i = 1; i < 10; ++i) {
553 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
554 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
555 }
556 CheckAckTimeout(clock_.ApproximateNow());
557}
558
559TEST_P(QuicReceivedPacketManagerTest, SendDelayedAckDecimationWithReordering) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500560 EXPECT_FALSE(HasPendingAck());
561 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_,
562 ACK_DECIMATION_WITH_REORDERING);
563
564 // The ack time should be based on min_rtt/4, since it's less than the
565 // default delayed ack time.
566 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
567 // Process all the packets in order so there aren't missing packets.
568 uint64_t kFirstDecimatedPacket = 101;
569 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
570 RecordPacketReceipt(i, clock_.ApproximateNow());
571 MaybeUpdateAckTimeout(kInstigateAck, i);
572 if (i % 2 == 0) {
573 // Ack every 2 packets by default.
574 CheckAckTimeout(clock_.ApproximateNow());
575 } else {
576 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
577 }
578 }
579
580 // Receive one packet out of order and then the rest in order.
581 // The loop leaves a one packet gap between acks sent to simulate some loss.
582 for (int j = 0; j < 3; ++j) {
583 // Process packet 10 first and ensure the timeout is one eighth min_rtt.
584 RecordPacketReceipt(kFirstDecimatedPacket + 9 + (j * 11),
585 clock_.ApproximateNow());
586 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 9 + (j * 11));
587 ack_time = clock_.ApproximateNow() + QuicTime::Delta::FromMilliseconds(5);
588 CheckAckTimeout(ack_time);
589
590 // The 10th received packet causes an ack to be sent.
591 for (int i = 0; i < 9; ++i) {
592 RecordPacketReceipt(kFirstDecimatedPacket + i + (j * 11),
593 clock_.ApproximateNow());
594 MaybeUpdateAckTimeout(kInstigateAck,
595 kFirstDecimatedPacket + i + (j * 11));
596 }
597 CheckAckTimeout(clock_.ApproximateNow());
598 }
599}
600
601TEST_P(QuicReceivedPacketManagerTest,
602 SendDelayedAckDecimationWithLargeReordering) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500603 EXPECT_FALSE(HasPendingAck());
604 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_,
605 ACK_DECIMATION_WITH_REORDERING);
606 // The ack time should be based on min_rtt/4, since it's less than the
607 // default delayed ack time.
608 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.25;
609
610 // Process all the packets in order so there aren't missing packets.
611 uint64_t kFirstDecimatedPacket = 101;
612 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
613 RecordPacketReceipt(i, clock_.ApproximateNow());
614 MaybeUpdateAckTimeout(kInstigateAck, i);
615 if (i % 2 == 0) {
616 // Ack every 2 packets by default.
617 CheckAckTimeout(clock_.ApproximateNow());
618 } else {
619 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
620 }
621 }
622
623 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
624 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
625 CheckAckTimeout(ack_time);
626
627 RecordPacketReceipt(kFirstDecimatedPacket + 19, clock_.ApproximateNow());
628 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 19);
629 ack_time = clock_.ApproximateNow() + kMinRttMs * 0.125;
630 CheckAckTimeout(ack_time);
631
632 // The 10th received packet causes an ack to be sent.
633 for (int i = 1; i < 9; ++i) {
634 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
635 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
636 }
637 CheckAckTimeout(clock_.ApproximateNow());
638
639 // The next packet received in order will cause an immediate ack, because it
640 // fills a hole.
641 RecordPacketReceipt(kFirstDecimatedPacket + 10, clock_.ApproximateNow());
642 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 10);
643 CheckAckTimeout(clock_.ApproximateNow());
644}
645
646TEST_P(QuicReceivedPacketManagerTest,
647 SendDelayedAckDecimationWithReorderingEighthRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500648 EXPECT_FALSE(HasPendingAck());
649 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_,
650 ACK_DECIMATION_WITH_REORDERING);
651 QuicReceivedPacketManagerPeer::SetAckDecimationDelay(&received_manager_,
652 0.125);
653 // The ack time should be based on min_rtt/8, since it's less than the
654 // default delayed ack time.
655 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.125;
656
657 // Process all the packets in order so there aren't missing packets.
658 uint64_t kFirstDecimatedPacket = 101;
659 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
660 RecordPacketReceipt(i, clock_.ApproximateNow());
661 MaybeUpdateAckTimeout(kInstigateAck, i);
662 if (i % 2 == 0) {
663 // Ack every 2 packets by default.
664 CheckAckTimeout(clock_.ApproximateNow());
665 } else {
666 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
667 }
668 }
669
670 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
671 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
672 CheckAckTimeout(ack_time);
673
674 // Process packet 10 first and ensure the timeout is one eighth min_rtt.
675 RecordPacketReceipt(kFirstDecimatedPacket + 9, clock_.ApproximateNow());
676 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 9);
677 CheckAckTimeout(ack_time);
678
679 // The 10th received packet causes an ack to be sent.
680 for (int i = 1; i < 9; ++i) {
681 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
682 MaybeUpdateAckTimeout(kInstigateAck + i, kFirstDecimatedPacket);
683 }
684 CheckAckTimeout(clock_.ApproximateNow());
685}
686
687TEST_P(QuicReceivedPacketManagerTest,
688 SendDelayedAckDecimationWithLargeReorderingEighthRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500689 EXPECT_FALSE(HasPendingAck());
690 QuicReceivedPacketManagerPeer::SetAckMode(&received_manager_,
691 ACK_DECIMATION_WITH_REORDERING);
692 QuicReceivedPacketManagerPeer::SetAckDecimationDelay(&received_manager_,
693 0.125);
694
695 // The ack time should be based on min_rtt/8, since it's less than the
696 // default delayed ack time.
697 QuicTime ack_time = clock_.ApproximateNow() + kMinRttMs * 0.125;
698 // Process all the packets in order so there aren't missing packets.
699 uint64_t kFirstDecimatedPacket = 101;
700 for (uint64_t i = 1; i < kFirstDecimatedPacket; ++i) {
701 RecordPacketReceipt(i, clock_.ApproximateNow());
702 MaybeUpdateAckTimeout(kInstigateAck, i);
703 if (i % 2 == 0) {
704 // Ack every 2 packets by default.
705 CheckAckTimeout(clock_.ApproximateNow());
706 } else {
707 CheckAckTimeout(clock_.ApproximateNow() + kDelayedAckTime);
708 }
709 }
710
711 RecordPacketReceipt(kFirstDecimatedPacket, clock_.ApproximateNow());
712 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket);
713 CheckAckTimeout(ack_time);
714
715 RecordPacketReceipt(kFirstDecimatedPacket + 19, clock_.ApproximateNow());
716 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 19);
717 CheckAckTimeout(ack_time);
718
719 // The 10th received packet causes an ack to be sent.
720 for (int i = 1; i < 9; ++i) {
721 RecordPacketReceipt(kFirstDecimatedPacket + i, clock_.ApproximateNow());
722 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + i);
723 }
724 CheckAckTimeout(clock_.ApproximateNow());
725
726 // The next packet received in order will cause an immediate ack, because it
727 // fills a hole.
728 RecordPacketReceipt(kFirstDecimatedPacket + 10, clock_.ApproximateNow());
729 MaybeUpdateAckTimeout(kInstigateAck, kFirstDecimatedPacket + 10);
730 CheckAckTimeout(clock_.ApproximateNow());
731}
732
733} // namespace
734} // namespace test
735} // namespace quic