blob: 97d83f579337126b6f77f690c21251de0c21e2d2 [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>
bnc463f2352019-10-10 04:49:34 -07008#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -05009
fayangd0907232020-06-02 12:56:48 -070010#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050012#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
13#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
14#include "net/third_party/quiche/src/quic/test_tools/quic_sent_packet_manager_peer.h"
15#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
bnc4e9283d2019-12-17 07:08:57 -080016#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h"
dmcardlecf0bfcf2019-12-13 08:08:21 -080017#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050018
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:
wub713afae2020-04-27 07:48:31 -070047 MOCK_METHOD(void,
48 OnSpuriousPacketRetransmission,
49 (TransmissionType transmission_type, QuicByteCount byte_size),
50 (override));
51 MOCK_METHOD(void,
52 OnPacketLoss,
53 (QuicPacketNumber lost_packet_number,
54 EncryptionLevel encryption_level,
55 TransmissionType transmission_type,
56 QuicTime detection_time),
57 (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050058};
59
fayangcff885a2019-10-22 07:39:04 -070060class QuicSentPacketManagerTest : public QuicTest {
QUICHE teama6ef0a62019-03-07 20:34:33 -050061 public:
62 void RetransmitCryptoPacket(uint64_t packet_number) {
63 EXPECT_CALL(
64 *send_algorithm_,
65 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
66 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
67 SerializedPacket packet(CreatePacket(packet_number, false));
68 packet.retransmittable_frames.push_back(
dmcardlecf0bfcf2019-12-13 08:08:21 -080069 QuicFrame(QuicStreamFrame(1, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -050070 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -070071 manager_.OnPacketSent(&packet, clock_.Now(), HANDSHAKE_RETRANSMISSION,
72 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050073 }
74
fayang06bb1b02019-06-14 14:07:12 -070075 void RetransmitDataPacket(uint64_t packet_number,
76 TransmissionType type,
77 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050078 EXPECT_CALL(
79 *send_algorithm_,
80 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
81 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
82 SerializedPacket packet(CreatePacket(packet_number, true));
fayang06bb1b02019-06-14 14:07:12 -070083 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -070084 manager_.OnPacketSent(&packet, clock_.Now(), type,
QUICHE teama6ef0a62019-03-07 20:34:33 -050085 HAS_RETRANSMITTABLE_DATA);
86 }
87
fayang06bb1b02019-06-14 14:07:12 -070088 void RetransmitDataPacket(uint64_t packet_number, TransmissionType type) {
89 RetransmitDataPacket(packet_number, type, ENCRYPTION_INITIAL);
90 }
91
QUICHE teama6ef0a62019-03-07 20:34:33 -050092 protected:
wub18773d62020-01-28 14:14:06 -080093 const CongestionControlType kInitialCongestionControlType = kCubicBytes;
QUICHE teama6ef0a62019-03-07 20:34:33 -050094 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070095 : manager_(Perspective::IS_SERVER,
96 &clock_,
97 QuicRandom::GetInstance(),
98 &stats_,
fayang3be090d2020-02-11 14:05:08 -080099 kInitialCongestionControlType),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500100 send_algorithm_(new StrictMock<MockSendAlgorithm>),
101 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
102 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
103 // Disable tail loss probes for most tests.
104 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
105 // Advance the time 1s so the send times are never QuicTime::Zero.
106 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
107 manager_.SetNetworkChangeVisitor(network_change_visitor_.get());
108 manager_.SetSessionNotifier(&notifier_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500109
wub18773d62020-01-28 14:14:06 -0800110 EXPECT_CALL(*send_algorithm_, GetCongestionControlType())
111 .WillRepeatedly(Return(kInitialCongestionControlType));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500112 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
113 .Times(AnyNumber())
114 .WillRepeatedly(Return(QuicBandwidth::Zero()));
115 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
116 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
wubf4ab9652020-02-20 14:45:43 -0800117 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(_)).Times(AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500118 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
119 .Times(AnyNumber());
120 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
121 EXPECT_CALL(notifier_, HasUnackedCryptoData())
122 .WillRepeatedly(Return(false));
123 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
QUICHE team9467db02019-05-30 09:38:45 -0700124 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500125 }
126
127 ~QuicSentPacketManagerTest() override {}
128
ianswett9f459cb2019-04-21 06:39:59 -0700129 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500130 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
131 if (num_packets == 0) {
132 EXPECT_TRUE(manager_.unacked_packets().empty());
133 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
134 &manager_));
135 return;
136 }
137
138 EXPECT_FALSE(manager_.unacked_packets().empty());
139 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
140 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700141 EXPECT_TRUE(
142 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500143 << packets[i];
144 }
145 }
146
147 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
148 EXPECT_EQ(
149 num_packets,
150 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
151 for (size_t i = 0; i < num_packets; ++i) {
152 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
153 &manager_, packets[i]))
154 << " packets[" << i << "]:" << packets[i];
155 }
156 }
157
158 void ExpectAck(uint64_t largest_observed) {
159 EXPECT_CALL(
160 *send_algorithm_,
161 // Ensure the AckedPacketVector argument contains largest_observed.
162 OnCongestionEvent(true, _, _,
163 Pointwise(PacketNumberEq(), {largest_observed}),
164 IsEmpty()));
165 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
166 }
167
dschinazi17d42422019-06-18 16:35:07 -0700168 void ExpectUpdatedRtt(uint64_t /*largest_observed*/) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500169 EXPECT_CALL(*send_algorithm_,
170 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
171 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
172 }
173
174 void ExpectAckAndLoss(bool rtt_updated,
175 uint64_t largest_observed,
176 uint64_t lost_packet) {
177 EXPECT_CALL(
178 *send_algorithm_,
179 OnCongestionEvent(rtt_updated, _, _,
180 Pointwise(PacketNumberEq(), {largest_observed}),
181 Pointwise(PacketNumberEq(), {lost_packet})));
182 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
183 }
184
185 // |packets_acked| and |packets_lost| should be in packet number order.
186 void ExpectAcksAndLosses(bool rtt_updated,
187 uint64_t* packets_acked,
188 size_t num_packets_acked,
189 uint64_t* packets_lost,
190 size_t num_packets_lost) {
191 std::vector<QuicPacketNumber> ack_vector;
192 for (size_t i = 0; i < num_packets_acked; ++i) {
193 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
194 }
195 std::vector<QuicPacketNumber> lost_vector;
196 for (size_t i = 0; i < num_packets_lost; ++i) {
197 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
198 }
199 EXPECT_CALL(*send_algorithm_,
200 OnCongestionEvent(rtt_updated, _, _,
201 Pointwise(PacketNumberEq(), ack_vector),
202 Pointwise(PacketNumberEq(), lost_vector)));
203 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
204 .Times(AnyNumber());
205 }
206
207 void RetransmitAndSendPacket(uint64_t old_packet_number,
208 uint64_t new_packet_number) {
209 RetransmitAndSendPacket(old_packet_number, new_packet_number,
210 TLP_RETRANSMISSION);
211 }
212
213 void RetransmitAndSendPacket(uint64_t old_packet_number,
214 uint64_t new_packet_number,
215 TransmissionType transmission_type) {
216 bool is_lost = false;
fayangcff885a2019-10-22 07:39:04 -0700217 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
218 transmission_type == TLP_RETRANSMISSION ||
219 transmission_type == RTO_RETRANSMISSION ||
220 transmission_type == PROBING_RETRANSMISSION) {
221 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
222 .WillOnce(WithArgs<1>(
223 Invoke([this, new_packet_number](TransmissionType type) {
224 RetransmitDataPacket(new_packet_number, type);
225 })));
226 } else {
227 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
228 is_lost = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 }
230 QuicSentPacketManagerPeer::MarkForRetransmission(
231 &manager_, old_packet_number, transmission_type);
fayangcff885a2019-10-22 07:39:04 -0700232 if (!is_lost) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233 return;
234 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 EXPECT_CALL(
236 *send_algorithm_,
237 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
238 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
fayangcff885a2019-10-22 07:39:04 -0700239 SerializedPacket packet(CreatePacket(new_packet_number, true));
240 manager_.OnPacketSent(&packet, clock_.Now(), transmission_type,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500241 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242 }
243
244 SerializedPacket CreateDataPacket(uint64_t packet_number) {
245 return CreatePacket(packet_number, true);
246 }
247
248 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
249 SerializedPacket packet(QuicPacketNumber(packet_number),
250 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
251 false, false);
252 if (retransmittable) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800253 packet.retransmittable_frames.push_back(QuicFrame(
254 QuicStreamFrame(kStreamId, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500255 }
256 return packet;
257 }
258
zhongyi1b2f7832019-06-14 13:31:34 -0700259 SerializedPacket CreatePingPacket(uint64_t packet_number) {
260 SerializedPacket packet(QuicPacketNumber(packet_number),
261 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
262 false, false);
263 packet.retransmittable_frames.push_back(QuicFrame(QuicPingFrame()));
264 return packet;
265 }
266
QUICHE teama6ef0a62019-03-07 20:34:33 -0500267 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700268 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
269 }
270
271 void SendDataPacket(uint64_t packet_number,
272 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500273 EXPECT_CALL(*send_algorithm_,
274 OnPacketSent(_, BytesInFlight(),
275 QuicPacketNumber(packet_number), _, _));
276 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700277 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700278 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
279 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500280 }
281
zhongyi1b2f7832019-06-14 13:31:34 -0700282 void SendPingPacket(uint64_t packet_number,
283 EncryptionLevel encryption_level) {
284 EXPECT_CALL(*send_algorithm_,
285 OnPacketSent(_, BytesInFlight(),
286 QuicPacketNumber(packet_number), _, _));
287 SerializedPacket packet(CreatePingPacket(packet_number));
288 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700289 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
290 HAS_RETRANSMITTABLE_DATA);
zhongyi1b2f7832019-06-14 13:31:34 -0700291 }
292
QUICHE teama6ef0a62019-03-07 20:34:33 -0500293 void SendCryptoPacket(uint64_t packet_number) {
294 EXPECT_CALL(
295 *send_algorithm_,
296 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
297 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
298 SerializedPacket packet(CreatePacket(packet_number, false));
299 packet.retransmittable_frames.push_back(
dmcardlecf0bfcf2019-12-13 08:08:21 -0800300 QuicFrame(QuicStreamFrame(1, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500301 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -0700302 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
303 HAS_RETRANSMITTABLE_DATA);
304 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500305 }
306
307 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
fayang06bb1b02019-06-14 14:07:12 -0700308 SendAckPacket(packet_number, largest_acked, ENCRYPTION_INITIAL);
309 }
310
311 void SendAckPacket(uint64_t packet_number,
312 uint64_t largest_acked,
313 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500314 EXPECT_CALL(
315 *send_algorithm_,
316 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
317 kDefaultLength, NO_RETRANSMITTABLE_DATA));
318 SerializedPacket packet(CreatePacket(packet_number, false));
319 packet.largest_acked = QuicPacketNumber(largest_acked);
fayang06bb1b02019-06-14 14:07:12 -0700320 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -0700321 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
322 NO_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500323 }
324
fayangce0a3162019-08-15 09:05:36 -0700325 void EnablePto(QuicTag tag) {
fayangce0a3162019-08-15 09:05:36 -0700326 QuicConfig config;
327 QuicTagVector options;
328 options.push_back(tag);
329 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
330 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
331 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
332 manager_.SetFromConfig(config);
fayang62f867a2019-08-22 12:05:01 -0700333 EXPECT_TRUE(manager_.pto_enabled());
fayangce0a3162019-08-15 09:05:36 -0700334 }
335
QUICHE teama6ef0a62019-03-07 20:34:33 -0500336 QuicSentPacketManager manager_;
337 MockClock clock_;
338 QuicConnectionStats stats_;
339 MockSendAlgorithm* send_algorithm_;
340 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
341 StrictMock<MockSessionNotifier> notifier_;
342};
343
fayangcff885a2019-10-22 07:39:04 -0700344TEST_F(QuicSentPacketManagerTest, IsUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500345 VerifyUnackedPackets(nullptr, 0);
346 SendDataPacket(1);
347
348 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800349 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500350 uint64_t retransmittable[] = {1};
351 VerifyRetransmittablePackets(retransmittable,
bnc4e9283d2019-12-17 07:08:57 -0800352 QUICHE_ARRAYSIZE(retransmittable));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500353}
354
fayangcff885a2019-10-22 07:39:04 -0700355TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500356 SendDataPacket(1);
357 RetransmitAndSendPacket(1, 2);
358
359 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
360 uint64_t unacked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800361 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700362 std::vector<uint64_t> retransmittable = {1, 2};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
364}
365
fayangcff885a2019-10-22 07:39:04 -0700366TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500367 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,
fayangf8e918b2019-07-16 13:03:16 -0700376 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
377 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700378 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500379 // Packet 1 is unacked, pending, but not retransmittable.
380 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800381 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700382 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500383 VerifyRetransmittablePackets(nullptr, 0);
384}
385
fayangcff885a2019-10-22 07:39:04 -0700386TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700388 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
389 .WillOnce(WithArgs<1>(Invoke(
390 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500391 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
392 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500393 // Ack 1.
394 ExpectAck(1);
395 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
396 clock_.Now());
397 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700398 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700399 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
400 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500401
fayangcff885a2019-10-22 07:39:04 -0700402 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
403 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800404 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700405 // We do not know packet 2 is a spurious retransmission until it gets acked.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500406 VerifyRetransmittablePackets(nullptr, 0);
407 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
408}
409
fayangcff885a2019-10-22 07:39:04 -0700410TEST_F(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700412 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500413 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
414 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500415
fayangcff885a2019-10-22 07:39:04 -0700416 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500417
418 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800419 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500420 VerifyRetransmittablePackets(nullptr, 0);
421 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
422}
423
fayangcff885a2019-10-22 07:39:04 -0700424TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 SendDataPacket(1);
426 RetransmitAndSendPacket(1, 2);
427 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
428 clock_.AdvanceTime(rtt);
429
430 // Ack 1 but not 2.
431 ExpectAck(1);
432 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
433 clock_.Now());
434 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700435 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700436 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
437 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700438 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500439 // 2 remains unacked, but no packets have retransmittable data.
440 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800441 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700442 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500443 VerifyRetransmittablePackets(nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -0700444 // Ack 2 causes 2 be considered as spurious retransmission.
445 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
446 ExpectAck(2);
447 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
448 clock_.Now());
449 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
450 EXPECT_EQ(PACKETS_NEWLY_ACKED,
451 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
452 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500453
454 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
455}
456
fayangcff885a2019-10-22 07:39:04 -0700457TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500458 SendDataPacket(1);
459 RetransmitAndSendPacket(1, 2);
460 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
461 clock_.AdvanceTime(rtt);
462
463 // First, ACK packet 1 which makes packet 2 non-retransmittable.
464 ExpectAck(1);
465 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
466 clock_.Now());
467 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700468 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700469 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
470 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500471
472 SendDataPacket(3);
473 SendDataPacket(4);
474 SendDataPacket(5);
475 clock_.AdvanceTime(rtt);
476
477 // Next, NACK packet 2 three times.
fayang3be090d2020-02-11 14:05:08 -0800478 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
479 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
480 ExpectAckAndLoss(true, 3, 2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500481 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
482 clock_.Now());
483 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
484 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700485 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700486 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
487 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500488
489 ExpectAck(4);
490 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
491 clock_.Now());
492 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
493 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700494 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700495 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
496 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500497
fayang3be090d2020-02-11 14:05:08 -0800498 ExpectAck(5);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500499 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
500 clock_.Now());
501 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
502 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700503 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700504 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
505 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506
fayangcff885a2019-10-22 07:39:04 -0700507 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800508 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700509 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500510 VerifyRetransmittablePackets(nullptr, 0);
511
512 // Verify that the retransmission alarm would not fire,
513 // since there is no retransmittable data outstanding.
514 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
515}
516
fayangcff885a2019-10-22 07:39:04 -0700517TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500518 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
519 SendDataPacket(1);
520 RetransmitAndSendPacket(1, 2);
521
522 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
523 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
524 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
525 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500526
527 // Ack 1 but not 2, before 2 is able to be sent.
528 // Since 1 has been retransmitted, it has already been lost, and so the
529 // send algorithm is not informed that it has been ACK'd.
530 ExpectUpdatedRtt(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500531 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
532 clock_.Now());
533 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700534 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700535 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
536 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500537
538 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
539 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800540 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700541 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500542 VerifyRetransmittablePackets(nullptr, 0);
543
544 // Verify that the retransmission alarm would not fire,
545 // since there is no retransmittable data outstanding.
546 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
547}
548
fayangcff885a2019-10-22 07:39:04 -0700549TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500550 StrictMock<MockDebugDelegate> debug_delegate;
fayangcff885a2019-10-22 07:39:04 -0700551 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION,
552 kDefaultLength))
553 .Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500554 manager_.SetDebugDelegate(&debug_delegate);
555
556 SendDataPacket(1);
557 RetransmitAndSendPacket(1, 2);
558 RetransmitAndSendPacket(2, 3);
559 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
560 clock_.AdvanceTime(rtt);
561
562 // Ack 1 but not 2 or 3.
563 ExpectAck(1);
564 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
565 clock_.Now());
566 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700567 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700568 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
569 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700570 // Frames in packets 2 and 3 are acked.
571 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
572 .Times(2)
573 .WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500574
575 // 2 and 3 remain unacked, but no packets have retransmittable data.
576 uint64_t unacked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -0800577 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700578 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500579 VerifyRetransmittablePackets(nullptr, 0);
580
581 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
582 SendDataPacket(4);
fayangcff885a2019-10-22 07:39:04 -0700583 // No new data gets acked in packet 3.
584 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
585 .WillOnce(Return(false))
586 .WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500587 uint64_t acked[] = {3, 4};
bnc4e9283d2019-12-17 07:08:57 -0800588 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500589 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
590 clock_.Now());
591 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
592 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700593 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700594 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
595 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500596
597 uint64_t unacked2[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800598 VerifyUnackedPackets(unacked2, QUICHE_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700599 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500600
601 SendDataPacket(5);
602 ExpectAckAndLoss(true, 5, 2);
603 EXPECT_CALL(debug_delegate,
vasilvv923b6d22020-03-23 11:17:58 -0700604 OnPacketLoss(QuicPacketNumber(2), _, LOSS_RETRANSMISSION, _));
fayangcff885a2019-10-22 07:39:04 -0700605 // Frames in all packets are acked.
606 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
607 // Notify session that stream frame in packet 2 gets lost although it is
608 // not outstanding.
609 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500610 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
611 clock_.Now());
612 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
613 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700614 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700615 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
616 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500617
fayangcff885a2019-10-22 07:39:04 -0700618 uint64_t unacked3[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800619 VerifyUnackedPackets(unacked3, QUICHE_ARRAYSIZE(unacked3));
ianswett67d7a3c2019-04-19 10:58:47 -0700620 EXPECT_FALSE(manager_.HasInFlightPackets());
fayangcff885a2019-10-22 07:39:04 -0700621 // Spurious retransmission is detected when packet 3 gets acked. We cannot
622 // know packet 2 is a spurious until it gets acked.
623 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
wube330aa42020-02-27 07:49:09 -0800624 EXPECT_EQ(1u, stats_.packets_lost);
wub050d2d42020-06-22 14:45:27 -0700625 EXPECT_LT(0.0, stats_.total_loss_detection_response_time);
wubaa51f0e2020-05-12 15:08:16 -0700626 EXPECT_LE(1u, stats_.sent_packets_max_sequence_reordering);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500627}
628
fayangcff885a2019-10-22 07:39:04 -0700629TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
vasilvv0fc587f2019-09-06 13:33:08 -0700630 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500631 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
632
633 SendDataPacket(1);
634 RetransmitAndSendPacket(1, 2);
635
636 // Ack original transmission, but that wasn't lost via fast retransmit,
637 // so no call on OnSpuriousRetransmission is expected.
638 {
639 ExpectAck(1);
640 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
641 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
642 clock_.Now());
643 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700644 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700645 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
646 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500647 }
648
649 SendDataPacket(3);
650 SendDataPacket(4);
651 // Ack 4, which causes 3 to be retransmitted.
652 {
653 ExpectAck(4);
654 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
655 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
656 clock_.Now());
657 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
658 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700659 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700660 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
661 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500662 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
663 }
664
665 // Ack 3, which causes SpuriousRetransmitDetected to be called.
666 {
667 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800668 ExpectAcksAndLosses(false, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500669 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
fayangcc4ea6a2019-10-25 08:44:03 -0700670 EXPECT_CALL(*loss_algorithm,
671 SpuriousLossDetected(_, _, _, QuicPacketNumber(3),
672 QuicPacketNumber(4)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500673 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
674 clock_.Now());
675 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
676 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
wub02831dc2020-02-28 12:00:54 -0800677 EXPECT_EQ(0u, stats_.packet_spuriously_detected_lost);
fayang3eb82212019-04-16 12:05:46 -0700678 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700679 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
680 ENCRYPTION_INITIAL));
wub02831dc2020-02-28 12:00:54 -0800681 EXPECT_EQ(1u, stats_.packet_spuriously_detected_lost);
fayangcff885a2019-10-22 07:39:04 -0700682 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
683 // 5 will cause 5 be considered as a spurious retransmission as no new
684 // data gets acked.
685 ExpectAck(5);
686 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
687 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
688 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
689 clock_.Now());
690 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
691 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
692 EXPECT_EQ(PACKETS_NEWLY_ACKED,
693 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
694 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500695 }
696}
697
fayangcff885a2019-10-22 07:39:04 -0700698TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500699 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
700}
701
fayangcff885a2019-10-22 07:39:04 -0700702TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500703 SendDataPacket(1);
704 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
705}
706
fayangcff885a2019-10-22 07:39:04 -0700707TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500708 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
709 SendDataPacket(1);
710 SendAckPacket(2, 1);
711
712 // Now ack the ack and expect an RTT update.
713 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800714 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500715 manager_.OnAckFrameStart(QuicPacketNumber(2),
716 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
717 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700718 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700719 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
720 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500721 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
722
723 SendAckPacket(3, 3);
724
725 // Now ack the ack and expect only an RTT update.
726 uint64_t acked2[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800727 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500728 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
729 clock_.Now());
730 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700731 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700732 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
733 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500734 EXPECT_EQ(QuicPacketNumber(3u),
735 manager_.largest_packet_peer_knows_is_acked());
736}
737
fayangcff885a2019-10-22 07:39:04 -0700738TEST_F(QuicSentPacketManagerTest, Rtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500739 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
740 SendDataPacket(1);
741 clock_.AdvanceTime(expected_rtt);
742
743 ExpectAck(1);
744 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
745 clock_.Now());
746 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700747 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700748 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
749 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500750 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
751}
752
fayangcff885a2019-10-22 07:39:04 -0700753TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500754 // Expect that the RTT is equal to the local time elapsed, since the
755 // ack_delay_time is larger than the local time elapsed
756 // and is hence invalid.
757 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
758 SendDataPacket(1);
759 clock_.AdvanceTime(expected_rtt);
760
761 ExpectAck(1);
762 manager_.OnAckFrameStart(QuicPacketNumber(1),
763 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
764 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700765 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700766 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
767 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500768 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
769}
770
fayangcff885a2019-10-22 07:39:04 -0700771TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500772 // Expect that the RTT is equal to the local time elapsed, since the
773 // ack_delay_time is infinite, and is hence invalid.
774 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
775 SendDataPacket(1);
776 clock_.AdvanceTime(expected_rtt);
777
778 ExpectAck(1);
779 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
780 clock_.Now());
781 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700782 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700783 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
784 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500785 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
786}
787
wub8ee29a02019-12-12 13:06:48 -0800788TEST_F(QuicSentPacketManagerTest, RttWithDeltaExceedingLimit) {
789 // Initialize min and smoothed rtt to 10ms.
790 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
791 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
792 QuicTime::Delta::Zero(), QuicTime::Zero());
793
794 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(100);
795 QuicTime::Delta ack_delay =
796 QuicTime::Delta::FromMilliseconds(5) + manager_.peer_max_ack_delay();
797 ASSERT_GT(send_delta - rtt_stats->min_rtt(), ack_delay);
798 SendDataPacket(1);
799 clock_.AdvanceTime(send_delta);
800
801 ExpectAck(1);
802 manager_.OnAckFrameStart(QuicPacketNumber(1), ack_delay, clock_.Now());
803 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
804 EXPECT_EQ(PACKETS_NEWLY_ACKED,
805 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
806 ENCRYPTION_FORWARD_SECURE));
807
808 QuicTime::Delta expected_rtt_sample =
wub81c9b662020-02-14 09:08:07 -0800809 send_delta - manager_.peer_max_ack_delay();
wub8ee29a02019-12-12 13:06:48 -0800810 EXPECT_EQ(expected_rtt_sample, manager_.GetRttStats()->latest_rtt());
811}
812
fayangcff885a2019-10-22 07:39:04 -0700813TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500814 // Expect that the RTT is the time between send and receive since the
815 // ack_delay_time is zero.
816 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
817 SendDataPacket(1);
818 clock_.AdvanceTime(expected_rtt);
819
820 ExpectAck(1);
821 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
822 clock_.Now());
823 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700824 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700825 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
826 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500827 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
828}
829
fayangcff885a2019-10-22 07:39:04 -0700830TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
fayang5d011982020-05-13 14:14:38 -0700831 if (GetQuicReloadableFlag(quic_default_on_pto)) {
832 return;
833 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500834 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
835
836 // Send 1 packet.
837 SendDataPacket(1);
838
839 // The first tail loss probe retransmits 1 packet.
840 manager_.OnRetransmissionTimeout();
841 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700842 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
843 .WillOnce(WithArgs<1>(Invoke(
844 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500845 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500846
847 // The second tail loss probe retransmits 1 packet.
848 manager_.OnRetransmissionTimeout();
849 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700850 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
851 .WillOnce(WithArgs<1>(Invoke(
852 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500853 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500854 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
855 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856
857 // Ack the third and ensure the first two are still pending.
858 ExpectAck(3);
859
860 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
861 clock_.Now());
862 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700863 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700864 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
865 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500866
ianswett67d7a3c2019-04-19 10:58:47 -0700867 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500868
869 // Acking two more packets will lose both of them due to nacks.
870 SendDataPacket(4);
871 SendDataPacket(5);
872 uint64_t acked[] = {4, 5};
873 uint64_t lost[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800874 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
875 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -0700876 // Frames in all packets are acked.
877 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
878 // Notify session that stream frame in packets 1 and 2 get lost although
879 // they are not outstanding.
880 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500881 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
882 clock_.Now());
883 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700884 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700885 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
886 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500887
ianswett67d7a3c2019-04-19 10:58:47 -0700888 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500889 EXPECT_EQ(2u, stats_.tlp_count);
890 EXPECT_EQ(0u, stats_.rto_count);
891}
892
fayangcff885a2019-10-22 07:39:04 -0700893TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
fayang5d011982020-05-13 14:14:38 -0700894 if (GetQuicReloadableFlag(quic_default_on_pto)) {
895 return;
896 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500897 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
898
899 // Send 100 packets.
900 const size_t kNumSentPackets = 100;
901 for (size_t i = 1; i <= kNumSentPackets; ++i) {
902 SendDataPacket(i);
903 }
904 QuicTime rto_packet_time = clock_.Now();
905 // Advance the time.
906 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
907
908 // The first tail loss probe retransmits 1 packet.
909 manager_.OnRetransmissionTimeout();
910 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700911 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
912 .WillOnce(WithArgs<1>(Invoke(
913 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500914 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500915 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
916 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500917 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
918
919 // The second tail loss probe retransmits 1 packet.
920 manager_.OnRetransmissionTimeout();
921 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700922 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
923 .WillOnce(WithArgs<1>(Invoke(
924 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500925 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500926 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
927 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
928
929 // Ensure the RTO is set based on the correct packet.
930 rto_packet_time = clock_.Now();
931 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
932 manager_.GetRetransmissionTime());
933
934 // Advance the time enough to ensure all packets are RTO'd.
935 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
936
fayangcff885a2019-10-22 07:39:04 -0700937 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
938 .Times(2)
939 .WillOnce(WithArgs<1>(Invoke(
940 [this](TransmissionType type) { RetransmitDataPacket(103, type); })))
941 .WillOnce(WithArgs<1>(Invoke(
942 [this](TransmissionType type) { RetransmitDataPacket(104, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500943 manager_.OnRetransmissionTimeout();
944 EXPECT_EQ(2u, stats_.tlp_count);
945 EXPECT_EQ(1u, stats_.rto_count);
fayang2a379bf2020-05-18 11:49:25 -0700946 EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress);
fayangcff885a2019-10-22 07:39:04 -0700947 // There are 2 RTO retransmissions.
948 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500949 QuicPacketNumber largest_acked = QuicPacketNumber(103);
950 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
951 EXPECT_CALL(*send_algorithm_,
952 OnCongestionEvent(
953 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
954 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -0700955 // Although frames in packet 3 gets acked, it would be kept for another
956 // RTT.
957 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
958 // Packets [1, 102] are lost, although stream frame in packet 3 is not
959 // outstanding.
960 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500961 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
962 clock_.Now());
963 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -0700964 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700965 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
966 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500967 // All packets before 103 should be lost.
fayangcff885a2019-10-22 07:39:04 -0700968 // Packet 104 is still in flight.
969 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
fayang2a379bf2020-05-18 11:49:25 -0700970 EXPECT_EQ(1u, stats_.max_consecutive_rto_with_forward_progress);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971}
972
fayangcff885a2019-10-22 07:39:04 -0700973TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500974 // Send 2 crypto packets and 3 data packets.
975 const size_t kNumSentCryptoPackets = 2;
976 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
977 SendCryptoPacket(i);
978 }
979 const size_t kNumSentDataPackets = 3;
980 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
981 SendDataPacket(kNumSentCryptoPackets + i);
982 }
ianswett0cc36802019-04-20 03:04:09 -0700983 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -0700984 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500985
986 // The first retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700987 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
988 .Times(2)
989 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
990 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500991 manager_.OnRetransmissionTimeout();
ianswett898306b2019-04-23 11:05:57 -0700992 // Expect all 4 handshake packets to be in flight and 3 data packets.
ianswett04004652019-09-03 18:46:57 -0700993 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -0700994 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500995
996 // The second retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700997 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
998 .Times(2)
999 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
1000 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001001 manager_.OnRetransmissionTimeout();
ianswett04004652019-09-03 18:46:57 -07001002 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -07001003 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001004
1005 // Now ack the two crypto packets and the speculatively encrypted request,
1006 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett04004652019-09-03 18:46:57 -07001007 // Crypto packets remain in flight, so any that aren't acked will be lost.
1008 uint64_t acked[] = {3, 4, 5, 8, 9};
1009 uint64_t lost[] = {1, 2, 6};
bnc4e9283d2019-12-17 07:08:57 -08001010 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
1011 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -07001012 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
1013 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001014 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1015 clock_.Now());
1016 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1017 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001018 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001019 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1020 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001021
ianswett0cc36802019-04-20 03:04:09 -07001022 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001023}
1024
fayangcff885a2019-10-22 07:39:04 -07001025TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001026 // Send 1 crypto packet.
1027 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001028 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001029
1030 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001031 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1032 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001033 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001034
1035 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001036 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1037 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001038 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001039
1040 // Now ack the second crypto packet, and ensure the first gets removed, but
1041 // the third does not.
1042 uint64_t acked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -08001043 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -07001044 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1045 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001046 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1047 clock_.Now());
1048 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001049 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001050 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1051 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001052
ianswett0cc36802019-04-20 03:04:09 -07001053 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett04004652019-09-03 18:46:57 -07001054 uint64_t unacked[] = {1, 3};
bnc4e9283d2019-12-17 07:08:57 -08001055 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001056}
1057
fayangcff885a2019-10-22 07:39:04 -07001058TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001059 // Send 2 crypto packets and 1 data packet.
1060 const size_t kNumSentCryptoPackets = 2;
1061 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1062 SendCryptoPacket(i);
1063 }
1064 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001065 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001066
1067 // Retransmit 2 crypto packets, but not the serialized packet.
fayangcff885a2019-10-22 07:39:04 -07001068 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1069 .Times(2)
1070 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1071 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001072 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001073 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001074}
1075
fayangcff885a2019-10-22 07:39:04 -07001076TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001077 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1078 // Send 1 crypto packet.
1079 SendCryptoPacket(1);
1080
ianswett0cc36802019-04-20 03:04:09 -07001081 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001082
1083 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001084 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1085 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001086 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001087 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001088
1089 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001090 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1091 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001092 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001093 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001094
1095 // Now neuter all unacked unencrypted packets, which occurs when the
1096 // connection goes forward secure.
fayangcff885a2019-10-22 07:39:04 -07001097 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1098 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
fayang93c83942019-11-07 10:41:16 -08001099 manager_.NeuterUnencryptedPackets();
ianswett0cc36802019-04-20 03:04:09 -07001100 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001101 uint64_t unacked[] = {1, 2, 3};
bnc4e9283d2019-12-17 07:08:57 -08001102 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001103 VerifyRetransmittablePackets(nullptr, 0);
ianswett0cc36802019-04-20 03:04:09 -07001104 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001105 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001106
1107 // Ensure both packets get discarded when packet 2 is acked.
1108 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -08001109 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001110 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1111 clock_.Now());
1112 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001113 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001114 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1115 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001116 VerifyUnackedPackets(nullptr, 0);
1117 VerifyRetransmittablePackets(nullptr, 0);
1118}
1119
fayangcff885a2019-10-22 07:39:04 -07001120TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
fayang5d011982020-05-13 14:14:38 -07001121 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1122 return;
1123 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001124 StrictMock<MockDebugDelegate> debug_delegate;
1125 manager_.SetDebugDelegate(&debug_delegate);
1126
1127 // Send 100 packets.
1128 const size_t kNumSentPackets = 100;
1129 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1130 SendDataPacket(i);
1131 }
1132
1133 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001134 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1135 .Times(2)
1136 .WillOnce(WithArgs<1>(Invoke(
1137 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1138 .WillOnce(WithArgs<1>(Invoke(
1139 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001140 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001141 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001142
1143 // Ack a retransmission.
1144 // Ensure no packets are lost.
1145 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1146 EXPECT_CALL(*send_algorithm_,
1147 OnCongestionEvent(true, _, _,
1148 Pointwise(PacketNumberEq(), {largest_acked}),
1149 /*lost_packets=*/IsEmpty()));
1150 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1151 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1152 // RTO's use loss detection instead of immediately declaring retransmitted
1153 // packets lost.
1154 for (int i = 1; i <= 99; ++i) {
1155 EXPECT_CALL(debug_delegate,
vasilvv923b6d22020-03-23 11:17:58 -07001156 OnPacketLoss(QuicPacketNumber(i), _, LOSS_RETRANSMISSION, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001157 }
fayangcff885a2019-10-22 07:39:04 -07001158 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1159 // Packets [1, 99] are considered as lost, although stream frame in packet
1160 // 2 is not outstanding.
1161 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001162 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1163 clock_.Now());
1164 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001165 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001166 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1167 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001168}
1169
fayangcff885a2019-10-22 07:39:04 -07001170TEST_F(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
fayang5d011982020-05-13 14:14:38 -07001171 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1172 return;
1173 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001174 // Set the 1RTO connection option.
1175 QuicConfig client_config;
1176 QuicTagVector options;
1177 options.push_back(k1RTO);
1178 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1179 client_config.SetConnectionOptionsToSend(options);
1180 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1181 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1182 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1183 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1184 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1185 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1186 manager_.SetFromConfig(client_config);
1187 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1188
1189 StrictMock<MockDebugDelegate> debug_delegate;
1190 manager_.SetDebugDelegate(&debug_delegate);
1191
1192 // Send 100 packets.
1193 const size_t kNumSentPackets = 100;
1194 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1195 SendDataPacket(i);
1196 }
1197
1198 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001199 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1200 .Times(1)
1201 .WillOnce(WithArgs<1>(Invoke(
1202 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001203 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001204 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001205}
1206
fayangcff885a2019-10-22 07:39:04 -07001207TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
fayang5d011982020-05-13 14:14:38 -07001208 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1209 return;
1210 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001211 QuicConfig client_config;
1212 QuicTagVector options;
1213 options.push_back(kNRTO);
1214 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1215 client_config.SetConnectionOptionsToSend(options);
1216 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1217 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1218 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1219 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1220 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1221 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1222 manager_.SetFromConfig(client_config);
1223 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1224 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1225
1226 // Send 100 packets.
1227 const size_t kNumSentPackets = 100;
1228 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1229 SendDataPacket(i);
1230 }
1231
1232 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001233 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1234 .Times(2)
1235 .WillOnce(WithArgs<1>(Invoke(
1236 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1237 .WillOnce(WithArgs<1>(Invoke(
1238 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001239 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001240 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001241
1242 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1243 // This will include packets in the lost packet map.
1244 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1245 EXPECT_CALL(*send_algorithm_,
1246 OnCongestionEvent(true, _, _,
1247 Pointwise(PacketNumberEq(), {largest_acked}),
1248 /*lost_packets=*/Not(IsEmpty())));
1249 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -07001250 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1251 // Packets [1, 99] are considered as lost, although stream frame in packet
1252 // 2 is not outstanding.
1253 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001254 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1255 clock_.Now());
1256 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001257 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001258 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1259 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001260}
1261
fayangcff885a2019-10-22 07:39:04 -07001262TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
fayang5d011982020-05-13 14:14:38 -07001263 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1264 return;
1265 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001266 // Send 1 packet.
1267 SendDataPacket(1);
1268
fayangcff885a2019-10-22 07:39:04 -07001269 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1270 .WillOnce(WithArgs<1>(Invoke(
1271 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001272 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001273 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001274
1275 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001276 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1277 .WillOnce(WithArgs<1>(Invoke(
1278 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001279 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001280 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001281
1282 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1283 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1284 ExpectAck(2);
1285 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1286 clock_.Now());
1287 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001288 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001289 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1290 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001291
1292 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001293 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001294}
1295
fayangcff885a2019-10-22 07:39:04 -07001296TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
fayang5d011982020-05-13 14:14:38 -07001297 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1298 return;
1299 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001300 // Send 1 packet.
1301 SendDataPacket(1);
1302
fayangcff885a2019-10-22 07:39:04 -07001303 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1304 .WillOnce(WithArgs<1>(Invoke(
1305 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001306 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001307 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001308
1309 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001310 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1311 .WillOnce(WithArgs<1>(Invoke(
1312 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001313 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001314 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001315
1316 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1317 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1318 ExpectAck(3);
1319 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1320 clock_.Now());
1321 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001322 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001323 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1324 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001325
1326 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001327 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001328}
1329
fayangcff885a2019-10-22 07:39:04 -07001330TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001331 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1332}
1333
fayangcff885a2019-10-22 07:39:04 -07001334TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001335 QuicTime crypto_packet_send_time = clock_.Now();
1336 SendCryptoPacket(1);
1337
1338 // Check the min.
1339 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1340 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1341 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1342 manager_.GetRetransmissionTime());
1343
1344 // Test with a standard smoothed RTT.
1345 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1346
1347 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1348 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1349 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1350
1351 // Retransmit the packet by invoking the retransmission timeout.
1352 clock_.AdvanceTime(1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001353 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1354 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1355 // When session decides what to write, crypto_packet_send_time gets updated.
1356 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001357 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001358
1359 // The retransmission time should now be twice as far in the future.
1360 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1361 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1362
1363 // Retransmit the packet for the 2nd time.
1364 clock_.AdvanceTime(2 * 1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001365 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1366 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1367 // When session decides what to write, crypto_packet_send_time gets updated.
1368 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001369 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370
1371 // Verify exponential backoff of the retransmission timeout.
1372 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1373 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1374}
1375
fayangcff885a2019-10-22 07:39:04 -07001376TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001377 GetConservativeTransmissionTimeCryptoHandshake) {
1378 QuicConfig config;
1379 QuicTagVector options;
1380 options.push_back(kCONH);
1381 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1382 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1383 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1384 manager_.SetFromConfig(config);
1385 // Calling SetFromConfig requires mocking out some send algorithm methods.
1386 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1387 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1388 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1389 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1390
1391 QuicTime crypto_packet_send_time = clock_.Now();
1392 SendCryptoPacket(1);
1393
1394 // Check the min.
1395 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1396 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1397 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1398 manager_.GetRetransmissionTime());
1399
1400 // Test with a standard smoothed RTT.
1401 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1402
1403 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1404 QuicTime expected_time = clock_.Now() + 2 * srtt;
1405 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1406
1407 // Retransmit the packet by invoking the retransmission timeout.
1408 clock_.AdvanceTime(2 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001409 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1410 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1411 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001412 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001413
1414 // The retransmission time should now be twice as far in the future.
1415 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1416 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1417}
1418
fayangcff885a2019-10-22 07:39:04 -07001419TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
fayang5d011982020-05-13 14:14:38 -07001420 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1421 return;
1422 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001423 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1424 SendDataPacket(1);
1425 SendDataPacket(2);
1426
1427 // Check the min.
1428 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1429 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1430 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1431 manager_.GetRetransmissionTime());
1432
1433 // Test with a standard smoothed RTT.
1434 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1435 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1436 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1437 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1438 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1439
1440 // Retransmit the packet by invoking the retransmission timeout.
1441 clock_.AdvanceTime(expected_tlp_delay);
1442 manager_.OnRetransmissionTimeout();
1443 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -07001444 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1445 .WillOnce(WithArgs<1>(Invoke(
1446 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001447 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001448 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1449 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001450
1451 expected_time = clock_.Now() + expected_tlp_delay;
1452 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1453}
1454
fayangcff885a2019-10-22 07:39:04 -07001455TEST_F(QuicSentPacketManagerTest, TLPRWithPendingStreamData) {
fayang5d011982020-05-13 14:14:38 -07001456 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1457 return;
1458 }
zhongyi1b2f7832019-06-14 13:31:34 -07001459 QuicConfig config;
1460 QuicTagVector options;
1461
1462 options.push_back(kTLPR);
1463 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1464 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1465 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1466 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1467 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1468 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1469 .WillOnce(Return(10 * kDefaultTCPMSS));
1470 manager_.SetFromConfig(config);
1471 EXPECT_TRUE(
1472 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1473
1474 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1475
1476 SendDataPacket(1);
1477 SendDataPacket(2);
1478
1479 // Test with a standard smoothed RTT.
1480 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1481 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1482 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1483 // With pending stream data, TLPR is used.
1484 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1485 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(true));
1486
1487 EXPECT_EQ(expected_tlp_delay,
1488 manager_.GetRetransmissionTime() - clock_.Now());
1489
1490 // Retransmit the packet by invoking the retransmission timeout.
1491 clock_.AdvanceTime(expected_tlp_delay);
1492 manager_.OnRetransmissionTimeout();
1493 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001494 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1495 .WillOnce(WithArgs<1>(Invoke(
1496 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1497 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1498
1499 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1500 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001501
1502 // 2nd TLP.
1503 expected_tlp_delay = 2 * srtt;
1504 EXPECT_EQ(expected_tlp_delay,
1505 manager_.GetRetransmissionTime() - clock_.Now());
1506}
1507
fayangcff885a2019-10-22 07:39:04 -07001508TEST_F(QuicSentPacketManagerTest, TLPRWithoutPendingStreamData) {
fayang5d011982020-05-13 14:14:38 -07001509 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1510 return;
1511 }
zhongyi1b2f7832019-06-14 13:31:34 -07001512 QuicConfig config;
1513 QuicTagVector options;
1514
1515 options.push_back(kTLPR);
1516 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1517 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1518 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1519 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1520 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1521 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1522 .WillOnce(Return(10 * kDefaultTCPMSS));
1523 manager_.SetFromConfig(config);
1524 EXPECT_TRUE(
1525 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1526 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1527
1528 SendPingPacket(1, ENCRYPTION_INITIAL);
1529 SendPingPacket(2, ENCRYPTION_INITIAL);
1530
1531 // Test with a standard smoothed RTT.
1532 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1533 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1534 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1535 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
zhongyi9fa2be32019-09-10 12:39:01 -07001536 // With no pending stream data, TLPR is ignored.
1537 expected_tlp_delay = 2 * srtt;
zhongyi1b2f7832019-06-14 13:31:34 -07001538 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(false));
1539 EXPECT_EQ(expected_tlp_delay,
1540 manager_.GetRetransmissionTime() - clock_.Now());
1541
1542 // Retransmit the packet by invoking the retransmission timeout.
1543 clock_.AdvanceTime(expected_tlp_delay);
1544 manager_.OnRetransmissionTimeout();
1545 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001546 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1547 .WillOnce(WithArgs<1>(Invoke(
1548 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1549 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1550 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1551 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001552
1553 // 2nd TLP.
1554 expected_tlp_delay = 2 * srtt;
1555 EXPECT_EQ(expected_tlp_delay,
1556 manager_.GetRetransmissionTime() - clock_.Now());
1557}
1558
fayangcff885a2019-10-22 07:39:04 -07001559TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
fayang5d011982020-05-13 14:14:38 -07001560 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1561 return;
1562 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001563 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1564 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1565 QuicTime::Delta::Zero(), QuicTime::Zero());
1566
1567 SendDataPacket(1);
1568 SendDataPacket(2);
1569 SendDataPacket(3);
1570 SendDataPacket(4);
1571
1572 QuicTime::Delta expected_rto_delay =
1573 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1574 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1575 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1576
1577 // Retransmit the packet by invoking the retransmission timeout.
1578 clock_.AdvanceTime(expected_rto_delay);
fayangcff885a2019-10-22 07:39:04 -07001579 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1580 .Times(2)
1581 .WillOnce(WithArgs<1>(Invoke(
1582 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1583 .WillOnce(WithArgs<1>(Invoke(
1584 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001585 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001586 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001587 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001588
1589 // The delay should double the second time.
1590 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1591 // Once we always base the timer on the right edge, leaving the older packets
1592 // in flight doesn't change the timeout.
1593 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1594
1595 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1596 // original value and OnRetransmissionTimeout is not called or reverted.
fayang01983412019-12-07 05:50:22 -08001597 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08001598 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
wub8ee29a02019-12-12 13:06:48 -08001599 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001600 clock_.Now());
fayang01983412019-12-07 05:50:22 -08001601 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001602 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001603 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1604 ENCRYPTION_INITIAL));
fayang01983412019-12-07 05:50:22 -08001605 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001606
1607 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1608 // and the TLP time. In production, there would always be two TLP's first.
1609 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1610 // by the latest RTT sample of 500ms.
1611 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
1612 // Once we always base the timer on the right edge, leaving the older packets
1613 // in flight doesn't change the timeout.
1614 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1615}
1616
fayangcff885a2019-10-22 07:39:04 -07001617TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
fayang5d011982020-05-13 14:14:38 -07001618 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1619 return;
1620 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001621 SendDataPacket(1);
1622 // Provide a 1ms RTT sample.
1623 const_cast<RttStats*>(manager_.GetRttStats())
1624 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
1625 QuicTime::Zero());
1626 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1627
1628 // If the delay is smaller than the min, ensure it exponentially backs off
1629 // from the min.
1630 for (int i = 0; i < 5; ++i) {
1631 EXPECT_EQ(delay,
1632 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001634 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1635 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1636 RetransmitDataPacket(i + 2, type);
1637 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001638 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001639 }
1640}
1641
fayangcff885a2019-10-22 07:39:04 -07001642TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
fayang5d011982020-05-13 14:14:38 -07001643 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1644 return;
1645 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646 SendDataPacket(1);
1647 // Provide a 60s RTT sample.
1648 const_cast<RttStats*>(manager_.GetRttStats())
1649 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
1650 QuicTime::Zero());
1651
1652 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1653 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001654}
1655
fayangcff885a2019-10-22 07:39:04 -07001656TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
fayang5d011982020-05-13 14:14:38 -07001657 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1658 return;
1659 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001660 SendDataPacket(1);
1661 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1662
1663 // Delay should back off exponentially.
1664 for (int i = 0; i < 5; ++i) {
1665 EXPECT_EQ(delay,
1666 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001667 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001668 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1669 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1670 RetransmitDataPacket(i + 2, type);
1671 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001672 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001673 }
1674}
1675
fayangcff885a2019-10-22 07:39:04 -07001676TEST_F(QuicSentPacketManagerTest, RetransmissionDelay) {
fayang5d011982020-05-13 14:14:38 -07001677 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1678 return;
1679 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001680 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1681 const int64_t kRttMs = 250;
1682 const int64_t kDeviationMs = 5;
1683
1684 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
1685 QuicTime::Delta::Zero(), clock_.Now());
1686
1687 // Initial value is to set the median deviation to half of the initial rtt,
1688 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
1689 // is added which is the initial rtt.
1690 QuicTime::Delta expected_delay =
1691 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
1692 EXPECT_EQ(expected_delay,
1693 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001694
1695 for (int i = 0; i < 100; ++i) {
1696 // Run to make sure that we converge.
1697 rtt_stats->UpdateRtt(
1698 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
1699 QuicTime::Delta::Zero(), clock_.Now());
1700 rtt_stats->UpdateRtt(
1701 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
1702 QuicTime::Delta::Zero(), clock_.Now());
1703 }
1704 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
1705
1706 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
1707 EXPECT_NEAR(expected_delay.ToMilliseconds(),
1708 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
1709 .ToMilliseconds(),
1710 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001711}
1712
fayangcff885a2019-10-22 07:39:04 -07001713TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
vasilvv0fc587f2019-09-06 13:33:08 -07001714 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001715 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
1716
1717 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1718 .WillRepeatedly(Return(QuicTime::Zero()));
1719 SendDataPacket(1);
1720 SendDataPacket(2);
1721
1722 // Handle an ack which causes the loss algorithm to be evaluated and
1723 // set the loss timeout.
1724 ExpectAck(2);
1725 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1726 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1727 clock_.Now());
1728 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001729 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001730 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1731 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001732
1733 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
1734 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1735 .WillRepeatedly(Return(timeout));
1736 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1737
1738 // Fire the retransmission timeout and ensure the loss detection algorithm
1739 // is invoked.
1740 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1741 manager_.OnRetransmissionTimeout();
1742}
1743
fayangcff885a2019-10-22 07:39:04 -07001744TEST_F(QuicSentPacketManagerTest, NegotiateIetfLossDetectionFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001745 EXPECT_TRUE(
1746 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1747 EXPECT_FALSE(
1748 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1749 EXPECT_EQ(kDefaultLossDelayShift,
1750 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001751
1752 QuicConfig config;
1753 QuicTagVector options;
1754 options.push_back(kILD0);
1755 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1756 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1757 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1758 manager_.SetFromConfig(config);
1759
fayangb0c7b4b2019-09-12 06:45:24 -07001760 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1761 EXPECT_FALSE(
1762 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1763}
1764
fayangcff885a2019-10-22 07:39:04 -07001765TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001766 NegotiateIetfLossDetectionOneFourthRttFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001767 EXPECT_TRUE(
1768 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1769 EXPECT_FALSE(
1770 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1771 EXPECT_EQ(kDefaultLossDelayShift,
1772 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001773
1774 QuicConfig config;
1775 QuicTagVector options;
1776 options.push_back(kILD1);
1777 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1778 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1779 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1780 manager_.SetFromConfig(config);
1781
fayangb0c7b4b2019-09-12 06:45:24 -07001782 EXPECT_EQ(kDefaultLossDelayShift,
1783 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1784 EXPECT_FALSE(
1785 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1786}
1787
fayangcff885a2019-10-22 07:39:04 -07001788TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001789 NegotiateIetfLossDetectionAdaptiveReorderingThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001790 EXPECT_TRUE(
1791 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1792 EXPECT_FALSE(
1793 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1794 EXPECT_EQ(kDefaultLossDelayShift,
1795 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001796
1797 QuicConfig config;
1798 QuicTagVector options;
1799 options.push_back(kILD2);
1800 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1801 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1802 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1803 manager_.SetFromConfig(config);
1804
fayangb0c7b4b2019-09-12 06:45:24 -07001805 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1806 EXPECT_TRUE(
1807 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1808}
1809
fayangcff885a2019-10-22 07:39:04 -07001810TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001811 NegotiateIetfLossDetectionAdaptiveReorderingThreshold2) {
fayang3be090d2020-02-11 14:05:08 -08001812 EXPECT_TRUE(
1813 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1814 EXPECT_FALSE(
1815 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1816 EXPECT_EQ(kDefaultLossDelayShift,
1817 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001818
1819 QuicConfig config;
1820 QuicTagVector options;
1821 options.push_back(kILD3);
1822 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1823 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1824 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1825 manager_.SetFromConfig(config);
fayangb0c7b4b2019-09-12 06:45:24 -07001826 EXPECT_EQ(kDefaultLossDelayShift,
1827 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1828 EXPECT_TRUE(
1829 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1830}
1831
fayangdb095652019-11-04 07:37:36 -08001832TEST_F(QuicSentPacketManagerTest,
1833 NegotiateIetfLossDetectionAdaptiveReorderingAndTimeThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001834 EXPECT_TRUE(
1835 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1836 EXPECT_FALSE(
1837 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1838 EXPECT_EQ(kDefaultLossDelayShift,
1839 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangdb095652019-11-04 07:37:36 -08001840
1841 QuicConfig config;
1842 QuicTagVector options;
1843 options.push_back(kILD4);
1844 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1845 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1846 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1847 manager_.SetFromConfig(config);
1848
fayangdb095652019-11-04 07:37:36 -08001849 EXPECT_EQ(kDefaultLossDelayShift,
1850 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1851 EXPECT_TRUE(
1852 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1853 EXPECT_TRUE(
1854 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1855}
1856
fayangcff885a2019-10-22 07:39:04 -07001857TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001858 QuicConfig config;
1859 QuicTagVector options;
1860
1861 options.push_back(kRENO);
1862 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1863 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1864 manager_.SetFromConfig(config);
1865 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1866 ->GetCongestionControlType());
1867
1868 options.clear();
1869 options.push_back(kTBBR);
1870 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1871 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1872 manager_.SetFromConfig(config);
1873 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1874 ->GetCongestionControlType());
1875
1876 options.clear();
1877 options.push_back(kBYTE);
1878 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1879 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1880 manager_.SetFromConfig(config);
1881 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1882 ->GetCongestionControlType());
1883 options.clear();
1884 options.push_back(kRENO);
1885 options.push_back(kBYTE);
1886 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1887 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1888 manager_.SetFromConfig(config);
1889 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1890 ->GetCongestionControlType());
1891}
1892
fayangcff885a2019-10-22 07:39:04 -07001893TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001894 QuicConfig config;
1895 QuicTagVector options;
1896
1897 // No change if the server receives client options.
1898 const SendAlgorithmInterface* mock_sender =
1899 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
1900 options.push_back(kRENO);
1901 config.SetClientConnectionOptions(options);
1902 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1903 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1904 manager_.SetFromConfig(config);
1905 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
1906
1907 // Change the congestion control on the client with client options.
1908 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1909 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1910 manager_.SetFromConfig(config);
1911 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1912 ->GetCongestionControlType());
1913
1914 options.clear();
1915 options.push_back(kTBBR);
1916 config.SetClientConnectionOptions(options);
1917 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1918 manager_.SetFromConfig(config);
1919 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1920 ->GetCongestionControlType());
1921
1922 options.clear();
1923 options.push_back(kBYTE);
1924 config.SetClientConnectionOptions(options);
1925 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1926 manager_.SetFromConfig(config);
1927 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1928 ->GetCongestionControlType());
1929
1930 options.clear();
1931 options.push_back(kRENO);
1932 options.push_back(kBYTE);
1933 config.SetClientConnectionOptions(options);
1934 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1935 manager_.SetFromConfig(config);
1936 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1937 ->GetCongestionControlType());
1938}
1939
fayangcff885a2019-10-22 07:39:04 -07001940TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07001941 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1942 return;
1943 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001944 QuicConfig config;
1945 QuicTagVector options;
1946
1947 options.push_back(kMAD2);
1948 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1949 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1950 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1951 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1952 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1953 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1954 .WillOnce(Return(10 * kDefaultTCPMSS));
1955 manager_.SetFromConfig(config);
1956 // Set the initial RTT to 1us.
1957 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
1958 QuicTime::Delta::FromMicroseconds(1));
1959 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
1960 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
1961 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001962
ianswettad65ab92019-10-28 07:19:07 -07001963 // Send two packets, and the TLP should be 1ms.
1964 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001965 SendDataPacket(1);
1966 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07001967 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001968 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001969}
1970
fayangcff885a2019-10-22 07:39:04 -07001971TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07001972 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1973 return;
1974 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001975 QuicConfig client_config;
1976 QuicTagVector options;
1977
1978 options.push_back(kMAD2);
1979 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1980 client_config.SetConnectionOptionsToSend(options);
1981 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1982 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1983 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1984 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1985 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1986 .WillOnce(Return(10 * kDefaultTCPMSS));
1987 manager_.SetFromConfig(client_config);
1988 // Set the initial RTT to 1us.
1989 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
1990 QuicTime::Delta::FromMicroseconds(1));
1991 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
1992 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
1993 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettad65ab92019-10-28 07:19:07 -07001994 // Send two packets, and the TLP should be 1ms.
1995 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001996 SendDataPacket(1);
1997 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07001998 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001999 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002000}
2001
fayangcff885a2019-10-22 07:39:04 -07002002TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002003 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2004 return;
2005 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002006 QuicConfig config;
2007 QuicTagVector options;
2008
2009 options.push_back(kMAD3);
2010 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2011 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2012 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2013 manager_.SetFromConfig(config);
2014 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2015 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2016 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2017 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002018 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002019 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002020 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002021 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002022 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002023 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002024 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002025}
2026
fayangcff885a2019-10-22 07:39:04 -07002027TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002028 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2029 return;
2030 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002031 QuicConfig client_config;
2032 QuicTagVector options;
2033
2034 options.push_back(kMAD3);
2035 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2036 client_config.SetConnectionOptionsToSend(options);
2037 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2038 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2039 manager_.SetFromConfig(client_config);
2040 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2041 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2042 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2043 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002044 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002045 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002046 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002047 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002048 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002049 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002050 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002051}
2052
fayangcff885a2019-10-22 07:39:04 -07002053TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002054 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2055 return;
2056 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002057 QuicConfig config;
2058 QuicTagVector options;
2059
2060 options.push_back(kNTLP);
2061 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2062 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2063 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2064 manager_.SetFromConfig(config);
2065 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2066}
2067
fayangcff885a2019-10-22 07:39:04 -07002068TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002069 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2070 return;
2071 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002072 QuicConfig client_config;
2073 QuicTagVector options;
2074
2075 options.push_back(kNTLP);
2076 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2077 client_config.SetConnectionOptionsToSend(options);
2078 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2079 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2080 manager_.SetFromConfig(client_config);
2081 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2082}
2083
fayangcff885a2019-10-22 07:39:04 -07002084TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002085 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2086 return;
2087 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002088 QuicConfig config;
2089 QuicTagVector options;
2090
2091 options.push_back(k1TLP);
2092 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2093 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2094 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2095 manager_.SetFromConfig(config);
2096 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2097}
2098
fayangcff885a2019-10-22 07:39:04 -07002099TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002100 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2101 return;
2102 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002103 QuicConfig client_config;
2104 QuicTagVector options;
2105
2106 options.push_back(k1TLP);
2107 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2108 client_config.SetConnectionOptionsToSend(options);
2109 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2110 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2111 manager_.SetFromConfig(client_config);
2112 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2113}
2114
fayangcff885a2019-10-22 07:39:04 -07002115TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002116 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2117 return;
2118 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002119 QuicConfig config;
2120 QuicTagVector options;
2121
2122 options.push_back(kTLPR);
2123 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2124 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2125 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2126 manager_.SetFromConfig(config);
2127 EXPECT_TRUE(
2128 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2129}
2130
fayangcff885a2019-10-22 07:39:04 -07002131TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002132 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2133 return;
2134 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002135 QuicConfig client_config;
2136 QuicTagVector options;
2137
2138 options.push_back(kTLPR);
2139 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2140 client_config.SetConnectionOptionsToSend(options);
2141 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2142 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2143 manager_.SetFromConfig(client_config);
2144 EXPECT_TRUE(
2145 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2146}
2147
fayangcff885a2019-10-22 07:39:04 -07002148TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002149 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2150 return;
2151 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002152 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2153 QuicConfig config;
2154 QuicTagVector options;
2155
2156 options.push_back(kNRTO);
2157 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2158 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2159 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2160 manager_.SetFromConfig(config);
2161 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2162}
2163
fayangcff885a2019-10-22 07:39:04 -07002164TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002165 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2166 return;
2167 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002168 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2169 QuicConfig client_config;
2170 QuicTagVector options;
2171
2172 options.push_back(kNRTO);
2173 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2174 client_config.SetConnectionOptionsToSend(options);
2175 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2176 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2177 manager_.SetFromConfig(client_config);
2178 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2179}
2180
fayangcff885a2019-10-22 07:39:04 -07002181TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002182 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2183 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2184
2185 QuicConfig config;
2186 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2187 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2188 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2189 manager_.SetFromConfig(config);
2190
2191 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2192 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2193}
2194
fayangcff885a2019-10-22 07:39:04 -07002195TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002196 // The sent packet manager should use the RTT from CachedNetworkParameters if
2197 // it is provided.
2198 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(1234);
2199 CachedNetworkParameters cached_network_params;
2200 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2201
QUICHE teamb4e187c2019-11-14 06:22:50 -08002202 SendAlgorithmInterface::NetworkParams params;
2203 params.bandwidth = QuicBandwidth::Zero();
2204 params.allow_cwnd_to_decrease = false;
2205 params.rtt = kRtt;
2206
2207 EXPECT_CALL(*send_algorithm_, AdjustNetworkParameters(params));
fayangbe83ecd2019-04-26 13:58:09 -07002208 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2209 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002210 manager_.ResumeConnectionState(cached_network_params, false);
2211 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2212}
2213
fayangcff885a2019-10-22 07:39:04 -07002214TEST_F(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002215 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2216 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2217 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2218 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2219
2220 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2221 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2222 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2223 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2224
2225 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
2226 manager_.OnConnectionMigration(IPV4_TO_IPV4_CHANGE);
2227
2228 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2229 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2230 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2231}
2232
fayangcff885a2019-10-22 07:39:04 -07002233TEST_F(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002234 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2235 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2236 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2237 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2238
2239 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2240 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2241 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2242 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2243
2244 manager_.OnConnectionMigration(IPV4_SUBNET_CHANGE);
2245
2246 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2247 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2248 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2249}
2250
fayangcff885a2019-10-22 07:39:04 -07002251TEST_F(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002252 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2253 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2254 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2255 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2256
2257 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2258 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2259 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2260 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2261
2262 manager_.OnConnectionMigration(PORT_CHANGE);
2263
2264 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2265 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2266 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2267}
2268
fayangcff885a2019-10-22 07:39:04 -07002269TEST_F(QuicSentPacketManagerTest, PathMtuIncreased) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002270 EXPECT_CALL(*send_algorithm_,
2271 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2272 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2273 nullptr, kDefaultLength + 100, false, false);
fayangcff885a2019-10-22 07:39:04 -07002274 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
2275 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002276
2277 // Ack the large packet and expect the path MTU to increase.
2278 ExpectAck(1);
2279 EXPECT_CALL(*network_change_visitor_,
2280 OnPathMtuIncreased(kDefaultLength + 100));
2281 QuicAckFrame ack_frame = InitAckFrame(1);
2282 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2283 clock_.Now());
2284 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002285 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002286 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2287 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002288}
2289
fayangcff885a2019-10-22 07:39:04 -07002290TEST_F(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002291 // Send packets 1 - 20.
2292 for (size_t i = 1; i <= 20; ++i) {
2293 SendDataPacket(i);
2294 }
2295 // Ack [5, 7), [10, 12), [15, 17).
2296 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2297 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002298 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2299 QUICHE_ARRAYSIZE(lost1));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002300 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2301 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2302 clock_.Now());
2303 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2304 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2305 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2306 // Make sure empty range does not harm.
2307 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002308 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002309 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2310 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002311
2312 // Ack [4, 8), [9, 13), [14, 21).
2313 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
bnc4e9283d2019-12-17 07:08:57 -08002314 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002315 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2316 clock_.Now());
2317 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2318 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2319 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002320 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002321 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2322 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002323}
2324
fayangcff885a2019-10-22 07:39:04 -07002325TEST_F(QuicSentPacketManagerTest, TolerateReneging) {
QUICHE team9929cc42019-03-13 08:17:43 -07002326 // Send packets 1 - 20.
2327 for (size_t i = 1; i <= 20; ++i) {
2328 SendDataPacket(i);
2329 }
2330 // Ack [5, 7), [10, 12), [15, 17).
2331 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2332 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002333 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2334 QUICHE_ARRAYSIZE(lost1));
QUICHE team9929cc42019-03-13 08:17:43 -07002335 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2336 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2337 clock_.Now());
2338 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2339 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2340 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002341 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002342 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2343 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002344
2345 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2346 uint64_t acked2[] = {4, 7, 9, 12};
bnc4e9283d2019-12-17 07:08:57 -08002347 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE team9929cc42019-03-13 08:17:43 -07002348 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2349 clock_.Now());
2350 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2351 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002352 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002353 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2354 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002355 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2356}
2357
fayangcff885a2019-10-22 07:39:04 -07002358TEST_F(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
QUICHE teamc279cec2019-03-22 06:51:48 -07002359 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang533cb1b2020-01-28 08:05:08 -08002360 const QuicUnackedPacketMap* unacked_packets =
2361 QuicSentPacketManagerPeer::GetUnackedPacketMap(&manager_);
QUICHE teamc279cec2019-03-22 06:51:48 -07002362 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002363 unacked_packets
2364 ->GetLargestSentRetransmittableOfPacketNumberSpace(INITIAL_DATA)
2365 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002366 EXPECT_FALSE(
2367 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2368 // Send packet 1.
2369 SendDataPacket(1, ENCRYPTION_INITIAL);
2370 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002371 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2372 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002373 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002374 unacked_packets
2375 ->GetLargestSentRetransmittableOfPacketNumberSpace(HANDSHAKE_DATA)
2376 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002377 // Ack packet 1.
2378 ExpectAck(1);
2379 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2380 clock_.Now());
2381 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002382 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002383 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2384 ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002385 EXPECT_EQ(QuicPacketNumber(1),
2386 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2387 EXPECT_FALSE(
2388 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2389 // Send packets 2 and 3.
2390 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2391 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2392 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002393 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2394 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002395 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002396 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2397 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002398 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002399 unacked_packets
2400 ->GetLargestSentRetransmittableOfPacketNumberSpace(APPLICATION_DATA)
2401 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002402 // Ack packet 2.
2403 ExpectAck(2);
2404 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2405 clock_.Now());
2406 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002407 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002408 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2409 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002410 EXPECT_EQ(QuicPacketNumber(2),
2411 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2412 EXPECT_FALSE(
2413 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2414 // Ack packet 3.
2415 ExpectAck(3);
2416 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2417 clock_.Now());
2418 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002419 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002420 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2421 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002422 EXPECT_EQ(QuicPacketNumber(3),
2423 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2424 EXPECT_FALSE(
2425 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2426 // Send packets 4 and 5.
2427 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2428 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2429 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002430 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2431 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002432 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002433 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2434 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002435 EXPECT_EQ(QuicPacketNumber(5),
fayang533cb1b2020-01-28 08:05:08 -08002436 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2437 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002438 // Ack packet 5.
2439 ExpectAck(5);
2440 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2441 clock_.Now());
2442 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002443 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002444 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2445 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002446 EXPECT_EQ(QuicPacketNumber(3),
2447 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2448 EXPECT_EQ(QuicPacketNumber(5),
2449 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2450 EXPECT_EQ(QuicPacketNumber(5),
2451 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2452
2453 // Send packets 6 - 8.
2454 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2455 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2456 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2457 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002458 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2459 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002460 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002461 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2462 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002463 EXPECT_EQ(QuicPacketNumber(8),
fayang533cb1b2020-01-28 08:05:08 -08002464 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2465 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002466 // Ack all packets.
2467 uint64_t acked[] = {4, 6, 7, 8};
bnc4e9283d2019-12-17 07:08:57 -08002468 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teamc279cec2019-03-22 06:51:48 -07002469 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2470 clock_.Now());
2471 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002472 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002473 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(5),
2474 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002475 EXPECT_EQ(QuicPacketNumber(3),
2476 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2477 EXPECT_EQ(QuicPacketNumber(8),
2478 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2479 EXPECT_EQ(QuicPacketNumber(8),
2480 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2481}
2482
fayangcff885a2019-10-22 07:39:04 -07002483TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002484 manager_.EnableMultiplePacketNumberSpacesSupport();
2485 // Send packet 1.
2486 SendDataPacket(1, ENCRYPTION_INITIAL);
2487 // Send packets 2 and 3.
2488 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2489 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2490
2491 // ACK packets 2 and 3 in the wrong packet number space.
2492 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2493 clock_.Now());
2494 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2495 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002496 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2497 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002498}
2499
fayangcff885a2019-10-22 07:39:04 -07002500TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
fayang3eb82212019-04-16 12:05:46 -07002501 manager_.EnableMultiplePacketNumberSpacesSupport();
2502 // Send packet 1.
2503 SendDataPacket(1, ENCRYPTION_INITIAL);
2504 // Send packets 2 and 3.
2505 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2506 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2507
2508 // ACK packet 1 in the wrong packet number space.
2509 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2510 clock_.Now());
2511 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2512 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002513 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2514 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002515}
2516
fayangcff885a2019-10-22 07:39:04 -07002517TEST_F(QuicSentPacketManagerTest,
fayang3eb82212019-04-16 12:05:46 -07002518 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002519 manager_.EnableMultiplePacketNumberSpacesSupport();
2520 // Send packet 1.
2521 SendDataPacket(1, ENCRYPTION_INITIAL);
2522 // Ack packet 1.
2523 ExpectAck(1);
2524 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2525 clock_.Now());
2526 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2527 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002528 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2529 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002530
2531 // Send packets 2 and 3.
2532 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2533 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2534
2535 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2536 // been acked in the correct packet number space, tolerate it.
2537 uint64_t acked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -08002538 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang3eb82212019-04-16 12:05:46 -07002539 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2540 clock_.Now());
2541 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2542 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002543 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2544 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002545}
2546
fayang06bb1b02019-06-14 14:07:12 -07002547// Regression test for b/133771183.
fayangcff885a2019-10-22 07:39:04 -07002548TEST_F(QuicSentPacketManagerTest, PacketInLimbo) {
fayang5d011982020-05-13 14:14:38 -07002549 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2550 return;
2551 }
fayang06bb1b02019-06-14 14:07:12 -07002552 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
2553 // Send SHLO.
2554 SendCryptoPacket(1);
2555 // Send data packet.
2556 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2557 // Send Ack Packet.
2558 SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE);
2559 // Retransmit SHLO.
2560 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2561 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }));
2562 manager_.OnRetransmissionTimeout();
2563
2564 // Successfully decrypt a forward secure packet.
2565 manager_.SetHandshakeConfirmed();
2566 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
2567 // Send Ack packet.
2568 SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE);
2569
2570 // Retransmission alarm fires.
2571 manager_.OnRetransmissionTimeout();
2572 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2573 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2574 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2575 })));
2576 manager_.MaybeRetransmitTailLossProbe();
2577
2578 // Received Ack of packets 1, 3 and 4.
2579 uint64_t acked[] = {1, 3, 4};
bnc4e9283d2019-12-17 07:08:57 -08002580 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang06bb1b02019-06-14 14:07:12 -07002581 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2582 clock_.Now());
2583 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
2584 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2585 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002586 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2587 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002588
2589 uint64_t acked2[] = {5, 6};
2590 uint64_t loss[] = {2};
fayang897605d2019-08-21 13:26:45 -07002591 // Verify packet 2 is detected lost.
2592 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
bnc4e9283d2019-12-17 07:08:57 -08002593 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), loss,
2594 QUICHE_ARRAYSIZE(loss));
fayang06bb1b02019-06-14 14:07:12 -07002595 manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(),
2596 clock_.Now());
2597 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7));
2598 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002599 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2600 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002601}
2602
fayangcff885a2019-10-22 07:39:04 -07002603TEST_F(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) {
fayang5d011982020-05-13 14:14:38 -07002604 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2605 return;
2606 }
fayanga29eb242019-07-16 12:25:38 -07002607 // Send 10 packets.
2608 for (size_t i = 1; i <= 10; ++i) {
2609 SendDataPacket(i);
2610 }
2611 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2612 .Times(2)
2613 .WillOnce(WithArgs<1>(Invoke(
2614 [this](TransmissionType type) { RetransmitDataPacket(11, type); })))
2615 .WillOnce(WithArgs<1>(Invoke(
2616 [this](TransmissionType type) { RetransmitDataPacket(12, type); })));
2617 manager_.OnRetransmissionTimeout();
2618 EXPECT_EQ(1u, stats_.rto_count);
2619 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2620
2621 // RTO fires again, but there is no packet to be RTO retransmitted.
2622 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
2623 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
2624 manager_.OnRetransmissionTimeout();
2625 EXPECT_EQ(2u, stats_.rto_count);
fayange861aee2019-10-16 13:40:39 -07002626 // Verify a credit is raised up.
2627 EXPECT_EQ(1u, manager_.pending_timer_transmission_count());
fayanga29eb242019-07-16 12:25:38 -07002628}
2629
fayangcff885a2019-10-22 07:39:04 -07002630TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeout) {
fayangce0a3162019-08-15 09:05:36 -07002631 EnablePto(k2PTO);
2632 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2633 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2634 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2635 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2636 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2637 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2638 QuicTime::Delta::Zero(), QuicTime::Zero());
2639 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2640
2641 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2642 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07002643 int pto_rttvar_multiplier =
2644 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayangce0a3162019-08-15 09:05:36 -07002645 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07002646 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayangce0a3162019-08-15 09:05:36 -07002647 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002648 QuicTime packet1_sent_time = clock_.Now();
fayangce0a3162019-08-15 09:05:36 -07002649 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2650 manager_.GetRetransmissionTime());
2651
2652 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2653 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2654 // Verify PTO is correctly set based on sent time of packet 2.
fayang5d011982020-05-13 14:14:38 -07002655 QuicTime deadline = clock_.Now() + expected_pto_delay;
2656 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2657 // Verify PTO is set based on left edge.
2658 deadline = packet1_sent_time + expected_pto_delay;
2659 }
2660 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayangce0a3162019-08-15 09:05:36 -07002661 EXPECT_EQ(0u, stats_.pto_count);
2662
2663 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002664 clock_.AdvanceTime(deadline - clock_.Now());
fayangce0a3162019-08-15 09:05:36 -07002665 manager_.OnRetransmissionTimeout();
2666 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2667 EXPECT_EQ(1u, stats_.pto_count);
fayang2a379bf2020-05-18 11:49:25 -07002668 EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress);
fayangce0a3162019-08-15 09:05:36 -07002669
2670 // Verify two probe packets get sent.
2671 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2672 .Times(2)
2673 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2674 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2675 })))
2676 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2677 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2678 })));
2679 manager_.MaybeSendProbePackets();
2680 // Verify PTO period gets set to twice the current value.
2681 QuicTime sent_time = clock_.Now();
2682 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2683 manager_.GetRetransmissionTime());
2684
2685 // Received ACK for packets 1 and 2.
2686 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002687 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangce0a3162019-08-15 09:05:36 -07002688 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2689 clock_.Now());
2690 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2691 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2692 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2693 ENCRYPTION_FORWARD_SECURE));
2694 expected_pto_delay =
2695 rtt_stats->SmoothedOrInitialRtt() +
fayang5d011982020-05-13 14:14:38 -07002696 std::max(pto_rttvar_multiplier * rtt_stats->mean_deviation(),
fayangce0a3162019-08-15 09:05:36 -07002697 QuicTime::Delta::FromMilliseconds(1)) +
2698 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2699
2700 // Verify PTO is correctly re-armed based on sent time of packet 4.
2701 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
fayang2a379bf2020-05-18 11:49:25 -07002702 EXPECT_EQ(1u, stats_.max_consecutive_rto_with_forward_progress);
fayangce0a3162019-08-15 09:05:36 -07002703}
2704
fayangcff885a2019-10-22 07:39:04 -07002705TEST_F(QuicSentPacketManagerTest, SendOneProbePacket) {
fayangce0a3162019-08-15 09:05:36 -07002706 EnablePto(k1PTO);
2707 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2708 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2709 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2710 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2711
2712 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07002713 QuicTime packet1_sent_time = clock_.Now();
fayangce0a3162019-08-15 09:05:36 -07002714 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2715 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2716
2717 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2718 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2719 QuicTime::Delta::Zero(), QuicTime::Zero());
2720 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2721 // Verify PTO period is correctly set.
fayang5d011982020-05-13 14:14:38 -07002722 int pto_rttvar_multiplier =
2723 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayangce0a3162019-08-15 09:05:36 -07002724 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07002725 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayangce0a3162019-08-15 09:05:36 -07002726 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002727 QuicTime deadline = clock_.Now() + expected_pto_delay;
2728 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2729 // Verify PTO is set based on left edge.
2730 deadline = packet1_sent_time + expected_pto_delay;
2731 }
2732 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayangce0a3162019-08-15 09:05:36 -07002733
2734 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002735 clock_.AdvanceTime(deadline - clock_.Now());
fayangce0a3162019-08-15 09:05:36 -07002736 manager_.OnRetransmissionTimeout();
2737 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2738
2739 // Verify one probe packet gets sent.
2740 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2741 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2742 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2743 })));
2744 manager_.MaybeSendProbePackets();
2745}
2746
fayangcff885a2019-10-22 07:39:04 -07002747TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeClient) {
fayang5f135052019-08-22 17:59:40 -07002748 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayangaf9903b2020-05-14 14:34:28 -07002749 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang5f135052019-08-22 17:59:40 -07002750 // Send CHLO.
2751 SendCryptoPacket(1);
2752 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2753 // Ack packet 1.
2754 ExpectAck(1);
2755 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2756 clock_.Now());
2757 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2758 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2759 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2760 ENCRYPTION_INITIAL));
2761 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2762 // Verify retransmission timeout is not zero because handshake is not
2763 // confirmed although there is no in flight packet.
2764 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2765 // Fire PTO.
2766 EXPECT_EQ(QuicSentPacketManager::PTO_MODE,
2767 manager_.OnRetransmissionTimeout());
2768}
2769
fayangcff885a2019-10-22 07:39:04 -07002770TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeServer) {
fayang08a6c952019-09-18 14:29:45 -07002771 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002772 // Send SHLO.
2773 SendCryptoPacket(1);
2774 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2775 // Ack packet 1.
2776 ExpectAck(1);
2777 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2778 clock_.Now());
2779 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2780 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2781 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2782 ENCRYPTION_INITIAL));
2783 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2784 // Verify retransmission timeout is not set on server side because there is
2785 // nothing in flight.
2786 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2787}
2788
fayang4c908f02019-11-01 07:26:17 -07002789TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) {
2790 EnablePto(k1PTO);
2791 // Use PTOS and PTOA.
2792 QuicConfig config;
2793 QuicTagVector options;
2794 options.push_back(kPTOS);
2795 options.push_back(kPTOA);
2796 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2797 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2798 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2799 manager_.SetFromConfig(config);
2800 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
2801 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
2802
2803 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2804 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2805 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2806 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2807 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2808 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2809 QuicTime::Delta::Zero(), QuicTime::Zero());
2810 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2811
2812 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07002813 QuicTime packet1_sent_time = clock_.Now();
fayang4c908f02019-11-01 07:26:17 -07002814 // Verify PTO is correctly set and ack delay is included.
fayang5d011982020-05-13 14:14:38 -07002815 int pto_rttvar_multiplier =
2816 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang4c908f02019-11-01 07:26:17 -07002817 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07002818 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang4c908f02019-11-01 07:26:17 -07002819 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2820 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2821 manager_.GetRetransmissionTime());
2822
2823 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2824 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2825 // Verify PTO is correctly set based on sent time of packet 2 but ack delay is
2826 // not included as an immediate ACK is expected.
2827 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
2828 kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002829 QuicTime deadline = clock_.Now() + expected_pto_delay;
2830 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2831 deadline = packet1_sent_time + expected_pto_delay;
2832 }
2833 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayang4c908f02019-11-01 07:26:17 -07002834 EXPECT_EQ(0u, stats_.pto_count);
2835
2836 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002837 clock_.AdvanceTime(deadline - clock_.Now());
fayang4c908f02019-11-01 07:26:17 -07002838 manager_.OnRetransmissionTimeout();
2839 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2840 EXPECT_EQ(1u, stats_.pto_count);
2841
2842 // Verify 1 probe packets get sent and packet number gets skipped.
2843 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2844 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2845 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2846 })));
2847 manager_.MaybeSendProbePackets();
2848 // Verify PTO period gets set to twice the current value. Also, ack delay is
2849 // not included.
2850 QuicTime sent_time = clock_.Now();
2851 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2852 manager_.GetRetransmissionTime());
2853
2854 // Received ACK for packets 1 and 2.
2855 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002856 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang4c908f02019-11-01 07:26:17 -07002857 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2858 clock_.Now());
2859 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2860 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2861 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2862 ENCRYPTION_FORWARD_SECURE));
2863 expected_pto_delay =
2864 rtt_stats->SmoothedOrInitialRtt() +
fayang5d011982020-05-13 14:14:38 -07002865 std::max(pto_rttvar_multiplier * rtt_stats->mean_deviation(),
fayang4c908f02019-11-01 07:26:17 -07002866 QuicTime::Delta::FromMilliseconds(1)) +
2867 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2868
2869 // Verify PTO is correctly re-armed based on sent time of packet 4. Because of
2870 // PTOS turns out to be spurious, ACK delay is included.
2871 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
2872
2873 // Received ACK for packets 4.
2874 ExpectAck(4);
2875 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2876 clock_.Now());
2877 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
2878 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2879 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2880 ENCRYPTION_FORWARD_SECURE));
2881 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2882 // Send more packets, such that peer will do ack decimation.
2883 std::vector<uint64_t> acked2;
2884 for (size_t i = 5; i <= 100; ++i) {
2885 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
2886 acked2.push_back(i);
2887 }
2888 // Received ACK for all sent packets.
2889 ExpectAcksAndLosses(true, &acked2[0], acked2.size(), nullptr, 0);
2890 manager_.OnAckFrameStart(QuicPacketNumber(100), QuicTime::Delta::Infinite(),
2891 clock_.Now());
2892 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(101));
2893 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2894 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(100),
2895 ENCRYPTION_FORWARD_SECURE));
2896
2897 expected_pto_delay =
2898 rtt_stats->SmoothedOrInitialRtt() +
fayang5d011982020-05-13 14:14:38 -07002899 std::max(pto_rttvar_multiplier * rtt_stats->mean_deviation(),
fayang4c908f02019-11-01 07:26:17 -07002900 QuicTime::Delta::FromMilliseconds(1)) +
2901 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2902 for (size_t i = 101; i < 110; i++) {
2903 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
2904 // Verify PTO timeout includes ACK delay as there are less than 10 packets
2905 // outstanding.
2906 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2907 manager_.GetRetransmissionTime());
2908 }
2909 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
2910 kDefaultDelayedAckTimeMs);
2911 SendDataPacket(110, ENCRYPTION_FORWARD_SECURE);
2912 // Verify ACK delay is excluded.
2913 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2914 manager_.GetRetransmissionTime());
2915}
2916
fayang7085a6d2019-11-04 07:03:57 -08002917TEST_F(QuicSentPacketManagerTest, StartExponentialBackoffSince2ndPto) {
2918 EnablePto(k2PTO);
2919 QuicConfig config;
2920 QuicTagVector options;
2921 options.push_back(kPEB2);
2922 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2923 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2924 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2925 manager_.SetFromConfig(config);
2926
2927 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2928 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2929 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2930 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2931 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2932 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2933 QuicTime::Delta::Zero(), QuicTime::Zero());
2934 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2935
2936 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07002937 QuicTime packet1_sent_time = clock_.Now();
fayang7085a6d2019-11-04 07:03:57 -08002938 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07002939 int pto_rttvar_multiplier =
2940 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang7085a6d2019-11-04 07:03:57 -08002941 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07002942 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang7085a6d2019-11-04 07:03:57 -08002943 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002944 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
fayang7085a6d2019-11-04 07:03:57 -08002945 manager_.GetRetransmissionTime());
2946
2947 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2948 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2949 // Verify PTO is correctly set based on sent time of packet 2.
fayang5d011982020-05-13 14:14:38 -07002950 QuicTime deadline = clock_.Now() + expected_pto_delay;
2951 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2952 // Verify PTO is set based on left edge.
2953 deadline = packet1_sent_time + expected_pto_delay;
2954 }
2955 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayang7085a6d2019-11-04 07:03:57 -08002956 EXPECT_EQ(0u, stats_.pto_count);
2957
2958 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002959 clock_.AdvanceTime(deadline - clock_.Now());
fayang7085a6d2019-11-04 07:03:57 -08002960 manager_.OnRetransmissionTimeout();
2961 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2962 EXPECT_EQ(1u, stats_.pto_count);
2963
2964 // Verify two probe packets get sent.
2965 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2966 .Times(2)
2967 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2968 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2969 })))
2970 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2971 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2972 })));
2973 manager_.MaybeSendProbePackets();
2974 // Verify no exponential backoff.
2975 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2976 manager_.GetRetransmissionTime());
2977
2978 // Invoke 2nd PTO.
2979 clock_.AdvanceTime(expected_pto_delay);
2980 manager_.OnRetransmissionTimeout();
2981 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2982 EXPECT_EQ(2u, stats_.pto_count);
2983
2984 // Verify two probe packets get sent.
2985 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2986 .Times(2)
2987 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2988 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
2989 })))
2990 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2991 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2992 })));
2993 manager_.MaybeSendProbePackets();
2994 // Verify still no exponential backoff.
2995 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2996 manager_.GetRetransmissionTime());
2997
2998 // Invoke 3rd PTO.
2999 clock_.AdvanceTime(expected_pto_delay);
3000 manager_.OnRetransmissionTimeout();
3001 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3002 EXPECT_EQ(3u, stats_.pto_count);
3003
3004 // Verify two probe packets get sent.
3005 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3006 .Times(2)
3007 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3008 RetransmitDataPacket(7, type, ENCRYPTION_FORWARD_SECURE);
3009 })))
3010 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3011 RetransmitDataPacket(8, type, ENCRYPTION_FORWARD_SECURE);
3012 })));
3013 manager_.MaybeSendProbePackets();
3014 // Verify exponential backoff starts.
3015 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3016 manager_.GetRetransmissionTime());
3017
3018 // Invoke 4th PTO.
3019 clock_.AdvanceTime(expected_pto_delay * 2);
3020 manager_.OnRetransmissionTimeout();
3021 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3022 EXPECT_EQ(4u, stats_.pto_count);
3023
3024 // Verify two probe packets get sent.
3025 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3026 .Times(2)
3027 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3028 RetransmitDataPacket(9, type, ENCRYPTION_FORWARD_SECURE);
3029 })))
3030 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3031 RetransmitDataPacket(10, type, ENCRYPTION_FORWARD_SECURE);
3032 })));
3033 manager_.MaybeSendProbePackets();
3034 // Verify exponential backoff continues.
3035 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3036 manager_.GetRetransmissionTime());
3037}
3038
fayang75db4342019-11-04 13:29:14 -08003039TEST_F(QuicSentPacketManagerTest, PtoTimeoutRttVarMultiple) {
3040 EnablePto(k1PTO);
3041 // Use 2 * rttvar
3042 QuicConfig config;
3043 QuicTagVector options;
3044 options.push_back(kPVS1);
3045 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3046 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3047 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3048 manager_.SetFromConfig(config);
3049
3050 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3051 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3052 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3053 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3054 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3055 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3056 QuicTime::Delta::Zero(), QuicTime::Zero());
3057 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3058
3059 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3060 // Verify PTO is correctly set based on 2 times rtt var.
3061 QuicTime::Delta expected_pto_delay =
3062 srtt + 2 * rtt_stats->mean_deviation() +
3063 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3064 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3065 manager_.GetRetransmissionTime());
3066}
3067
fayang93c83942019-11-07 10:41:16 -08003068// Regression test for b/143962153
3069TEST_F(QuicSentPacketManagerTest, RtoNotInFlightPacket) {
fayang5d011982020-05-13 14:14:38 -07003070 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3071 return;
3072 }
fayang93c83942019-11-07 10:41:16 -08003073 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
3074 // Send SHLO.
dmcardlecf0bfcf2019-12-13 08:08:21 -08003075 QuicStreamFrame crypto_frame(1, false, 0, quiche::QuicheStringPiece());
fayang93c83942019-11-07 10:41:16 -08003076 SendCryptoPacket(1);
3077 // Send data packet.
3078 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3079
3080 // Successfully decrypt a forward secure packet.
fayange1e81d22020-01-06 11:41:34 -08003081 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(1);
fayang93c83942019-11-07 10:41:16 -08003082 manager_.SetHandshakeConfirmed();
3083
3084 // 1st TLP.
3085 manager_.OnRetransmissionTimeout();
3086 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3087 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3088 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3089 })));
3090 manager_.MaybeRetransmitTailLossProbe();
3091
3092 // 2nd TLP.
3093 manager_.OnRetransmissionTimeout();
3094 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3095 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3096 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3097 })));
3098 manager_.MaybeRetransmitTailLossProbe();
3099
3100 // RTO retransmits SHLO although it is not in flight.
fayang93c83942019-11-07 10:41:16 -08003101 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
fayangac35d452019-11-08 12:35:15 -08003102 .WillOnce(WithArgs<0>(Invoke([&crypto_frame](const QuicFrames& frames) {
3103 EXPECT_EQ(1u, frames.size());
fayange1e81d22020-01-06 11:41:34 -08003104 EXPECT_NE(crypto_frame, frames[0].stream_frame);
fayangac35d452019-11-08 12:35:15 -08003105 })));
fayang93c83942019-11-07 10:41:16 -08003106 manager_.OnRetransmissionTimeout();
3107}
3108
fayang4aa22402020-01-07 11:36:07 -08003109TEST_F(QuicSentPacketManagerTest, Aggressive1Pto) {
3110 EnablePto(k1PTO);
3111 // Let the first PTO be aggressive.
3112 QuicConfig config;
3113 QuicTagVector options;
3114 options.push_back(kPTOS);
3115 options.push_back(kPAG1);
3116 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3117 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3118 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3119 manager_.SetFromConfig(config);
3120
3121 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3122 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3123 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3124 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3125 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3126 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3127 QuicTime::Delta::Zero(), QuicTime::Zero());
3128 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3129 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3130 // Verify PTO is correctly set.
3131 QuicTime::Delta expected_pto_delay = 2 * srtt;
3132 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3133 manager_.GetRetransmissionTime());
3134
3135 // Invoke PTO.
3136 clock_.AdvanceTime(expected_pto_delay);
3137 manager_.OnRetransmissionTimeout();
3138 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3139 EXPECT_EQ(1u, stats_.pto_count);
3140
3141 // Verify 1 probe packets get sent and packet number gets skipped.
3142 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3143 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3144 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3145 })));
3146 manager_.MaybeSendProbePackets();
3147
3148 // Verify PTO period gets set correctly.
3149 QuicTime sent_time = clock_.Now();
fayang5d011982020-05-13 14:14:38 -07003150 int pto_rttvar_multiplier =
3151 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang4aa22402020-01-07 11:36:07 -08003152 expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003153 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang4aa22402020-01-07 11:36:07 -08003154 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3155 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3156 manager_.GetRetransmissionTime());
3157}
3158
3159TEST_F(QuicSentPacketManagerTest, Aggressive2Ptos) {
3160 EnablePto(k1PTO);
3161 // Let the first PTO be aggressive.
3162 QuicConfig config;
3163 QuicTagVector options;
3164 options.push_back(kPTOS);
3165 options.push_back(kPAG2);
3166 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3167 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3168 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3169 manager_.SetFromConfig(config);
3170
3171 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3172 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3173 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3174 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3175 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3176 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3177 QuicTime::Delta::Zero(), QuicTime::Zero());
3178 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3179 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3180 // Verify PTO is correctly set.
3181 QuicTime::Delta expected_pto_delay = 2 * srtt;
3182 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3183 manager_.GetRetransmissionTime());
3184
3185 // Invoke PTO.
3186 clock_.AdvanceTime(expected_pto_delay);
3187 manager_.OnRetransmissionTimeout();
3188 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3189 EXPECT_EQ(1u, stats_.pto_count);
3190
3191 // Verify 1 probe packets get sent and packet number gets skipped.
3192 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3193 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3194 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3195 })));
3196 manager_.MaybeSendProbePackets();
3197
3198 // Verify PTO period gets set correctly.
3199 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3200 manager_.GetRetransmissionTime());
3201
3202 // Invoke 2nd PTO.
3203 clock_.AdvanceTime(expected_pto_delay);
3204 manager_.OnRetransmissionTimeout();
3205 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3206 EXPECT_EQ(2u, stats_.pto_count);
3207
3208 // Verify 1 probe packets get sent and packet number gets skipped.
3209 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3210 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3211 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3212 })));
3213 manager_.MaybeSendProbePackets();
fayang5d011982020-05-13 14:14:38 -07003214 int pto_rttvar_multiplier =
3215 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang4aa22402020-01-07 11:36:07 -08003216 expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003217 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang4aa22402020-01-07 11:36:07 -08003218 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3219
3220 // Verify PTO period gets set correctly.
3221 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3222 manager_.GetRetransmissionTime());
3223}
3224
fayang402103c2020-01-10 13:36:24 -08003225TEST_F(QuicSentPacketManagerTest, IW10ForUpAndDown) {
3226 SetQuicReloadableFlag(quic_bbr_mitigate_overly_large_bandwidth_sample, true);
3227 QuicConfig config;
3228 QuicTagVector options;
3229 options.push_back(kBWS5);
3230 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3231 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3232 EXPECT_CALL(*send_algorithm_, SetInitialCongestionWindowInPackets(10));
3233 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3234 manager_.SetFromConfig(config);
3235
3236 EXPECT_EQ(10u, manager_.initial_congestion_window());
3237}
3238
fayang18ff23b2020-01-28 09:19:00 -08003239TEST_F(QuicSentPacketManagerTest, ClientMultiplePacketNumberSpacePtoTimeout) {
3240 manager_.EnableMultiplePacketNumberSpacesSupport();
3241 EnablePto(k1PTO);
3242 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3243 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3244 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3245 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3246 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3247 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3248 QuicTime::Delta::Zero(), QuicTime::Zero());
3249 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
fayang9a0e1bd2020-02-19 13:13:04 -08003250 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayang18ff23b2020-01-28 09:19:00 -08003251
3252 // Send packet 1.
3253 SendDataPacket(1, ENCRYPTION_INITIAL);
3254 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003255 int pto_rttvar_multiplier =
3256 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang18ff23b2020-01-28 09:19:00 -08003257 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003258 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang18ff23b2020-01-28 09:19:00 -08003259 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3260 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3261 manager_.GetRetransmissionTime());
3262
3263 // Discard initial key and send packet 2 in handshake.
3264 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3265 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3266 manager_.NeuterUnencryptedPackets();
3267
3268 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
3269 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3270 // Verify PTO is correctly set based on sent time of packet 2.
3271 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3272 manager_.GetRetransmissionTime());
3273 // Invoke PTO.
3274 clock_.AdvanceTime(expected_pto_delay);
3275 manager_.OnRetransmissionTimeout();
3276 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3277 EXPECT_EQ(1u, stats_.pto_count);
fayangaf9903b2020-05-14 14:34:28 -07003278 EXPECT_EQ(1u, stats_.crypto_retransmit_count);
fayang18ff23b2020-01-28 09:19:00 -08003279
3280 // Verify probe packet gets sent.
3281 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3282 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3283 RetransmitDataPacket(3, type, ENCRYPTION_HANDSHAKE);
3284 })));
3285 manager_.MaybeSendProbePackets();
3286 // Verify PTO period gets set to twice the current value.
3287 const QuicTime packet3_sent_time = clock_.Now();
3288 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3289 manager_.GetRetransmissionTime());
3290
fayang9a0e1bd2020-02-19 13:13:04 -08003291 // Send packet 4 in application data with 0-RTT.
fayang18ff23b2020-01-28 09:19:00 -08003292 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
fayang9a0e1bd2020-02-19 13:13:04 -08003293 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
fayang42834942020-03-30 10:56:15 -07003294 const QuicTime packet4_sent_time = clock_.Now();
fayang18ff23b2020-01-28 09:19:00 -08003295 // Verify PTO timeout is still based on packet 3.
3296 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3297 manager_.GetRetransmissionTime());
3298
3299 // Send packet 5 in handshake.
3300 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3301 SendDataPacket(5, ENCRYPTION_HANDSHAKE);
fayang9a0e1bd2020-02-19 13:13:04 -08003302 const QuicTime packet5_sent_time = clock_.Now();
3303 // Verify PTO timeout is now based on packet 5 because packet 4 should be
3304 // ignored.
fayang18ff23b2020-01-28 09:19:00 -08003305 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3306 manager_.GetRetransmissionTime());
3307
fayang9a0e1bd2020-02-19 13:13:04 -08003308 // Send packet 6 in 1-RTT.
3309 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3310 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
3311 const QuicTime packet6_sent_time = clock_.Now();
3312 // Verify PTO timeout is now based on packet 5.
3313 EXPECT_EQ(packet5_sent_time + expected_pto_delay * 2,
3314 manager_.GetRetransmissionTime());
3315
3316 // Send packet 7 in handshake.
3317 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3318 SendDataPacket(7, ENCRYPTION_HANDSHAKE);
3319 // Verify PTO timeout is now based on packet 6.
3320 EXPECT_EQ(packet6_sent_time + expected_pto_delay * 2,
3321 manager_.GetRetransmissionTime());
3322
fayang18ff23b2020-01-28 09:19:00 -08003323 // Neuter handshake key.
3324 manager_.SetHandshakeConfirmed();
fayang42834942020-03-30 10:56:15 -07003325 // Forward progress has been made, verify PTO counter gets reset. PTO timeout
3326 // is armed by left edge.
3327 EXPECT_EQ(packet4_sent_time + expected_pto_delay,
fayang18ff23b2020-01-28 09:19:00 -08003328 manager_.GetRetransmissionTime());
3329}
3330
3331TEST_F(QuicSentPacketManagerTest, ServerMultiplePacketNumberSpacePtoTimeout) {
3332 manager_.EnableMultiplePacketNumberSpacesSupport();
3333 EnablePto(k1PTO);
3334 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3335 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3336 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3337 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3338 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3339 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3340 QuicTime::Delta::Zero(), QuicTime::Zero());
3341 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3342
3343 // Send packet 1.
3344 SendDataPacket(1, ENCRYPTION_INITIAL);
3345 const QuicTime packet1_sent_time = clock_.Now();
3346 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003347 int pto_rttvar_multiplier =
3348 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang18ff23b2020-01-28 09:19:00 -08003349 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003350 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang18ff23b2020-01-28 09:19:00 -08003351 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3352 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3353 manager_.GetRetransmissionTime());
3354
3355 // Send packet 2 in handshake.
3356 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3357 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
fayang9a0e1bd2020-02-19 13:13:04 -08003358 const QuicTime packet2_sent_time = clock_.Now();
fayang18ff23b2020-01-28 09:19:00 -08003359 // Verify PTO timeout is still based on packet 1.
3360 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3361 manager_.GetRetransmissionTime());
3362
fayang9a0e1bd2020-02-19 13:13:04 -08003363 // Discard initial keys.
fayang18ff23b2020-01-28 09:19:00 -08003364 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3365 manager_.NeuterUnencryptedPackets();
fayang18ff23b2020-01-28 09:19:00 -08003366
fayang9a0e1bd2020-02-19 13:13:04 -08003367 // Send packet 3 in 1-RTT.
fayang18ff23b2020-01-28 09:19:00 -08003368 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3369 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
fayang9a0e1bd2020-02-19 13:13:04 -08003370 // Verify PTO timeout is based on packet 2.
3371 const QuicTime packet3_sent_time = clock_.Now();
3372 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3373 manager_.GetRetransmissionTime());
3374
3375 // Send packet 4 in handshake.
3376 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3377 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3378 // Verify PTO timeout is based on packet 4 as application data is ignored.
fayang18ff23b2020-01-28 09:19:00 -08003379 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3380 manager_.GetRetransmissionTime());
fayang9a0e1bd2020-02-19 13:13:04 -08003381
3382 // Discard handshake keys.
3383 manager_.SetHandshakeConfirmed();
3384 // Verify PTO timeout is now based on packet 3 as handshake is
3385 // complete/confirmed.
3386 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3387 manager_.GetRetransmissionTime());
fayang18ff23b2020-01-28 09:19:00 -08003388}
3389
fayang2ccfbcf2020-02-28 12:37:08 -08003390TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge) {
fayang2ccfbcf2020-02-28 12:37:08 -08003391 EnablePto(k1PTO);
3392 // Use PTOS and PLE1.
3393 QuicConfig config;
3394 QuicTagVector options;
3395 options.push_back(kPTOS);
3396 options.push_back(kPLE1);
3397 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3398 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3399 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3400 manager_.SetFromConfig(config);
3401 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3402 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3403 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3404 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3405 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3406 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3407 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3408 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3409 QuicTime::Delta::Zero(), QuicTime::Zero());
3410 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3411
3412 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3413 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003414 int pto_rttvar_multiplier =
3415 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang2ccfbcf2020-02-28 12:37:08 -08003416 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003417 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang2ccfbcf2020-02-28 12:37:08 -08003418 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3419 const QuicTime packet1_sent_time = clock_.Now();
3420 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3421 manager_.GetRetransmissionTime());
3422
3423 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3424 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3425 // Verify PTO is still based on packet 1.
3426 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3427 manager_.GetRetransmissionTime());
3428 EXPECT_EQ(0u, stats_.pto_count);
3429
3430 // Invoke PTO.
3431 clock_.AdvanceTime(expected_pto_delay);
3432 manager_.OnRetransmissionTimeout();
3433 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3434 EXPECT_EQ(1u, stats_.pto_count);
3435
3436 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3437 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3438 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3439 })));
3440 manager_.MaybeSendProbePackets();
3441 // Verify PTO period gets set to twice the current value and based on packet3.
3442 QuicTime packet3_sent_time = clock_.Now();
3443 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3444 manager_.GetRetransmissionTime());
3445
3446 // Received ACK for packets 1 and 2.
3447 uint64_t acked[] = {1, 2};
3448 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
3449 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3450 clock_.Now());
3451 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3452 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3453 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3454 ENCRYPTION_FORWARD_SECURE));
3455 expected_pto_delay =
3456 rtt_stats->SmoothedOrInitialRtt() +
fayang5d011982020-05-13 14:14:38 -07003457 std::max(pto_rttvar_multiplier * rtt_stats->mean_deviation(),
fayang2ccfbcf2020-02-28 12:37:08 -08003458 QuicTime::Delta::FromMilliseconds(1)) +
3459 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3460
3461 // Verify PTO is correctly re-armed based on sent time of packet 4.
3462 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3463 manager_.GetRetransmissionTime());
3464}
3465
fayangc5d9b2c2020-03-02 11:12:26 -08003466TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge2) {
fayangc5d9b2c2020-03-02 11:12:26 -08003467 EnablePto(k1PTO);
3468 // Use PTOS and PLE2.
3469 QuicConfig config;
3470 QuicTagVector options;
3471 options.push_back(kPTOS);
3472 options.push_back(kPLE2);
3473 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3474 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3475 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3476 manager_.SetFromConfig(config);
3477 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3478 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3479 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3480 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3481 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3482 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3483 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3484 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3485 QuicTime::Delta::Zero(), QuicTime::Zero());
3486 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3487
3488 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3489 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003490 int pto_rttvar_multiplier =
3491 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayangc5d9b2c2020-03-02 11:12:26 -08003492 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003493 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayangc5d9b2c2020-03-02 11:12:26 -08003494 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3495 const QuicTime packet1_sent_time = clock_.Now();
3496 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3497 manager_.GetRetransmissionTime());
3498
3499 // Sent a packet 10ms before PTO expiring.
3500 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(
3501 expected_pto_delay.ToMilliseconds() - 10));
3502 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3503 // Verify PTO expands to packet 2 sent time + 1.5 * srtt.
3504 expected_pto_delay = 1.5 * rtt_stats->smoothed_rtt();
3505 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3506 manager_.GetRetransmissionTime());
3507 EXPECT_EQ(0u, stats_.pto_count);
3508
3509 // Invoke PTO.
3510 clock_.AdvanceTime(expected_pto_delay);
3511 manager_.OnRetransmissionTimeout();
3512 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3513 EXPECT_EQ(1u, stats_.pto_count);
3514
3515 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3516 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3517 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3518 })));
3519 manager_.MaybeSendProbePackets();
3520 // Verify PTO period gets set to twice the expected value and based on
3521 // packet3 (right edge).
3522 expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003523 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayangc5d9b2c2020-03-02 11:12:26 -08003524 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3525 QuicTime packet3_sent_time = clock_.Now();
3526 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3527 manager_.GetRetransmissionTime());
3528
3529 // Received ACK for packets 1 and 2.
3530 uint64_t acked[] = {1, 2};
3531 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
3532 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3533 clock_.Now());
3534 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3535 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3536 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3537 ENCRYPTION_FORWARD_SECURE));
3538 expected_pto_delay =
3539 rtt_stats->SmoothedOrInitialRtt() +
fayang5d011982020-05-13 14:14:38 -07003540 std::max(pto_rttvar_multiplier * rtt_stats->mean_deviation(),
fayangc5d9b2c2020-03-02 11:12:26 -08003541 QuicTime::Delta::FromMilliseconds(1)) +
3542 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3543
3544 // Verify PTO is correctly re-armed based on sent time of packet 3 (left
3545 // edge).
3546 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3547 manager_.GetRetransmissionTime());
3548}
3549
fayangc2fd6102020-03-02 17:27:38 -08003550TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutUsingStandardDeviation) {
fayangc2fd6102020-03-02 17:27:38 -08003551 EnablePto(k1PTO);
3552 // Use PTOS and PSDA.
3553 QuicConfig config;
3554 QuicTagVector options;
3555 options.push_back(kPTOS);
3556 options.push_back(kPSDA);
3557 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3558 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3559 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3560 manager_.SetFromConfig(config);
3561 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3562 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3563 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3564 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3565 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3566 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3567 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3568 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3569 QuicTime::Delta::Zero(), QuicTime::Zero());
3570 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
3571 QuicTime::Delta::Zero(), QuicTime::Zero());
3572 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
3573 QuicTime::Delta::Zero(), QuicTime::Zero());
3574 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(75),
3575 QuicTime::Delta::Zero(), QuicTime::Zero());
3576 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3577
3578 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3579 // Verify PTO is correctly set using standard deviation.
fayang5d011982020-05-13 14:14:38 -07003580 int pto_rttvar_multiplier =
3581 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayangc2fd6102020-03-02 17:27:38 -08003582 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003583 srtt + pto_rttvar_multiplier * rtt_stats->GetStandardOrMeanDeviation() +
fayangc2fd6102020-03-02 17:27:38 -08003584 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3585 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3586 manager_.GetRetransmissionTime());
3587}
3588
fayang2ccfbcf2020-02-28 12:37:08 -08003589TEST_F(QuicSentPacketManagerTest,
3590 ComputingProbeTimeoutByLeftEdgeMultiplePacketNumberSpaces) {
fayang2ccfbcf2020-02-28 12:37:08 -08003591 manager_.EnableMultiplePacketNumberSpacesSupport();
3592 EnablePto(k1PTO);
3593 // Use PTOS and PLE1.
3594 QuicConfig config;
3595 QuicTagVector options;
3596 options.push_back(kPTOS);
3597 options.push_back(kPLE1);
3598 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3599 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3600 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3601 manager_.SetFromConfig(config);
3602 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3603 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3604 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3605 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3606 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3607 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3608 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3609 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3610 QuicTime::Delta::Zero(), QuicTime::Zero());
3611 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3612
3613 // Send packet 1.
3614 SendDataPacket(1, ENCRYPTION_INITIAL);
3615 const QuicTime packet1_sent_time = clock_.Now();
3616 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003617 int pto_rttvar_multiplier =
3618 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayang2ccfbcf2020-02-28 12:37:08 -08003619 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003620 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayang2ccfbcf2020-02-28 12:37:08 -08003621 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3622 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3623 manager_.GetRetransmissionTime());
3624
3625 // Send packet 2 in handshake.
3626 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3627 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3628 const QuicTime packet2_sent_time = clock_.Now();
3629 // Verify PTO timeout is still based on packet 1.
3630 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3631 manager_.GetRetransmissionTime());
3632
3633 // Discard initial keys.
3634 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3635 manager_.NeuterUnencryptedPackets();
3636
3637 // Send packet 3 in 1-RTT.
3638 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3639 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
3640 // Verify PTO timeout is based on packet 2.
3641 const QuicTime packet3_sent_time = clock_.Now();
3642 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3643 manager_.GetRetransmissionTime());
3644
3645 // Send packet 4 in handshake.
3646 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3647 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3648 // Verify PTO timeout is based on packet 4 as application data is ignored.
3649 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3650 manager_.GetRetransmissionTime());
3651
3652 // Discard handshake keys.
3653 manager_.SetHandshakeConfirmed();
3654 // Verify PTO timeout is now based on packet 3 as handshake is
3655 // complete/confirmed.
3656 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3657 manager_.GetRetransmissionTime());
3658
3659 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3660 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
3661 // Verify PTO timeout is still based on packet 3.
3662 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3663 manager_.GetRetransmissionTime());
3664}
3665
fayangc5d9b2c2020-03-02 11:12:26 -08003666TEST_F(QuicSentPacketManagerTest,
3667 ComputingProbeTimeoutByLeftEdge2MultiplePacketNumberSpaces) {
fayangc5d9b2c2020-03-02 11:12:26 -08003668 manager_.EnableMultiplePacketNumberSpacesSupport();
3669 EnablePto(k1PTO);
3670 // Use PTOS and PLE2.
3671 QuicConfig config;
3672 QuicTagVector options;
3673 options.push_back(kPTOS);
3674 options.push_back(kPLE2);
3675 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3676 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3677 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3678 manager_.SetFromConfig(config);
3679 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3680 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3681 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3682 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3683 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3684 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3685 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3686 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3687 QuicTime::Delta::Zero(), QuicTime::Zero());
3688 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3689
3690 // Send packet 1.
3691 SendDataPacket(1, ENCRYPTION_INITIAL);
3692 const QuicTime packet1_sent_time = clock_.Now();
3693 // Verify PTO is correctly set.
fayang5d011982020-05-13 14:14:38 -07003694 int pto_rttvar_multiplier =
3695 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
fayangc5d9b2c2020-03-02 11:12:26 -08003696 QuicTime::Delta expected_pto_delay =
fayang5d011982020-05-13 14:14:38 -07003697 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
fayangc5d9b2c2020-03-02 11:12:26 -08003698 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3699 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3700 manager_.GetRetransmissionTime());
3701
3702 // Send packet 2 in handshake.
3703 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3704 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3705 const QuicTime packet2_sent_time = clock_.Now();
3706 // Verify PTO timeout is still based on packet 1.
3707 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3708 manager_.GetRetransmissionTime());
3709
3710 // Discard initial keys.
3711 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3712 manager_.NeuterUnencryptedPackets();
3713
3714 // Send packet 3 in 1-RTT.
3715 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3716 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
3717 // Verify PTO timeout is based on packet 2.
3718 const QuicTime packet3_sent_time = clock_.Now();
3719 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3720 manager_.GetRetransmissionTime());
3721
3722 // Send packet 4 in handshake.
3723 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3724 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3725 // Verify PTO timeout is based on packet 4 as application data is ignored.
3726 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3727 manager_.GetRetransmissionTime());
3728
3729 // Discard handshake keys.
3730 manager_.SetHandshakeConfirmed();
3731 // Verify PTO timeout is now based on packet 3 as handshake is
3732 // complete/confirmed.
3733 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3734 manager_.GetRetransmissionTime());
3735
3736 // Send packet 5 10ms before PTO expiring.
3737 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(
3738 expected_pto_delay.ToMilliseconds() - 10));
3739 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
3740 // Verify PTO timeout expands to packet 5 sent time + 1.5 * srtt.
3741 EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->smoothed_rtt(),
3742 manager_.GetRetransmissionTime());
3743}
3744
wubf4ab9652020-02-20 14:45:43 -08003745TEST_F(QuicSentPacketManagerTest, SetHandshakeConfirmed) {
3746 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
3747 manager_.EnableMultiplePacketNumberSpacesSupport();
3748
3749 SendDataPacket(1, ENCRYPTION_INITIAL);
3750
3751 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3752
3753 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
3754 .WillOnce(
3755 Invoke([](const QuicFrame& /*frame*/, QuicTime::Delta ack_delay_time,
3756 QuicTime receive_timestamp) {
3757 EXPECT_TRUE(ack_delay_time.IsZero());
3758 EXPECT_EQ(receive_timestamp, QuicTime::Zero());
3759 return true;
3760 }));
3761
wub64863212020-05-28 10:33:59 -07003762 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(QuicPacketNumber(2))).Times(1);
wubf4ab9652020-02-20 14:45:43 -08003763 manager_.SetHandshakeConfirmed();
3764}
3765
fayangd5c2ffb2020-02-04 11:49:05 -08003766// Regresstion test for b/148841700.
3767TEST_F(QuicSentPacketManagerTest, NeuterUnencryptedPackets) {
3768 SendCryptoPacket(1);
3769 SendPingPacket(2, ENCRYPTION_INITIAL);
3770 // Crypto data has been discarded but ping does not.
fayang1f8619f2020-03-16 08:39:58 -07003771 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
3772 .Times(2)
3773 .WillOnce(Return(false))
3774 .WillOnce(Return(true));
fayangd5c2ffb2020-02-04 11:49:05 -08003775 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
wub64863212020-05-28 10:33:59 -07003776
3777 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(QuicPacketNumber(1))).Times(1);
fayangd5c2ffb2020-02-04 11:49:05 -08003778 manager_.NeuterUnencryptedPackets();
3779}
3780
fayang84427fc2020-03-09 12:43:26 -07003781TEST_F(QuicSentPacketManagerTest, NoPacketThresholdDetectionForRuntPackets) {
3782 EXPECT_TRUE(
3783 QuicSentPacketManagerPeer::UsePacketThresholdForRuntPackets(&manager_));
3784
fayang84427fc2020-03-09 12:43:26 -07003785 QuicConfig config;
3786 QuicTagVector options;
3787 options.push_back(kRUNT);
3788 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3789 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3790 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3791 manager_.SetFromConfig(config);
3792
3793 EXPECT_FALSE(
3794 QuicSentPacketManagerPeer::UsePacketThresholdForRuntPackets(&manager_));
3795}
3796
fayang1640cc22020-03-21 14:11:02 -07003797TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelay) {
3798 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
3799 // Before RTT sample is available.
3800 // 2 TLPs + 2 RTOs.
3801 QuicTime::Delta expected_delay = QuicTime::Delta::Zero();
3802 for (size_t i = 0; i < 2; ++i) {
3803 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i);
3804 expected_delay =
3805 expected_delay +
3806 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_);
3807 }
3808 for (size_t i = 0; i < 2; ++i) {
3809 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i);
3810 expected_delay =
3811 expected_delay +
3812 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_);
3813 }
3814 EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay());
3815
3816 expected_delay = QuicTime::Delta::Zero();
3817 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 0);
3818 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 0);
3819
3820 // After RTT sample is available.
3821 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3822 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3823 QuicTime::Delta::Zero(), QuicTime::Zero());
3824 // 2 TLPs + 2 RTOs.
3825 for (size_t i = 0; i < 2; ++i) {
3826 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i);
3827 expected_delay =
3828 expected_delay +
3829 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_);
3830 }
3831 for (size_t i = 0; i < 2; ++i) {
3832 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i);
3833 expected_delay =
3834 expected_delay +
3835 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_);
3836 }
3837 EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay());
3838}
3839
fayang6c7313c2020-04-23 12:10:35 -07003840// Regression test for b/154050235.
3841TEST_F(QuicSentPacketManagerTest, ExponentialBackoffWithNoRttMeasurement) {
3842 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayangaf9903b2020-05-14 14:34:28 -07003843 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang6c7313c2020-04-23 12:10:35 -07003844 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3845 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kInitialRttMs),
3846 rtt_stats->initial_rtt());
3847 EXPECT_TRUE(rtt_stats->smoothed_rtt().IsZero());
3848
3849 SendCryptoPacket(1);
3850 QuicTime::Delta expected_pto_delay =
3851 QuicTime::Delta::FromMilliseconds(3 * kInitialRttMs);
3852 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3853 manager_.GetRetransmissionTime());
3854
3855 // Invoke PTO.
3856 clock_.AdvanceTime(expected_pto_delay);
3857 manager_.OnRetransmissionTimeout();
3858
3859 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3860 .WillOnce(WithArgs<1>(Invoke([this]() { RetransmitCryptoPacket(3); })));
3861 manager_.MaybeSendProbePackets();
fayang5d011982020-05-13 14:14:38 -07003862 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3863 manager_.AdjustPendingTimerTransmissions();
3864 }
fayang6c7313c2020-04-23 12:10:35 -07003865 // Verify exponential backoff of the PTO timeout.
3866 EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay,
3867 manager_.GetRetransmissionTime());
3868}
3869
3870TEST_F(QuicSentPacketManagerTest, PtoDelayWithTinyInitialRtt) {
fayangaf9903b2020-05-14 14:34:28 -07003871 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang6c7313c2020-04-23 12:10:35 -07003872 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3873 // Assume client provided a tiny initial RTT.
3874 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMicroseconds(1));
3875 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), rtt_stats->initial_rtt());
3876 EXPECT_TRUE(rtt_stats->smoothed_rtt().IsZero());
3877
3878 SendCryptoPacket(1);
3879 QuicTime::Delta expected_pto_delay = QuicTime::Delta::FromMilliseconds(10);
3880 // Verify kMinHandshakeTimeoutMs is respected.
3881 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3882 manager_.GetRetransmissionTime());
3883
3884 // Invoke PTO.
3885 clock_.AdvanceTime(expected_pto_delay);
3886 manager_.OnRetransmissionTimeout();
3887
3888 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3889 .WillOnce(WithArgs<1>(Invoke([this]() { RetransmitCryptoPacket(3); })));
3890 manager_.MaybeSendProbePackets();
fayang5d011982020-05-13 14:14:38 -07003891 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3892 manager_.AdjustPendingTimerTransmissions();
3893 }
fayang6c7313c2020-04-23 12:10:35 -07003894 // Verify exponential backoff of the PTO timeout.
3895 EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay,
3896 manager_.GetRetransmissionTime());
3897}
3898
fayangaecfd532020-04-28 12:35:12 -07003899TEST_F(QuicSentPacketManagerTest, HandshakeAckCausesInitialKeyDropping) {
3900 manager_.EnableMultiplePacketNumberSpacesSupport();
3901 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
3902 // Send INITIAL packet 1.
3903 SendDataPacket(1, ENCRYPTION_INITIAL);
3904 QuicTime::Delta expected_pto_delay =
3905 QuicTime::Delta::FromMilliseconds(3 * kInitialRttMs);
3906 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3907 manager_.GetRetransmissionTime());
3908 // Send HANDSHAKE ack.
3909 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3910 SendAckPacket(2, /*largest_acked=*/1, ENCRYPTION_HANDSHAKE);
3911 // Sending HANDSHAKE packet causes dropping of INITIAL key.
3912 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
3913 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3914 manager_.NeuterUnencryptedPackets();
3915 // There is no in flight packets.
3916 EXPECT_FALSE(manager_.HasInFlightPackets());
3917 // Verify PTO timer gets rearmed from now because of anti-amplification.
3918 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3919 manager_.GetRetransmissionTime());
3920
3921 // Invoke PTO.
3922 clock_.AdvanceTime(expected_pto_delay);
3923 manager_.OnRetransmissionTimeout();
3924 // Verify nothing to probe (and connection will send PING for current
3925 // encryption level).
3926 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
3927 manager_.MaybeSendProbePackets();
3928}
3929
fayang40334262020-05-19 15:18:28 -07003930// Regression test for b/156487311
3931TEST_F(QuicSentPacketManagerTest, ClearLastInflightPacketsSentTime) {
3932 manager_.EnableMultiplePacketNumberSpacesSupport();
3933 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3934 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3935 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3936 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3937
3938 // Send INITIAL 1.
3939 SendDataPacket(1, ENCRYPTION_INITIAL);
3940 const QuicTime packet1_sent_time = clock_.Now();
3941 // Send HANDSHAKE 2.
3942 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3943 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3944 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
3945 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3946 const QuicTime packet2_sent_time = clock_.Now();
3947
3948 // Send half RTT 5.
3949 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3950 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
3951
3952 // Received ACK for INITIAL 1.
3953 ExpectAck(1);
3954 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
3955 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
3956 clock_.Now());
3957 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
3958 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3959 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3960 ENCRYPTION_INITIAL));
3961 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3962 int pto_rttvar_multiplier =
3963 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
3964 const QuicTime::Delta pto_delay =
3965 rtt_stats->smoothed_rtt() +
3966 pto_rttvar_multiplier * rtt_stats->mean_deviation() +
3967 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3968 if (GetQuicReloadableFlag(quic_fix_last_inflight_packets_sent_time)) {
3969 // Verify PTO is armed based on handshake data.
3970 EXPECT_EQ(packet2_sent_time + pto_delay, manager_.GetRetransmissionTime());
3971 } else {
3972 // Problematic: PTO is still armed based on initial data.
3973 EXPECT_EQ(packet1_sent_time + pto_delay, manager_.GetRetransmissionTime());
3974 clock_.AdvanceTime(pto_delay);
3975 manager_.OnRetransmissionTimeout();
3976 // Nothing to retransmit in INITIAL space.
3977 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
3978 manager_.MaybeSendProbePackets();
3979 // PING packet gets sent.
3980 SendPingPacket(6, ENCRYPTION_INITIAL);
fayang352170a2020-05-28 13:50:18 -07003981 manager_.AdjustPendingTimerTransmissions();
fayang40334262020-05-19 15:18:28 -07003982
3983 // Verify PTO is armed based on packet 2.
3984 EXPECT_EQ(packet2_sent_time + pto_delay * 2,
3985 manager_.GetRetransmissionTime());
3986 clock_.AdvanceTime(pto_delay * 2);
3987 manager_.OnRetransmissionTimeout();
3988 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(testing::AtLeast(1));
3989 manager_.MaybeSendProbePackets();
3990 }
3991}
3992
fayangd0907232020-06-02 12:56:48 -07003993// Regression test for b/157895910.
3994TEST_F(QuicSentPacketManagerTest, EarliestSentTimeNotInitializedWhenPtoFires) {
3995 SetQuicReloadableFlag(quic_fix_last_inflight_packets_sent_time, true);
3996 manager_.EnableMultiplePacketNumberSpacesSupport();
3997 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3998 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3999 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4000 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4001
4002 // Send INITIAL 1.
4003 SendDataPacket(1, ENCRYPTION_INITIAL);
4004
4005 // Send HANDSHAKE packets.
4006 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4007 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
4008 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
4009 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
4010
4011 // Send half RTT packet.
4012 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
4013
4014 // Received ACK for INITIAL packet 1.
4015 ExpectAck(1);
4016 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4017 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4018 clock_.Now());
4019 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4020 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4021 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4022 ENCRYPTION_INITIAL));
4023
4024 // Received ACK for HANDSHAKE packets.
4025 uint64_t acked[] = {2, 3, 4};
4026 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
4027 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4028 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
4029 clock_.Now());
4030 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(5));
4031 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4032 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
4033 ENCRYPTION_HANDSHAKE));
4034 if (GetQuicReloadableFlag(quic_fix_server_pto_timeout)) {
4035 // Verify PTO will not be armed.
4036 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
4037 return;
4038 }
4039 // PTO fires but there is nothing to send.
4040 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
4041 manager_.OnRetransmissionTimeout();
4042 EXPECT_QUIC_BUG(manager_.MaybeSendProbePackets(),
4043 "earlist_sent_time not initialized when trying to send PTO "
4044 "retransmissions");
4045}
4046
fayang7d4b0172020-06-18 14:05:45 -07004047TEST_F(QuicSentPacketManagerTest, MaybeRetransmitInitialData) {
4048 manager_.EnableMultiplePacketNumberSpacesSupport();
4049 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4050 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4051 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4052 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4053 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4054 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
4055 QuicTime::Delta::Zero(), QuicTime::Zero());
4056 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
4057
4058 // Send packet 1.
4059 SendDataPacket(1, ENCRYPTION_INITIAL);
4060 QuicTime packet1_sent_time = clock_.Now();
4061
4062 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4063 // Send packets 2 and 3.
4064 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
4065 QuicTime packet2_sent_time = clock_.Now();
4066 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
4067 // Verify PTO is correctly set based on packet 1.
4068 int pto_rttvar_multiplier =
4069 GetQuicReloadableFlag(quic_default_on_pto) ? 2 : 4;
4070 QuicTime::Delta expected_pto_delay =
4071 srtt + pto_rttvar_multiplier * rtt_stats->mean_deviation() +
4072 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
4073 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
4074 manager_.GetRetransmissionTime());
4075
4076 // Assume connection is going to send INITIAL ACK.
4077 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4078 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4079 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
4080 RetransmitDataPacket(4, type, ENCRYPTION_INITIAL);
4081 })));
fayanga39d0362020-06-22 08:57:35 -07004082 manager_.RetransmitDataOfSpaceIfAny(INITIAL_DATA);
fayang7d4b0172020-06-18 14:05:45 -07004083 // Verify PTO is re-armed based on packet 2.
4084 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
4085 manager_.GetRetransmissionTime());
4086
4087 // Connection is going to send another INITIAL ACK.
4088 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4089 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4090 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
4091 RetransmitDataPacket(5, type, ENCRYPTION_INITIAL);
4092 })));
fayanga39d0362020-06-22 08:57:35 -07004093 manager_.RetransmitDataOfSpaceIfAny(INITIAL_DATA);
fayang7d4b0172020-06-18 14:05:45 -07004094 // Verify PTO does not change.
4095 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
4096 manager_.GetRetransmissionTime());
4097}
4098
fayangbc9f56f2020-06-19 03:49:22 -07004099TEST_F(QuicSentPacketManagerTest,
4100 AggressivePtoBeforeAnyRttSamplesAreAvailable) {
4101 manager_.EnableMultiplePacketNumberSpacesSupport();
4102 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4103 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4104 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4105 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4106 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4107
4108 QuicConfig config;
4109 QuicTagVector options;
4110 options.push_back(kAPTO);
4111 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
4112 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4113 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4114 manager_.SetFromConfig(config);
4115
4116 // Send INITIAL 1.
4117 SendDataPacket(1, ENCRYPTION_INITIAL);
4118 // Verify retransmission timeout is expected.
4119 EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->initial_rtt(),
4120 manager_.GetRetransmissionTime());
4121}
4122
QUICHE teama6ef0a62019-03-07 20:34:33 -05004123} // namespace
4124} // namespace test
4125} // namespace quic