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