blob: 6a641fe53a2112f1172fac78ccf76dc66add4a50 [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_sent_packet_manager.h"
6
7#include <memory>
8
9#include "net/third_party/quiche/src/quic/core/quic_pending_retransmission.h"
10#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
13#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
14#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
15#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
16#include "net/third_party/quiche/src/quic/test_tools/quic_sent_packet_manager_peer.h"
17#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
18
19using testing::_;
20using testing::AnyNumber;
21using testing::Invoke;
22using testing::InvokeWithoutArgs;
23using testing::IsEmpty;
24using testing::Not;
25using testing::Pointwise;
26using testing::Return;
27using testing::StrictMock;
28using testing::WithArgs;
29
30namespace quic {
31namespace test {
32namespace {
33// Default packet length.
34const uint32_t kDefaultLength = 1000;
35
36// Stream ID for data sent in CreatePacket().
37const QuicStreamId kStreamId = 7;
38
39// Matcher to check that the packet number matches the second argument.
40MATCHER(PacketNumberEq, "") {
41 return ::testing::get<0>(arg).packet_number ==
42 QuicPacketNumber(::testing::get<1>(arg));
43}
44
45class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate {
46 public:
47 MOCK_METHOD2(OnSpuriousPacketRetransmission,
48 void(TransmissionType transmission_type,
49 QuicByteCount byte_size));
50 MOCK_METHOD3(OnPacketLoss,
51 void(QuicPacketNumber lost_packet_number,
52 TransmissionType transmission_type,
53 QuicTime detection_time));
54};
55
56class QuicSentPacketManagerTest : public QuicTestWithParam<bool> {
57 public:
58 void RetransmitCryptoPacket(uint64_t packet_number) {
59 EXPECT_CALL(
60 *send_algorithm_,
61 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
62 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
63 SerializedPacket packet(CreatePacket(packet_number, false));
64 packet.retransmittable_frames.push_back(
65 QuicFrame(QuicStreamFrame(1, false, 0, QuicStringPiece())));
66 packet.has_crypto_handshake = IS_HANDSHAKE;
67 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
68 HANDSHAKE_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
69 }
70
71 void RetransmitDataPacket(uint64_t packet_number, TransmissionType type) {
72 EXPECT_CALL(
73 *send_algorithm_,
74 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
75 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
76 SerializedPacket packet(CreatePacket(packet_number, true));
77 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(), type,
78 HAS_RETRANSMITTABLE_DATA);
79 }
80
81 protected:
82 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070083 : manager_(Perspective::IS_SERVER,
84 &clock_,
85 QuicRandom::GetInstance(),
86 &stats_,
87 kCubicBytes,
88 kNack),
QUICHE teama6ef0a62019-03-07 20:34:33 -050089 send_algorithm_(new StrictMock<MockSendAlgorithm>),
90 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
91 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
92 // Disable tail loss probes for most tests.
93 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
94 // Advance the time 1s so the send times are never QuicTime::Zero.
95 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
96 manager_.SetNetworkChangeVisitor(network_change_visitor_.get());
97 manager_.SetSessionNotifier(&notifier_);
98 manager_.SetSessionDecideWhatToWrite(GetParam());
99
100 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
101 .Times(AnyNumber());
102 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
103 .Times(AnyNumber())
104 .WillRepeatedly(Return(QuicBandwidth::Zero()));
105 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
106 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
107 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
108 .Times(AnyNumber());
109 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
110 EXPECT_CALL(notifier_, HasUnackedCryptoData())
111 .WillRepeatedly(Return(false));
112 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
113 EXPECT_CALL(notifier_, OnFrameAcked(_, _)).WillRepeatedly(Return(true));
114 }
115
116 ~QuicSentPacketManagerTest() override {}
117
ianswett9f459cb2019-04-21 06:39:59 -0700118 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
120 if (num_packets == 0) {
121 EXPECT_TRUE(manager_.unacked_packets().empty());
122 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
123 &manager_));
124 return;
125 }
126
127 EXPECT_FALSE(manager_.unacked_packets().empty());
128 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
129 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700130 EXPECT_TRUE(
131 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500132 << packets[i];
133 }
134 }
135
136 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
137 EXPECT_EQ(
138 num_packets,
139 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
140 for (size_t i = 0; i < num_packets; ++i) {
141 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
142 &manager_, packets[i]))
143 << " packets[" << i << "]:" << packets[i];
144 }
145 }
146
147 void ExpectAck(uint64_t largest_observed) {
148 EXPECT_CALL(
149 *send_algorithm_,
150 // Ensure the AckedPacketVector argument contains largest_observed.
151 OnCongestionEvent(true, _, _,
152 Pointwise(PacketNumberEq(), {largest_observed}),
153 IsEmpty()));
154 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
155 }
156
157 void ExpectUpdatedRtt(uint64_t largest_observed) {
158 EXPECT_CALL(*send_algorithm_,
159 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
160 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
161 }
162
163 void ExpectAckAndLoss(bool rtt_updated,
164 uint64_t largest_observed,
165 uint64_t lost_packet) {
166 EXPECT_CALL(
167 *send_algorithm_,
168 OnCongestionEvent(rtt_updated, _, _,
169 Pointwise(PacketNumberEq(), {largest_observed}),
170 Pointwise(PacketNumberEq(), {lost_packet})));
171 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
172 }
173
174 // |packets_acked| and |packets_lost| should be in packet number order.
175 void ExpectAcksAndLosses(bool rtt_updated,
176 uint64_t* packets_acked,
177 size_t num_packets_acked,
178 uint64_t* packets_lost,
179 size_t num_packets_lost) {
180 std::vector<QuicPacketNumber> ack_vector;
181 for (size_t i = 0; i < num_packets_acked; ++i) {
182 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
183 }
184 std::vector<QuicPacketNumber> lost_vector;
185 for (size_t i = 0; i < num_packets_lost; ++i) {
186 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
187 }
188 EXPECT_CALL(*send_algorithm_,
189 OnCongestionEvent(rtt_updated, _, _,
190 Pointwise(PacketNumberEq(), ack_vector),
191 Pointwise(PacketNumberEq(), lost_vector)));
192 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
193 .Times(AnyNumber());
194 }
195
196 void RetransmitAndSendPacket(uint64_t old_packet_number,
197 uint64_t new_packet_number) {
198 RetransmitAndSendPacket(old_packet_number, new_packet_number,
199 TLP_RETRANSMISSION);
200 }
201
202 void RetransmitAndSendPacket(uint64_t old_packet_number,
203 uint64_t new_packet_number,
204 TransmissionType transmission_type) {
205 bool is_lost = false;
206 if (manager_.session_decides_what_to_write()) {
207 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
208 transmission_type == TLP_RETRANSMISSION ||
209 transmission_type == RTO_RETRANSMISSION ||
210 transmission_type == PROBING_RETRANSMISSION) {
211 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
212 .WillOnce(WithArgs<1>(
213 Invoke([this, new_packet_number](TransmissionType type) {
214 RetransmitDataPacket(new_packet_number, type);
215 })));
216 } else {
217 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
218 is_lost = true;
219 }
220 }
221 QuicSentPacketManagerPeer::MarkForRetransmission(
222 &manager_, old_packet_number, transmission_type);
223 if (manager_.session_decides_what_to_write()) {
224 if (!is_lost) {
225 return;
226 }
227 EXPECT_CALL(
228 *send_algorithm_,
229 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
230 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
231 SerializedPacket packet(CreatePacket(new_packet_number, true));
232 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
233 transmission_type, HAS_RETRANSMITTABLE_DATA);
234 return;
235 }
236 EXPECT_TRUE(manager_.HasPendingRetransmissions());
237 QuicPendingRetransmission next_retransmission =
238 manager_.NextPendingRetransmission();
239 EXPECT_EQ(QuicPacketNumber(old_packet_number),
240 next_retransmission.packet_number);
241 EXPECT_EQ(transmission_type, next_retransmission.transmission_type);
242
243 EXPECT_CALL(
244 *send_algorithm_,
245 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
246 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
247 SerializedPacket packet(CreatePacket(new_packet_number, false));
248 manager_.OnPacketSent(&packet, QuicPacketNumber(old_packet_number),
249 clock_.Now(), transmission_type,
250 HAS_RETRANSMITTABLE_DATA);
251 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_,
252 new_packet_number));
253 }
254
255 SerializedPacket CreateDataPacket(uint64_t packet_number) {
256 return CreatePacket(packet_number, true);
257 }
258
259 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
260 SerializedPacket packet(QuicPacketNumber(packet_number),
261 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
262 false, false);
263 if (retransmittable) {
264 packet.retransmittable_frames.push_back(
265 QuicFrame(QuicStreamFrame(kStreamId, false, 0, QuicStringPiece())));
266 }
267 return packet;
268 }
269
270 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700271 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
272 }
273
274 void SendDataPacket(uint64_t packet_number,
275 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 EXPECT_CALL(*send_algorithm_,
277 OnPacketSent(_, BytesInFlight(),
278 QuicPacketNumber(packet_number), _, _));
279 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700280 packet.encryption_level = encryption_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500281 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
282 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
283 }
284
285 void SendCryptoPacket(uint64_t packet_number) {
286 EXPECT_CALL(
287 *send_algorithm_,
288 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
289 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
290 SerializedPacket packet(CreatePacket(packet_number, false));
291 packet.retransmittable_frames.push_back(
292 QuicFrame(QuicStreamFrame(1, false, 0, QuicStringPiece())));
293 packet.has_crypto_handshake = IS_HANDSHAKE;
294 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
295 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
296 if (manager_.session_decides_what_to_write()) {
297 EXPECT_CALL(notifier_, HasUnackedCryptoData())
298 .WillRepeatedly(Return(true));
299 }
300 }
301
302 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
303 EXPECT_CALL(
304 *send_algorithm_,
305 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
306 kDefaultLength, NO_RETRANSMITTABLE_DATA));
307 SerializedPacket packet(CreatePacket(packet_number, false));
308 packet.largest_acked = QuicPacketNumber(largest_acked);
309 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
310 NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA);
311 }
312
313 // Based on QuicConnection's WritePendingRetransmissions.
314 void RetransmitNextPacket(uint64_t retransmission_packet_number) {
315 EXPECT_TRUE(manager_.HasPendingRetransmissions());
316 EXPECT_CALL(
317 *send_algorithm_,
318 OnPacketSent(_, _, QuicPacketNumber(retransmission_packet_number),
319 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
320 const QuicPendingRetransmission pending =
321 manager_.NextPendingRetransmission();
322 SerializedPacket packet(CreatePacket(retransmission_packet_number, false));
323 manager_.OnPacketSent(&packet, pending.packet_number, clock_.Now(),
324 pending.transmission_type, HAS_RETRANSMITTABLE_DATA);
325 }
326
327 QuicSentPacketManager manager_;
328 MockClock clock_;
329 QuicConnectionStats stats_;
330 MockSendAlgorithm* send_algorithm_;
331 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
332 StrictMock<MockSessionNotifier> notifier_;
333};
334
335INSTANTIATE_TEST_SUITE_P(Tests, QuicSentPacketManagerTest, testing::Bool());
336
337TEST_P(QuicSentPacketManagerTest, IsUnacked) {
338 VerifyUnackedPackets(nullptr, 0);
339 SendDataPacket(1);
340
341 uint64_t unacked[] = {1};
342 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
343 uint64_t retransmittable[] = {1};
344 VerifyRetransmittablePackets(retransmittable,
345 QUIC_ARRAYSIZE(retransmittable));
346}
347
348TEST_P(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
349 SendDataPacket(1);
350 RetransmitAndSendPacket(1, 2);
351
352 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
353 uint64_t unacked[] = {1, 2};
354 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
355 std::vector<uint64_t> retransmittable;
356 if (manager_.session_decides_what_to_write()) {
357 retransmittable = {1, 2};
358 } else {
359 retransmittable = {2};
360 }
361 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
362}
363
364TEST_P(QuicSentPacketManagerTest, RetransmitThenAck) {
365 SendDataPacket(1);
366 RetransmitAndSendPacket(1, 2);
367
368 // Ack 2 but not 1.
369 ExpectAck(2);
370 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
371 clock_.Now());
372 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700373 EXPECT_EQ(PACKETS_NEWLY_ACKED,
374 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 if (manager_.session_decides_what_to_write()) {
376 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
377 }
378 // Packet 1 is unacked, pending, but not retransmittable.
379 uint64_t unacked[] = {1};
380 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700381 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500382 VerifyRetransmittablePackets(nullptr, 0);
383}
384
385TEST_P(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
386 SendDataPacket(1);
387 if (manager_.session_decides_what_to_write()) {
388 if (manager_.session_decides_what_to_write()) {
389 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
390 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
391 RetransmitDataPacket(2, type);
392 })));
393 }
394 }
395 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
396 TLP_RETRANSMISSION);
397 if (!manager_.session_decides_what_to_write()) {
398 EXPECT_TRUE(manager_.HasPendingRetransmissions());
399 }
400 // Ack 1.
401 ExpectAck(1);
402 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
403 clock_.Now());
404 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700405 EXPECT_EQ(PACKETS_NEWLY_ACKED,
406 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407
408 // There should no longer be a pending retransmission.
409 EXPECT_FALSE(manager_.HasPendingRetransmissions());
410
411 if (manager_.session_decides_what_to_write()) {
412 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
413 uint64_t unacked[] = {2};
414 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
415 // We do not know packet 2 is a spurious retransmission until it gets acked.
416 } else {
417 // No unacked packets remain.
418 VerifyUnackedPackets(nullptr, 0);
419 }
420 VerifyRetransmittablePackets(nullptr, 0);
421 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
422}
423
424TEST_P(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
425 SendDataPacket(1);
426 if (manager_.session_decides_what_to_write()) {
427 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
428 }
429 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
430 TLP_RETRANSMISSION);
431 if (!manager_.session_decides_what_to_write()) {
432 EXPECT_TRUE(manager_.HasPendingRetransmissions());
433 }
434
435 manager_.CancelRetransmissionsForStream(kStreamId);
436 if (manager_.session_decides_what_to_write()) {
437 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
438 }
439
440 // There should no longer be a pending retransmission.
441 EXPECT_FALSE(manager_.HasPendingRetransmissions());
442
443 uint64_t unacked[] = {1};
444 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
445 VerifyRetransmittablePackets(nullptr, 0);
446 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
447}
448
449TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
450 SendDataPacket(1);
451 RetransmitAndSendPacket(1, 2);
452 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
453 clock_.AdvanceTime(rtt);
454
455 // Ack 1 but not 2.
456 ExpectAck(1);
457 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
458 clock_.Now());
459 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700460 EXPECT_EQ(PACKETS_NEWLY_ACKED,
461 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500462 if (manager_.session_decides_what_to_write()) {
463 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
464 }
465 // 2 remains unacked, but no packets have retransmittable data.
466 uint64_t unacked[] = {2};
467 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700468 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500469 VerifyRetransmittablePackets(nullptr, 0);
470 if (manager_.session_decides_what_to_write()) {
471 // Ack 2 causes 2 be considered as spurious retransmission.
472 EXPECT_CALL(notifier_, OnFrameAcked(_, _)).WillOnce(Return(false));
473 ExpectAck(2);
474 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
475 clock_.Now());
476 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700477 EXPECT_EQ(PACKETS_NEWLY_ACKED,
478 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479 }
480
481 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
482}
483
484TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
485 SendDataPacket(1);
486 RetransmitAndSendPacket(1, 2);
487 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
488 clock_.AdvanceTime(rtt);
489
490 // First, ACK packet 1 which makes packet 2 non-retransmittable.
491 ExpectAck(1);
492 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
493 clock_.Now());
494 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700495 EXPECT_EQ(PACKETS_NEWLY_ACKED,
496 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497
498 SendDataPacket(3);
499 SendDataPacket(4);
500 SendDataPacket(5);
501 clock_.AdvanceTime(rtt);
502
503 // Next, NACK packet 2 three times.
504 ExpectAck(3);
505 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
506 clock_.Now());
507 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
508 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700509 EXPECT_EQ(PACKETS_NEWLY_ACKED,
510 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500511
512 ExpectAck(4);
513 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
514 clock_.Now());
515 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
516 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700517 EXPECT_EQ(PACKETS_NEWLY_ACKED,
518 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500519
520 ExpectAckAndLoss(true, 5, 2);
521 if (manager_.session_decides_what_to_write()) {
522 // Frames in all packets are acked.
523 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
524 // Notify session that stream frame in packet 2 gets lost although it is
525 // not outstanding.
526 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
527 }
528 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
529 clock_.Now());
530 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
531 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700532 EXPECT_EQ(PACKETS_NEWLY_ACKED,
533 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500534
535 if (manager_.session_decides_what_to_write()) {
536 uint64_t unacked[] = {2};
537 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
538 } else {
539 // No packets remain unacked.
540 VerifyUnackedPackets(nullptr, 0);
541 }
ianswett67d7a3c2019-04-19 10:58:47 -0700542 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543 VerifyRetransmittablePackets(nullptr, 0);
544
545 // Verify that the retransmission alarm would not fire,
546 // since there is no retransmittable data outstanding.
547 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
548}
549
550TEST_P(QuicSentPacketManagerTest,
551 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
552 SendDataPacket(1);
553 RetransmitAndSendPacket(1, 2);
554
555 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
556 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
557 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
558 manager_.OnRetransmissionTimeout();
559 EXPECT_TRUE(manager_.HasPendingRetransmissions());
560
561 // Ack 1 but not 2, before 2 is able to be sent.
562 // Since 1 has been retransmitted, it has already been lost, and so the
563 // send algorithm is not informed that it has been ACK'd.
564 ExpectUpdatedRtt(1);
565 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
566 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
567 clock_.Now());
568 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700569 EXPECT_EQ(PACKETS_NEWLY_ACKED,
570 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571
572 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
573 uint64_t unacked[] = {2};
574 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700575 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 VerifyRetransmittablePackets(nullptr, 0);
577
578 // Verify that the retransmission alarm would not fire,
579 // since there is no retransmittable data outstanding.
580 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
581}
582
583TEST_P(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
584 StrictMock<MockDebugDelegate> debug_delegate;
585 if (manager_.session_decides_what_to_write()) {
586 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(
587 TLP_RETRANSMISSION, kDefaultLength))
588 .Times(1);
589 } else {
590 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(
591 TLP_RETRANSMISSION, kDefaultLength))
592 .Times(2);
593 }
594 manager_.SetDebugDelegate(&debug_delegate);
595
596 SendDataPacket(1);
597 RetransmitAndSendPacket(1, 2);
598 RetransmitAndSendPacket(2, 3);
599 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
600 clock_.AdvanceTime(rtt);
601
602 // Ack 1 but not 2 or 3.
603 ExpectAck(1);
604 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
605 clock_.Now());
606 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700607 EXPECT_EQ(PACKETS_NEWLY_ACKED,
608 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500609 if (manager_.session_decides_what_to_write()) {
610 // Frames in packets 2 and 3 are acked.
611 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
612 .Times(2)
613 .WillRepeatedly(Return(false));
614 }
615
616 // 2 and 3 remain unacked, but no packets have retransmittable data.
617 uint64_t unacked[] = {2, 3};
618 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700619 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500620 VerifyRetransmittablePackets(nullptr, 0);
621
622 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
623 SendDataPacket(4);
624 if (manager_.session_decides_what_to_write()) {
625 // No new data gets acked in packet 3.
626 EXPECT_CALL(notifier_, OnFrameAcked(_, _))
627 .WillOnce(Return(false))
628 .WillRepeatedly(Return(true));
629 }
630 uint64_t acked[] = {3, 4};
631 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
632 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
633 clock_.Now());
634 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
635 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700636 EXPECT_EQ(PACKETS_NEWLY_ACKED,
637 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500638
639 uint64_t unacked2[] = {2};
640 VerifyUnackedPackets(unacked2, QUIC_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700641 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500642
643 SendDataPacket(5);
644 ExpectAckAndLoss(true, 5, 2);
645 EXPECT_CALL(debug_delegate,
646 OnPacketLoss(QuicPacketNumber(2), LOSS_RETRANSMISSION, _));
647 if (manager_.session_decides_what_to_write()) {
648 // Frames in all packets are acked.
649 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
650 // Notify session that stream frame in packet 2 gets lost although it is
651 // not outstanding.
652 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
653 }
654 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
655 clock_.Now());
656 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
657 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700658 EXPECT_EQ(PACKETS_NEWLY_ACKED,
659 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500660
661 if (manager_.session_decides_what_to_write()) {
662 uint64_t unacked[] = {2};
663 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
664 } else {
665 VerifyUnackedPackets(nullptr, 0);
666 }
ianswett67d7a3c2019-04-19 10:58:47 -0700667 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500668 if (manager_.session_decides_what_to_write()) {
669 // Spurious retransmission is detected when packet 3 gets acked. We cannot
670 // know packet 2 is a spurious until it gets acked.
671 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
672 } else {
673 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted);
674 }
675}
676
677TEST_P(QuicSentPacketManagerTest, AckOriginalTransmission) {
678 auto loss_algorithm = QuicMakeUnique<MockLossAlgorithm>();
679 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
680
681 SendDataPacket(1);
682 RetransmitAndSendPacket(1, 2);
683
684 // Ack original transmission, but that wasn't lost via fast retransmit,
685 // so no call on OnSpuriousRetransmission is expected.
686 {
687 ExpectAck(1);
688 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
689 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
690 clock_.Now());
691 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700692 EXPECT_EQ(PACKETS_NEWLY_ACKED,
693 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500694 }
695
696 SendDataPacket(3);
697 SendDataPacket(4);
698 // Ack 4, which causes 3 to be retransmitted.
699 {
700 ExpectAck(4);
701 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
702 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
703 clock_.Now());
704 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
705 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700706 EXPECT_EQ(PACKETS_NEWLY_ACKED,
707 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
709 }
710
711 // Ack 3, which causes SpuriousRetransmitDetected to be called.
712 {
713 uint64_t acked[] = {3};
714 ExpectAcksAndLosses(false, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
715 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
716 EXPECT_CALL(*loss_algorithm,
717 SpuriousRetransmitDetected(_, _, _, QuicPacketNumber(5)));
718 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
719 clock_.Now());
720 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
721 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700722 EXPECT_EQ(PACKETS_NEWLY_ACKED,
723 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500724 if (manager_.session_decides_what_to_write()) {
725 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
726 // 5 will cause 5 be considered as a spurious retransmission as no new
727 // data gets acked.
728 ExpectAck(5);
729 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
730 EXPECT_CALL(notifier_, OnFrameAcked(_, _)).WillOnce(Return(false));
731 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
732 clock_.Now());
733 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
734 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700735 EXPECT_EQ(PACKETS_NEWLY_ACKED,
736 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500737 }
738 }
739}
740
741TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) {
742 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
743}
744
745TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
746 SendDataPacket(1);
747 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
748}
749
750TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
751 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
752 SendDataPacket(1);
753 SendAckPacket(2, 1);
754
755 // Now ack the ack and expect an RTT update.
756 uint64_t acked[] = {1, 2};
757 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
758 manager_.OnAckFrameStart(QuicPacketNumber(2),
759 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
760 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700761 EXPECT_EQ(PACKETS_NEWLY_ACKED,
762 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500763 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
764
765 SendAckPacket(3, 3);
766
767 // Now ack the ack and expect only an RTT update.
768 uint64_t acked2[] = {3};
769 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
770 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
771 clock_.Now());
772 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700773 EXPECT_EQ(PACKETS_NEWLY_ACKED,
774 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500775 EXPECT_EQ(QuicPacketNumber(3u),
776 manager_.largest_packet_peer_knows_is_acked());
777}
778
779TEST_P(QuicSentPacketManagerTest, Rtt) {
780 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
781 SendDataPacket(1);
782 clock_.AdvanceTime(expected_rtt);
783
784 ExpectAck(1);
785 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
786 clock_.Now());
787 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700788 EXPECT_EQ(PACKETS_NEWLY_ACKED,
789 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500790 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
791}
792
793TEST_P(QuicSentPacketManagerTest, RttWithInvalidDelta) {
794 // Expect that the RTT is equal to the local time elapsed, since the
795 // ack_delay_time is larger than the local time elapsed
796 // and is hence invalid.
797 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
798 SendDataPacket(1);
799 clock_.AdvanceTime(expected_rtt);
800
801 ExpectAck(1);
802 manager_.OnAckFrameStart(QuicPacketNumber(1),
803 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
804 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700805 EXPECT_EQ(PACKETS_NEWLY_ACKED,
806 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500807 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
808}
809
810TEST_P(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
811 // Expect that the RTT is equal to the local time elapsed, since the
812 // ack_delay_time is infinite, and is hence invalid.
813 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
814 SendDataPacket(1);
815 clock_.AdvanceTime(expected_rtt);
816
817 ExpectAck(1);
818 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
819 clock_.Now());
820 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700821 EXPECT_EQ(PACKETS_NEWLY_ACKED,
822 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500823 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
824}
825
826TEST_P(QuicSentPacketManagerTest, RttZeroDelta) {
827 // Expect that the RTT is the time between send and receive since the
828 // ack_delay_time is zero.
829 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
830 SendDataPacket(1);
831 clock_.AdvanceTime(expected_rtt);
832
833 ExpectAck(1);
834 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
835 clock_.Now());
836 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700837 EXPECT_EQ(PACKETS_NEWLY_ACKED,
838 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500839 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
840}
841
842TEST_P(QuicSentPacketManagerTest, TailLossProbeTimeout) {
843 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
844
845 // Send 1 packet.
846 SendDataPacket(1);
847
848 // The first tail loss probe retransmits 1 packet.
849 manager_.OnRetransmissionTimeout();
850 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
851 EXPECT_FALSE(manager_.HasPendingRetransmissions());
852 if (manager_.session_decides_what_to_write()) {
853 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
854 .WillOnce(WithArgs<1>(Invoke(
855 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
856 }
857 manager_.MaybeRetransmitTailLossProbe();
858 if (!manager_.session_decides_what_to_write()) {
859 EXPECT_TRUE(manager_.HasPendingRetransmissions());
860 RetransmitNextPacket(2);
861 EXPECT_FALSE(manager_.HasPendingRetransmissions());
862 }
863
864 // The second tail loss probe retransmits 1 packet.
865 manager_.OnRetransmissionTimeout();
866 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
867 EXPECT_FALSE(manager_.HasPendingRetransmissions());
868 if (manager_.session_decides_what_to_write()) {
869 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
870 .WillOnce(WithArgs<1>(Invoke(
871 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
872 }
873 manager_.MaybeRetransmitTailLossProbe();
874 if (!manager_.session_decides_what_to_write()) {
875 EXPECT_TRUE(manager_.HasPendingRetransmissions());
876 RetransmitNextPacket(3);
877 }
878 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
879 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
880 EXPECT_FALSE(manager_.HasPendingRetransmissions());
881
882 // Ack the third and ensure the first two are still pending.
883 ExpectAck(3);
884
885 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
886 clock_.Now());
887 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700888 EXPECT_EQ(PACKETS_NEWLY_ACKED,
889 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500890
ianswett67d7a3c2019-04-19 10:58:47 -0700891 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500892
893 // Acking two more packets will lose both of them due to nacks.
894 SendDataPacket(4);
895 SendDataPacket(5);
896 uint64_t acked[] = {4, 5};
897 uint64_t lost[] = {1, 2};
898 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), lost,
899 QUIC_ARRAYSIZE(lost));
900 if (manager_.session_decides_what_to_write()) {
901 // Frames in all packets are acked.
902 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
903 // Notify session that stream frame in packets 1 and 2 get lost although
904 // they are not outstanding.
905 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
906 }
907 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
908 clock_.Now());
909 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700910 EXPECT_EQ(PACKETS_NEWLY_ACKED,
911 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500912
913 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett67d7a3c2019-04-19 10:58:47 -0700914 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500915 EXPECT_EQ(2u, stats_.tlp_count);
916 EXPECT_EQ(0u, stats_.rto_count);
917}
918
919TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
920 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
921
922 // Send 100 packets.
923 const size_t kNumSentPackets = 100;
924 for (size_t i = 1; i <= kNumSentPackets; ++i) {
925 SendDataPacket(i);
926 }
927 QuicTime rto_packet_time = clock_.Now();
928 // Advance the time.
929 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
930
931 // The first tail loss probe retransmits 1 packet.
932 manager_.OnRetransmissionTimeout();
933 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
934 EXPECT_FALSE(manager_.HasPendingRetransmissions());
935 if (manager_.session_decides_what_to_write()) {
936 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
937 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
938 RetransmitDataPacket(101, type);
939 })));
940 }
941 manager_.MaybeRetransmitTailLossProbe();
942 if (!manager_.session_decides_what_to_write()) {
943 EXPECT_TRUE(manager_.HasPendingRetransmissions());
944 RetransmitNextPacket(101);
945 }
946 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
947 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
948 EXPECT_FALSE(manager_.HasPendingRetransmissions());
949 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
950
951 // The second tail loss probe retransmits 1 packet.
952 manager_.OnRetransmissionTimeout();
953 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
954 EXPECT_FALSE(manager_.HasPendingRetransmissions());
955 if (manager_.session_decides_what_to_write()) {
956 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
957 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
958 RetransmitDataPacket(102, type);
959 })));
960 }
961 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
962 if (!manager_.session_decides_what_to_write()) {
963 EXPECT_TRUE(manager_.HasPendingRetransmissions());
964 RetransmitNextPacket(102);
965 }
966 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
967 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
968
969 // Ensure the RTO is set based on the correct packet.
970 rto_packet_time = clock_.Now();
971 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
972 manager_.GetRetransmissionTime());
973
974 // Advance the time enough to ensure all packets are RTO'd.
975 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
976
977 if (manager_.session_decides_what_to_write()) {
978 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
979 .Times(2)
980 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
981 RetransmitDataPacket(103, type);
982 })))
983 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
984 RetransmitDataPacket(104, type);
985 })));
986 }
987 manager_.OnRetransmissionTimeout();
988 EXPECT_EQ(2u, stats_.tlp_count);
989 EXPECT_EQ(1u, stats_.rto_count);
990 if (manager_.session_decides_what_to_write()) {
991 // There are 2 RTO retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -0700992 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500993 }
994 if (!manager_.session_decides_what_to_write()) {
995 // Send and Ack the RTO and ensure OnRetransmissionTimeout is called.
ianswett9f459cb2019-04-21 06:39:59 -0700996 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500997 EXPECT_TRUE(manager_.HasPendingRetransmissions());
998 RetransmitNextPacket(103);
999 }
1000 QuicPacketNumber largest_acked = QuicPacketNumber(103);
1001 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1002 EXPECT_CALL(*send_algorithm_,
1003 OnCongestionEvent(
1004 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
1005 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1006 if (manager_.session_decides_what_to_write()) {
1007 // Although frames in packet 3 gets acked, it would be kept for another
1008 // RTT.
1009 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1010 // Packets [1, 102] are lost, although stream frame in packet 3 is not
1011 // outstanding.
1012 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
1013 }
1014 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
1015 clock_.Now());
1016 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -07001017 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1018 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001019 // All packets before 103 should be lost.
1020 if (manager_.session_decides_what_to_write()) {
1021 // Packet 104 is still in flight.
ianswett9f459cb2019-04-21 06:39:59 -07001022 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001023 } else {
ianswett9f459cb2019-04-21 06:39:59 -07001024 EXPECT_EQ(0u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001025 }
1026}
1027
1028TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
1029 // Send 2 crypto packets and 3 data packets.
1030 const size_t kNumSentCryptoPackets = 2;
1031 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1032 SendCryptoPacket(i);
1033 }
1034 const size_t kNumSentDataPackets = 3;
1035 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1036 SendDataPacket(kNumSentCryptoPackets + i);
1037 }
ianswett0cc36802019-04-20 03:04:09 -07001038 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -07001039 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001040
1041 // The first retransmits 2 packets.
1042 if (manager_.session_decides_what_to_write()) {
1043 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1044 .Times(2)
1045 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1046 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
1047 }
1048 manager_.OnRetransmissionTimeout();
1049 if (!manager_.session_decides_what_to_write()) {
1050 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1051 RetransmitNextPacket(6);
1052 RetransmitNextPacket(7);
1053 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1054 }
ianswett898306b2019-04-23 11:05:57 -07001055 // Expect all 4 handshake packets to be in flight and 3 data packets.
1056 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1057 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
1058 }
ianswett0cc36802019-04-20 03:04:09 -07001059 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001060
1061 // The second retransmits 2 packets.
1062 if (manager_.session_decides_what_to_write()) {
1063 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1064 .Times(2)
1065 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
1066 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
1067 }
1068 manager_.OnRetransmissionTimeout();
1069 if (!manager_.session_decides_what_to_write()) {
1070 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1071 RetransmitNextPacket(8);
1072 RetransmitNextPacket(9);
1073 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1074 }
ianswett898306b2019-04-23 11:05:57 -07001075 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1076 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
1077 }
ianswett0cc36802019-04-20 03:04:09 -07001078 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001079
1080 // Now ack the two crypto packets and the speculatively encrypted request,
1081 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett898306b2019-04-23 11:05:57 -07001082 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1083 // Crypto packets remain in flight, so any that aren't acked will be lost.
1084 uint64_t acked[] = {3, 4, 5, 8, 9};
1085 uint64_t lost[] = {1, 2, 6};
1086 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), lost,
1087 QUIC_ARRAYSIZE(lost));
1088 if (manager_.session_decides_what_to_write()) {
1089 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
1090 }
1091 } else {
1092 uint64_t acked[] = {3, 4, 5, 8, 9};
1093 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1094 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001095 if (manager_.session_decides_what_to_write()) {
1096 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1097 .WillRepeatedly(Return(false));
1098 }
1099 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1100 clock_.Now());
1101 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1102 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001103 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1104 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001105
ianswett0cc36802019-04-20 03:04:09 -07001106 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001107}
1108
1109TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
1110 // Send 2 crypto packets and 3 data packets.
1111 const size_t kNumSentCryptoPackets = 2;
1112 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1113 SendCryptoPacket(i);
1114 }
1115 const size_t kNumSentDataPackets = 3;
1116 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1117 SendDataPacket(kNumSentCryptoPackets + i);
1118 }
ianswett0cc36802019-04-20 03:04:09 -07001119 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001120
1121 if (manager_.session_decides_what_to_write()) {
1122 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1123 .Times(2)
1124 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1125 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
1126 }
1127 manager_.OnRetransmissionTimeout();
1128 if (!manager_.session_decides_what_to_write()) {
1129 RetransmitNextPacket(6);
1130 RetransmitNextPacket(7);
1131 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1132 }
ianswett0cc36802019-04-20 03:04:09 -07001133 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001134
1135 // Now act like a version negotiation packet arrived, which would cause all
1136 // unacked packets to be retransmitted.
1137 if (manager_.session_decides_what_to_write()) {
1138 // Mark packets [1, 7] lost. And the frames in 6 and 7 are same as packets 1
1139 // and 2, respectively.
1140 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(7);
1141 }
1142 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1143
1144 // Ensure the first two pending packets are the crypto retransmits.
1145 if (manager_.session_decides_what_to_write()) {
1146 RetransmitCryptoPacket(8);
1147 RetransmitCryptoPacket(9);
1148 RetransmitDataPacket(10, ALL_UNACKED_RETRANSMISSION);
1149 RetransmitDataPacket(11, ALL_UNACKED_RETRANSMISSION);
1150 RetransmitDataPacket(12, ALL_UNACKED_RETRANSMISSION);
1151 } else {
1152 ASSERT_TRUE(manager_.HasPendingRetransmissions());
1153 EXPECT_EQ(QuicPacketNumber(6u),
1154 manager_.NextPendingRetransmission().packet_number);
1155 RetransmitNextPacket(8);
1156 EXPECT_EQ(QuicPacketNumber(7u),
1157 manager_.NextPendingRetransmission().packet_number);
1158 RetransmitNextPacket(9);
1159 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1160 // Send 3 more data packets and ensure the least unacked is raised.
1161 RetransmitNextPacket(10);
1162 RetransmitNextPacket(11);
1163 RetransmitNextPacket(12);
1164 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1165 }
1166
1167 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
1168 // Least unacked isn't raised until an ack is received, so ack the
1169 // crypto packets.
1170 uint64_t acked[] = {8, 9};
1171 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1172 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1173 clock_.Now());
1174 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
fayang3eb82212019-04-16 12:05:46 -07001175 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1176 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001177 if (manager_.session_decides_what_to_write()) {
1178 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1179 .WillRepeatedly(Return(false));
1180 }
1181 EXPECT_EQ(QuicPacketNumber(10u), manager_.GetLeastUnacked());
1182}
1183
1184TEST_P(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
1185 // Send 1 crypto packet.
1186 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001187 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001188
1189 // Retransmit the crypto packet as 2.
1190 if (manager_.session_decides_what_to_write()) {
1191 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1192 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1193 }
1194 manager_.OnRetransmissionTimeout();
1195 if (!manager_.session_decides_what_to_write()) {
1196 RetransmitNextPacket(2);
1197 }
1198
1199 // Retransmit the crypto packet as 3.
1200 if (manager_.session_decides_what_to_write()) {
1201 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1202 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1203 }
1204 manager_.OnRetransmissionTimeout();
1205 if (!manager_.session_decides_what_to_write()) {
1206 RetransmitNextPacket(3);
1207 }
1208
1209 // Now ack the second crypto packet, and ensure the first gets removed, but
1210 // the third does not.
1211 uint64_t acked[] = {2};
1212 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1213 if (manager_.session_decides_what_to_write()) {
1214 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1215 .WillRepeatedly(Return(false));
1216 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
1217 }
1218 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1219 clock_.Now());
1220 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001221 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1222 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001223
ianswett0cc36802019-04-20 03:04:09 -07001224 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -07001225 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1226 uint64_t unacked[] = {1, 3};
1227 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1228 } else {
1229 uint64_t unacked[] = {3};
1230 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1231 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001232}
1233
1234TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
1235 // Send 2 crypto packets and 1 data packet.
1236 const size_t kNumSentCryptoPackets = 2;
1237 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1238 SendCryptoPacket(i);
1239 }
1240 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001241 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001242
1243 // Retransmit 2 crypto packets, but not the serialized packet.
1244 if (manager_.session_decides_what_to_write()) {
1245 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1246 .Times(2)
1247 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1248 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
1249 }
1250 manager_.OnRetransmissionTimeout();
1251 if (!manager_.session_decides_what_to_write()) {
1252 RetransmitNextPacket(4);
1253 RetransmitNextPacket(5);
1254 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1255 }
ianswett0cc36802019-04-20 03:04:09 -07001256 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001257}
1258
1259TEST_P(QuicSentPacketManagerTest,
1260 CryptoHandshakeRetransmissionThenRetransmitAll) {
1261 // Send 1 crypto packet.
1262 SendCryptoPacket(1);
1263
ianswett0cc36802019-04-20 03:04:09 -07001264 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001265
1266 // Retransmit the crypto packet as 2.
1267 if (manager_.session_decides_what_to_write()) {
1268 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1269 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1270 }
1271 manager_.OnRetransmissionTimeout();
1272 if (!manager_.session_decides_what_to_write()) {
1273 RetransmitNextPacket(2);
1274 }
1275 // Now retransmit all the unacked packets, which occurs when there is a
1276 // version negotiation.
1277 if (manager_.session_decides_what_to_write()) {
1278 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
1279 }
1280 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1281 if (manager_.session_decides_what_to_write()) {
1282 // Both packets 1 and 2 are unackable.
ianswette129b0c2019-04-20 00:27:00 -07001283 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(1)));
1284 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(2)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001285 } else {
1286 // Packet 2 is useful because it does not get retransmitted and still has
1287 // retransmittable frames.
1288 uint64_t unacked[] = {1, 2};
1289 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1290 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1291 }
ianswett0cc36802019-04-20 03:04:09 -07001292 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001293 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001294}
1295
1296TEST_P(QuicSentPacketManagerTest,
1297 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1298 // Send 1 crypto packet.
1299 SendCryptoPacket(1);
1300
ianswett0cc36802019-04-20 03:04:09 -07001301 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001302
1303 // Retransmit the crypto packet as 2.
1304 if (manager_.session_decides_what_to_write()) {
1305 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1306 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1307 }
1308 manager_.OnRetransmissionTimeout();
1309 if (!manager_.session_decides_what_to_write()) {
1310 RetransmitNextPacket(2);
1311 }
ianswett0cc36802019-04-20 03:04:09 -07001312 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001313
1314 // Retransmit the crypto packet as 3.
1315 if (manager_.session_decides_what_to_write()) {
1316 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1317 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1318 }
1319 manager_.OnRetransmissionTimeout();
1320 if (!manager_.session_decides_what_to_write()) {
1321 RetransmitNextPacket(3);
1322 }
ianswett0cc36802019-04-20 03:04:09 -07001323 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001324
1325 // Now neuter all unacked unencrypted packets, which occurs when the
1326 // connection goes forward secure.
1327 manager_.NeuterUnencryptedPackets();
1328 if (manager_.session_decides_what_to_write()) {
1329 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1330 .WillRepeatedly(Return(false));
1331 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
1332 }
ianswett0cc36802019-04-20 03:04:09 -07001333 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001334 uint64_t unacked[] = {1, 2, 3};
1335 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1336 VerifyRetransmittablePackets(nullptr, 0);
1337 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett0cc36802019-04-20 03:04:09 -07001338 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001339 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001340
1341 // Ensure both packets get discarded when packet 2 is acked.
1342 uint64_t acked[] = {3};
1343 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1344 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1345 clock_.Now());
1346 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001347 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1348 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001349 VerifyUnackedPackets(nullptr, 0);
1350 VerifyRetransmittablePackets(nullptr, 0);
1351}
1352
1353TEST_P(QuicSentPacketManagerTest, RetransmissionTimeout) {
1354 StrictMock<MockDebugDelegate> debug_delegate;
1355 manager_.SetDebugDelegate(&debug_delegate);
1356
1357 // Send 100 packets.
1358 const size_t kNumSentPackets = 100;
1359 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1360 SendDataPacket(i);
1361 }
1362
1363 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1364 if (manager_.session_decides_what_to_write()) {
1365 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1366 .Times(2)
1367 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1368 RetransmitDataPacket(101, type);
1369 })))
1370 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1371 RetransmitDataPacket(102, type);
1372 })));
1373 }
1374 manager_.OnRetransmissionTimeout();
1375 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001376 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001377 } else {
1378 ASSERT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001379 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380 RetransmitNextPacket(101);
1381 ASSERT_TRUE(manager_.HasPendingRetransmissions());
1382 RetransmitNextPacket(102);
1383 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1384 }
1385
1386 // Ack a retransmission.
1387 // Ensure no packets are lost.
1388 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1389 EXPECT_CALL(*send_algorithm_,
1390 OnCongestionEvent(true, _, _,
1391 Pointwise(PacketNumberEq(), {largest_acked}),
1392 /*lost_packets=*/IsEmpty()));
1393 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1394 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1395 // RTO's use loss detection instead of immediately declaring retransmitted
1396 // packets lost.
1397 for (int i = 1; i <= 99; ++i) {
1398 EXPECT_CALL(debug_delegate,
1399 OnPacketLoss(QuicPacketNumber(i), LOSS_RETRANSMISSION, _));
1400 }
1401 if (manager_.session_decides_what_to_write()) {
1402 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1403 // Packets [1, 99] are considered as lost, although stream frame in packet
1404 // 2 is not outstanding.
1405 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
1406 }
1407 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1408 clock_.Now());
1409 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001410 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1411 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001412}
1413
1414TEST_P(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
1415 // Set the 1RTO connection option.
1416 QuicConfig client_config;
1417 QuicTagVector options;
1418 options.push_back(k1RTO);
1419 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1420 client_config.SetConnectionOptionsToSend(options);
1421 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1422 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1423 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1424 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1425 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1426 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1427 manager_.SetFromConfig(client_config);
1428 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1429
1430 StrictMock<MockDebugDelegate> debug_delegate;
1431 manager_.SetDebugDelegate(&debug_delegate);
1432
1433 // Send 100 packets.
1434 const size_t kNumSentPackets = 100;
1435 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1436 SendDataPacket(i);
1437 }
1438
1439 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1440 if (manager_.session_decides_what_to_write()) {
1441 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1442 .Times(1)
1443 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1444 RetransmitDataPacket(101, type);
1445 })));
1446 }
1447 manager_.OnRetransmissionTimeout();
1448 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001449 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001450 } else {
1451 ASSERT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001452 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001453 RetransmitNextPacket(101);
1454 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1455 }
1456}
1457
1458TEST_P(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
1459 QuicConfig client_config;
1460 QuicTagVector options;
1461 options.push_back(kNRTO);
1462 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1463 client_config.SetConnectionOptionsToSend(options);
1464 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1465 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1466 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1467 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1468 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1469 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1470 manager_.SetFromConfig(client_config);
1471 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1472 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1473
1474 // Send 100 packets.
1475 const size_t kNumSentPackets = 100;
1476 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1477 SendDataPacket(i);
1478 }
1479
1480 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1481 if (manager_.session_decides_what_to_write()) {
1482 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1483 .Times(2)
1484 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1485 RetransmitDataPacket(101, type);
1486 })))
1487 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1488 RetransmitDataPacket(102, type);
1489 })));
1490 }
1491 manager_.OnRetransmissionTimeout();
1492 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001493 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001494 } else {
1495 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001496 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001497 RetransmitNextPacket(101);
1498 RetransmitNextPacket(102);
1499 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1500 }
1501
1502 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1503 // This will include packets in the lost packet map.
1504 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1505 EXPECT_CALL(*send_algorithm_,
1506 OnCongestionEvent(true, _, _,
1507 Pointwise(PacketNumberEq(), {largest_acked}),
1508 /*lost_packets=*/Not(IsEmpty())));
1509 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1510 if (manager_.session_decides_what_to_write()) {
1511 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1512 // Packets [1, 99] are considered as lost, although stream frame in packet
1513 // 2 is not outstanding.
1514 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
1515 }
1516 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1517 clock_.Now());
1518 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001519 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1520 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001521}
1522
1523TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
1524 // Send 1 packet.
1525 SendDataPacket(1);
1526
1527 if (manager_.session_decides_what_to_write()) {
1528 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1529 .WillOnce(WithArgs<1>(Invoke(
1530 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
1531 }
1532 manager_.OnRetransmissionTimeout();
1533 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001534 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001535 } else {
1536 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001537 EXPECT_EQ(kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001538 RetransmitNextPacket(2);
1539 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1540 }
1541
1542 // Rto a second time.
1543 if (manager_.session_decides_what_to_write()) {
1544 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1545 .WillOnce(WithArgs<1>(Invoke(
1546 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1547 }
1548 manager_.OnRetransmissionTimeout();
1549 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001550 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001551 } else {
1552 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001553 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001554 RetransmitNextPacket(3);
1555 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1556 }
1557
1558 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1559 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1560 ExpectAck(2);
1561 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1562 clock_.Now());
1563 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001564 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1565 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001566
1567 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001568 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001569}
1570
1571TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
1572 // Send 1 packet.
1573 SendDataPacket(1);
1574
1575 if (manager_.session_decides_what_to_write()) {
1576 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1577 .WillOnce(WithArgs<1>(Invoke(
1578 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
1579 }
1580 manager_.OnRetransmissionTimeout();
1581 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001582 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001583 } else {
1584 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001585 EXPECT_EQ(kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001586 RetransmitNextPacket(2);
1587 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1588 }
1589
1590 // Rto a second time.
1591 if (manager_.session_decides_what_to_write()) {
1592 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1593 .WillOnce(WithArgs<1>(Invoke(
1594 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1595 }
1596 manager_.OnRetransmissionTimeout();
1597 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001598 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599 } else {
1600 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001601 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001602 RetransmitNextPacket(3);
1603 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1604 }
1605
1606 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1607 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1608 ExpectAck(3);
1609 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1610 clock_.Now());
1611 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001612 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1613 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001614
1615 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001616 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001617}
1618
1619TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) {
1620 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1621}
1622
1623TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
1624 QuicTime crypto_packet_send_time = clock_.Now();
1625 SendCryptoPacket(1);
1626
1627 // Check the min.
1628 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1629 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1630 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1631 manager_.GetRetransmissionTime());
1632
1633 // Test with a standard smoothed RTT.
1634 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1635
1636 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1637 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1638 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1639
1640 // Retransmit the packet by invoking the retransmission timeout.
1641 clock_.AdvanceTime(1.5 * srtt);
1642 if (manager_.session_decides_what_to_write()) {
1643 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1644 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1645 // When session decides what to write, crypto_packet_send_time gets updated.
1646 crypto_packet_send_time = clock_.Now();
1647 }
1648 manager_.OnRetransmissionTimeout();
1649 if (!manager_.session_decides_what_to_write()) {
1650 RetransmitNextPacket(2);
1651 }
1652
1653 // The retransmission time should now be twice as far in the future.
1654 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1655 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1656
1657 // Retransmit the packet for the 2nd time.
1658 clock_.AdvanceTime(2 * 1.5 * srtt);
1659 if (manager_.session_decides_what_to_write()) {
1660 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1661 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1662 // When session decides what to write, crypto_packet_send_time gets updated.
1663 crypto_packet_send_time = clock_.Now();
1664 }
1665 manager_.OnRetransmissionTimeout();
1666 if (!manager_.session_decides_what_to_write()) {
1667 RetransmitNextPacket(3);
1668 }
1669
1670 // Verify exponential backoff of the retransmission timeout.
1671 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1672 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1673}
1674
1675TEST_P(QuicSentPacketManagerTest,
1676 GetConservativeTransmissionTimeCryptoHandshake) {
1677 QuicConfig config;
1678 QuicTagVector options;
1679 options.push_back(kCONH);
1680 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1681 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1682 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1683 manager_.SetFromConfig(config);
1684 // Calling SetFromConfig requires mocking out some send algorithm methods.
1685 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1686 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1687 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1688 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1689
1690 QuicTime crypto_packet_send_time = clock_.Now();
1691 SendCryptoPacket(1);
1692
1693 // Check the min.
1694 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1695 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1696 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1697 manager_.GetRetransmissionTime());
1698
1699 // Test with a standard smoothed RTT.
1700 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1701
1702 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1703 QuicTime expected_time = clock_.Now() + 2 * srtt;
1704 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1705
1706 // Retransmit the packet by invoking the retransmission timeout.
1707 clock_.AdvanceTime(2 * srtt);
1708 if (manager_.session_decides_what_to_write()) {
1709 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1710 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1711 crypto_packet_send_time = clock_.Now();
1712 }
1713 manager_.OnRetransmissionTimeout();
1714 if (!manager_.session_decides_what_to_write()) {
1715 RetransmitNextPacket(2);
1716 }
1717
1718 // The retransmission time should now be twice as far in the future.
1719 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1720 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1721}
1722
1723TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
1724 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1725 SendDataPacket(1);
1726 SendDataPacket(2);
1727
1728 // Check the min.
1729 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1730 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1731 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1732 manager_.GetRetransmissionTime());
1733
1734 // Test with a standard smoothed RTT.
1735 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1736 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1737 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1738 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1739 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1740
1741 // Retransmit the packet by invoking the retransmission timeout.
1742 clock_.AdvanceTime(expected_tlp_delay);
1743 manager_.OnRetransmissionTimeout();
1744 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1745 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1746 if (manager_.session_decides_what_to_write()) {
1747 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1748 .WillOnce(WithArgs<1>(Invoke(
1749 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1750 }
1751 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1752 if (!manager_.session_decides_what_to_write()) {
1753 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1754 RetransmitNextPacket(3);
1755 }
1756 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1757 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1758 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1759
1760 expected_time = clock_.Now() + expected_tlp_delay;
1761 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1762}
1763
1764TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
1765 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1766 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1767 QuicTime::Delta::Zero(), QuicTime::Zero());
1768
1769 SendDataPacket(1);
1770 SendDataPacket(2);
1771 SendDataPacket(3);
1772 SendDataPacket(4);
1773
1774 QuicTime::Delta expected_rto_delay =
1775 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1776 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1777 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1778
1779 // Retransmit the packet by invoking the retransmission timeout.
1780 clock_.AdvanceTime(expected_rto_delay);
1781 if (manager_.session_decides_what_to_write()) {
1782 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1783 .Times(2)
1784 .WillOnce(WithArgs<1>(Invoke(
1785 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1786 .WillOnce(WithArgs<1>(Invoke(
1787 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
1788 }
1789 manager_.OnRetransmissionTimeout();
1790 if (!manager_.session_decides_what_to_write()) {
1791 // All packets are still considered inflight.
ianswett9f459cb2019-04-21 06:39:59 -07001792 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001793 RetransmitNextPacket(5);
1794 RetransmitNextPacket(6);
1795 }
1796 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001797 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001798 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1799
1800 // The delay should double the second time.
1801 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1802 // Once we always base the timer on the right edge, leaving the older packets
1803 // in flight doesn't change the timeout.
1804 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1805
1806 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1807 // original value and OnRetransmissionTimeout is not called or reverted.
1808 ExpectAck(2);
1809 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1810 clock_.Now());
1811 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001812 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1813 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001814 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001815 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001816
1817 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1818 // and the TLP time. In production, there would always be two TLP's first.
1819 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1820 // by the latest RTT sample of 500ms.
1821 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
1822 // Once we always base the timer on the right edge, leaving the older packets
1823 // in flight doesn't change the timeout.
1824 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1825}
1826
1827TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
1828 SendDataPacket(1);
1829 // Provide a 1ms RTT sample.
1830 const_cast<RttStats*>(manager_.GetRttStats())
1831 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
1832 QuicTime::Zero());
1833 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1834
1835 // If the delay is smaller than the min, ensure it exponentially backs off
1836 // from the min.
1837 for (int i = 0; i < 5; ++i) {
1838 EXPECT_EQ(delay,
1839 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1840 EXPECT_EQ(delay,
1841 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1842 delay = delay + delay;
1843 if (manager_.session_decides_what_to_write()) {
1844 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1845 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1846 RetransmitDataPacket(i + 2, type);
1847 })));
1848 }
1849 manager_.OnRetransmissionTimeout();
1850 if (!manager_.session_decides_what_to_write()) {
1851 RetransmitNextPacket(i + 2);
1852 }
1853 }
1854}
1855
1856TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
1857 SendDataPacket(1);
1858 // Provide a 60s RTT sample.
1859 const_cast<RttStats*>(manager_.GetRttStats())
1860 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
1861 QuicTime::Zero());
1862
1863 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1864 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1865 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1866 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1867}
1868
1869TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
1870 SendDataPacket(1);
1871 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1872
1873 // Delay should back off exponentially.
1874 for (int i = 0; i < 5; ++i) {
1875 EXPECT_EQ(delay,
1876 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1877 EXPECT_EQ(delay,
1878 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1879 delay = delay + delay;
1880 if (manager_.session_decides_what_to_write()) {
1881 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1882 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1883 RetransmitDataPacket(i + 2, type);
1884 })));
1885 }
1886 manager_.OnRetransmissionTimeout();
1887 if (!manager_.session_decides_what_to_write()) {
1888 RetransmitNextPacket(i + 2);
1889 }
1890 }
1891}
1892
1893TEST_P(QuicSentPacketManagerTest, RetransmissionDelay) {
1894 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1895 const int64_t kRttMs = 250;
1896 const int64_t kDeviationMs = 5;
1897
1898 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
1899 QuicTime::Delta::Zero(), clock_.Now());
1900
1901 // Initial value is to set the median deviation to half of the initial rtt,
1902 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
1903 // is added which is the initial rtt.
1904 QuicTime::Delta expected_delay =
1905 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
1906 EXPECT_EQ(expected_delay,
1907 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1908 EXPECT_EQ(expected_delay,
1909 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1910
1911 for (int i = 0; i < 100; ++i) {
1912 // Run to make sure that we converge.
1913 rtt_stats->UpdateRtt(
1914 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
1915 QuicTime::Delta::Zero(), clock_.Now());
1916 rtt_stats->UpdateRtt(
1917 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
1918 QuicTime::Delta::Zero(), clock_.Now());
1919 }
1920 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
1921
1922 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
1923 EXPECT_NEAR(expected_delay.ToMilliseconds(),
1924 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
1925 .ToMilliseconds(),
1926 1);
1927 EXPECT_EQ(QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0),
1928 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1929}
1930
1931TEST_P(QuicSentPacketManagerTest, GetLossDelay) {
1932 auto loss_algorithm = QuicMakeUnique<MockLossAlgorithm>();
1933 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
1934
1935 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1936 .WillRepeatedly(Return(QuicTime::Zero()));
1937 SendDataPacket(1);
1938 SendDataPacket(2);
1939
1940 // Handle an ack which causes the loss algorithm to be evaluated and
1941 // set the loss timeout.
1942 ExpectAck(2);
1943 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1944 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1945 clock_.Now());
1946 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001947 EXPECT_EQ(PACKETS_NEWLY_ACKED,
1948 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001949
1950 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
1951 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1952 .WillRepeatedly(Return(timeout));
1953 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1954
1955 // Fire the retransmission timeout and ensure the loss detection algorithm
1956 // is invoked.
1957 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1958 manager_.OnRetransmissionTimeout();
1959}
1960
1961TEST_P(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
1962 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1963 ->GetLossDetectionType());
1964
1965 QuicConfig config;
1966 QuicTagVector options;
1967 options.push_back(kTIME);
1968 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1969 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1970 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1971 manager_.SetFromConfig(config);
1972
1973 EXPECT_EQ(kTime, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1974 ->GetLossDetectionType());
1975}
1976
1977TEST_P(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
1978 QuicConfig config;
1979 QuicTagVector options;
1980
1981 options.push_back(kRENO);
1982 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1983 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1984 manager_.SetFromConfig(config);
1985 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1986 ->GetCongestionControlType());
1987
1988 options.clear();
1989 options.push_back(kTBBR);
1990 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1991 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1992 manager_.SetFromConfig(config);
1993 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1994 ->GetCongestionControlType());
1995
1996 options.clear();
1997 options.push_back(kBYTE);
1998 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1999 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2000 manager_.SetFromConfig(config);
2001 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2002 ->GetCongestionControlType());
2003 options.clear();
2004 options.push_back(kRENO);
2005 options.push_back(kBYTE);
2006 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2007 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2008 manager_.SetFromConfig(config);
2009 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2010 ->GetCongestionControlType());
2011}
2012
2013TEST_P(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
2014 QuicConfig config;
2015 QuicTagVector options;
2016
2017 // No change if the server receives client options.
2018 const SendAlgorithmInterface* mock_sender =
2019 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
2020 options.push_back(kRENO);
2021 config.SetClientConnectionOptions(options);
2022 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2023 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2024 manager_.SetFromConfig(config);
2025 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
2026
2027 // Change the congestion control on the client with client options.
2028 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2029 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2030 manager_.SetFromConfig(config);
2031 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2032 ->GetCongestionControlType());
2033
2034 options.clear();
2035 options.push_back(kTBBR);
2036 config.SetClientConnectionOptions(options);
2037 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2038 manager_.SetFromConfig(config);
2039 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2040 ->GetCongestionControlType());
2041
2042 options.clear();
2043 options.push_back(kBYTE);
2044 config.SetClientConnectionOptions(options);
2045 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2046 manager_.SetFromConfig(config);
2047 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2048 ->GetCongestionControlType());
2049
2050 options.clear();
2051 options.push_back(kRENO);
2052 options.push_back(kBYTE);
2053 config.SetClientConnectionOptions(options);
2054 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2055 manager_.SetFromConfig(config);
2056 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2057 ->GetCongestionControlType());
2058}
2059
2060TEST_P(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) {
2061 QuicConfig config;
2062 QuicTagVector options;
2063
2064 options.push_back(k1CON);
2065 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2066 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2067 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1));
2068 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2069 manager_.SetFromConfig(config);
2070
2071 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2072 QuicConfig client_config;
2073 client_config.SetConnectionOptionsToSend(options);
2074 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2075 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1));
2076 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2077 manager_.SetFromConfig(client_config);
2078}
2079
2080TEST_P(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
2081 QuicConfig config;
2082 QuicTagVector options;
2083
2084 options.push_back(kMAD2);
2085 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2086 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2087 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2088 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2089 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2090 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2091 .WillOnce(Return(10 * kDefaultTCPMSS));
2092 manager_.SetFromConfig(config);
2093 // Set the initial RTT to 1us.
2094 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2095 QuicTime::Delta::FromMicroseconds(1));
2096 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2097 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2098 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2099 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2100 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2101
2102 // Send two packets, and the TLP should be 2 us.
2103 SendDataPacket(1);
2104 SendDataPacket(2);
2105 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2106 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2107 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2108 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2109}
2110
2111TEST_P(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
2112 QuicConfig client_config;
2113 QuicTagVector options;
2114
2115 options.push_back(kMAD2);
2116 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2117 client_config.SetConnectionOptionsToSend(options);
2118 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2119 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2120 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2121 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2122 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2123 .WillOnce(Return(10 * kDefaultTCPMSS));
2124 manager_.SetFromConfig(client_config);
2125 // Set the initial RTT to 1us.
2126 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2127 QuicTime::Delta::FromMicroseconds(1));
2128 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2129 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2130 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2131 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2132 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2133 // Send two packets, and the TLP should be 2 us.
2134 SendDataPacket(1);
2135 SendDataPacket(2);
2136 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2137 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2138 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2139 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2140}
2141
2142TEST_P(QuicSentPacketManagerTest, NegotiateIETFTLPFromOptionsAtServer) {
2143 QuicConfig config;
2144 QuicTagVector options;
2145
2146 options.push_back(kMAD4);
2147 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2148 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2149 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2150 manager_.SetFromConfig(config);
2151 // Provide an RTT measurement of 100ms.
2152 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2153 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2154 QuicTime::Delta::Zero(), QuicTime::Zero());
2155 // Expect 1.5x * SRTT + 0ms MAD
2156 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2157 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2158 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2159 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2160 // Expect 1.5x * SRTT + 50ms MAD
2161 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150),
2162 QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero());
2163 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt());
2164 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2165 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2166 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2167 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2168}
2169
2170TEST_P(QuicSentPacketManagerTest, NegotiateIETFTLPFromOptionsAtClient) {
2171 QuicConfig client_config;
2172 QuicTagVector options;
2173
2174 options.push_back(kMAD4);
2175 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2176 client_config.SetConnectionOptionsToSend(options);
2177 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2178 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2179 manager_.SetFromConfig(client_config);
2180 // Provide an RTT measurement of 100ms.
2181 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2182 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2183 QuicTime::Delta::Zero(), QuicTime::Zero());
2184 // Expect 1.5x * SRTT + 0ms MAD
2185 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2186 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2187 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2188 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2189 // Expect 1.5x * SRTT + 50ms MAD
2190 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150),
2191 QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero());
2192 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt());
2193 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2194 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2195 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2196 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2197}
2198
2199TEST_P(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
2200 QuicConfig config;
2201 QuicTagVector options;
2202
2203 options.push_back(kMAD3);
2204 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2205 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2206 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2207 manager_.SetFromConfig(config);
2208 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2209 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2210 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2211 QuicTime::Delta::Zero(), QuicTime::Zero());
2212 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1),
2213 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2214 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1),
2215 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2216 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
2217 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2218 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2219 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2220 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2221}
2222
2223TEST_P(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
2224 QuicConfig client_config;
2225 QuicTagVector options;
2226
2227 options.push_back(kMAD3);
2228 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2229 client_config.SetConnectionOptionsToSend(options);
2230 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2231 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2232 manager_.SetFromConfig(client_config);
2233 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2234 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2235 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2236 QuicTime::Delta::Zero(), QuicTime::Zero());
2237 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1),
2238 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2239 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1),
2240 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2241 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
2242 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2243 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2244 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
2245 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2246}
2247
2248TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
2249 QuicConfig config;
2250 QuicTagVector options;
2251
2252 options.push_back(kNTLP);
2253 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2254 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2255 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2256 manager_.SetFromConfig(config);
2257 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2258}
2259
2260TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
2261 QuicConfig client_config;
2262 QuicTagVector options;
2263
2264 options.push_back(kNTLP);
2265 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2266 client_config.SetConnectionOptionsToSend(options);
2267 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2268 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2269 manager_.SetFromConfig(client_config);
2270 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2271}
2272
2273TEST_P(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
2274 QuicConfig config;
2275 QuicTagVector options;
2276
2277 options.push_back(k1TLP);
2278 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2279 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2280 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2281 manager_.SetFromConfig(config);
2282 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2283}
2284
2285TEST_P(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
2286 QuicConfig client_config;
2287 QuicTagVector options;
2288
2289 options.push_back(k1TLP);
2290 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2291 client_config.SetConnectionOptionsToSend(options);
2292 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2293 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2294 manager_.SetFromConfig(client_config);
2295 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2296}
2297
2298TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
2299 QuicConfig config;
2300 QuicTagVector options;
2301
2302 options.push_back(kTLPR);
2303 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2304 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2305 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2306 manager_.SetFromConfig(config);
2307 EXPECT_TRUE(
2308 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2309}
2310
2311TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
2312 QuicConfig client_config;
2313 QuicTagVector options;
2314
2315 options.push_back(kTLPR);
2316 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2317 client_config.SetConnectionOptionsToSend(options);
2318 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2319 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2320 manager_.SetFromConfig(client_config);
2321 EXPECT_TRUE(
2322 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2323}
2324
2325TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
2326 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2327 QuicConfig config;
2328 QuicTagVector options;
2329
2330 options.push_back(kNRTO);
2331 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2332 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2333 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2334 manager_.SetFromConfig(config);
2335 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2336}
2337
2338TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
2339 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2340 QuicConfig client_config;
2341 QuicTagVector options;
2342
2343 options.push_back(kNRTO);
2344 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2345 client_config.SetConnectionOptionsToSend(options);
2346 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2347 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2348 manager_.SetFromConfig(client_config);
2349 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2350}
2351
2352TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
2353 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2354 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2355
2356 QuicConfig config;
2357 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2358 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2359 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2360 manager_.SetFromConfig(config);
2361
2362 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2363 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2364}
2365
2366TEST_P(QuicSentPacketManagerTest, ResumeConnectionState) {
2367 // The sent packet manager should use the RTT from CachedNetworkParameters if
2368 // it is provided.
2369 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(1234);
2370 CachedNetworkParameters cached_network_params;
2371 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2372
2373 EXPECT_CALL(*send_algorithm_,
2374 AdjustNetworkParameters(QuicBandwidth::Zero(), kRtt));
fayangbe83ecd2019-04-26 13:58:09 -07002375 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2376 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002377 manager_.ResumeConnectionState(cached_network_params, false);
2378 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2379}
2380
2381TEST_P(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
2382 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2383 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2384 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2385 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2386
2387 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2388 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2389 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2390 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2391
2392 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
2393 manager_.OnConnectionMigration(IPV4_TO_IPV4_CHANGE);
2394
2395 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2396 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2397 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2398}
2399
2400TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
2401 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2402 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2403 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2404 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2405
2406 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2407 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2408 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2409 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2410
2411 manager_.OnConnectionMigration(IPV4_SUBNET_CHANGE);
2412
2413 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2414 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2415 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2416}
2417
2418TEST_P(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
2419 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2420 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2421 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2422 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2423
2424 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2425 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2426 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2427 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2428
2429 manager_.OnConnectionMigration(PORT_CHANGE);
2430
2431 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2432 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2433 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2434}
2435
2436TEST_P(QuicSentPacketManagerTest, PathMtuIncreased) {
2437 EXPECT_CALL(*send_algorithm_,
2438 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2439 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2440 nullptr, kDefaultLength + 100, false, false);
2441 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
2442 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
2443
2444 // Ack the large packet and expect the path MTU to increase.
2445 ExpectAck(1);
2446 EXPECT_CALL(*network_change_visitor_,
2447 OnPathMtuIncreased(kDefaultLength + 100));
2448 QuicAckFrame ack_frame = InitAckFrame(1);
2449 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2450 clock_.Now());
2451 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002452 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2453 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002454}
2455
2456TEST_P(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
2457 // Send packets 1 - 20.
2458 for (size_t i = 1; i <= 20; ++i) {
2459 SendDataPacket(i);
2460 }
2461 // Ack [5, 7), [10, 12), [15, 17).
2462 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2463 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
2464 ExpectAcksAndLosses(true, acked1, QUIC_ARRAYSIZE(acked1), lost1,
2465 QUIC_ARRAYSIZE(lost1));
2466 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2467 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2468 clock_.Now());
2469 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2470 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2471 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2472 // Make sure empty range does not harm.
2473 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002474 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2475 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002476
2477 // Ack [4, 8), [9, 13), [14, 21).
2478 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
2479 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
2480 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2481 clock_.Now());
2482 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2483 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2484 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002485 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2486 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002487}
2488
QUICHE team9929cc42019-03-13 08:17:43 -07002489TEST_P(QuicSentPacketManagerTest, TolerateReneging) {
2490 if (!manager_.tolerate_reneging()) {
2491 return;
2492 }
2493 // Send packets 1 - 20.
2494 for (size_t i = 1; i <= 20; ++i) {
2495 SendDataPacket(i);
2496 }
2497 // Ack [5, 7), [10, 12), [15, 17).
2498 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2499 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
2500 ExpectAcksAndLosses(true, acked1, QUIC_ARRAYSIZE(acked1), lost1,
2501 QUIC_ARRAYSIZE(lost1));
2502 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2503 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2504 clock_.Now());
2505 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2506 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2507 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002508 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2509 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002510
2511 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2512 uint64_t acked2[] = {4, 7, 9, 12};
2513 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
2514 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2515 clock_.Now());
2516 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2517 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002518 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2519 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002520 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2521}
2522
QUICHE teamc279cec2019-03-22 06:51:48 -07002523TEST_P(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
2524 if (!GetQuicReloadableFlag(quic_use_uber_loss_algorithm)) {
2525 return;
2526 }
2527 manager_.EnableMultiplePacketNumberSpacesSupport();
2528 EXPECT_FALSE(
2529 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL).IsInitialized());
2530 EXPECT_FALSE(
2531 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2532 // Send packet 1.
2533 SendDataPacket(1, ENCRYPTION_INITIAL);
2534 EXPECT_EQ(QuicPacketNumber(1),
2535 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2536 EXPECT_FALSE(
2537 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2538 // Ack packet 1.
2539 ExpectAck(1);
2540 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2541 clock_.Now());
2542 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002543 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2544 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002545 EXPECT_EQ(QuicPacketNumber(1),
2546 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2547 EXPECT_FALSE(
2548 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2549 // Send packets 2 and 3.
2550 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2551 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2552 EXPECT_EQ(QuicPacketNumber(1),
2553 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2554 EXPECT_EQ(QuicPacketNumber(3),
2555 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2556 EXPECT_FALSE(
2557 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2558 // Ack packet 2.
2559 ExpectAck(2);
2560 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2561 clock_.Now());
2562 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002563 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2564 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002565 EXPECT_EQ(QuicPacketNumber(2),
2566 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2567 EXPECT_FALSE(
2568 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2569 // Ack packet 3.
2570 ExpectAck(3);
2571 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2572 clock_.Now());
2573 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002574 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2575 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002576 EXPECT_EQ(QuicPacketNumber(3),
2577 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2578 EXPECT_FALSE(
2579 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2580 // Send packets 4 and 5.
2581 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2582 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2583 EXPECT_EQ(QuicPacketNumber(1),
2584 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2585 EXPECT_EQ(QuicPacketNumber(3),
2586 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2587 EXPECT_EQ(QuicPacketNumber(5),
2588 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2589 EXPECT_EQ(QuicPacketNumber(5),
2590 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2591 // Ack packet 5.
2592 ExpectAck(5);
2593 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2594 clock_.Now());
2595 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002596 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2597 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002598 EXPECT_EQ(QuicPacketNumber(3),
2599 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2600 EXPECT_EQ(QuicPacketNumber(5),
2601 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2602 EXPECT_EQ(QuicPacketNumber(5),
2603 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2604
2605 // Send packets 6 - 8.
2606 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2607 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2608 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2609 EXPECT_EQ(QuicPacketNumber(1),
2610 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2611 EXPECT_EQ(QuicPacketNumber(3),
2612 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2613 EXPECT_EQ(QuicPacketNumber(8),
2614 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2615 EXPECT_EQ(QuicPacketNumber(8),
2616 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2617 // Ack all packets.
2618 uint64_t acked[] = {4, 6, 7, 8};
2619 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
2620 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2621 clock_.Now());
2622 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002623 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2624 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002625 EXPECT_EQ(QuicPacketNumber(3),
2626 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2627 EXPECT_EQ(QuicPacketNumber(8),
2628 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2629 EXPECT_EQ(QuicPacketNumber(8),
2630 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2631}
2632
fayang3eb82212019-04-16 12:05:46 -07002633TEST_P(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
2634 if (!GetQuicReloadableFlag(quic_use_uber_loss_algorithm)) {
2635 return;
2636 }
2637 manager_.EnableMultiplePacketNumberSpacesSupport();
2638 // Send packet 1.
2639 SendDataPacket(1, ENCRYPTION_INITIAL);
2640 // Send packets 2 and 3.
2641 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2642 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2643
2644 // ACK packets 2 and 3 in the wrong packet number space.
2645 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2646 clock_.Now());
2647 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2648 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
2649 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
2650}
2651
2652TEST_P(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
2653 if (!GetQuicReloadableFlag(quic_use_uber_loss_algorithm)) {
2654 return;
2655 }
2656 manager_.EnableMultiplePacketNumberSpacesSupport();
2657 // Send packet 1.
2658 SendDataPacket(1, ENCRYPTION_INITIAL);
2659 // Send packets 2 and 3.
2660 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2661 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2662
2663 // ACK packet 1 in the wrong packet number space.
2664 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2665 clock_.Now());
2666 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2667 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
2668 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_HANDSHAKE));
2669}
2670
2671TEST_P(QuicSentPacketManagerTest,
2672 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
2673 if (!GetQuicReloadableFlag(quic_use_uber_loss_algorithm)) {
2674 return;
2675 }
2676 manager_.EnableMultiplePacketNumberSpacesSupport();
2677 // Send packet 1.
2678 SendDataPacket(1, ENCRYPTION_INITIAL);
2679 // Ack packet 1.
2680 ExpectAck(1);
2681 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2682 clock_.Now());
2683 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2684 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2685 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_INITIAL));
2686
2687 // Send packets 2 and 3.
2688 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2689 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2690
2691 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2692 // been acked in the correct packet number space, tolerate it.
2693 uint64_t acked[] = {2, 3};
2694 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
2695 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2696 clock_.Now());
2697 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2698 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2699 manager_.OnAckFrameEnd(clock_.Now(), ENCRYPTION_HANDSHAKE));
2700}
2701
QUICHE teama6ef0a62019-03-07 20:34:33 -05002702} // namespace
2703} // namespace test
2704} // namespace quic