blob: 8c2da38f683464f604f2beb686be62b78ece1dbb [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
fayang06bb1b02019-06-14 14:07:12 -070071 void RetransmitDataPacket(uint64_t packet_number,
72 TransmissionType type,
73 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050074 EXPECT_CALL(
75 *send_algorithm_,
76 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
77 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
78 SerializedPacket packet(CreatePacket(packet_number, true));
fayang06bb1b02019-06-14 14:07:12 -070079 packet.encryption_level = level;
QUICHE teama6ef0a62019-03-07 20:34:33 -050080 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(), type,
81 HAS_RETRANSMITTABLE_DATA);
82 }
83
fayang06bb1b02019-06-14 14:07:12 -070084 void RetransmitDataPacket(uint64_t packet_number, TransmissionType type) {
85 RetransmitDataPacket(packet_number, type, ENCRYPTION_INITIAL);
86 }
87
QUICHE teama6ef0a62019-03-07 20:34:33 -050088 protected:
89 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070090 : manager_(Perspective::IS_SERVER,
91 &clock_,
92 QuicRandom::GetInstance(),
93 &stats_,
94 kCubicBytes,
95 kNack),
QUICHE teama6ef0a62019-03-07 20:34:33 -050096 send_algorithm_(new StrictMock<MockSendAlgorithm>),
97 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
98 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
99 // Disable tail loss probes for most tests.
100 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
101 // Advance the time 1s so the send times are never QuicTime::Zero.
102 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
103 manager_.SetNetworkChangeVisitor(network_change_visitor_.get());
104 manager_.SetSessionNotifier(&notifier_);
105 manager_.SetSessionDecideWhatToWrite(GetParam());
106
107 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
108 .Times(AnyNumber());
109 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
110 .Times(AnyNumber())
111 .WillRepeatedly(Return(QuicBandwidth::Zero()));
112 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
113 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
114 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
115 .Times(AnyNumber());
116 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
117 EXPECT_CALL(notifier_, HasUnackedCryptoData())
118 .WillRepeatedly(Return(false));
119 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
QUICHE team9467db02019-05-30 09:38:45 -0700120 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 }
122
123 ~QuicSentPacketManagerTest() override {}
124
ianswett9f459cb2019-04-21 06:39:59 -0700125 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500126 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
127 if (num_packets == 0) {
128 EXPECT_TRUE(manager_.unacked_packets().empty());
129 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
130 &manager_));
131 return;
132 }
133
134 EXPECT_FALSE(manager_.unacked_packets().empty());
135 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
136 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700137 EXPECT_TRUE(
138 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500139 << packets[i];
140 }
141 }
142
143 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
144 EXPECT_EQ(
145 num_packets,
146 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
147 for (size_t i = 0; i < num_packets; ++i) {
148 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
149 &manager_, packets[i]))
150 << " packets[" << i << "]:" << packets[i];
151 }
152 }
153
154 void ExpectAck(uint64_t largest_observed) {
155 EXPECT_CALL(
156 *send_algorithm_,
157 // Ensure the AckedPacketVector argument contains largest_observed.
158 OnCongestionEvent(true, _, _,
159 Pointwise(PacketNumberEq(), {largest_observed}),
160 IsEmpty()));
161 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
162 }
163
dschinazi17d42422019-06-18 16:35:07 -0700164 void ExpectUpdatedRtt(uint64_t /*largest_observed*/) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165 EXPECT_CALL(*send_algorithm_,
166 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
167 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
168 }
169
170 void ExpectAckAndLoss(bool rtt_updated,
171 uint64_t largest_observed,
172 uint64_t lost_packet) {
173 EXPECT_CALL(
174 *send_algorithm_,
175 OnCongestionEvent(rtt_updated, _, _,
176 Pointwise(PacketNumberEq(), {largest_observed}),
177 Pointwise(PacketNumberEq(), {lost_packet})));
178 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
179 }
180
181 // |packets_acked| and |packets_lost| should be in packet number order.
182 void ExpectAcksAndLosses(bool rtt_updated,
183 uint64_t* packets_acked,
184 size_t num_packets_acked,
185 uint64_t* packets_lost,
186 size_t num_packets_lost) {
187 std::vector<QuicPacketNumber> ack_vector;
188 for (size_t i = 0; i < num_packets_acked; ++i) {
189 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
190 }
191 std::vector<QuicPacketNumber> lost_vector;
192 for (size_t i = 0; i < num_packets_lost; ++i) {
193 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
194 }
195 EXPECT_CALL(*send_algorithm_,
196 OnCongestionEvent(rtt_updated, _, _,
197 Pointwise(PacketNumberEq(), ack_vector),
198 Pointwise(PacketNumberEq(), lost_vector)));
199 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
200 .Times(AnyNumber());
201 }
202
203 void RetransmitAndSendPacket(uint64_t old_packet_number,
204 uint64_t new_packet_number) {
205 RetransmitAndSendPacket(old_packet_number, new_packet_number,
206 TLP_RETRANSMISSION);
207 }
208
209 void RetransmitAndSendPacket(uint64_t old_packet_number,
210 uint64_t new_packet_number,
211 TransmissionType transmission_type) {
212 bool is_lost = false;
213 if (manager_.session_decides_what_to_write()) {
214 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
215 transmission_type == TLP_RETRANSMISSION ||
216 transmission_type == RTO_RETRANSMISSION ||
217 transmission_type == PROBING_RETRANSMISSION) {
218 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
219 .WillOnce(WithArgs<1>(
220 Invoke([this, new_packet_number](TransmissionType type) {
221 RetransmitDataPacket(new_packet_number, type);
222 })));
223 } else {
224 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
225 is_lost = true;
226 }
227 }
228 QuicSentPacketManagerPeer::MarkForRetransmission(
229 &manager_, old_packet_number, transmission_type);
230 if (manager_.session_decides_what_to_write()) {
231 if (!is_lost) {
232 return;
233 }
234 EXPECT_CALL(
235 *send_algorithm_,
236 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
237 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
238 SerializedPacket packet(CreatePacket(new_packet_number, true));
239 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
240 transmission_type, HAS_RETRANSMITTABLE_DATA);
241 return;
242 }
243 EXPECT_TRUE(manager_.HasPendingRetransmissions());
244 QuicPendingRetransmission next_retransmission =
245 manager_.NextPendingRetransmission();
246 EXPECT_EQ(QuicPacketNumber(old_packet_number),
247 next_retransmission.packet_number);
248 EXPECT_EQ(transmission_type, next_retransmission.transmission_type);
249
250 EXPECT_CALL(
251 *send_algorithm_,
252 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
253 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
254 SerializedPacket packet(CreatePacket(new_packet_number, false));
255 manager_.OnPacketSent(&packet, QuicPacketNumber(old_packet_number),
256 clock_.Now(), transmission_type,
257 HAS_RETRANSMITTABLE_DATA);
258 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_,
259 new_packet_number));
260 }
261
262 SerializedPacket CreateDataPacket(uint64_t packet_number) {
263 return CreatePacket(packet_number, true);
264 }
265
266 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
267 SerializedPacket packet(QuicPacketNumber(packet_number),
268 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
269 false, false);
270 if (retransmittable) {
271 packet.retransmittable_frames.push_back(
272 QuicFrame(QuicStreamFrame(kStreamId, false, 0, QuicStringPiece())));
273 }
274 return packet;
275 }
276
zhongyi1b2f7832019-06-14 13:31:34 -0700277 SerializedPacket CreatePingPacket(uint64_t packet_number) {
278 SerializedPacket packet(QuicPacketNumber(packet_number),
279 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
280 false, false);
281 packet.retransmittable_frames.push_back(QuicFrame(QuicPingFrame()));
282 return packet;
283 }
284
QUICHE teama6ef0a62019-03-07 20:34:33 -0500285 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700286 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
287 }
288
289 void SendDataPacket(uint64_t packet_number,
290 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500291 EXPECT_CALL(*send_algorithm_,
292 OnPacketSent(_, BytesInFlight(),
293 QuicPacketNumber(packet_number), _, _));
294 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700295 packet.encryption_level = encryption_level;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500296 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
297 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
298 }
299
zhongyi1b2f7832019-06-14 13:31:34 -0700300 void SendPingPacket(uint64_t packet_number,
301 EncryptionLevel encryption_level) {
302 EXPECT_CALL(*send_algorithm_,
303 OnPacketSent(_, BytesInFlight(),
304 QuicPacketNumber(packet_number), _, _));
305 SerializedPacket packet(CreatePingPacket(packet_number));
306 packet.encryption_level = encryption_level;
307 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
308 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
309 }
310
QUICHE teama6ef0a62019-03-07 20:34:33 -0500311 void SendCryptoPacket(uint64_t packet_number) {
312 EXPECT_CALL(
313 *send_algorithm_,
314 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
315 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
316 SerializedPacket packet(CreatePacket(packet_number, false));
317 packet.retransmittable_frames.push_back(
318 QuicFrame(QuicStreamFrame(1, false, 0, QuicStringPiece())));
319 packet.has_crypto_handshake = IS_HANDSHAKE;
320 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
321 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
322 if (manager_.session_decides_what_to_write()) {
323 EXPECT_CALL(notifier_, HasUnackedCryptoData())
324 .WillRepeatedly(Return(true));
325 }
326 }
327
328 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
fayang06bb1b02019-06-14 14:07:12 -0700329 SendAckPacket(packet_number, largest_acked, ENCRYPTION_INITIAL);
330 }
331
332 void SendAckPacket(uint64_t packet_number,
333 uint64_t largest_acked,
334 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500335 EXPECT_CALL(
336 *send_algorithm_,
337 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
338 kDefaultLength, NO_RETRANSMITTABLE_DATA));
339 SerializedPacket packet(CreatePacket(packet_number, false));
340 packet.largest_acked = QuicPacketNumber(largest_acked);
fayang06bb1b02019-06-14 14:07:12 -0700341 packet.encryption_level = level;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500342 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
343 NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA);
344 }
345
346 // Based on QuicConnection's WritePendingRetransmissions.
347 void RetransmitNextPacket(uint64_t retransmission_packet_number) {
348 EXPECT_TRUE(manager_.HasPendingRetransmissions());
349 EXPECT_CALL(
350 *send_algorithm_,
351 OnPacketSent(_, _, QuicPacketNumber(retransmission_packet_number),
352 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
353 const QuicPendingRetransmission pending =
354 manager_.NextPendingRetransmission();
355 SerializedPacket packet(CreatePacket(retransmission_packet_number, false));
356 manager_.OnPacketSent(&packet, pending.packet_number, clock_.Now(),
357 pending.transmission_type, HAS_RETRANSMITTABLE_DATA);
358 }
359
fayangce0a3162019-08-15 09:05:36 -0700360 void EnablePto(QuicTag tag) {
361 SetQuicReloadableFlag(quic_fix_rto_retransmission3, true);
362 manager_.SetSessionDecideWhatToWrite(true);
363 SetQuicReloadableFlag(quic_enable_pto, true);
364 QuicConfig config;
365 QuicTagVector options;
366 options.push_back(tag);
367 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
368 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
369 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
370 manager_.SetFromConfig(config);
371 EXPECT_TRUE(manager_.enable_pto());
372 }
373
QUICHE teama6ef0a62019-03-07 20:34:33 -0500374 QuicSentPacketManager manager_;
375 MockClock clock_;
376 QuicConnectionStats stats_;
377 MockSendAlgorithm* send_algorithm_;
378 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
379 StrictMock<MockSessionNotifier> notifier_;
380};
381
382INSTANTIATE_TEST_SUITE_P(Tests, QuicSentPacketManagerTest, testing::Bool());
383
384TEST_P(QuicSentPacketManagerTest, IsUnacked) {
385 VerifyUnackedPackets(nullptr, 0);
386 SendDataPacket(1);
387
388 uint64_t unacked[] = {1};
389 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
390 uint64_t retransmittable[] = {1};
391 VerifyRetransmittablePackets(retransmittable,
392 QUIC_ARRAYSIZE(retransmittable));
393}
394
395TEST_P(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
396 SendDataPacket(1);
397 RetransmitAndSendPacket(1, 2);
398
399 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
400 uint64_t unacked[] = {1, 2};
401 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
402 std::vector<uint64_t> retransmittable;
403 if (manager_.session_decides_what_to_write()) {
404 retransmittable = {1, 2};
405 } else {
406 retransmittable = {2};
407 }
408 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
409}
410
411TEST_P(QuicSentPacketManagerTest, RetransmitThenAck) {
412 SendDataPacket(1);
413 RetransmitAndSendPacket(1, 2);
414
415 // Ack 2 but not 1.
416 ExpectAck(2);
417 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
418 clock_.Now());
419 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700420 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700421 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
422 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500423 if (manager_.session_decides_what_to_write()) {
424 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
425 }
426 // Packet 1 is unacked, pending, but not retransmittable.
427 uint64_t unacked[] = {1};
428 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700429 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500430 VerifyRetransmittablePackets(nullptr, 0);
431}
432
433TEST_P(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
434 SendDataPacket(1);
435 if (manager_.session_decides_what_to_write()) {
436 if (manager_.session_decides_what_to_write()) {
437 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
438 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
439 RetransmitDataPacket(2, type);
440 })));
441 }
442 }
443 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
444 TLP_RETRANSMISSION);
445 if (!manager_.session_decides_what_to_write()) {
446 EXPECT_TRUE(manager_.HasPendingRetransmissions());
447 }
448 // Ack 1.
449 ExpectAck(1);
450 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
451 clock_.Now());
452 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700453 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700454 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
455 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500456
457 // There should no longer be a pending retransmission.
458 EXPECT_FALSE(manager_.HasPendingRetransmissions());
459
460 if (manager_.session_decides_what_to_write()) {
461 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
462 uint64_t unacked[] = {2};
463 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
464 // We do not know packet 2 is a spurious retransmission until it gets acked.
465 } else {
466 // No unacked packets remain.
467 VerifyUnackedPackets(nullptr, 0);
468 }
469 VerifyRetransmittablePackets(nullptr, 0);
470 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
471}
472
473TEST_P(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
474 SendDataPacket(1);
475 if (manager_.session_decides_what_to_write()) {
476 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
477 }
478 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
479 TLP_RETRANSMISSION);
480 if (!manager_.session_decides_what_to_write()) {
481 EXPECT_TRUE(manager_.HasPendingRetransmissions());
482 }
483
484 manager_.CancelRetransmissionsForStream(kStreamId);
485 if (manager_.session_decides_what_to_write()) {
486 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
487 }
488
489 // There should no longer be a pending retransmission.
490 EXPECT_FALSE(manager_.HasPendingRetransmissions());
491
492 uint64_t unacked[] = {1};
493 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
494 VerifyRetransmittablePackets(nullptr, 0);
495 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
496}
497
498TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
499 SendDataPacket(1);
500 RetransmitAndSendPacket(1, 2);
501 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
502 clock_.AdvanceTime(rtt);
503
504 // Ack 1 but not 2.
505 ExpectAck(1);
506 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
507 clock_.Now());
508 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700509 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700510 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
511 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500512 if (manager_.session_decides_what_to_write()) {
513 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
514 }
515 // 2 remains unacked, but no packets have retransmittable data.
516 uint64_t unacked[] = {2};
517 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700518 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500519 VerifyRetransmittablePackets(nullptr, 0);
520 if (manager_.session_decides_what_to_write()) {
521 // Ack 2 causes 2 be considered as spurious retransmission.
QUICHE team9467db02019-05-30 09:38:45 -0700522 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500523 ExpectAck(2);
524 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
525 clock_.Now());
526 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700527 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700528 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
529 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500530 }
531
532 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
533}
534
535TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
536 SendDataPacket(1);
537 RetransmitAndSendPacket(1, 2);
538 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
539 clock_.AdvanceTime(rtt);
540
541 // First, ACK packet 1 which makes packet 2 non-retransmittable.
542 ExpectAck(1);
543 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
544 clock_.Now());
545 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700546 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700547 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
548 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500549
550 SendDataPacket(3);
551 SendDataPacket(4);
552 SendDataPacket(5);
553 clock_.AdvanceTime(rtt);
554
555 // Next, NACK packet 2 three times.
556 ExpectAck(3);
557 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
558 clock_.Now());
559 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
560 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700561 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700562 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
563 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500564
565 ExpectAck(4);
566 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
567 clock_.Now());
568 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
569 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700570 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700571 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
572 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500573
574 ExpectAckAndLoss(true, 5, 2);
575 if (manager_.session_decides_what_to_write()) {
576 // Frames in all packets are acked.
577 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
578 // Notify session that stream frame in packet 2 gets lost although it is
579 // not outstanding.
580 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
581 }
582 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
583 clock_.Now());
584 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
585 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700586 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700587 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
588 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500589
590 if (manager_.session_decides_what_to_write()) {
591 uint64_t unacked[] = {2};
592 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
593 } else {
594 // No packets remain unacked.
595 VerifyUnackedPackets(nullptr, 0);
596 }
ianswett67d7a3c2019-04-19 10:58:47 -0700597 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500598 VerifyRetransmittablePackets(nullptr, 0);
599
600 // Verify that the retransmission alarm would not fire,
601 // since there is no retransmittable data outstanding.
602 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
603}
604
605TEST_P(QuicSentPacketManagerTest,
606 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
607 SendDataPacket(1);
608 RetransmitAndSendPacket(1, 2);
609
610 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
611 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
612 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
613 manager_.OnRetransmissionTimeout();
614 EXPECT_TRUE(manager_.HasPendingRetransmissions());
615
616 // Ack 1 but not 2, before 2 is able to be sent.
617 // Since 1 has been retransmitted, it has already been lost, and so the
618 // send algorithm is not informed that it has been ACK'd.
619 ExpectUpdatedRtt(1);
620 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
621 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
622 clock_.Now());
623 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700624 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700625 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
626 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627
628 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
629 uint64_t unacked[] = {2};
630 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700631 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500632 VerifyRetransmittablePackets(nullptr, 0);
633
634 // Verify that the retransmission alarm would not fire,
635 // since there is no retransmittable data outstanding.
636 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
637}
638
639TEST_P(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
640 StrictMock<MockDebugDelegate> debug_delegate;
641 if (manager_.session_decides_what_to_write()) {
642 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(
643 TLP_RETRANSMISSION, kDefaultLength))
644 .Times(1);
645 } else {
646 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(
647 TLP_RETRANSMISSION, kDefaultLength))
648 .Times(2);
649 }
650 manager_.SetDebugDelegate(&debug_delegate);
651
652 SendDataPacket(1);
653 RetransmitAndSendPacket(1, 2);
654 RetransmitAndSendPacket(2, 3);
655 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
656 clock_.AdvanceTime(rtt);
657
658 // Ack 1 but not 2 or 3.
659 ExpectAck(1);
660 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
661 clock_.Now());
662 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700663 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700664 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
665 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500666 if (manager_.session_decides_what_to_write()) {
667 // Frames in packets 2 and 3 are acked.
668 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
669 .Times(2)
670 .WillRepeatedly(Return(false));
671 }
672
673 // 2 and 3 remain unacked, but no packets have retransmittable data.
674 uint64_t unacked[] = {2, 3};
675 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700676 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500677 VerifyRetransmittablePackets(nullptr, 0);
678
679 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
680 SendDataPacket(4);
681 if (manager_.session_decides_what_to_write()) {
682 // No new data gets acked in packet 3.
QUICHE team9467db02019-05-30 09:38:45 -0700683 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500684 .WillOnce(Return(false))
685 .WillRepeatedly(Return(true));
686 }
687 uint64_t acked[] = {3, 4};
688 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
689 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
690 clock_.Now());
691 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
692 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700693 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700694 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
695 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500696
697 uint64_t unacked2[] = {2};
698 VerifyUnackedPackets(unacked2, QUIC_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700699 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500700
701 SendDataPacket(5);
702 ExpectAckAndLoss(true, 5, 2);
703 EXPECT_CALL(debug_delegate,
704 OnPacketLoss(QuicPacketNumber(2), LOSS_RETRANSMISSION, _));
705 if (manager_.session_decides_what_to_write()) {
706 // Frames in all packets are acked.
707 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
708 // Notify session that stream frame in packet 2 gets lost although it is
709 // not outstanding.
710 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
711 }
712 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
713 clock_.Now());
714 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
715 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700716 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700717 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
718 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500719
720 if (manager_.session_decides_what_to_write()) {
721 uint64_t unacked[] = {2};
722 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
723 } else {
724 VerifyUnackedPackets(nullptr, 0);
725 }
ianswett67d7a3c2019-04-19 10:58:47 -0700726 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500727 if (manager_.session_decides_what_to_write()) {
728 // Spurious retransmission is detected when packet 3 gets acked. We cannot
729 // know packet 2 is a spurious until it gets acked.
730 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
731 } else {
732 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted);
733 }
734}
735
736TEST_P(QuicSentPacketManagerTest, AckOriginalTransmission) {
737 auto loss_algorithm = QuicMakeUnique<MockLossAlgorithm>();
738 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
739
740 SendDataPacket(1);
741 RetransmitAndSendPacket(1, 2);
742
743 // Ack original transmission, but that wasn't lost via fast retransmit,
744 // so no call on OnSpuriousRetransmission is expected.
745 {
746 ExpectAck(1);
747 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
748 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
749 clock_.Now());
750 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700751 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700752 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
753 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500754 }
755
756 SendDataPacket(3);
757 SendDataPacket(4);
758 // Ack 4, which causes 3 to be retransmitted.
759 {
760 ExpectAck(4);
761 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
762 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
763 clock_.Now());
764 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
765 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700766 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700767 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
768 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500769 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
770 }
771
772 // Ack 3, which causes SpuriousRetransmitDetected to be called.
773 {
774 uint64_t acked[] = {3};
775 ExpectAcksAndLosses(false, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
776 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
777 EXPECT_CALL(*loss_algorithm,
778 SpuriousRetransmitDetected(_, _, _, QuicPacketNumber(5)));
779 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
780 clock_.Now());
781 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
782 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700783 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700784 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
785 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500786 if (manager_.session_decides_what_to_write()) {
787 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
788 // 5 will cause 5 be considered as a spurious retransmission as no new
789 // data gets acked.
790 ExpectAck(5);
791 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
QUICHE team9467db02019-05-30 09:38:45 -0700792 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500793 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
794 clock_.Now());
795 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
796 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700797 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700798 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
799 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500800 }
801 }
802}
803
804TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) {
805 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
806}
807
808TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
809 SendDataPacket(1);
810 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
811}
812
813TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
814 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
815 SendDataPacket(1);
816 SendAckPacket(2, 1);
817
818 // Now ack the ack and expect an RTT update.
819 uint64_t acked[] = {1, 2};
820 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
821 manager_.OnAckFrameStart(QuicPacketNumber(2),
822 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
823 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700824 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700825 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
826 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500827 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
828
829 SendAckPacket(3, 3);
830
831 // Now ack the ack and expect only an RTT update.
832 uint64_t acked2[] = {3};
833 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
834 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
835 clock_.Now());
836 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700837 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700838 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
839 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500840 EXPECT_EQ(QuicPacketNumber(3u),
841 manager_.largest_packet_peer_knows_is_acked());
842}
843
844TEST_P(QuicSentPacketManagerTest, Rtt) {
845 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
846 SendDataPacket(1);
847 clock_.AdvanceTime(expected_rtt);
848
849 ExpectAck(1);
850 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
851 clock_.Now());
852 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700853 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700854 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
855 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
857}
858
859TEST_P(QuicSentPacketManagerTest, RttWithInvalidDelta) {
860 // Expect that the RTT is equal to the local time elapsed, since the
861 // ack_delay_time is larger than the local time elapsed
862 // and is hence invalid.
863 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
864 SendDataPacket(1);
865 clock_.AdvanceTime(expected_rtt);
866
867 ExpectAck(1);
868 manager_.OnAckFrameStart(QuicPacketNumber(1),
869 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
870 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700871 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700872 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
873 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500874 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
875}
876
877TEST_P(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
878 // Expect that the RTT is equal to the local time elapsed, since the
879 // ack_delay_time is infinite, and is hence invalid.
880 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
881 SendDataPacket(1);
882 clock_.AdvanceTime(expected_rtt);
883
884 ExpectAck(1);
885 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
886 clock_.Now());
887 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700888 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700889 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
890 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500891 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
892}
893
894TEST_P(QuicSentPacketManagerTest, RttZeroDelta) {
895 // Expect that the RTT is the time between send and receive since the
896 // ack_delay_time is zero.
897 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
898 SendDataPacket(1);
899 clock_.AdvanceTime(expected_rtt);
900
901 ExpectAck(1);
902 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
903 clock_.Now());
904 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700905 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700906 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
907 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500908 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
909}
910
911TEST_P(QuicSentPacketManagerTest, TailLossProbeTimeout) {
912 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
913
914 // Send 1 packet.
915 SendDataPacket(1);
916
917 // The first tail loss probe retransmits 1 packet.
918 manager_.OnRetransmissionTimeout();
919 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
920 EXPECT_FALSE(manager_.HasPendingRetransmissions());
921 if (manager_.session_decides_what_to_write()) {
922 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
923 .WillOnce(WithArgs<1>(Invoke(
924 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
925 }
926 manager_.MaybeRetransmitTailLossProbe();
927 if (!manager_.session_decides_what_to_write()) {
928 EXPECT_TRUE(manager_.HasPendingRetransmissions());
929 RetransmitNextPacket(2);
930 EXPECT_FALSE(manager_.HasPendingRetransmissions());
931 }
932
933 // The second tail loss probe retransmits 1 packet.
934 manager_.OnRetransmissionTimeout();
935 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
936 EXPECT_FALSE(manager_.HasPendingRetransmissions());
937 if (manager_.session_decides_what_to_write()) {
938 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
939 .WillOnce(WithArgs<1>(Invoke(
940 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
941 }
942 manager_.MaybeRetransmitTailLossProbe();
943 if (!manager_.session_decides_what_to_write()) {
944 EXPECT_TRUE(manager_.HasPendingRetransmissions());
945 RetransmitNextPacket(3);
946 }
947 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
948 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
949 EXPECT_FALSE(manager_.HasPendingRetransmissions());
950
951 // Ack the third and ensure the first two are still pending.
952 ExpectAck(3);
953
954 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
955 clock_.Now());
956 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700957 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700958 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
959 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500960
ianswett67d7a3c2019-04-19 10:58:47 -0700961 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500962
963 // Acking two more packets will lose both of them due to nacks.
964 SendDataPacket(4);
965 SendDataPacket(5);
966 uint64_t acked[] = {4, 5};
967 uint64_t lost[] = {1, 2};
968 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), lost,
969 QUIC_ARRAYSIZE(lost));
970 if (manager_.session_decides_what_to_write()) {
971 // Frames in all packets are acked.
972 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
973 // Notify session that stream frame in packets 1 and 2 get lost although
974 // they are not outstanding.
975 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
976 }
977 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
978 clock_.Now());
979 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700980 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700981 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
982 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500983
984 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett67d7a3c2019-04-19 10:58:47 -0700985 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500986 EXPECT_EQ(2u, stats_.tlp_count);
987 EXPECT_EQ(0u, stats_.rto_count);
988}
989
990TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
991 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
992
993 // Send 100 packets.
994 const size_t kNumSentPackets = 100;
995 for (size_t i = 1; i <= kNumSentPackets; ++i) {
996 SendDataPacket(i);
997 }
998 QuicTime rto_packet_time = clock_.Now();
999 // Advance the time.
1000 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
1001
1002 // The first tail loss probe retransmits 1 packet.
1003 manager_.OnRetransmissionTimeout();
1004 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1005 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1006 if (manager_.session_decides_what_to_write()) {
1007 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1008 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1009 RetransmitDataPacket(101, type);
1010 })));
1011 }
1012 manager_.MaybeRetransmitTailLossProbe();
1013 if (!manager_.session_decides_what_to_write()) {
1014 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1015 RetransmitNextPacket(101);
1016 }
1017 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1018 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1019 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1020 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
1021
1022 // The second tail loss probe retransmits 1 packet.
1023 manager_.OnRetransmissionTimeout();
1024 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1025 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1026 if (manager_.session_decides_what_to_write()) {
1027 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1028 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1029 RetransmitDataPacket(102, type);
1030 })));
1031 }
1032 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1033 if (!manager_.session_decides_what_to_write()) {
1034 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1035 RetransmitNextPacket(102);
1036 }
1037 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1038 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1039
1040 // Ensure the RTO is set based on the correct packet.
1041 rto_packet_time = clock_.Now();
1042 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
1043 manager_.GetRetransmissionTime());
1044
1045 // Advance the time enough to ensure all packets are RTO'd.
1046 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
1047
1048 if (manager_.session_decides_what_to_write()) {
1049 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1050 .Times(2)
1051 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1052 RetransmitDataPacket(103, type);
1053 })))
1054 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1055 RetransmitDataPacket(104, type);
1056 })));
1057 }
1058 manager_.OnRetransmissionTimeout();
1059 EXPECT_EQ(2u, stats_.tlp_count);
1060 EXPECT_EQ(1u, stats_.rto_count);
1061 if (manager_.session_decides_what_to_write()) {
1062 // There are 2 RTO retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001063 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001064 }
1065 if (!manager_.session_decides_what_to_write()) {
1066 // Send and Ack the RTO and ensure OnRetransmissionTimeout is called.
ianswett9f459cb2019-04-21 06:39:59 -07001067 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001068 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1069 RetransmitNextPacket(103);
1070 }
1071 QuicPacketNumber largest_acked = QuicPacketNumber(103);
1072 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1073 EXPECT_CALL(*send_algorithm_,
1074 OnCongestionEvent(
1075 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
1076 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1077 if (manager_.session_decides_what_to_write()) {
1078 // Although frames in packet 3 gets acked, it would be kept for another
1079 // RTT.
1080 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1081 // Packets [1, 102] are lost, although stream frame in packet 3 is not
1082 // outstanding.
1083 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
1084 }
1085 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
1086 clock_.Now());
1087 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -07001088 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001089 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1090 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001091 // All packets before 103 should be lost.
1092 if (manager_.session_decides_what_to_write()) {
1093 // Packet 104 is still in flight.
ianswett9f459cb2019-04-21 06:39:59 -07001094 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001095 } else {
ianswett9f459cb2019-04-21 06:39:59 -07001096 EXPECT_EQ(0u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001097 }
1098}
1099
1100TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
1101 // Send 2 crypto packets and 3 data packets.
1102 const size_t kNumSentCryptoPackets = 2;
1103 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1104 SendCryptoPacket(i);
1105 }
1106 const size_t kNumSentDataPackets = 3;
1107 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1108 SendDataPacket(kNumSentCryptoPackets + i);
1109 }
ianswett0cc36802019-04-20 03:04:09 -07001110 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -07001111 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001112
1113 // The first retransmits 2 packets.
1114 if (manager_.session_decides_what_to_write()) {
1115 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1116 .Times(2)
1117 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1118 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
1119 }
1120 manager_.OnRetransmissionTimeout();
1121 if (!manager_.session_decides_what_to_write()) {
1122 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1123 RetransmitNextPacket(6);
1124 RetransmitNextPacket(7);
1125 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1126 }
ianswett898306b2019-04-23 11:05:57 -07001127 // Expect all 4 handshake packets to be in flight and 3 data packets.
1128 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1129 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
1130 }
ianswett0cc36802019-04-20 03:04:09 -07001131 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001132
1133 // The second retransmits 2 packets.
1134 if (manager_.session_decides_what_to_write()) {
1135 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1136 .Times(2)
1137 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
1138 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
1139 }
1140 manager_.OnRetransmissionTimeout();
1141 if (!manager_.session_decides_what_to_write()) {
1142 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1143 RetransmitNextPacket(8);
1144 RetransmitNextPacket(9);
1145 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1146 }
ianswett898306b2019-04-23 11:05:57 -07001147 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1148 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
1149 }
ianswett0cc36802019-04-20 03:04:09 -07001150 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001151
1152 // Now ack the two crypto packets and the speculatively encrypted request,
1153 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett898306b2019-04-23 11:05:57 -07001154 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1155 // Crypto packets remain in flight, so any that aren't acked will be lost.
1156 uint64_t acked[] = {3, 4, 5, 8, 9};
1157 uint64_t lost[] = {1, 2, 6};
1158 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), lost,
1159 QUIC_ARRAYSIZE(lost));
1160 if (manager_.session_decides_what_to_write()) {
1161 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
1162 }
1163 } else {
1164 uint64_t acked[] = {3, 4, 5, 8, 9};
1165 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1166 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001167 if (manager_.session_decides_what_to_write()) {
1168 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1169 .WillRepeatedly(Return(false));
1170 }
1171 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1172 clock_.Now());
1173 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1174 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001175 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001176 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1177 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001178
ianswett0cc36802019-04-20 03:04:09 -07001179 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001180}
1181
1182TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
1183 // Send 2 crypto packets and 3 data packets.
1184 const size_t kNumSentCryptoPackets = 2;
1185 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1186 SendCryptoPacket(i);
1187 }
1188 const size_t kNumSentDataPackets = 3;
1189 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1190 SendDataPacket(kNumSentCryptoPackets + i);
1191 }
ianswett0cc36802019-04-20 03:04:09 -07001192 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001193
1194 if (manager_.session_decides_what_to_write()) {
1195 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1196 .Times(2)
1197 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1198 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
1199 }
1200 manager_.OnRetransmissionTimeout();
1201 if (!manager_.session_decides_what_to_write()) {
1202 RetransmitNextPacket(6);
1203 RetransmitNextPacket(7);
1204 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1205 }
ianswett0cc36802019-04-20 03:04:09 -07001206 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001207
1208 // Now act like a version negotiation packet arrived, which would cause all
1209 // unacked packets to be retransmitted.
1210 if (manager_.session_decides_what_to_write()) {
1211 // Mark packets [1, 7] lost. And the frames in 6 and 7 are same as packets 1
1212 // and 2, respectively.
1213 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(7);
1214 }
1215 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1216
1217 // Ensure the first two pending packets are the crypto retransmits.
1218 if (manager_.session_decides_what_to_write()) {
1219 RetransmitCryptoPacket(8);
1220 RetransmitCryptoPacket(9);
1221 RetransmitDataPacket(10, ALL_UNACKED_RETRANSMISSION);
1222 RetransmitDataPacket(11, ALL_UNACKED_RETRANSMISSION);
1223 RetransmitDataPacket(12, ALL_UNACKED_RETRANSMISSION);
1224 } else {
1225 ASSERT_TRUE(manager_.HasPendingRetransmissions());
1226 EXPECT_EQ(QuicPacketNumber(6u),
1227 manager_.NextPendingRetransmission().packet_number);
1228 RetransmitNextPacket(8);
1229 EXPECT_EQ(QuicPacketNumber(7u),
1230 manager_.NextPendingRetransmission().packet_number);
1231 RetransmitNextPacket(9);
1232 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1233 // Send 3 more data packets and ensure the least unacked is raised.
1234 RetransmitNextPacket(10);
1235 RetransmitNextPacket(11);
1236 RetransmitNextPacket(12);
1237 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1238 }
1239
1240 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
1241 // Least unacked isn't raised until an ack is received, so ack the
1242 // crypto packets.
1243 uint64_t acked[] = {8, 9};
1244 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1245 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1246 clock_.Now());
1247 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
fayang3eb82212019-04-16 12:05:46 -07001248 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001249 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1250 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001251 if (manager_.session_decides_what_to_write()) {
1252 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1253 .WillRepeatedly(Return(false));
1254 }
1255 EXPECT_EQ(QuicPacketNumber(10u), manager_.GetLeastUnacked());
1256}
1257
1258TEST_P(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
1259 // Send 1 crypto packet.
1260 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001261 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001262
1263 // Retransmit the crypto packet as 2.
1264 if (manager_.session_decides_what_to_write()) {
1265 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1266 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1267 }
1268 manager_.OnRetransmissionTimeout();
1269 if (!manager_.session_decides_what_to_write()) {
1270 RetransmitNextPacket(2);
1271 }
1272
1273 // Retransmit the crypto packet as 3.
1274 if (manager_.session_decides_what_to_write()) {
1275 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1276 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1277 }
1278 manager_.OnRetransmissionTimeout();
1279 if (!manager_.session_decides_what_to_write()) {
1280 RetransmitNextPacket(3);
1281 }
1282
1283 // Now ack the second crypto packet, and ensure the first gets removed, but
1284 // the third does not.
1285 uint64_t acked[] = {2};
1286 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1287 if (manager_.session_decides_what_to_write()) {
1288 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1289 .WillRepeatedly(Return(false));
1290 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
1291 }
1292 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1293 clock_.Now());
1294 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001295 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001296 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1297 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001298
ianswett0cc36802019-04-20 03:04:09 -07001299 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -07001300 if (GetQuicReloadableFlag(quic_loss_removes_from_inflight)) {
1301 uint64_t unacked[] = {1, 3};
1302 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1303 } else {
1304 uint64_t unacked[] = {3};
1305 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1306 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001307}
1308
1309TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
1310 // Send 2 crypto packets and 1 data packet.
1311 const size_t kNumSentCryptoPackets = 2;
1312 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1313 SendCryptoPacket(i);
1314 }
1315 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001316 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001317
1318 // Retransmit 2 crypto packets, but not the serialized packet.
1319 if (manager_.session_decides_what_to_write()) {
1320 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1321 .Times(2)
1322 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1323 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
1324 }
1325 manager_.OnRetransmissionTimeout();
1326 if (!manager_.session_decides_what_to_write()) {
1327 RetransmitNextPacket(4);
1328 RetransmitNextPacket(5);
1329 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1330 }
ianswett0cc36802019-04-20 03:04:09 -07001331 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001332}
1333
1334TEST_P(QuicSentPacketManagerTest,
1335 CryptoHandshakeRetransmissionThenRetransmitAll) {
1336 // Send 1 crypto packet.
1337 SendCryptoPacket(1);
1338
ianswett0cc36802019-04-20 03:04:09 -07001339 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001340
1341 // Retransmit the crypto packet as 2.
1342 if (manager_.session_decides_what_to_write()) {
1343 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1344 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1345 }
1346 manager_.OnRetransmissionTimeout();
1347 if (!manager_.session_decides_what_to_write()) {
1348 RetransmitNextPacket(2);
1349 }
1350 // Now retransmit all the unacked packets, which occurs when there is a
1351 // version negotiation.
1352 if (manager_.session_decides_what_to_write()) {
1353 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
1354 }
1355 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1356 if (manager_.session_decides_what_to_write()) {
1357 // Both packets 1 and 2 are unackable.
ianswette129b0c2019-04-20 00:27:00 -07001358 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(1)));
1359 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(2)));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001360 } else {
1361 // Packet 2 is useful because it does not get retransmitted and still has
1362 // retransmittable frames.
1363 uint64_t unacked[] = {1, 2};
1364 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1365 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1366 }
ianswett0cc36802019-04-20 03:04:09 -07001367 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001368 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001369}
1370
1371TEST_P(QuicSentPacketManagerTest,
1372 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1373 // Send 1 crypto packet.
1374 SendCryptoPacket(1);
1375
ianswett0cc36802019-04-20 03:04:09 -07001376 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001377
1378 // Retransmit the crypto packet as 2.
1379 if (manager_.session_decides_what_to_write()) {
1380 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1381 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1382 }
1383 manager_.OnRetransmissionTimeout();
1384 if (!manager_.session_decides_what_to_write()) {
1385 RetransmitNextPacket(2);
1386 }
ianswett0cc36802019-04-20 03:04:09 -07001387 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001388
1389 // Retransmit the crypto packet as 3.
1390 if (manager_.session_decides_what_to_write()) {
1391 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1392 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1393 }
1394 manager_.OnRetransmissionTimeout();
1395 if (!manager_.session_decides_what_to_write()) {
1396 RetransmitNextPacket(3);
1397 }
ianswett0cc36802019-04-20 03:04:09 -07001398 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001399
1400 // Now neuter all unacked unencrypted packets, which occurs when the
1401 // connection goes forward secure.
1402 manager_.NeuterUnencryptedPackets();
1403 if (manager_.session_decides_what_to_write()) {
1404 EXPECT_CALL(notifier_, HasUnackedCryptoData())
1405 .WillRepeatedly(Return(false));
1406 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
1407 }
ianswett0cc36802019-04-20 03:04:09 -07001408 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001409 uint64_t unacked[] = {1, 2, 3};
1410 VerifyUnackedPackets(unacked, QUIC_ARRAYSIZE(unacked));
1411 VerifyRetransmittablePackets(nullptr, 0);
1412 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett0cc36802019-04-20 03:04:09 -07001413 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001414 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001415
1416 // Ensure both packets get discarded when packet 2 is acked.
1417 uint64_t acked[] = {3};
1418 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
1419 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1420 clock_.Now());
1421 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001422 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001423 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1424 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001425 VerifyUnackedPackets(nullptr, 0);
1426 VerifyRetransmittablePackets(nullptr, 0);
1427}
1428
1429TEST_P(QuicSentPacketManagerTest, RetransmissionTimeout) {
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(2)
1443 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1444 RetransmitDataPacket(101, type);
1445 })))
1446 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1447 RetransmitDataPacket(102, type);
1448 })));
1449 }
1450 manager_.OnRetransmissionTimeout();
1451 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001452 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001453 } else {
1454 ASSERT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001455 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001456 RetransmitNextPacket(101);
1457 ASSERT_TRUE(manager_.HasPendingRetransmissions());
1458 RetransmitNextPacket(102);
1459 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1460 }
1461
1462 // Ack a retransmission.
1463 // Ensure no packets are lost.
1464 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1465 EXPECT_CALL(*send_algorithm_,
1466 OnCongestionEvent(true, _, _,
1467 Pointwise(PacketNumberEq(), {largest_acked}),
1468 /*lost_packets=*/IsEmpty()));
1469 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1470 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1471 // RTO's use loss detection instead of immediately declaring retransmitted
1472 // packets lost.
1473 for (int i = 1; i <= 99; ++i) {
1474 EXPECT_CALL(debug_delegate,
1475 OnPacketLoss(QuicPacketNumber(i), LOSS_RETRANSMISSION, _));
1476 }
1477 if (manager_.session_decides_what_to_write()) {
1478 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1479 // Packets [1, 99] are considered as lost, although stream frame in packet
1480 // 2 is not outstanding.
1481 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
1482 }
1483 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1484 clock_.Now());
1485 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001486 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001487 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1488 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001489}
1490
1491TEST_P(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
1492 // Set the 1RTO connection option.
1493 QuicConfig client_config;
1494 QuicTagVector options;
1495 options.push_back(k1RTO);
1496 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1497 client_config.SetConnectionOptionsToSend(options);
1498 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1499 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1500 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1501 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1502 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1503 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1504 manager_.SetFromConfig(client_config);
1505 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1506
1507 StrictMock<MockDebugDelegate> debug_delegate;
1508 manager_.SetDebugDelegate(&debug_delegate);
1509
1510 // Send 100 packets.
1511 const size_t kNumSentPackets = 100;
1512 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1513 SendDataPacket(i);
1514 }
1515
1516 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1517 if (manager_.session_decides_what_to_write()) {
1518 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1519 .Times(1)
1520 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1521 RetransmitDataPacket(101, type);
1522 })));
1523 }
1524 manager_.OnRetransmissionTimeout();
1525 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001526 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001527 } else {
1528 ASSERT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001529 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001530 RetransmitNextPacket(101);
1531 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1532 }
1533}
1534
1535TEST_P(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
1536 QuicConfig client_config;
1537 QuicTagVector options;
1538 options.push_back(kNRTO);
1539 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1540 client_config.SetConnectionOptionsToSend(options);
1541 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1542 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1543 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1544 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1545 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1546 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1547 manager_.SetFromConfig(client_config);
1548 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1549 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1550
1551 // Send 100 packets.
1552 const size_t kNumSentPackets = 100;
1553 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1554 SendDataPacket(i);
1555 }
1556
1557 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1558 if (manager_.session_decides_what_to_write()) {
1559 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1560 .Times(2)
1561 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1562 RetransmitDataPacket(101, type);
1563 })))
1564 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
1565 RetransmitDataPacket(102, type);
1566 })));
1567 }
1568 manager_.OnRetransmissionTimeout();
1569 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001570 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001571 } else {
1572 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001573 EXPECT_EQ(100 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001574 RetransmitNextPacket(101);
1575 RetransmitNextPacket(102);
1576 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1577 }
1578
1579 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1580 // This will include packets in the lost packet map.
1581 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1582 EXPECT_CALL(*send_algorithm_,
1583 OnCongestionEvent(true, _, _,
1584 Pointwise(PacketNumberEq(), {largest_acked}),
1585 /*lost_packets=*/Not(IsEmpty())));
1586 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1587 if (manager_.session_decides_what_to_write()) {
1588 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1589 // Packets [1, 99] are considered as lost, although stream frame in packet
1590 // 2 is not outstanding.
1591 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
1592 }
1593 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1594 clock_.Now());
1595 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001596 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001597 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1598 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001599}
1600
1601TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
1602 // Send 1 packet.
1603 SendDataPacket(1);
1604
1605 if (manager_.session_decides_what_to_write()) {
1606 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1607 .WillOnce(WithArgs<1>(Invoke(
1608 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
1609 }
1610 manager_.OnRetransmissionTimeout();
1611 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001612 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001613 } else {
1614 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001615 EXPECT_EQ(kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001616 RetransmitNextPacket(2);
1617 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1618 }
1619
1620 // Rto a second time.
1621 if (manager_.session_decides_what_to_write()) {
1622 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1623 .WillOnce(WithArgs<1>(Invoke(
1624 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1625 }
1626 manager_.OnRetransmissionTimeout();
1627 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001628 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001629 } else {
1630 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001631 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001632 RetransmitNextPacket(3);
1633 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1634 }
1635
1636 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1637 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1638 ExpectAck(2);
1639 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1640 clock_.Now());
1641 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001642 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001643 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1644 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001645
1646 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001647 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001648}
1649
1650TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
1651 // Send 1 packet.
1652 SendDataPacket(1);
1653
1654 if (manager_.session_decides_what_to_write()) {
1655 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1656 .WillOnce(WithArgs<1>(Invoke(
1657 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
1658 }
1659 manager_.OnRetransmissionTimeout();
1660 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001661 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001662 } else {
1663 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001664 EXPECT_EQ(kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001665 RetransmitNextPacket(2);
1666 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1667 }
1668
1669 // Rto a second time.
1670 if (manager_.session_decides_what_to_write()) {
1671 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1672 .WillOnce(WithArgs<1>(Invoke(
1673 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1674 }
1675 manager_.OnRetransmissionTimeout();
1676 if (manager_.session_decides_what_to_write()) {
ianswett9f459cb2019-04-21 06:39:59 -07001677 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001678 } else {
1679 EXPECT_TRUE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07001680 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001681 RetransmitNextPacket(3);
1682 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1683 }
1684
1685 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1686 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1687 ExpectAck(3);
1688 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1689 clock_.Now());
1690 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001691 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001692 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1693 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001694
1695 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001696 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001697}
1698
1699TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) {
1700 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1701}
1702
1703TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
1704 QuicTime crypto_packet_send_time = clock_.Now();
1705 SendCryptoPacket(1);
1706
1707 // Check the min.
1708 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1709 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1710 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1711 manager_.GetRetransmissionTime());
1712
1713 // Test with a standard smoothed RTT.
1714 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1715
1716 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1717 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1718 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1719
1720 // Retransmit the packet by invoking the retransmission timeout.
1721 clock_.AdvanceTime(1.5 * srtt);
1722 if (manager_.session_decides_what_to_write()) {
1723 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1724 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1725 // When session decides what to write, crypto_packet_send_time gets updated.
1726 crypto_packet_send_time = clock_.Now();
1727 }
1728 manager_.OnRetransmissionTimeout();
1729 if (!manager_.session_decides_what_to_write()) {
1730 RetransmitNextPacket(2);
1731 }
1732
1733 // The retransmission time should now be twice as far in the future.
1734 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1735 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1736
1737 // Retransmit the packet for the 2nd time.
1738 clock_.AdvanceTime(2 * 1.5 * srtt);
1739 if (manager_.session_decides_what_to_write()) {
1740 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1741 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1742 // When session decides what to write, crypto_packet_send_time gets updated.
1743 crypto_packet_send_time = clock_.Now();
1744 }
1745 manager_.OnRetransmissionTimeout();
1746 if (!manager_.session_decides_what_to_write()) {
1747 RetransmitNextPacket(3);
1748 }
1749
1750 // Verify exponential backoff of the retransmission timeout.
1751 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1752 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1753}
1754
1755TEST_P(QuicSentPacketManagerTest,
1756 GetConservativeTransmissionTimeCryptoHandshake) {
1757 QuicConfig config;
1758 QuicTagVector options;
1759 options.push_back(kCONH);
1760 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1761 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1762 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1763 manager_.SetFromConfig(config);
1764 // Calling SetFromConfig requires mocking out some send algorithm methods.
1765 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1766 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1767 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1768 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1769
1770 QuicTime crypto_packet_send_time = clock_.Now();
1771 SendCryptoPacket(1);
1772
1773 // Check the min.
1774 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1775 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1776 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1777 manager_.GetRetransmissionTime());
1778
1779 // Test with a standard smoothed RTT.
1780 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1781
1782 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1783 QuicTime expected_time = clock_.Now() + 2 * srtt;
1784 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1785
1786 // Retransmit the packet by invoking the retransmission timeout.
1787 clock_.AdvanceTime(2 * srtt);
1788 if (manager_.session_decides_what_to_write()) {
1789 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1790 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1791 crypto_packet_send_time = clock_.Now();
1792 }
1793 manager_.OnRetransmissionTimeout();
1794 if (!manager_.session_decides_what_to_write()) {
1795 RetransmitNextPacket(2);
1796 }
1797
1798 // The retransmission time should now be twice as far in the future.
1799 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1800 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1801}
1802
1803TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
1804 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1805 SendDataPacket(1);
1806 SendDataPacket(2);
1807
1808 // Check the min.
1809 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1810 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1811 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1812 manager_.GetRetransmissionTime());
1813
1814 // Test with a standard smoothed RTT.
1815 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1816 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1817 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1818 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1819 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1820
1821 // Retransmit the packet by invoking the retransmission timeout.
1822 clock_.AdvanceTime(expected_tlp_delay);
1823 manager_.OnRetransmissionTimeout();
1824 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1825 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1826 if (manager_.session_decides_what_to_write()) {
1827 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1828 .WillOnce(WithArgs<1>(Invoke(
1829 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1830 }
1831 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1832 if (!manager_.session_decides_what_to_write()) {
1833 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1834 RetransmitNextPacket(3);
1835 }
1836 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1837 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1838 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1839
1840 expected_time = clock_.Now() + expected_tlp_delay;
1841 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1842}
1843
zhongyi1b2f7832019-06-14 13:31:34 -07001844TEST_P(QuicSentPacketManagerTest, TLPRWithPendingStreamData) {
1845 if (!manager_.session_decides_what_to_write()) {
1846 return;
1847 }
1848
1849 QuicConfig config;
1850 QuicTagVector options;
1851
1852 options.push_back(kTLPR);
1853 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1854 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1855 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1856 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1857 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1858 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1859 .WillOnce(Return(10 * kDefaultTCPMSS));
1860 manager_.SetFromConfig(config);
1861 EXPECT_TRUE(
1862 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1863
1864 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1865
1866 SendDataPacket(1);
1867 SendDataPacket(2);
1868
1869 // Test with a standard smoothed RTT.
1870 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1871 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1872 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1873 // With pending stream data, TLPR is used.
1874 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1875 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(true));
1876
1877 EXPECT_EQ(expected_tlp_delay,
1878 manager_.GetRetransmissionTime() - clock_.Now());
1879
1880 // Retransmit the packet by invoking the retransmission timeout.
1881 clock_.AdvanceTime(expected_tlp_delay);
1882 manager_.OnRetransmissionTimeout();
1883 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1884 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1885 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1886 .WillOnce(WithArgs<1>(Invoke(
1887 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1888 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1889
1890 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1891 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1892 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1893
1894 // 2nd TLP.
1895 expected_tlp_delay = 2 * srtt;
1896 EXPECT_EQ(expected_tlp_delay,
1897 manager_.GetRetransmissionTime() - clock_.Now());
1898}
1899
1900TEST_P(QuicSentPacketManagerTest, TLPRWithoutPendingStreamData) {
1901 if (!manager_.session_decides_what_to_write()) {
1902 return;
1903 }
1904
1905 QuicConfig config;
1906 QuicTagVector options;
1907
1908 options.push_back(kTLPR);
1909 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1910 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1911 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1912 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1913 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1914 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1915 .WillOnce(Return(10 * kDefaultTCPMSS));
1916 manager_.SetFromConfig(config);
1917 EXPECT_TRUE(
1918 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1919 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1920
1921 SendPingPacket(1, ENCRYPTION_INITIAL);
1922 SendPingPacket(2, ENCRYPTION_INITIAL);
1923
1924 // Test with a standard smoothed RTT.
1925 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1926 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1927 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1928 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1929 if (GetQuicReloadableFlag(quic_ignore_tlpr_if_no_pending_stream_data)) {
1930 // With no pending stream data, TLPR is ignored.
1931 expected_tlp_delay = 2 * srtt;
1932 }
1933 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(false));
1934 EXPECT_EQ(expected_tlp_delay,
1935 manager_.GetRetransmissionTime() - clock_.Now());
1936
1937 // Retransmit the packet by invoking the retransmission timeout.
1938 clock_.AdvanceTime(expected_tlp_delay);
1939 manager_.OnRetransmissionTimeout();
1940 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
1941 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1942 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1943 .WillOnce(WithArgs<1>(Invoke(
1944 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1945 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1946 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1947 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
1948 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1949
1950 // 2nd TLP.
1951 expected_tlp_delay = 2 * srtt;
1952 EXPECT_EQ(expected_tlp_delay,
1953 manager_.GetRetransmissionTime() - clock_.Now());
1954}
1955
QUICHE teama6ef0a62019-03-07 20:34:33 -05001956TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
1957 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1958 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1959 QuicTime::Delta::Zero(), QuicTime::Zero());
1960
1961 SendDataPacket(1);
1962 SendDataPacket(2);
1963 SendDataPacket(3);
1964 SendDataPacket(4);
1965
1966 QuicTime::Delta expected_rto_delay =
1967 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1968 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1969 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1970
1971 // Retransmit the packet by invoking the retransmission timeout.
1972 clock_.AdvanceTime(expected_rto_delay);
1973 if (manager_.session_decides_what_to_write()) {
1974 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1975 .Times(2)
1976 .WillOnce(WithArgs<1>(Invoke(
1977 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1978 .WillOnce(WithArgs<1>(Invoke(
1979 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
1980 }
1981 manager_.OnRetransmissionTimeout();
1982 if (!manager_.session_decides_what_to_write()) {
1983 // All packets are still considered inflight.
ianswett9f459cb2019-04-21 06:39:59 -07001984 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001985 RetransmitNextPacket(5);
1986 RetransmitNextPacket(6);
1987 }
1988 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001989 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001990 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1991
1992 // The delay should double the second time.
1993 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1994 // Once we always base the timer on the right edge, leaving the older packets
1995 // in flight doesn't change the timeout.
1996 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1997
1998 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1999 // original value and OnRetransmissionTimeout is not called or reverted.
2000 ExpectAck(2);
2001 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2002 clock_.Now());
2003 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002004 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002005 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2006 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002007 EXPECT_FALSE(manager_.HasPendingRetransmissions());
ianswett9f459cb2019-04-21 06:39:59 -07002008 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002009
2010 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
2011 // and the TLP time. In production, there would always be two TLP's first.
2012 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
2013 // by the latest RTT sample of 500ms.
2014 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
2015 // Once we always base the timer on the right edge, leaving the older packets
2016 // in flight doesn't change the timeout.
2017 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
2018}
2019
2020TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
2021 SendDataPacket(1);
2022 // Provide a 1ms RTT sample.
2023 const_cast<RttStats*>(manager_.GetRttStats())
2024 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
2025 QuicTime::Zero());
2026 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
2027
2028 // If the delay is smaller than the min, ensure it exponentially backs off
2029 // from the min.
2030 for (int i = 0; i < 5; ++i) {
2031 EXPECT_EQ(delay,
2032 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2033 EXPECT_EQ(delay,
2034 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
2035 delay = delay + delay;
2036 if (manager_.session_decides_what_to_write()) {
2037 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2038 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
2039 RetransmitDataPacket(i + 2, type);
2040 })));
2041 }
2042 manager_.OnRetransmissionTimeout();
2043 if (!manager_.session_decides_what_to_write()) {
2044 RetransmitNextPacket(i + 2);
2045 }
2046 }
2047}
2048
2049TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
2050 SendDataPacket(1);
2051 // Provide a 60s RTT sample.
2052 const_cast<RttStats*>(manager_.GetRttStats())
2053 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
2054 QuicTime::Zero());
2055
2056 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
2057 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2058 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
2059 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2060}
2061
2062TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
2063 SendDataPacket(1);
2064 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
2065
2066 // Delay should back off exponentially.
2067 for (int i = 0; i < 5; ++i) {
2068 EXPECT_EQ(delay,
2069 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2070 EXPECT_EQ(delay,
2071 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
2072 delay = delay + delay;
2073 if (manager_.session_decides_what_to_write()) {
2074 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2075 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
2076 RetransmitDataPacket(i + 2, type);
2077 })));
2078 }
2079 manager_.OnRetransmissionTimeout();
2080 if (!manager_.session_decides_what_to_write()) {
2081 RetransmitNextPacket(i + 2);
2082 }
2083 }
2084}
2085
2086TEST_P(QuicSentPacketManagerTest, RetransmissionDelay) {
2087 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2088 const int64_t kRttMs = 250;
2089 const int64_t kDeviationMs = 5;
2090
2091 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
2092 QuicTime::Delta::Zero(), clock_.Now());
2093
2094 // Initial value is to set the median deviation to half of the initial rtt,
2095 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
2096 // is added which is the initial rtt.
2097 QuicTime::Delta expected_delay =
2098 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
2099 EXPECT_EQ(expected_delay,
2100 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2101 EXPECT_EQ(expected_delay,
2102 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2103
2104 for (int i = 0; i < 100; ++i) {
2105 // Run to make sure that we converge.
2106 rtt_stats->UpdateRtt(
2107 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
2108 QuicTime::Delta::Zero(), clock_.Now());
2109 rtt_stats->UpdateRtt(
2110 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
2111 QuicTime::Delta::Zero(), clock_.Now());
2112 }
2113 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
2114
2115 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
2116 EXPECT_NEAR(expected_delay.ToMilliseconds(),
2117 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
2118 .ToMilliseconds(),
2119 1);
2120 EXPECT_EQ(QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0),
2121 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
2122}
2123
2124TEST_P(QuicSentPacketManagerTest, GetLossDelay) {
2125 auto loss_algorithm = QuicMakeUnique<MockLossAlgorithm>();
2126 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
2127
2128 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
2129 .WillRepeatedly(Return(QuicTime::Zero()));
2130 SendDataPacket(1);
2131 SendDataPacket(2);
2132
2133 // Handle an ack which causes the loss algorithm to be evaluated and
2134 // set the loss timeout.
2135 ExpectAck(2);
2136 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2137 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2138 clock_.Now());
2139 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002140 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002141 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2142 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002143
2144 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
2145 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
2146 .WillRepeatedly(Return(timeout));
2147 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
2148
2149 // Fire the retransmission timeout and ensure the loss detection algorithm
2150 // is invoked.
2151 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2152 manager_.OnRetransmissionTimeout();
2153}
2154
2155TEST_P(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
2156 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
2157 ->GetLossDetectionType());
2158
2159 QuicConfig config;
2160 QuicTagVector options;
2161 options.push_back(kTIME);
2162 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2163 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2164 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2165 manager_.SetFromConfig(config);
2166
2167 EXPECT_EQ(kTime, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
2168 ->GetLossDetectionType());
2169}
2170
2171TEST_P(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
2172 QuicConfig config;
2173 QuicTagVector options;
2174
2175 options.push_back(kRENO);
2176 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2177 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2178 manager_.SetFromConfig(config);
2179 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2180 ->GetCongestionControlType());
2181
2182 options.clear();
2183 options.push_back(kTBBR);
2184 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2185 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2186 manager_.SetFromConfig(config);
2187 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2188 ->GetCongestionControlType());
2189
2190 options.clear();
2191 options.push_back(kBYTE);
2192 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2193 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2194 manager_.SetFromConfig(config);
2195 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2196 ->GetCongestionControlType());
2197 options.clear();
2198 options.push_back(kRENO);
2199 options.push_back(kBYTE);
2200 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2201 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2202 manager_.SetFromConfig(config);
2203 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2204 ->GetCongestionControlType());
2205}
2206
2207TEST_P(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
2208 QuicConfig config;
2209 QuicTagVector options;
2210
2211 // No change if the server receives client options.
2212 const SendAlgorithmInterface* mock_sender =
2213 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
2214 options.push_back(kRENO);
2215 config.SetClientConnectionOptions(options);
2216 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2217 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2218 manager_.SetFromConfig(config);
2219 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
2220
2221 // Change the congestion control on the client with client options.
2222 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2223 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2224 manager_.SetFromConfig(config);
2225 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2226 ->GetCongestionControlType());
2227
2228 options.clear();
2229 options.push_back(kTBBR);
2230 config.SetClientConnectionOptions(options);
2231 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2232 manager_.SetFromConfig(config);
2233 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2234 ->GetCongestionControlType());
2235
2236 options.clear();
2237 options.push_back(kBYTE);
2238 config.SetClientConnectionOptions(options);
2239 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2240 manager_.SetFromConfig(config);
2241 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2242 ->GetCongestionControlType());
2243
2244 options.clear();
2245 options.push_back(kRENO);
2246 options.push_back(kBYTE);
2247 config.SetClientConnectionOptions(options);
2248 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2249 manager_.SetFromConfig(config);
2250 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2251 ->GetCongestionControlType());
2252}
2253
QUICHE teama6ef0a62019-03-07 20:34:33 -05002254TEST_P(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
2255 QuicConfig config;
2256 QuicTagVector options;
2257
2258 options.push_back(kMAD2);
2259 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2260 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2261 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2262 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2263 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2264 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2265 .WillOnce(Return(10 * kDefaultTCPMSS));
2266 manager_.SetFromConfig(config);
2267 // Set the initial RTT to 1us.
2268 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2269 QuicTime::Delta::FromMicroseconds(1));
2270 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2271 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2272 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2273 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2274 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2275
ianswettdcc474e2019-08-06 08:22:38 -07002276 // Send two packets, and the TLP should be 2 us or 1ms.
2277 QuicTime::Delta expected_tlp_delay =
2278 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2279 ? QuicTime::Delta::FromMilliseconds(1)
2280 : QuicTime::Delta::FromMicroseconds(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002281 SendDataPacket(1);
2282 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002283 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002284 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002285 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002286 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2287}
2288
2289TEST_P(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
2290 QuicConfig client_config;
2291 QuicTagVector options;
2292
2293 options.push_back(kMAD2);
2294 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2295 client_config.SetConnectionOptionsToSend(options);
2296 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2297 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2298 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2299 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2300 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2301 .WillOnce(Return(10 * kDefaultTCPMSS));
2302 manager_.SetFromConfig(client_config);
2303 // Set the initial RTT to 1us.
2304 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2305 QuicTime::Delta::FromMicroseconds(1));
2306 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2307 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2308 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2309 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2310 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
ianswettdcc474e2019-08-06 08:22:38 -07002311 // Send two packets, and the TLP should be 2 us or 1ms.
2312 QuicTime::Delta expected_tlp_delay =
2313 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2314 ? QuicTime::Delta::FromMilliseconds(1)
2315 : QuicTime::Delta::FromMicroseconds(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002316 SendDataPacket(1);
2317 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002318 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002319 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002320 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002321 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2322}
2323
2324TEST_P(QuicSentPacketManagerTest, NegotiateIETFTLPFromOptionsAtServer) {
ianswettdcc474e2019-08-06 08:22:38 -07002325 if (GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)) {
2326 return;
2327 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002328 QuicConfig config;
2329 QuicTagVector options;
2330
2331 options.push_back(kMAD4);
2332 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2333 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2334 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2335 manager_.SetFromConfig(config);
2336 // Provide an RTT measurement of 100ms.
2337 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2338 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2339 QuicTime::Delta::Zero(), QuicTime::Zero());
2340 // Expect 1.5x * SRTT + 0ms MAD
2341 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2342 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2343 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2344 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2345 // Expect 1.5x * SRTT + 50ms MAD
2346 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150),
2347 QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero());
2348 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt());
2349 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2350 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2351 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2352 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2353}
2354
2355TEST_P(QuicSentPacketManagerTest, NegotiateIETFTLPFromOptionsAtClient) {
ianswettdcc474e2019-08-06 08:22:38 -07002356 if (GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)) {
2357 return;
2358 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002359 QuicConfig client_config;
2360 QuicTagVector options;
2361
2362 options.push_back(kMAD4);
2363 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2364 client_config.SetConnectionOptionsToSend(options);
2365 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2366 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2367 manager_.SetFromConfig(client_config);
2368 // Provide an RTT measurement of 100ms.
2369 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2370 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2371 QuicTime::Delta::Zero(), QuicTime::Zero());
2372 // Expect 1.5x * SRTT + 0ms MAD
2373 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2374 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2375 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
2376 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2377 // Expect 1.5x * SRTT + 50ms MAD
2378 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(150),
2379 QuicTime::Delta::FromMilliseconds(50), QuicTime::Zero());
2380 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt());
2381 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2382 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2383 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
2384 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2385}
2386
2387TEST_P(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
2388 QuicConfig config;
2389 QuicTagVector options;
2390
2391 options.push_back(kMAD3);
2392 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2393 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2394 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2395 manager_.SetFromConfig(config);
2396 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2397 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2398 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2399 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettdcc474e2019-08-06 08:22:38 -07002400 QuicTime::Delta expected_rto_delay =
2401 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2402 ? QuicTime::Delta::FromMilliseconds(1)
2403 : QuicTime::Delta::FromMicroseconds(1);
2404 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002405 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002406 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002407 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2408 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettdcc474e2019-08-06 08:22:38 -07002409 QuicTime::Delta expected_tlp_delay =
2410 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2411 ? QuicTime::Delta::FromMicroseconds(502)
2412 : QuicTime::Delta::FromMicroseconds(2);
2413 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002414 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002415 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002416 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2417}
2418
2419TEST_P(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
2420 QuicConfig client_config;
2421 QuicTagVector options;
2422
2423 options.push_back(kMAD3);
2424 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2425 client_config.SetConnectionOptionsToSend(options);
2426 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2427 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2428 manager_.SetFromConfig(client_config);
2429 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2430 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2431 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2432 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettdcc474e2019-08-06 08:22:38 -07002433 QuicTime::Delta expected_rto_delay =
2434 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2435 ? QuicTime::Delta::FromMilliseconds(1)
2436 : QuicTime::Delta::FromMicroseconds(1);
2437 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002438 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002439 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002440 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2441 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettdcc474e2019-08-06 08:22:38 -07002442 QuicTime::Delta expected_tlp_delay =
2443 GetQuicReloadableFlag(quic_sent_packet_manager_cleanup)
2444 ? QuicTime::Delta::FromMicroseconds(502)
2445 : QuicTime::Delta::FromMicroseconds(2);
2446 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002447 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002448 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002449 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2450}
2451
2452TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
2453 QuicConfig config;
2454 QuicTagVector options;
2455
2456 options.push_back(kNTLP);
2457 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2458 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2459 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2460 manager_.SetFromConfig(config);
2461 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2462}
2463
2464TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
2465 QuicConfig client_config;
2466 QuicTagVector options;
2467
2468 options.push_back(kNTLP);
2469 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2470 client_config.SetConnectionOptionsToSend(options);
2471 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2472 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2473 manager_.SetFromConfig(client_config);
2474 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2475}
2476
2477TEST_P(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
2478 QuicConfig config;
2479 QuicTagVector options;
2480
2481 options.push_back(k1TLP);
2482 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2483 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2484 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2485 manager_.SetFromConfig(config);
2486 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2487}
2488
2489TEST_P(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
2490 QuicConfig client_config;
2491 QuicTagVector options;
2492
2493 options.push_back(k1TLP);
2494 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2495 client_config.SetConnectionOptionsToSend(options);
2496 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2497 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2498 manager_.SetFromConfig(client_config);
2499 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2500}
2501
2502TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
2503 QuicConfig config;
2504 QuicTagVector options;
2505
2506 options.push_back(kTLPR);
2507 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2508 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2509 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2510 manager_.SetFromConfig(config);
2511 EXPECT_TRUE(
2512 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2513}
2514
2515TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
2516 QuicConfig client_config;
2517 QuicTagVector options;
2518
2519 options.push_back(kTLPR);
2520 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2521 client_config.SetConnectionOptionsToSend(options);
2522 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2523 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2524 manager_.SetFromConfig(client_config);
2525 EXPECT_TRUE(
2526 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2527}
2528
2529TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
2530 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2531 QuicConfig config;
2532 QuicTagVector options;
2533
2534 options.push_back(kNRTO);
2535 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2536 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2537 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2538 manager_.SetFromConfig(config);
2539 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2540}
2541
2542TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
2543 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2544 QuicConfig client_config;
2545 QuicTagVector options;
2546
2547 options.push_back(kNRTO);
2548 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2549 client_config.SetConnectionOptionsToSend(options);
2550 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2551 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2552 manager_.SetFromConfig(client_config);
2553 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2554}
2555
2556TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
2557 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2558 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2559
2560 QuicConfig config;
2561 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2562 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2563 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2564 manager_.SetFromConfig(config);
2565
2566 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2567 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2568}
2569
2570TEST_P(QuicSentPacketManagerTest, ResumeConnectionState) {
2571 // The sent packet manager should use the RTT from CachedNetworkParameters if
2572 // it is provided.
2573 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(1234);
2574 CachedNetworkParameters cached_network_params;
2575 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2576
2577 EXPECT_CALL(*send_algorithm_,
fayangf1b99dc2019-05-14 06:29:18 -07002578 AdjustNetworkParameters(QuicBandwidth::Zero(), kRtt, false));
fayangbe83ecd2019-04-26 13:58:09 -07002579 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2580 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002581 manager_.ResumeConnectionState(cached_network_params, false);
2582 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2583}
2584
2585TEST_P(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
2586 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2587 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2588 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2589 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2590
2591 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2592 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2593 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2594 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2595
2596 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
2597 manager_.OnConnectionMigration(IPV4_TO_IPV4_CHANGE);
2598
2599 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2600 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2601 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2602}
2603
2604TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
2605 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2606 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2607 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2608 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2609
2610 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2611 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2612 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2613 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2614
2615 manager_.OnConnectionMigration(IPV4_SUBNET_CHANGE);
2616
2617 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2618 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2619 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2620}
2621
2622TEST_P(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
2623 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2624 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2625 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2626 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2627
2628 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2629 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2630 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2631 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2632
2633 manager_.OnConnectionMigration(PORT_CHANGE);
2634
2635 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2636 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2637 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2638}
2639
2640TEST_P(QuicSentPacketManagerTest, PathMtuIncreased) {
2641 EXPECT_CALL(*send_algorithm_,
2642 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2643 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2644 nullptr, kDefaultLength + 100, false, false);
2645 manager_.OnPacketSent(&packet, QuicPacketNumber(), clock_.Now(),
2646 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
2647
2648 // Ack the large packet and expect the path MTU to increase.
2649 ExpectAck(1);
2650 EXPECT_CALL(*network_change_visitor_,
2651 OnPathMtuIncreased(kDefaultLength + 100));
2652 QuicAckFrame ack_frame = InitAckFrame(1);
2653 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2654 clock_.Now());
2655 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002656 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002657 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2658 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002659}
2660
2661TEST_P(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
2662 // Send packets 1 - 20.
2663 for (size_t i = 1; i <= 20; ++i) {
2664 SendDataPacket(i);
2665 }
2666 // Ack [5, 7), [10, 12), [15, 17).
2667 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2668 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
2669 ExpectAcksAndLosses(true, acked1, QUIC_ARRAYSIZE(acked1), lost1,
2670 QUIC_ARRAYSIZE(lost1));
2671 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2672 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2673 clock_.Now());
2674 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2675 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2676 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2677 // Make sure empty range does not harm.
2678 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002679 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002680 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2681 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002682
2683 // Ack [4, 8), [9, 13), [14, 21).
2684 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
2685 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
2686 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2687 clock_.Now());
2688 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2689 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2690 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002691 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002692 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2693 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002694}
2695
QUICHE team9929cc42019-03-13 08:17:43 -07002696TEST_P(QuicSentPacketManagerTest, TolerateReneging) {
QUICHE team9929cc42019-03-13 08:17:43 -07002697 // Send packets 1 - 20.
2698 for (size_t i = 1; i <= 20; ++i) {
2699 SendDataPacket(i);
2700 }
2701 // Ack [5, 7), [10, 12), [15, 17).
2702 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2703 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
2704 ExpectAcksAndLosses(true, acked1, QUIC_ARRAYSIZE(acked1), lost1,
2705 QUIC_ARRAYSIZE(lost1));
2706 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2707 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2708 clock_.Now());
2709 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2710 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2711 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002712 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002713 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2714 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002715
2716 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2717 uint64_t acked2[] = {4, 7, 9, 12};
2718 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), nullptr, 0);
2719 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2720 clock_.Now());
2721 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2722 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002723 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002724 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2725 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002726 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2727}
2728
QUICHE teamc279cec2019-03-22 06:51:48 -07002729TEST_P(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
QUICHE teamc279cec2019-03-22 06:51:48 -07002730 manager_.EnableMultiplePacketNumberSpacesSupport();
2731 EXPECT_FALSE(
2732 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL).IsInitialized());
2733 EXPECT_FALSE(
2734 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2735 // Send packet 1.
2736 SendDataPacket(1, ENCRYPTION_INITIAL);
2737 EXPECT_EQ(QuicPacketNumber(1),
2738 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2739 EXPECT_FALSE(
2740 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2741 // Ack packet 1.
2742 ExpectAck(1);
2743 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2744 clock_.Now());
2745 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002746 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002747 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2748 ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002749 EXPECT_EQ(QuicPacketNumber(1),
2750 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2751 EXPECT_FALSE(
2752 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2753 // Send packets 2 and 3.
2754 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2755 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2756 EXPECT_EQ(QuicPacketNumber(1),
2757 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2758 EXPECT_EQ(QuicPacketNumber(3),
2759 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2760 EXPECT_FALSE(
2761 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2762 // Ack packet 2.
2763 ExpectAck(2);
2764 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2765 clock_.Now());
2766 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002767 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002768 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2769 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002770 EXPECT_EQ(QuicPacketNumber(2),
2771 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2772 EXPECT_FALSE(
2773 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2774 // Ack packet 3.
2775 ExpectAck(3);
2776 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2777 clock_.Now());
2778 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002779 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002780 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2781 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002782 EXPECT_EQ(QuicPacketNumber(3),
2783 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2784 EXPECT_FALSE(
2785 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2786 // Send packets 4 and 5.
2787 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2788 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2789 EXPECT_EQ(QuicPacketNumber(1),
2790 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2791 EXPECT_EQ(QuicPacketNumber(3),
2792 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2793 EXPECT_EQ(QuicPacketNumber(5),
2794 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2795 EXPECT_EQ(QuicPacketNumber(5),
2796 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2797 // Ack packet 5.
2798 ExpectAck(5);
2799 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2800 clock_.Now());
2801 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002802 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002803 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2804 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002805 EXPECT_EQ(QuicPacketNumber(3),
2806 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2807 EXPECT_EQ(QuicPacketNumber(5),
2808 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2809 EXPECT_EQ(QuicPacketNumber(5),
2810 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2811
2812 // Send packets 6 - 8.
2813 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2814 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2815 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2816 EXPECT_EQ(QuicPacketNumber(1),
2817 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2818 EXPECT_EQ(QuicPacketNumber(3),
2819 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2820 EXPECT_EQ(QuicPacketNumber(8),
2821 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2822 EXPECT_EQ(QuicPacketNumber(8),
2823 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2824 // Ack all packets.
2825 uint64_t acked[] = {4, 6, 7, 8};
2826 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
2827 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2828 clock_.Now());
2829 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002830 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002831 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(5),
2832 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002833 EXPECT_EQ(QuicPacketNumber(3),
2834 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2835 EXPECT_EQ(QuicPacketNumber(8),
2836 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2837 EXPECT_EQ(QuicPacketNumber(8),
2838 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2839}
2840
fayang3eb82212019-04-16 12:05:46 -07002841TEST_P(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002842 manager_.EnableMultiplePacketNumberSpacesSupport();
2843 // Send packet 1.
2844 SendDataPacket(1, ENCRYPTION_INITIAL);
2845 // Send packets 2 and 3.
2846 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2847 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2848
2849 // ACK packets 2 and 3 in the wrong packet number space.
2850 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2851 clock_.Now());
2852 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2853 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002854 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2855 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002856}
2857
2858TEST_P(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
fayang3eb82212019-04-16 12:05:46 -07002859 manager_.EnableMultiplePacketNumberSpacesSupport();
2860 // Send packet 1.
2861 SendDataPacket(1, ENCRYPTION_INITIAL);
2862 // Send packets 2 and 3.
2863 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2864 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2865
2866 // ACK packet 1 in the wrong packet number space.
2867 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2868 clock_.Now());
2869 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2870 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002871 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2872 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002873}
2874
2875TEST_P(QuicSentPacketManagerTest,
2876 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002877 manager_.EnableMultiplePacketNumberSpacesSupport();
2878 // Send packet 1.
2879 SendDataPacket(1, ENCRYPTION_INITIAL);
2880 // Ack packet 1.
2881 ExpectAck(1);
2882 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2883 clock_.Now());
2884 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2885 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002886 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2887 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002888
2889 // Send packets 2 and 3.
2890 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2891 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2892
2893 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2894 // been acked in the correct packet number space, tolerate it.
2895 uint64_t acked[] = {2, 3};
2896 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
2897 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2898 clock_.Now());
2899 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2900 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002901 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2902 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002903}
2904
fayang06bb1b02019-06-14 14:07:12 -07002905// Regression test for b/133771183.
2906TEST_P(QuicSentPacketManagerTest, PacketInLimbo) {
2907 if (!manager_.session_decides_what_to_write()) {
2908 return;
2909 }
2910 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
2911 // Send SHLO.
2912 SendCryptoPacket(1);
2913 // Send data packet.
2914 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2915 // Send Ack Packet.
2916 SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE);
2917 // Retransmit SHLO.
2918 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2919 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }));
2920 manager_.OnRetransmissionTimeout();
2921
2922 // Successfully decrypt a forward secure packet.
2923 manager_.SetHandshakeConfirmed();
2924 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
2925 // Send Ack packet.
2926 SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE);
2927
2928 // Retransmission alarm fires.
2929 manager_.OnRetransmissionTimeout();
2930 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2931 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2932 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2933 })));
2934 manager_.MaybeRetransmitTailLossProbe();
2935
2936 // Received Ack of packets 1, 3 and 4.
2937 uint64_t acked[] = {1, 3, 4};
2938 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
2939 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2940 clock_.Now());
2941 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
2942 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2943 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002944 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2945 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002946
2947 uint64_t acked2[] = {5, 6};
2948 uint64_t loss[] = {2};
fayang897605d2019-08-21 13:26:45 -07002949 // Verify packet 2 is detected lost.
2950 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
2951 ExpectAcksAndLosses(true, acked2, QUIC_ARRAYSIZE(acked2), loss,
2952 QUIC_ARRAYSIZE(loss));
fayang06bb1b02019-06-14 14:07:12 -07002953 manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(),
2954 clock_.Now());
2955 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7));
2956 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002957 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2958 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002959}
2960
fayanga29eb242019-07-16 12:25:38 -07002961TEST_P(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) {
2962 if (!manager_.session_decides_what_to_write()) {
2963 return;
2964 }
2965 // Send 10 packets.
2966 for (size_t i = 1; i <= 10; ++i) {
2967 SendDataPacket(i);
2968 }
2969 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2970 .Times(2)
2971 .WillOnce(WithArgs<1>(Invoke(
2972 [this](TransmissionType type) { RetransmitDataPacket(11, type); })))
2973 .WillOnce(WithArgs<1>(Invoke(
2974 [this](TransmissionType type) { RetransmitDataPacket(12, type); })));
2975 manager_.OnRetransmissionTimeout();
2976 EXPECT_EQ(1u, stats_.rto_count);
2977 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2978
2979 // RTO fires again, but there is no packet to be RTO retransmitted.
2980 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
2981 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
2982 manager_.OnRetransmissionTimeout();
2983 EXPECT_EQ(2u, stats_.rto_count);
fayang67f82272019-08-14 16:08:45 -07002984 if (GetQuicReloadableFlag(quic_fix_rto_retransmission3)) {
fayanga29eb242019-07-16 12:25:38 -07002985 // Verify a credit is raised up.
2986 EXPECT_EQ(1u, manager_.pending_timer_transmission_count());
2987 } else {
2988 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2989 }
2990}
2991
fayangce0a3162019-08-15 09:05:36 -07002992TEST_P(QuicSentPacketManagerTest, ComputingProbeTimeout) {
2993 EnablePto(k2PTO);
2994 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2995 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2996 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2997 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2998 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2999 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3000 QuicTime::Delta::Zero(), QuicTime::Zero());
3001 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3002
3003 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3004 // Verify PTO is correctly set.
3005 QuicTime::Delta expected_pto_delay =
3006 srtt + 4 * rtt_stats->mean_deviation() +
3007 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3008 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3009 manager_.GetRetransmissionTime());
3010
3011 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3012 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3013 // Verify PTO is correctly set based on sent time of packet 2.
3014 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3015 manager_.GetRetransmissionTime());
3016 EXPECT_EQ(0u, stats_.pto_count);
3017
3018 // Invoke PTO.
3019 clock_.AdvanceTime(expected_pto_delay);
3020 manager_.OnRetransmissionTimeout();
3021 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3022 EXPECT_EQ(1u, stats_.pto_count);
3023
3024 // Verify two probe packets get sent.
3025 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3026 .Times(2)
3027 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3028 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3029 })))
3030 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3031 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3032 })));
3033 manager_.MaybeSendProbePackets();
3034 // Verify PTO period gets set to twice the current value.
3035 QuicTime sent_time = clock_.Now();
3036 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3037 manager_.GetRetransmissionTime());
3038
3039 // Received ACK for packets 1 and 2.
3040 uint64_t acked[] = {1, 2};
3041 ExpectAcksAndLosses(true, acked, QUIC_ARRAYSIZE(acked), nullptr, 0);
3042 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3043 clock_.Now());
3044 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3045 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3046 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3047 ENCRYPTION_FORWARD_SECURE));
3048 expected_pto_delay =
3049 rtt_stats->SmoothedOrInitialRtt() +
3050 std::max(4 * rtt_stats->mean_deviation(),
3051 QuicTime::Delta::FromMilliseconds(1)) +
3052 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3053
3054 // Verify PTO is correctly re-armed based on sent time of packet 4.
3055 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
3056}
3057
3058TEST_P(QuicSentPacketManagerTest, SendOneProbePacket) {
3059 EnablePto(k1PTO);
3060 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3061 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3062 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3063 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3064
3065 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3066 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3067 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3068
3069 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3070 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3071 QuicTime::Delta::Zero(), QuicTime::Zero());
3072 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3073 // Verify PTO period is correctly set.
3074 QuicTime::Delta expected_pto_delay =
3075 srtt + 4 * rtt_stats->mean_deviation() +
3076 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3077 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3078 manager_.GetRetransmissionTime());
3079
3080 // Invoke PTO.
3081 clock_.AdvanceTime(expected_pto_delay);
3082 manager_.OnRetransmissionTimeout();
3083 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3084
3085 // Verify one probe packet gets sent.
3086 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3087 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3088 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3089 })));
3090 manager_.MaybeSendProbePackets();
3091}
3092
QUICHE teama6ef0a62019-03-07 20:34:33 -05003093} // namespace
3094} // namespace test
3095} // namespace quic