blob: 2449cd65ba259c792d70d87f28d087151b5fe793 [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
QUICHE teama6ef0a62019-03-07 20:34:33 -050010#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
12#include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h"
13#include "net/third_party/quiche/src/quic/test_tools/quic_sent_packet_manager_peer.h"
14#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
bnc4e9283d2019-12-17 07:08:57 -080015#include "net/third_party/quiche/src/common/platform/api/quiche_arraysize.h"
dmcardlecf0bfcf2019-12-13 08:08:21 -080016#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050017
18using testing::_;
19using testing::AnyNumber;
20using testing::Invoke;
21using testing::InvokeWithoutArgs;
22using testing::IsEmpty;
23using testing::Not;
24using testing::Pointwise;
25using testing::Return;
26using testing::StrictMock;
27using testing::WithArgs;
28
29namespace quic {
30namespace test {
31namespace {
32// Default packet length.
33const uint32_t kDefaultLength = 1000;
34
35// Stream ID for data sent in CreatePacket().
36const QuicStreamId kStreamId = 7;
37
38// Matcher to check that the packet number matches the second argument.
39MATCHER(PacketNumberEq, "") {
40 return ::testing::get<0>(arg).packet_number ==
41 QuicPacketNumber(::testing::get<1>(arg));
42}
43
44class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate {
45 public:
46 MOCK_METHOD2(OnSpuriousPacketRetransmission,
47 void(TransmissionType transmission_type,
48 QuicByteCount byte_size));
49 MOCK_METHOD3(OnPacketLoss,
50 void(QuicPacketNumber lost_packet_number,
51 TransmissionType transmission_type,
52 QuicTime detection_time));
53};
54
fayangcff885a2019-10-22 07:39:04 -070055class QuicSentPacketManagerTest : public QuicTest {
QUICHE teama6ef0a62019-03-07 20:34:33 -050056 public:
57 void RetransmitCryptoPacket(uint64_t packet_number) {
58 EXPECT_CALL(
59 *send_algorithm_,
60 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
61 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
62 SerializedPacket packet(CreatePacket(packet_number, false));
63 packet.retransmittable_frames.push_back(
dmcardlecf0bfcf2019-12-13 08:08:21 -080064 QuicFrame(QuicStreamFrame(1, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -050065 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -070066 manager_.OnPacketSent(&packet, clock_.Now(), HANDSHAKE_RETRANSMISSION,
67 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -050068 }
69
fayang06bb1b02019-06-14 14:07:12 -070070 void RetransmitDataPacket(uint64_t packet_number,
71 TransmissionType type,
72 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050073 EXPECT_CALL(
74 *send_algorithm_,
75 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
76 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
77 SerializedPacket packet(CreatePacket(packet_number, true));
fayang06bb1b02019-06-14 14:07:12 -070078 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -070079 manager_.OnPacketSent(&packet, clock_.Now(), type,
QUICHE teama6ef0a62019-03-07 20:34:33 -050080 HAS_RETRANSMITTABLE_DATA);
81 }
82
fayang06bb1b02019-06-14 14:07:12 -070083 void RetransmitDataPacket(uint64_t packet_number, TransmissionType type) {
84 RetransmitDataPacket(packet_number, type, ENCRYPTION_INITIAL);
85 }
86
QUICHE teama6ef0a62019-03-07 20:34:33 -050087 protected:
wub18773d62020-01-28 14:14:06 -080088 const CongestionControlType kInitialCongestionControlType = kCubicBytes;
QUICHE teama6ef0a62019-03-07 20:34:33 -050089 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070090 : manager_(Perspective::IS_SERVER,
91 &clock_,
92 QuicRandom::GetInstance(),
93 &stats_,
fayang3be090d2020-02-11 14:05:08 -080094 kInitialCongestionControlType),
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 send_algorithm_(new StrictMock<MockSendAlgorithm>),
96 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
97 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
98 // Disable tail loss probes for most tests.
99 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
100 // Advance the time 1s so the send times are never QuicTime::Zero.
101 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
102 manager_.SetNetworkChangeVisitor(network_change_visitor_.get());
103 manager_.SetSessionNotifier(&notifier_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500104
wub18773d62020-01-28 14:14:06 -0800105 EXPECT_CALL(*send_algorithm_, GetCongestionControlType())
106 .WillRepeatedly(Return(kInitialCongestionControlType));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500107 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
108 .Times(AnyNumber());
109 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
110 .Times(AnyNumber())
111 .WillRepeatedly(Return(QuicBandwidth::Zero()));
112 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
113 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
114 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
115 .Times(AnyNumber());
116 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
117 EXPECT_CALL(notifier_, HasUnackedCryptoData())
118 .WillRepeatedly(Return(false));
119 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
QUICHE team9467db02019-05-30 09:38:45 -0700120 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 }
122
123 ~QuicSentPacketManagerTest() override {}
124
ianswett9f459cb2019-04-21 06:39:59 -0700125 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500126 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
127 if (num_packets == 0) {
128 EXPECT_TRUE(manager_.unacked_packets().empty());
129 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
130 &manager_));
131 return;
132 }
133
134 EXPECT_FALSE(manager_.unacked_packets().empty());
135 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
136 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700137 EXPECT_TRUE(
138 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500139 << packets[i];
140 }
141 }
142
143 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
144 EXPECT_EQ(
145 num_packets,
146 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
147 for (size_t i = 0; i < num_packets; ++i) {
148 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
149 &manager_, packets[i]))
150 << " packets[" << i << "]:" << packets[i];
151 }
152 }
153
154 void ExpectAck(uint64_t largest_observed) {
155 EXPECT_CALL(
156 *send_algorithm_,
157 // Ensure the AckedPacketVector argument contains largest_observed.
158 OnCongestionEvent(true, _, _,
159 Pointwise(PacketNumberEq(), {largest_observed}),
160 IsEmpty()));
161 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
162 }
163
dschinazi17d42422019-06-18 16:35:07 -0700164 void ExpectUpdatedRtt(uint64_t /*largest_observed*/) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165 EXPECT_CALL(*send_algorithm_,
166 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
167 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
168 }
169
170 void ExpectAckAndLoss(bool rtt_updated,
171 uint64_t largest_observed,
172 uint64_t lost_packet) {
173 EXPECT_CALL(
174 *send_algorithm_,
175 OnCongestionEvent(rtt_updated, _, _,
176 Pointwise(PacketNumberEq(), {largest_observed}),
177 Pointwise(PacketNumberEq(), {lost_packet})));
178 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
179 }
180
181 // |packets_acked| and |packets_lost| should be in packet number order.
182 void ExpectAcksAndLosses(bool rtt_updated,
183 uint64_t* packets_acked,
184 size_t num_packets_acked,
185 uint64_t* packets_lost,
186 size_t num_packets_lost) {
187 std::vector<QuicPacketNumber> ack_vector;
188 for (size_t i = 0; i < num_packets_acked; ++i) {
189 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
190 }
191 std::vector<QuicPacketNumber> lost_vector;
192 for (size_t i = 0; i < num_packets_lost; ++i) {
193 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
194 }
195 EXPECT_CALL(*send_algorithm_,
196 OnCongestionEvent(rtt_updated, _, _,
197 Pointwise(PacketNumberEq(), ack_vector),
198 Pointwise(PacketNumberEq(), lost_vector)));
199 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
200 .Times(AnyNumber());
201 }
202
203 void RetransmitAndSendPacket(uint64_t old_packet_number,
204 uint64_t new_packet_number) {
205 RetransmitAndSendPacket(old_packet_number, new_packet_number,
206 TLP_RETRANSMISSION);
207 }
208
209 void RetransmitAndSendPacket(uint64_t old_packet_number,
210 uint64_t new_packet_number,
211 TransmissionType transmission_type) {
212 bool is_lost = false;
fayangcff885a2019-10-22 07:39:04 -0700213 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
214 transmission_type == TLP_RETRANSMISSION ||
215 transmission_type == RTO_RETRANSMISSION ||
216 transmission_type == PROBING_RETRANSMISSION) {
217 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
218 .WillOnce(WithArgs<1>(
219 Invoke([this, new_packet_number](TransmissionType type) {
220 RetransmitDataPacket(new_packet_number, type);
221 })));
222 } else {
223 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
224 is_lost = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500225 }
226 QuicSentPacketManagerPeer::MarkForRetransmission(
227 &manager_, old_packet_number, transmission_type);
fayangcff885a2019-10-22 07:39:04 -0700228 if (!is_lost) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 return;
230 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500231 EXPECT_CALL(
232 *send_algorithm_,
233 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
234 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
fayangcff885a2019-10-22 07:39:04 -0700235 SerializedPacket packet(CreatePacket(new_packet_number, true));
236 manager_.OnPacketSent(&packet, clock_.Now(), transmission_type,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500237 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 }
239
240 SerializedPacket CreateDataPacket(uint64_t packet_number) {
241 return CreatePacket(packet_number, true);
242 }
243
244 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
245 SerializedPacket packet(QuicPacketNumber(packet_number),
246 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
247 false, false);
248 if (retransmittable) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800249 packet.retransmittable_frames.push_back(QuicFrame(
250 QuicStreamFrame(kStreamId, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500251 }
252 return packet;
253 }
254
zhongyi1b2f7832019-06-14 13:31:34 -0700255 SerializedPacket CreatePingPacket(uint64_t packet_number) {
256 SerializedPacket packet(QuicPacketNumber(packet_number),
257 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
258 false, false);
259 packet.retransmittable_frames.push_back(QuicFrame(QuicPingFrame()));
260 return packet;
261 }
262
QUICHE teama6ef0a62019-03-07 20:34:33 -0500263 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700264 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
265 }
266
267 void SendDataPacket(uint64_t packet_number,
268 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500269 EXPECT_CALL(*send_algorithm_,
270 OnPacketSent(_, BytesInFlight(),
271 QuicPacketNumber(packet_number), _, _));
272 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700273 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700274 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
275 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 }
277
zhongyi1b2f7832019-06-14 13:31:34 -0700278 void SendPingPacket(uint64_t packet_number,
279 EncryptionLevel encryption_level) {
280 EXPECT_CALL(*send_algorithm_,
281 OnPacketSent(_, BytesInFlight(),
282 QuicPacketNumber(packet_number), _, _));
283 SerializedPacket packet(CreatePingPacket(packet_number));
284 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700285 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
286 HAS_RETRANSMITTABLE_DATA);
zhongyi1b2f7832019-06-14 13:31:34 -0700287 }
288
QUICHE teama6ef0a62019-03-07 20:34:33 -0500289 void SendCryptoPacket(uint64_t packet_number) {
290 EXPECT_CALL(
291 *send_algorithm_,
292 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
293 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
294 SerializedPacket packet(CreatePacket(packet_number, false));
295 packet.retransmittable_frames.push_back(
dmcardlecf0bfcf2019-12-13 08:08:21 -0800296 QuicFrame(QuicStreamFrame(1, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500297 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -0700298 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
299 HAS_RETRANSMITTABLE_DATA);
300 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500301 }
302
303 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
fayang06bb1b02019-06-14 14:07:12 -0700304 SendAckPacket(packet_number, largest_acked, ENCRYPTION_INITIAL);
305 }
306
307 void SendAckPacket(uint64_t packet_number,
308 uint64_t largest_acked,
309 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500310 EXPECT_CALL(
311 *send_algorithm_,
312 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
313 kDefaultLength, NO_RETRANSMITTABLE_DATA));
314 SerializedPacket packet(CreatePacket(packet_number, false));
315 packet.largest_acked = QuicPacketNumber(largest_acked);
fayang06bb1b02019-06-14 14:07:12 -0700316 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -0700317 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
318 NO_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500319 }
320
fayangce0a3162019-08-15 09:05:36 -0700321 void EnablePto(QuicTag tag) {
fayangce0a3162019-08-15 09:05:36 -0700322 QuicConfig config;
323 QuicTagVector options;
324 options.push_back(tag);
325 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
326 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
327 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
328 manager_.SetFromConfig(config);
fayang62f867a2019-08-22 12:05:01 -0700329 EXPECT_TRUE(manager_.pto_enabled());
fayangce0a3162019-08-15 09:05:36 -0700330 }
331
QUICHE teama6ef0a62019-03-07 20:34:33 -0500332 QuicSentPacketManager manager_;
333 MockClock clock_;
334 QuicConnectionStats stats_;
335 MockSendAlgorithm* send_algorithm_;
336 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
337 StrictMock<MockSessionNotifier> notifier_;
338};
339
fayangcff885a2019-10-22 07:39:04 -0700340TEST_F(QuicSentPacketManagerTest, IsUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500341 VerifyUnackedPackets(nullptr, 0);
342 SendDataPacket(1);
343
344 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800345 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500346 uint64_t retransmittable[] = {1};
347 VerifyRetransmittablePackets(retransmittable,
bnc4e9283d2019-12-17 07:08:57 -0800348 QUICHE_ARRAYSIZE(retransmittable));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500349}
350
fayangcff885a2019-10-22 07:39:04 -0700351TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500352 SendDataPacket(1);
353 RetransmitAndSendPacket(1, 2);
354
355 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
356 uint64_t unacked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800357 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700358 std::vector<uint64_t> retransmittable = {1, 2};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500359 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
360}
361
fayangcff885a2019-10-22 07:39:04 -0700362TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500363 SendDataPacket(1);
364 RetransmitAndSendPacket(1, 2);
365
366 // Ack 2 but not 1.
367 ExpectAck(2);
368 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
369 clock_.Now());
370 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700371 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700372 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
373 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700374 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 // Packet 1 is unacked, pending, but not retransmittable.
376 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800377 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700378 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500379 VerifyRetransmittablePackets(nullptr, 0);
380}
381
fayangcff885a2019-10-22 07:39:04 -0700382TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500383 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700384 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
385 .WillOnce(WithArgs<1>(Invoke(
386 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
388 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500389 // Ack 1.
390 ExpectAck(1);
391 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
392 clock_.Now());
393 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700394 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700395 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
396 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500397
fayangcff885a2019-10-22 07:39:04 -0700398 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
399 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800400 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700401 // We do not know packet 2 is a spurious retransmission until it gets acked.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 VerifyRetransmittablePackets(nullptr, 0);
403 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
404}
405
fayangcff885a2019-10-22 07:39:04 -0700406TEST_F(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700408 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500409 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
410 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411
fayangcff885a2019-10-22 07:39:04 -0700412 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500413
414 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800415 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500416 VerifyRetransmittablePackets(nullptr, 0);
417 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
418}
419
fayangcff885a2019-10-22 07:39:04 -0700420TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500421 SendDataPacket(1);
422 RetransmitAndSendPacket(1, 2);
423 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
424 clock_.AdvanceTime(rtt);
425
426 // Ack 1 but not 2.
427 ExpectAck(1);
428 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
429 clock_.Now());
430 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700431 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700432 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
433 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700434 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500435 // 2 remains unacked, but no packets have retransmittable data.
436 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800437 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700438 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500439 VerifyRetransmittablePackets(nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -0700440 // Ack 2 causes 2 be considered as spurious retransmission.
441 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
442 ExpectAck(2);
443 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
444 clock_.Now());
445 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
446 EXPECT_EQ(PACKETS_NEWLY_ACKED,
447 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
448 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500449
450 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
451}
452
fayangcff885a2019-10-22 07:39:04 -0700453TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500454 SendDataPacket(1);
455 RetransmitAndSendPacket(1, 2);
456 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
457 clock_.AdvanceTime(rtt);
458
459 // First, ACK packet 1 which makes packet 2 non-retransmittable.
460 ExpectAck(1);
461 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
462 clock_.Now());
463 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700464 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700465 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
466 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500467
468 SendDataPacket(3);
469 SendDataPacket(4);
470 SendDataPacket(5);
471 clock_.AdvanceTime(rtt);
472
473 // Next, NACK packet 2 three times.
fayang3be090d2020-02-11 14:05:08 -0800474 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
475 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
476 ExpectAckAndLoss(true, 3, 2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500477 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
478 clock_.Now());
479 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
480 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700481 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700482 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
483 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500484
485 ExpectAck(4);
486 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
487 clock_.Now());
488 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
489 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700490 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700491 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
492 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500493
fayang3be090d2020-02-11 14:05:08 -0800494 ExpectAck(5);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500495 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
496 clock_.Now());
497 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
498 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700499 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700500 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
501 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500502
fayangcff885a2019-10-22 07:39:04 -0700503 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800504 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700505 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506 VerifyRetransmittablePackets(nullptr, 0);
507
508 // Verify that the retransmission alarm would not fire,
509 // since there is no retransmittable data outstanding.
510 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
511}
512
fayangcff885a2019-10-22 07:39:04 -0700513TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500514 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
515 SendDataPacket(1);
516 RetransmitAndSendPacket(1, 2);
517
518 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
519 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
520 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
521 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500522
523 // Ack 1 but not 2, before 2 is able to be sent.
524 // Since 1 has been retransmitted, it has already been lost, and so the
525 // send algorithm is not informed that it has been ACK'd.
526 ExpectUpdatedRtt(1);
527 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
528 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
529 clock_.Now());
530 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700531 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700532 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
533 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500534
535 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
536 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800537 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700538 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500539 VerifyRetransmittablePackets(nullptr, 0);
540
541 // Verify that the retransmission alarm would not fire,
542 // since there is no retransmittable data outstanding.
543 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
544}
545
fayangcff885a2019-10-22 07:39:04 -0700546TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500547 StrictMock<MockDebugDelegate> debug_delegate;
fayangcff885a2019-10-22 07:39:04 -0700548 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION,
549 kDefaultLength))
550 .Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500551 manager_.SetDebugDelegate(&debug_delegate);
552
553 SendDataPacket(1);
554 RetransmitAndSendPacket(1, 2);
555 RetransmitAndSendPacket(2, 3);
556 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
557 clock_.AdvanceTime(rtt);
558
559 // Ack 1 but not 2 or 3.
560 ExpectAck(1);
561 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
562 clock_.Now());
563 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700564 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700565 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
566 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700567 // Frames in packets 2 and 3 are acked.
568 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
569 .Times(2)
570 .WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500571
572 // 2 and 3 remain unacked, but no packets have retransmittable data.
573 uint64_t unacked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -0800574 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700575 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500576 VerifyRetransmittablePackets(nullptr, 0);
577
578 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
579 SendDataPacket(4);
fayangcff885a2019-10-22 07:39:04 -0700580 // No new data gets acked in packet 3.
581 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
582 .WillOnce(Return(false))
583 .WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500584 uint64_t acked[] = {3, 4};
bnc4e9283d2019-12-17 07:08:57 -0800585 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500586 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
587 clock_.Now());
588 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
589 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700590 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700591 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
592 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500593
594 uint64_t unacked2[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800595 VerifyUnackedPackets(unacked2, QUICHE_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700596 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500597
598 SendDataPacket(5);
599 ExpectAckAndLoss(true, 5, 2);
600 EXPECT_CALL(debug_delegate,
601 OnPacketLoss(QuicPacketNumber(2), LOSS_RETRANSMISSION, _));
fayangcff885a2019-10-22 07:39:04 -0700602 // Frames in all packets are acked.
603 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
604 // Notify session that stream frame in packet 2 gets lost although it is
605 // not outstanding.
606 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500607 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
608 clock_.Now());
609 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
610 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700611 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700612 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
613 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500614
fayangcff885a2019-10-22 07:39:04 -0700615 uint64_t unacked3[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800616 VerifyUnackedPackets(unacked3, QUICHE_ARRAYSIZE(unacked3));
ianswett67d7a3c2019-04-19 10:58:47 -0700617 EXPECT_FALSE(manager_.HasInFlightPackets());
fayangcff885a2019-10-22 07:39:04 -0700618 // Spurious retransmission is detected when packet 3 gets acked. We cannot
619 // know packet 2 is a spurious until it gets acked.
620 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500621}
622
fayangcff885a2019-10-22 07:39:04 -0700623TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
vasilvv0fc587f2019-09-06 13:33:08 -0700624 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500625 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
626
627 SendDataPacket(1);
628 RetransmitAndSendPacket(1, 2);
629
630 // Ack original transmission, but that wasn't lost via fast retransmit,
631 // so no call on OnSpuriousRetransmission is expected.
632 {
633 ExpectAck(1);
634 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
635 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
636 clock_.Now());
637 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700638 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700639 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
640 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500641 }
642
643 SendDataPacket(3);
644 SendDataPacket(4);
645 // Ack 4, which causes 3 to be retransmitted.
646 {
647 ExpectAck(4);
648 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
649 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
650 clock_.Now());
651 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
652 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700653 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700654 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
655 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500656 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
657 }
658
659 // Ack 3, which causes SpuriousRetransmitDetected to be called.
660 {
661 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800662 ExpectAcksAndLosses(false, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500663 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
fayangcc4ea6a2019-10-25 08:44:03 -0700664 EXPECT_CALL(*loss_algorithm,
665 SpuriousLossDetected(_, _, _, QuicPacketNumber(3),
666 QuicPacketNumber(4)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500667 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
668 clock_.Now());
669 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
670 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700671 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700672 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
673 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700674 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
675 // 5 will cause 5 be considered as a spurious retransmission as no new
676 // data gets acked.
677 ExpectAck(5);
678 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
679 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
680 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
681 clock_.Now());
682 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
683 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
684 EXPECT_EQ(PACKETS_NEWLY_ACKED,
685 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
686 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500687 }
688}
689
fayangcff885a2019-10-22 07:39:04 -0700690TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500691 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
692}
693
fayangcff885a2019-10-22 07:39:04 -0700694TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500695 SendDataPacket(1);
696 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
697}
698
fayangcff885a2019-10-22 07:39:04 -0700699TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500700 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
701 SendDataPacket(1);
702 SendAckPacket(2, 1);
703
704 // Now ack the ack and expect an RTT update.
705 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800706 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500707 manager_.OnAckFrameStart(QuicPacketNumber(2),
708 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
709 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700710 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700711 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
712 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500713 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
714
715 SendAckPacket(3, 3);
716
717 // Now ack the ack and expect only an RTT update.
718 uint64_t acked2[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800719 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500720 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
721 clock_.Now());
722 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700723 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700724 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
725 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500726 EXPECT_EQ(QuicPacketNumber(3u),
727 manager_.largest_packet_peer_knows_is_acked());
728}
729
fayangcff885a2019-10-22 07:39:04 -0700730TEST_F(QuicSentPacketManagerTest, Rtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500731 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
732 SendDataPacket(1);
733 clock_.AdvanceTime(expected_rtt);
734
735 ExpectAck(1);
736 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
737 clock_.Now());
738 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700739 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700740 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
741 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500742 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
743}
744
fayangcff885a2019-10-22 07:39:04 -0700745TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500746 // Expect that the RTT is equal to the local time elapsed, since the
747 // ack_delay_time is larger than the local time elapsed
748 // and is hence invalid.
749 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
750 SendDataPacket(1);
751 clock_.AdvanceTime(expected_rtt);
752
753 ExpectAck(1);
754 manager_.OnAckFrameStart(QuicPacketNumber(1),
755 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
756 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700757 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700758 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
759 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500760 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
761}
762
fayangcff885a2019-10-22 07:39:04 -0700763TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500764 // Expect that the RTT is equal to the local time elapsed, since the
765 // ack_delay_time is infinite, and is hence invalid.
766 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
767 SendDataPacket(1);
768 clock_.AdvanceTime(expected_rtt);
769
770 ExpectAck(1);
771 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
772 clock_.Now());
773 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700774 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700775 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
776 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500777 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
778}
779
wub8ee29a02019-12-12 13:06:48 -0800780TEST_F(QuicSentPacketManagerTest, RttWithDeltaExceedingLimit) {
781 // Initialize min and smoothed rtt to 10ms.
782 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
783 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
784 QuicTime::Delta::Zero(), QuicTime::Zero());
785
786 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(100);
787 QuicTime::Delta ack_delay =
788 QuicTime::Delta::FromMilliseconds(5) + manager_.peer_max_ack_delay();
789 ASSERT_GT(send_delta - rtt_stats->min_rtt(), ack_delay);
790 SendDataPacket(1);
791 clock_.AdvanceTime(send_delta);
792
793 ExpectAck(1);
794 manager_.OnAckFrameStart(QuicPacketNumber(1), ack_delay, clock_.Now());
795 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
796 EXPECT_EQ(PACKETS_NEWLY_ACKED,
797 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
798 ENCRYPTION_FORWARD_SECURE));
799
800 QuicTime::Delta expected_rtt_sample =
wub81c9b662020-02-14 09:08:07 -0800801 send_delta - manager_.peer_max_ack_delay();
wub8ee29a02019-12-12 13:06:48 -0800802 EXPECT_EQ(expected_rtt_sample, manager_.GetRttStats()->latest_rtt());
803}
804
fayangcff885a2019-10-22 07:39:04 -0700805TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500806 // Expect that the RTT is the time between send and receive since the
807 // ack_delay_time is zero.
808 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
809 SendDataPacket(1);
810 clock_.AdvanceTime(expected_rtt);
811
812 ExpectAck(1);
813 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
814 clock_.Now());
815 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700816 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700817 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
818 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500819 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
820}
821
fayangcff885a2019-10-22 07:39:04 -0700822TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500823 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
824
825 // Send 1 packet.
826 SendDataPacket(1);
827
828 // The first tail loss probe retransmits 1 packet.
829 manager_.OnRetransmissionTimeout();
830 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700831 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
832 .WillOnce(WithArgs<1>(Invoke(
833 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500834 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500835
836 // The second tail loss probe retransmits 1 packet.
837 manager_.OnRetransmissionTimeout();
838 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700839 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
840 .WillOnce(WithArgs<1>(Invoke(
841 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500842 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500843 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
844 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500845
846 // Ack the third and ensure the first two are still pending.
847 ExpectAck(3);
848
849 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
850 clock_.Now());
851 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700852 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700853 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
854 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500855
ianswett67d7a3c2019-04-19 10:58:47 -0700856 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500857
858 // Acking two more packets will lose both of them due to nacks.
859 SendDataPacket(4);
860 SendDataPacket(5);
861 uint64_t acked[] = {4, 5};
862 uint64_t lost[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800863 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
864 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -0700865 // Frames in all packets are acked.
866 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
867 // Notify session that stream frame in packets 1 and 2 get lost although
868 // they are not outstanding.
869 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500870 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
871 clock_.Now());
872 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700873 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700874 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
875 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500876
ianswett67d7a3c2019-04-19 10:58:47 -0700877 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500878 EXPECT_EQ(2u, stats_.tlp_count);
879 EXPECT_EQ(0u, stats_.rto_count);
880}
881
fayangcff885a2019-10-22 07:39:04 -0700882TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500883 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
884
885 // Send 100 packets.
886 const size_t kNumSentPackets = 100;
887 for (size_t i = 1; i <= kNumSentPackets; ++i) {
888 SendDataPacket(i);
889 }
890 QuicTime rto_packet_time = clock_.Now();
891 // Advance the time.
892 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
893
894 // The first tail loss probe retransmits 1 packet.
895 manager_.OnRetransmissionTimeout();
896 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700897 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
898 .WillOnce(WithArgs<1>(Invoke(
899 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500900 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500901 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
902 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500903 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
904
905 // The second tail loss probe retransmits 1 packet.
906 manager_.OnRetransmissionTimeout();
907 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700908 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
909 .WillOnce(WithArgs<1>(Invoke(
910 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500911 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500912 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
913 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
914
915 // Ensure the RTO is set based on the correct packet.
916 rto_packet_time = clock_.Now();
917 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
918 manager_.GetRetransmissionTime());
919
920 // Advance the time enough to ensure all packets are RTO'd.
921 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
922
fayangcff885a2019-10-22 07:39:04 -0700923 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
924 .Times(2)
925 .WillOnce(WithArgs<1>(Invoke(
926 [this](TransmissionType type) { RetransmitDataPacket(103, type); })))
927 .WillOnce(WithArgs<1>(Invoke(
928 [this](TransmissionType type) { RetransmitDataPacket(104, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500929 manager_.OnRetransmissionTimeout();
930 EXPECT_EQ(2u, stats_.tlp_count);
931 EXPECT_EQ(1u, stats_.rto_count);
fayangcff885a2019-10-22 07:39:04 -0700932 // There are 2 RTO retransmissions.
933 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500934 QuicPacketNumber largest_acked = QuicPacketNumber(103);
935 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
936 EXPECT_CALL(*send_algorithm_,
937 OnCongestionEvent(
938 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
939 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -0700940 // Although frames in packet 3 gets acked, it would be kept for another
941 // RTT.
942 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
943 // Packets [1, 102] are lost, although stream frame in packet 3 is not
944 // outstanding.
945 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500946 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
947 clock_.Now());
948 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -0700949 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700950 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
951 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500952 // All packets before 103 should be lost.
fayangcff885a2019-10-22 07:39:04 -0700953 // Packet 104 is still in flight.
954 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500955}
956
fayangcff885a2019-10-22 07:39:04 -0700957TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500958 // Send 2 crypto packets and 3 data packets.
959 const size_t kNumSentCryptoPackets = 2;
960 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
961 SendCryptoPacket(i);
962 }
963 const size_t kNumSentDataPackets = 3;
964 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
965 SendDataPacket(kNumSentCryptoPackets + i);
966 }
ianswett0cc36802019-04-20 03:04:09 -0700967 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -0700968 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500969
970 // The first retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700971 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
972 .Times(2)
973 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
974 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500975 manager_.OnRetransmissionTimeout();
ianswett898306b2019-04-23 11:05:57 -0700976 // Expect all 4 handshake packets to be in flight and 3 data packets.
ianswett04004652019-09-03 18:46:57 -0700977 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -0700978 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500979
980 // The second retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700981 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
982 .Times(2)
983 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
984 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500985 manager_.OnRetransmissionTimeout();
ianswett04004652019-09-03 18:46:57 -0700986 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -0700987 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500988
989 // Now ack the two crypto packets and the speculatively encrypted request,
990 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett04004652019-09-03 18:46:57 -0700991 // Crypto packets remain in flight, so any that aren't acked will be lost.
992 uint64_t acked[] = {3, 4, 5, 8, 9};
993 uint64_t lost[] = {1, 2, 6};
bnc4e9283d2019-12-17 07:08:57 -0800994 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
995 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -0700996 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
997 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500998 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
999 clock_.Now());
1000 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1001 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001002 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001003 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1004 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001005
ianswett0cc36802019-04-20 03:04:09 -07001006 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001007}
1008
fayangcff885a2019-10-22 07:39:04 -07001009TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001010 // Send 2 crypto packets and 3 data packets.
1011 const size_t kNumSentCryptoPackets = 2;
1012 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1013 SendCryptoPacket(i);
1014 }
1015 const size_t kNumSentDataPackets = 3;
1016 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1017 SendDataPacket(kNumSentCryptoPackets + i);
1018 }
ianswett0cc36802019-04-20 03:04:09 -07001019 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001020
fayangcff885a2019-10-22 07:39:04 -07001021 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1022 .Times(2)
1023 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1024 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001025 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001026 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001027
1028 // Now act like a version negotiation packet arrived, which would cause all
1029 // unacked packets to be retransmitted.
fayangcff885a2019-10-22 07:39:04 -07001030 // Mark packets [1, 7] lost. And the frames in 6 and 7 are same as packets 1
1031 // and 2, respectively.
1032 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(7);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001033 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1034
1035 // Ensure the first two pending packets are the crypto retransmits.
fayangcff885a2019-10-22 07:39:04 -07001036 RetransmitCryptoPacket(8);
1037 RetransmitCryptoPacket(9);
1038 RetransmitDataPacket(10, ALL_UNACKED_RETRANSMISSION);
1039 RetransmitDataPacket(11, ALL_UNACKED_RETRANSMISSION);
1040 RetransmitDataPacket(12, ALL_UNACKED_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001041
1042 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
1043 // Least unacked isn't raised until an ack is received, so ack the
1044 // crypto packets.
1045 uint64_t acked[] = {8, 9};
bnc4e9283d2019-12-17 07:08:57 -08001046 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001047 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1048 clock_.Now());
1049 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
fayang3eb82212019-04-16 12:05:46 -07001050 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001051 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1052 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -07001053 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001054 EXPECT_EQ(QuicPacketNumber(10u), manager_.GetLeastUnacked());
1055}
1056
fayangcff885a2019-10-22 07:39:04 -07001057TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001058 // Send 1 crypto packet.
1059 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001060 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001061
1062 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001063 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1064 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001065 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001066
1067 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001068 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1069 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001070 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001071
1072 // Now ack the second crypto packet, and ensure the first gets removed, but
1073 // the third does not.
1074 uint64_t acked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -08001075 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -07001076 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1077 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001078 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1079 clock_.Now());
1080 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001081 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001082 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1083 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001084
ianswett0cc36802019-04-20 03:04:09 -07001085 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett04004652019-09-03 18:46:57 -07001086 uint64_t unacked[] = {1, 3};
bnc4e9283d2019-12-17 07:08:57 -08001087 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001088}
1089
fayangcff885a2019-10-22 07:39:04 -07001090TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001091 // Send 2 crypto packets and 1 data packet.
1092 const size_t kNumSentCryptoPackets = 2;
1093 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1094 SendCryptoPacket(i);
1095 }
1096 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001097 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001098
1099 // Retransmit 2 crypto packets, but not the serialized packet.
fayangcff885a2019-10-22 07:39:04 -07001100 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1101 .Times(2)
1102 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1103 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001104 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001105 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001106}
1107
fayangcff885a2019-10-22 07:39:04 -07001108TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001109 CryptoHandshakeRetransmissionThenRetransmitAll) {
1110 // Send 1 crypto packet.
1111 SendCryptoPacket(1);
1112
ianswett0cc36802019-04-20 03:04:09 -07001113 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001114
1115 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001116 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1117 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001118 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001119 // Now retransmit all the unacked packets, which occurs when there is a
1120 // version negotiation.
fayangcff885a2019-10-22 07:39:04 -07001121 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001122 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
fayangcff885a2019-10-22 07:39:04 -07001123 // Both packets 1 and 2 are unackable.
1124 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(1)));
1125 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(2)));
ianswett0cc36802019-04-20 03:04:09 -07001126 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001127 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001128}
1129
fayangcff885a2019-10-22 07:39:04 -07001130TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001131 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1132 // Send 1 crypto packet.
1133 SendCryptoPacket(1);
1134
ianswett0cc36802019-04-20 03:04:09 -07001135 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001136
1137 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001138 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1139 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001140 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001141 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001142
1143 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001144 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1145 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001146 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001147 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001148
1149 // Now neuter all unacked unencrypted packets, which occurs when the
1150 // connection goes forward secure.
fayangcff885a2019-10-22 07:39:04 -07001151 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1152 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
fayang93c83942019-11-07 10:41:16 -08001153 manager_.NeuterUnencryptedPackets();
ianswett0cc36802019-04-20 03:04:09 -07001154 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001155 uint64_t unacked[] = {1, 2, 3};
bnc4e9283d2019-12-17 07:08:57 -08001156 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001157 VerifyRetransmittablePackets(nullptr, 0);
ianswett0cc36802019-04-20 03:04:09 -07001158 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001159 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001160
1161 // Ensure both packets get discarded when packet 2 is acked.
1162 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -08001163 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001164 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1165 clock_.Now());
1166 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001167 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001168 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1169 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001170 VerifyUnackedPackets(nullptr, 0);
1171 VerifyRetransmittablePackets(nullptr, 0);
1172}
1173
fayangcff885a2019-10-22 07:39:04 -07001174TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001175 StrictMock<MockDebugDelegate> debug_delegate;
1176 manager_.SetDebugDelegate(&debug_delegate);
1177
1178 // Send 100 packets.
1179 const size_t kNumSentPackets = 100;
1180 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1181 SendDataPacket(i);
1182 }
1183
1184 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001185 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1186 .Times(2)
1187 .WillOnce(WithArgs<1>(Invoke(
1188 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1189 .WillOnce(WithArgs<1>(Invoke(
1190 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001191 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001192 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001193
1194 // Ack a retransmission.
1195 // Ensure no packets are lost.
1196 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1197 EXPECT_CALL(*send_algorithm_,
1198 OnCongestionEvent(true, _, _,
1199 Pointwise(PacketNumberEq(), {largest_acked}),
1200 /*lost_packets=*/IsEmpty()));
1201 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1202 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1203 // RTO's use loss detection instead of immediately declaring retransmitted
1204 // packets lost.
1205 for (int i = 1; i <= 99; ++i) {
1206 EXPECT_CALL(debug_delegate,
1207 OnPacketLoss(QuicPacketNumber(i), LOSS_RETRANSMISSION, _));
1208 }
fayangcff885a2019-10-22 07:39:04 -07001209 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1210 // Packets [1, 99] are considered as lost, although stream frame in packet
1211 // 2 is not outstanding.
1212 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001213 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1214 clock_.Now());
1215 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001216 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001217 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1218 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001219}
1220
fayangcff885a2019-10-22 07:39:04 -07001221TEST_F(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001222 // Set the 1RTO connection option.
1223 QuicConfig client_config;
1224 QuicTagVector options;
1225 options.push_back(k1RTO);
1226 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1227 client_config.SetConnectionOptionsToSend(options);
1228 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1229 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1230 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1231 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1232 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1233 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1234 manager_.SetFromConfig(client_config);
1235 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1236
1237 StrictMock<MockDebugDelegate> debug_delegate;
1238 manager_.SetDebugDelegate(&debug_delegate);
1239
1240 // Send 100 packets.
1241 const size_t kNumSentPackets = 100;
1242 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1243 SendDataPacket(i);
1244 }
1245
1246 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001247 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1248 .Times(1)
1249 .WillOnce(WithArgs<1>(Invoke(
1250 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001251 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001252 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001253}
1254
fayangcff885a2019-10-22 07:39:04 -07001255TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001256 QuicConfig client_config;
1257 QuicTagVector options;
1258 options.push_back(kNRTO);
1259 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1260 client_config.SetConnectionOptionsToSend(options);
1261 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1262 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1263 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1264 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1265 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1266 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1267 manager_.SetFromConfig(client_config);
1268 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1269 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1270
1271 // Send 100 packets.
1272 const size_t kNumSentPackets = 100;
1273 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1274 SendDataPacket(i);
1275 }
1276
1277 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001278 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1279 .Times(2)
1280 .WillOnce(WithArgs<1>(Invoke(
1281 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1282 .WillOnce(WithArgs<1>(Invoke(
1283 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001285 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001286
1287 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1288 // This will include packets in the lost packet map.
1289 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1290 EXPECT_CALL(*send_algorithm_,
1291 OnCongestionEvent(true, _, _,
1292 Pointwise(PacketNumberEq(), {largest_acked}),
1293 /*lost_packets=*/Not(IsEmpty())));
1294 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -07001295 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1296 // Packets [1, 99] are considered as lost, although stream frame in packet
1297 // 2 is not outstanding.
1298 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001299 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1300 clock_.Now());
1301 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001302 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001303 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1304 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001305}
1306
fayangcff885a2019-10-22 07:39:04 -07001307TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001308 // Send 1 packet.
1309 SendDataPacket(1);
1310
fayangcff885a2019-10-22 07:39:04 -07001311 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1312 .WillOnce(WithArgs<1>(Invoke(
1313 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001314 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001315 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001316
1317 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001318 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1319 .WillOnce(WithArgs<1>(Invoke(
1320 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001321 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001322 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001323
1324 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1325 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1326 ExpectAck(2);
1327 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1328 clock_.Now());
1329 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001330 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001331 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1332 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001333
1334 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001335 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001336}
1337
fayangcff885a2019-10-22 07:39:04 -07001338TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001339 // Send 1 packet.
1340 SendDataPacket(1);
1341
fayangcff885a2019-10-22 07:39:04 -07001342 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1343 .WillOnce(WithArgs<1>(Invoke(
1344 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001345 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001346 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001347
1348 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001349 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1350 .WillOnce(WithArgs<1>(Invoke(
1351 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001352 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001353 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001354
1355 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1356 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1357 ExpectAck(3);
1358 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1359 clock_.Now());
1360 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001361 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001362 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1363 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001364
1365 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001366 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001367}
1368
fayangcff885a2019-10-22 07:39:04 -07001369TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1371}
1372
fayangcff885a2019-10-22 07:39:04 -07001373TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001374 QuicTime crypto_packet_send_time = clock_.Now();
1375 SendCryptoPacket(1);
1376
1377 // Check the min.
1378 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1379 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1380 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1381 manager_.GetRetransmissionTime());
1382
1383 // Test with a standard smoothed RTT.
1384 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1385
1386 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1387 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1388 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1389
1390 // Retransmit the packet by invoking the retransmission timeout.
1391 clock_.AdvanceTime(1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001392 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1393 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1394 // When session decides what to write, crypto_packet_send_time gets updated.
1395 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001396 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001397
1398 // The retransmission time should now be twice as far in the future.
1399 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1400 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1401
1402 // Retransmit the packet for the 2nd time.
1403 clock_.AdvanceTime(2 * 1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001404 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1405 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1406 // When session decides what to write, crypto_packet_send_time gets updated.
1407 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001408 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001409
1410 // Verify exponential backoff of the retransmission timeout.
1411 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1412 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1413}
1414
fayangcff885a2019-10-22 07:39:04 -07001415TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001416 GetConservativeTransmissionTimeCryptoHandshake) {
1417 QuicConfig config;
1418 QuicTagVector options;
1419 options.push_back(kCONH);
1420 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1421 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1422 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1423 manager_.SetFromConfig(config);
1424 // Calling SetFromConfig requires mocking out some send algorithm methods.
1425 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1426 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1427 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1428 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1429
1430 QuicTime crypto_packet_send_time = clock_.Now();
1431 SendCryptoPacket(1);
1432
1433 // Check the min.
1434 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1435 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1436 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1437 manager_.GetRetransmissionTime());
1438
1439 // Test with a standard smoothed RTT.
1440 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1441
1442 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1443 QuicTime expected_time = clock_.Now() + 2 * srtt;
1444 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1445
1446 // Retransmit the packet by invoking the retransmission timeout.
1447 clock_.AdvanceTime(2 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001448 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1449 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1450 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001451 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001452
1453 // The retransmission time should now be twice as far in the future.
1454 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1455 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1456}
1457
fayangcff885a2019-10-22 07:39:04 -07001458TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001459 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1460 SendDataPacket(1);
1461 SendDataPacket(2);
1462
1463 // Check the min.
1464 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1465 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1466 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1467 manager_.GetRetransmissionTime());
1468
1469 // Test with a standard smoothed RTT.
1470 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1471 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1472 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1473 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1474 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1475
1476 // Retransmit the packet by invoking the retransmission timeout.
1477 clock_.AdvanceTime(expected_tlp_delay);
1478 manager_.OnRetransmissionTimeout();
1479 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -07001480 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1481 .WillOnce(WithArgs<1>(Invoke(
1482 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001483 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001484 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1485 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001486
1487 expected_time = clock_.Now() + expected_tlp_delay;
1488 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1489}
1490
fayangcff885a2019-10-22 07:39:04 -07001491TEST_F(QuicSentPacketManagerTest, TLPRWithPendingStreamData) {
zhongyi1b2f7832019-06-14 13:31:34 -07001492 QuicConfig config;
1493 QuicTagVector options;
1494
1495 options.push_back(kTLPR);
1496 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1497 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1498 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1499 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1500 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1501 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1502 .WillOnce(Return(10 * kDefaultTCPMSS));
1503 manager_.SetFromConfig(config);
1504 EXPECT_TRUE(
1505 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1506
1507 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1508
1509 SendDataPacket(1);
1510 SendDataPacket(2);
1511
1512 // Test with a standard smoothed RTT.
1513 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1514 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1515 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1516 // With pending stream data, TLPR is used.
1517 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1518 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(true));
1519
1520 EXPECT_EQ(expected_tlp_delay,
1521 manager_.GetRetransmissionTime() - clock_.Now());
1522
1523 // Retransmit the packet by invoking the retransmission timeout.
1524 clock_.AdvanceTime(expected_tlp_delay);
1525 manager_.OnRetransmissionTimeout();
1526 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001527 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1528 .WillOnce(WithArgs<1>(Invoke(
1529 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1530 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1531
1532 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1533 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001534
1535 // 2nd TLP.
1536 expected_tlp_delay = 2 * srtt;
1537 EXPECT_EQ(expected_tlp_delay,
1538 manager_.GetRetransmissionTime() - clock_.Now());
1539}
1540
fayangcff885a2019-10-22 07:39:04 -07001541TEST_F(QuicSentPacketManagerTest, TLPRWithoutPendingStreamData) {
zhongyi1b2f7832019-06-14 13:31:34 -07001542 QuicConfig config;
1543 QuicTagVector options;
1544
1545 options.push_back(kTLPR);
1546 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1547 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1548 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1549 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1550 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1551 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1552 .WillOnce(Return(10 * kDefaultTCPMSS));
1553 manager_.SetFromConfig(config);
1554 EXPECT_TRUE(
1555 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1556 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1557
1558 SendPingPacket(1, ENCRYPTION_INITIAL);
1559 SendPingPacket(2, ENCRYPTION_INITIAL);
1560
1561 // Test with a standard smoothed RTT.
1562 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1563 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1564 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1565 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
zhongyi9fa2be32019-09-10 12:39:01 -07001566 // With no pending stream data, TLPR is ignored.
1567 expected_tlp_delay = 2 * srtt;
zhongyi1b2f7832019-06-14 13:31:34 -07001568 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(false));
1569 EXPECT_EQ(expected_tlp_delay,
1570 manager_.GetRetransmissionTime() - clock_.Now());
1571
1572 // Retransmit the packet by invoking the retransmission timeout.
1573 clock_.AdvanceTime(expected_tlp_delay);
1574 manager_.OnRetransmissionTimeout();
1575 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001576 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1577 .WillOnce(WithArgs<1>(Invoke(
1578 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1579 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1580 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1581 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001582
1583 // 2nd TLP.
1584 expected_tlp_delay = 2 * srtt;
1585 EXPECT_EQ(expected_tlp_delay,
1586 manager_.GetRetransmissionTime() - clock_.Now());
1587}
1588
fayangcff885a2019-10-22 07:39:04 -07001589TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001590 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1591 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1592 QuicTime::Delta::Zero(), QuicTime::Zero());
1593
1594 SendDataPacket(1);
1595 SendDataPacket(2);
1596 SendDataPacket(3);
1597 SendDataPacket(4);
1598
1599 QuicTime::Delta expected_rto_delay =
1600 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1601 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1602 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1603
1604 // Retransmit the packet by invoking the retransmission timeout.
1605 clock_.AdvanceTime(expected_rto_delay);
fayangcff885a2019-10-22 07:39:04 -07001606 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1607 .Times(2)
1608 .WillOnce(WithArgs<1>(Invoke(
1609 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1610 .WillOnce(WithArgs<1>(Invoke(
1611 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001612 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001613 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001614 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001615
1616 // The delay should double the second time.
1617 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1618 // Once we always base the timer on the right edge, leaving the older packets
1619 // in flight doesn't change the timeout.
1620 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1621
1622 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1623 // original value and OnRetransmissionTimeout is not called or reverted.
fayang01983412019-12-07 05:50:22 -08001624 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08001625 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
wub8ee29a02019-12-12 13:06:48 -08001626 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001627 clock_.Now());
fayang01983412019-12-07 05:50:22 -08001628 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001629 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001630 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1631 ENCRYPTION_INITIAL));
fayang01983412019-12-07 05:50:22 -08001632 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633
1634 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1635 // and the TLP time. In production, there would always be two TLP's first.
1636 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1637 // by the latest RTT sample of 500ms.
1638 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
1639 // Once we always base the timer on the right edge, leaving the older packets
1640 // in flight doesn't change the timeout.
1641 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1642}
1643
fayangcff885a2019-10-22 07:39:04 -07001644TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001645 SendDataPacket(1);
1646 // Provide a 1ms RTT sample.
1647 const_cast<RttStats*>(manager_.GetRttStats())
1648 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
1649 QuicTime::Zero());
1650 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1651
1652 // If the delay is smaller than the min, ensure it exponentially backs off
1653 // from the min.
1654 for (int i = 0; i < 5; ++i) {
1655 EXPECT_EQ(delay,
1656 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1657 EXPECT_EQ(delay,
1658 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1659 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001660 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1661 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1662 RetransmitDataPacket(i + 2, type);
1663 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001664 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001665 }
1666}
1667
fayangcff885a2019-10-22 07:39:04 -07001668TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001669 SendDataPacket(1);
1670 // Provide a 60s RTT sample.
1671 const_cast<RttStats*>(manager_.GetRttStats())
1672 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
1673 QuicTime::Zero());
1674
1675 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1676 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1677 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1678 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1679}
1680
fayangcff885a2019-10-22 07:39:04 -07001681TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001682 SendDataPacket(1);
1683 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1684
1685 // Delay should back off exponentially.
1686 for (int i = 0; i < 5; ++i) {
1687 EXPECT_EQ(delay,
1688 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1689 EXPECT_EQ(delay,
1690 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1691 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001692 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1693 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1694 RetransmitDataPacket(i + 2, type);
1695 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001696 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001697 }
1698}
1699
fayangcff885a2019-10-22 07:39:04 -07001700TEST_F(QuicSentPacketManagerTest, RetransmissionDelay) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001701 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1702 const int64_t kRttMs = 250;
1703 const int64_t kDeviationMs = 5;
1704
1705 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
1706 QuicTime::Delta::Zero(), clock_.Now());
1707
1708 // Initial value is to set the median deviation to half of the initial rtt,
1709 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
1710 // is added which is the initial rtt.
1711 QuicTime::Delta expected_delay =
1712 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
1713 EXPECT_EQ(expected_delay,
1714 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1715 EXPECT_EQ(expected_delay,
1716 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1717
1718 for (int i = 0; i < 100; ++i) {
1719 // Run to make sure that we converge.
1720 rtt_stats->UpdateRtt(
1721 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
1722 QuicTime::Delta::Zero(), clock_.Now());
1723 rtt_stats->UpdateRtt(
1724 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
1725 QuicTime::Delta::Zero(), clock_.Now());
1726 }
1727 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
1728
1729 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
1730 EXPECT_NEAR(expected_delay.ToMilliseconds(),
1731 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
1732 .ToMilliseconds(),
1733 1);
1734 EXPECT_EQ(QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0),
1735 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1736}
1737
fayangcff885a2019-10-22 07:39:04 -07001738TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
vasilvv0fc587f2019-09-06 13:33:08 -07001739 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001740 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
1741
1742 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1743 .WillRepeatedly(Return(QuicTime::Zero()));
1744 SendDataPacket(1);
1745 SendDataPacket(2);
1746
1747 // Handle an ack which causes the loss algorithm to be evaluated and
1748 // set the loss timeout.
1749 ExpectAck(2);
1750 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1751 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1752 clock_.Now());
1753 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001754 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001755 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1756 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001757
1758 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
1759 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1760 .WillRepeatedly(Return(timeout));
1761 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1762
1763 // Fire the retransmission timeout and ensure the loss detection algorithm
1764 // is invoked.
1765 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1766 manager_.OnRetransmissionTimeout();
1767}
1768
fayangcff885a2019-10-22 07:39:04 -07001769TEST_F(QuicSentPacketManagerTest, NegotiateIetfLossDetectionFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001770 EXPECT_TRUE(
1771 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1772 EXPECT_FALSE(
1773 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1774 EXPECT_EQ(kDefaultLossDelayShift,
1775 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001776
1777 QuicConfig config;
1778 QuicTagVector options;
1779 options.push_back(kILD0);
1780 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1781 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1782 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1783 manager_.SetFromConfig(config);
1784
fayangb0c7b4b2019-09-12 06:45:24 -07001785 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1786 EXPECT_FALSE(
1787 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1788}
1789
fayangcff885a2019-10-22 07:39:04 -07001790TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001791 NegotiateIetfLossDetectionOneFourthRttFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001792 EXPECT_TRUE(
1793 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1794 EXPECT_FALSE(
1795 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1796 EXPECT_EQ(kDefaultLossDelayShift,
1797 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001798
1799 QuicConfig config;
1800 QuicTagVector options;
1801 options.push_back(kILD1);
1802 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1803 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1804 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1805 manager_.SetFromConfig(config);
1806
fayangb0c7b4b2019-09-12 06:45:24 -07001807 EXPECT_EQ(kDefaultLossDelayShift,
1808 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1809 EXPECT_FALSE(
1810 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1811}
1812
fayangcff885a2019-10-22 07:39:04 -07001813TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001814 NegotiateIetfLossDetectionAdaptiveReorderingThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001815 EXPECT_TRUE(
1816 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1817 EXPECT_FALSE(
1818 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1819 EXPECT_EQ(kDefaultLossDelayShift,
1820 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001821
1822 QuicConfig config;
1823 QuicTagVector options;
1824 options.push_back(kILD2);
1825 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1826 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1827 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1828 manager_.SetFromConfig(config);
1829
fayangb0c7b4b2019-09-12 06:45:24 -07001830 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1831 EXPECT_TRUE(
1832 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1833}
1834
fayangcff885a2019-10-22 07:39:04 -07001835TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001836 NegotiateIetfLossDetectionAdaptiveReorderingThreshold2) {
fayang3be090d2020-02-11 14:05:08 -08001837 EXPECT_TRUE(
1838 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1839 EXPECT_FALSE(
1840 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1841 EXPECT_EQ(kDefaultLossDelayShift,
1842 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001843
1844 QuicConfig config;
1845 QuicTagVector options;
1846 options.push_back(kILD3);
1847 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1848 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1849 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1850 manager_.SetFromConfig(config);
fayangb0c7b4b2019-09-12 06:45:24 -07001851 EXPECT_EQ(kDefaultLossDelayShift,
1852 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1853 EXPECT_TRUE(
1854 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1855}
1856
fayangdb095652019-11-04 07:37:36 -08001857TEST_F(QuicSentPacketManagerTest,
1858 NegotiateIetfLossDetectionAdaptiveReorderingAndTimeThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001859 EXPECT_TRUE(
1860 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1861 EXPECT_FALSE(
1862 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1863 EXPECT_EQ(kDefaultLossDelayShift,
1864 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangdb095652019-11-04 07:37:36 -08001865
1866 QuicConfig config;
1867 QuicTagVector options;
1868 options.push_back(kILD4);
1869 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1870 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1871 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1872 manager_.SetFromConfig(config);
1873
fayangdb095652019-11-04 07:37:36 -08001874 EXPECT_EQ(kDefaultLossDelayShift,
1875 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1876 EXPECT_TRUE(
1877 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1878 EXPECT_TRUE(
1879 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1880}
1881
fayangcff885a2019-10-22 07:39:04 -07001882TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001883 QuicConfig config;
1884 QuicTagVector options;
1885
1886 options.push_back(kRENO);
1887 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1888 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1889 manager_.SetFromConfig(config);
1890 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1891 ->GetCongestionControlType());
1892
1893 options.clear();
1894 options.push_back(kTBBR);
1895 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1896 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1897 manager_.SetFromConfig(config);
1898 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1899 ->GetCongestionControlType());
1900
1901 options.clear();
1902 options.push_back(kBYTE);
1903 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1904 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1905 manager_.SetFromConfig(config);
1906 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1907 ->GetCongestionControlType());
1908 options.clear();
1909 options.push_back(kRENO);
1910 options.push_back(kBYTE);
1911 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1912 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1913 manager_.SetFromConfig(config);
1914 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1915 ->GetCongestionControlType());
1916}
1917
fayangcff885a2019-10-22 07:39:04 -07001918TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001919 QuicConfig config;
1920 QuicTagVector options;
1921
1922 // No change if the server receives client options.
1923 const SendAlgorithmInterface* mock_sender =
1924 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
1925 options.push_back(kRENO);
1926 config.SetClientConnectionOptions(options);
1927 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1928 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1929 manager_.SetFromConfig(config);
1930 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
1931
1932 // Change the congestion control on the client with client options.
1933 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1934 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1935 manager_.SetFromConfig(config);
1936 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1937 ->GetCongestionControlType());
1938
1939 options.clear();
1940 options.push_back(kTBBR);
1941 config.SetClientConnectionOptions(options);
1942 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1943 manager_.SetFromConfig(config);
1944 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1945 ->GetCongestionControlType());
1946
1947 options.clear();
1948 options.push_back(kBYTE);
1949 config.SetClientConnectionOptions(options);
1950 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1951 manager_.SetFromConfig(config);
1952 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1953 ->GetCongestionControlType());
1954
1955 options.clear();
1956 options.push_back(kRENO);
1957 options.push_back(kBYTE);
1958 config.SetClientConnectionOptions(options);
1959 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1960 manager_.SetFromConfig(config);
1961 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1962 ->GetCongestionControlType());
1963}
1964
fayangcff885a2019-10-22 07:39:04 -07001965TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001966 QuicConfig config;
1967 QuicTagVector options;
1968
1969 options.push_back(kMAD2);
1970 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1971 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1972 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1973 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1974 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1975 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1976 .WillOnce(Return(10 * kDefaultTCPMSS));
1977 manager_.SetFromConfig(config);
1978 // Set the initial RTT to 1us.
1979 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
1980 QuicTime::Delta::FromMicroseconds(1));
1981 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
1982 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
1983 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
1984 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
1985 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
1986
ianswettad65ab92019-10-28 07:19:07 -07001987 // Send two packets, and the TLP should be 1ms.
1988 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001989 SendDataPacket(1);
1990 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07001991 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001992 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07001993 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001994 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
1995}
1996
fayangcff885a2019-10-22 07:39:04 -07001997TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001998 QuicConfig client_config;
1999 QuicTagVector options;
2000
2001 options.push_back(kMAD2);
2002 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2003 client_config.SetConnectionOptionsToSend(options);
2004 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2005 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2006 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2007 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2008 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2009 .WillOnce(Return(10 * kDefaultTCPMSS));
2010 manager_.SetFromConfig(client_config);
2011 // Set the initial RTT to 1us.
2012 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2013 QuicTime::Delta::FromMicroseconds(1));
2014 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2015 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2016 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2017 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2018 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
ianswettad65ab92019-10-28 07:19:07 -07002019 // Send two packets, and the TLP should be 1ms.
2020 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002021 SendDataPacket(1);
2022 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002023 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002024 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002025 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002026 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2027}
2028
fayangcff885a2019-10-22 07:39:04 -07002029TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002030 QuicConfig config;
2031 QuicTagVector options;
2032
2033 options.push_back(kMAD3);
2034 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2035 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2036 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2037 manager_.SetFromConfig(config);
2038 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2039 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2040 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2041 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002042 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002043 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002044 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002045 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002046 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2047 // 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_));
ianswettdcc474e2019-08-06 08:22:38 -07002051 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002052 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2053}
2054
fayangcff885a2019-10-22 07:39:04 -07002055TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002056 QuicConfig client_config;
2057 QuicTagVector options;
2058
2059 options.push_back(kMAD3);
2060 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2061 client_config.SetConnectionOptionsToSend(options);
2062 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2063 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2064 manager_.SetFromConfig(client_config);
2065 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2066 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2067 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2068 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002069 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002070 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002071 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002072 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002073 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2074 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002075 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002076 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002077 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002078 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002079 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2080}
2081
fayangcff885a2019-10-22 07:39:04 -07002082TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002083 QuicConfig config;
2084 QuicTagVector options;
2085
2086 options.push_back(kNTLP);
2087 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2088 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2089 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2090 manager_.SetFromConfig(config);
2091 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2092}
2093
fayangcff885a2019-10-22 07:39:04 -07002094TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002095 QuicConfig client_config;
2096 QuicTagVector options;
2097
2098 options.push_back(kNTLP);
2099 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2100 client_config.SetConnectionOptionsToSend(options);
2101 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2102 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2103 manager_.SetFromConfig(client_config);
2104 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2105}
2106
fayangcff885a2019-10-22 07:39:04 -07002107TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002108 QuicConfig config;
2109 QuicTagVector options;
2110
2111 options.push_back(k1TLP);
2112 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2113 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2114 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2115 manager_.SetFromConfig(config);
2116 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2117}
2118
fayangcff885a2019-10-22 07:39:04 -07002119TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002120 QuicConfig client_config;
2121 QuicTagVector options;
2122
2123 options.push_back(k1TLP);
2124 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2125 client_config.SetConnectionOptionsToSend(options);
2126 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2127 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2128 manager_.SetFromConfig(client_config);
2129 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2130}
2131
fayangcff885a2019-10-22 07:39:04 -07002132TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002133 QuicConfig config;
2134 QuicTagVector options;
2135
2136 options.push_back(kTLPR);
2137 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2138 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2139 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2140 manager_.SetFromConfig(config);
2141 EXPECT_TRUE(
2142 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2143}
2144
fayangcff885a2019-10-22 07:39:04 -07002145TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002146 QuicConfig client_config;
2147 QuicTagVector options;
2148
2149 options.push_back(kTLPR);
2150 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2151 client_config.SetConnectionOptionsToSend(options);
2152 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2153 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2154 manager_.SetFromConfig(client_config);
2155 EXPECT_TRUE(
2156 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2157}
2158
fayangcff885a2019-10-22 07:39:04 -07002159TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002160 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2161 QuicConfig config;
2162 QuicTagVector options;
2163
2164 options.push_back(kNRTO);
2165 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2166 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2167 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2168 manager_.SetFromConfig(config);
2169 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2170}
2171
fayangcff885a2019-10-22 07:39:04 -07002172TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002173 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2174 QuicConfig client_config;
2175 QuicTagVector options;
2176
2177 options.push_back(kNRTO);
2178 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2179 client_config.SetConnectionOptionsToSend(options);
2180 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2181 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2182 manager_.SetFromConfig(client_config);
2183 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2184}
2185
fayangcff885a2019-10-22 07:39:04 -07002186TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002187 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2188 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2189
2190 QuicConfig config;
2191 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2192 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2193 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2194 manager_.SetFromConfig(config);
2195
2196 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2197 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2198}
2199
fayangcff885a2019-10-22 07:39:04 -07002200TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002201 // The sent packet manager should use the RTT from CachedNetworkParameters if
2202 // it is provided.
2203 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(1234);
2204 CachedNetworkParameters cached_network_params;
2205 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2206
QUICHE teamb4e187c2019-11-14 06:22:50 -08002207 SendAlgorithmInterface::NetworkParams params;
2208 params.bandwidth = QuicBandwidth::Zero();
2209 params.allow_cwnd_to_decrease = false;
2210 params.rtt = kRtt;
2211
2212 EXPECT_CALL(*send_algorithm_, AdjustNetworkParameters(params));
fayangbe83ecd2019-04-26 13:58:09 -07002213 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2214 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002215 manager_.ResumeConnectionState(cached_network_params, false);
2216 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2217}
2218
fayangcff885a2019-10-22 07:39:04 -07002219TEST_F(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002220 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2221 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2222 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2223 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2224
2225 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2226 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2227 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2228 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2229
2230 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
2231 manager_.OnConnectionMigration(IPV4_TO_IPV4_CHANGE);
2232
2233 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2234 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2235 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2236}
2237
fayangcff885a2019-10-22 07:39:04 -07002238TEST_F(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002239 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2240 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2241 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2242 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2243
2244 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2245 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2246 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2247 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2248
2249 manager_.OnConnectionMigration(IPV4_SUBNET_CHANGE);
2250
2251 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2252 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2253 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2254}
2255
fayangcff885a2019-10-22 07:39:04 -07002256TEST_F(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002257 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2258 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2259 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2260 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2261
2262 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2263 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2264 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2265 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2266
2267 manager_.OnConnectionMigration(PORT_CHANGE);
2268
2269 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2270 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2271 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2272}
2273
fayangcff885a2019-10-22 07:39:04 -07002274TEST_F(QuicSentPacketManagerTest, PathMtuIncreased) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002275 EXPECT_CALL(*send_algorithm_,
2276 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2277 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2278 nullptr, kDefaultLength + 100, false, false);
fayangcff885a2019-10-22 07:39:04 -07002279 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
2280 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002281
2282 // Ack the large packet and expect the path MTU to increase.
2283 ExpectAck(1);
2284 EXPECT_CALL(*network_change_visitor_,
2285 OnPathMtuIncreased(kDefaultLength + 100));
2286 QuicAckFrame ack_frame = InitAckFrame(1);
2287 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2288 clock_.Now());
2289 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002290 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002291 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2292 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002293}
2294
fayangcff885a2019-10-22 07:39:04 -07002295TEST_F(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002296 // Send packets 1 - 20.
2297 for (size_t i = 1; i <= 20; ++i) {
2298 SendDataPacket(i);
2299 }
2300 // Ack [5, 7), [10, 12), [15, 17).
2301 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2302 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002303 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2304 QUICHE_ARRAYSIZE(lost1));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002305 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2306 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2307 clock_.Now());
2308 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2309 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2310 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2311 // Make sure empty range does not harm.
2312 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002313 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002314 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2315 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002316
2317 // Ack [4, 8), [9, 13), [14, 21).
2318 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
bnc4e9283d2019-12-17 07:08:57 -08002319 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002320 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2321 clock_.Now());
2322 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2323 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2324 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002325 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002326 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2327 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002328}
2329
fayangcff885a2019-10-22 07:39:04 -07002330TEST_F(QuicSentPacketManagerTest, TolerateReneging) {
QUICHE team9929cc42019-03-13 08:17:43 -07002331 // Send packets 1 - 20.
2332 for (size_t i = 1; i <= 20; ++i) {
2333 SendDataPacket(i);
2334 }
2335 // Ack [5, 7), [10, 12), [15, 17).
2336 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2337 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002338 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2339 QUICHE_ARRAYSIZE(lost1));
QUICHE team9929cc42019-03-13 08:17:43 -07002340 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2341 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2342 clock_.Now());
2343 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2344 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2345 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002346 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002347 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2348 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002349
2350 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2351 uint64_t acked2[] = {4, 7, 9, 12};
bnc4e9283d2019-12-17 07:08:57 -08002352 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE team9929cc42019-03-13 08:17:43 -07002353 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2354 clock_.Now());
2355 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2356 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002357 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002358 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2359 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002360 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2361}
2362
fayangcff885a2019-10-22 07:39:04 -07002363TEST_F(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
QUICHE teamc279cec2019-03-22 06:51:48 -07002364 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang533cb1b2020-01-28 08:05:08 -08002365 const QuicUnackedPacketMap* unacked_packets =
2366 QuicSentPacketManagerPeer::GetUnackedPacketMap(&manager_);
QUICHE teamc279cec2019-03-22 06:51:48 -07002367 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002368 unacked_packets
2369 ->GetLargestSentRetransmittableOfPacketNumberSpace(INITIAL_DATA)
2370 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002371 EXPECT_FALSE(
2372 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2373 // Send packet 1.
2374 SendDataPacket(1, ENCRYPTION_INITIAL);
2375 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002376 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2377 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002378 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002379 unacked_packets
2380 ->GetLargestSentRetransmittableOfPacketNumberSpace(HANDSHAKE_DATA)
2381 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002382 // Ack packet 1.
2383 ExpectAck(1);
2384 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2385 clock_.Now());
2386 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002387 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002388 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2389 ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002390 EXPECT_EQ(QuicPacketNumber(1),
2391 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2392 EXPECT_FALSE(
2393 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2394 // Send packets 2 and 3.
2395 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2396 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2397 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002398 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2399 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002400 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002401 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2402 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002403 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002404 unacked_packets
2405 ->GetLargestSentRetransmittableOfPacketNumberSpace(APPLICATION_DATA)
2406 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002407 // Ack packet 2.
2408 ExpectAck(2);
2409 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2410 clock_.Now());
2411 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002412 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002413 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2414 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002415 EXPECT_EQ(QuicPacketNumber(2),
2416 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2417 EXPECT_FALSE(
2418 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2419 // Ack packet 3.
2420 ExpectAck(3);
2421 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2422 clock_.Now());
2423 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002424 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002425 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2426 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002427 EXPECT_EQ(QuicPacketNumber(3),
2428 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2429 EXPECT_FALSE(
2430 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2431 // Send packets 4 and 5.
2432 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2433 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2434 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002435 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2436 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002437 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002438 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2439 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002440 EXPECT_EQ(QuicPacketNumber(5),
fayang533cb1b2020-01-28 08:05:08 -08002441 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2442 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002443 // Ack packet 5.
2444 ExpectAck(5);
2445 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2446 clock_.Now());
2447 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002448 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002449 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2450 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002451 EXPECT_EQ(QuicPacketNumber(3),
2452 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2453 EXPECT_EQ(QuicPacketNumber(5),
2454 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2455 EXPECT_EQ(QuicPacketNumber(5),
2456 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2457
2458 // Send packets 6 - 8.
2459 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2460 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2461 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2462 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002463 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2464 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002465 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002466 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2467 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002468 EXPECT_EQ(QuicPacketNumber(8),
fayang533cb1b2020-01-28 08:05:08 -08002469 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2470 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002471 // Ack all packets.
2472 uint64_t acked[] = {4, 6, 7, 8};
bnc4e9283d2019-12-17 07:08:57 -08002473 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teamc279cec2019-03-22 06:51:48 -07002474 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2475 clock_.Now());
2476 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002477 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002478 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(5),
2479 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002480 EXPECT_EQ(QuicPacketNumber(3),
2481 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2482 EXPECT_EQ(QuicPacketNumber(8),
2483 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2484 EXPECT_EQ(QuicPacketNumber(8),
2485 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2486}
2487
fayangcff885a2019-10-22 07:39:04 -07002488TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002489 manager_.EnableMultiplePacketNumberSpacesSupport();
2490 // Send packet 1.
2491 SendDataPacket(1, ENCRYPTION_INITIAL);
2492 // Send packets 2 and 3.
2493 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2494 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2495
2496 // ACK packets 2 and 3 in the wrong packet number space.
2497 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2498 clock_.Now());
2499 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2500 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002501 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2502 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002503}
2504
fayangcff885a2019-10-22 07:39:04 -07002505TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
fayang3eb82212019-04-16 12:05:46 -07002506 manager_.EnableMultiplePacketNumberSpacesSupport();
2507 // Send packet 1.
2508 SendDataPacket(1, ENCRYPTION_INITIAL);
2509 // Send packets 2 and 3.
2510 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2511 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2512
2513 // ACK packet 1 in the wrong packet number space.
2514 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2515 clock_.Now());
2516 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2517 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002518 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2519 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002520}
2521
fayangcff885a2019-10-22 07:39:04 -07002522TEST_F(QuicSentPacketManagerTest,
fayang3eb82212019-04-16 12:05:46 -07002523 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002524 manager_.EnableMultiplePacketNumberSpacesSupport();
2525 // Send packet 1.
2526 SendDataPacket(1, ENCRYPTION_INITIAL);
2527 // Ack packet 1.
2528 ExpectAck(1);
2529 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2530 clock_.Now());
2531 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2532 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002533 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2534 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002535
2536 // Send packets 2 and 3.
2537 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2538 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2539
2540 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2541 // been acked in the correct packet number space, tolerate it.
2542 uint64_t acked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -08002543 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang3eb82212019-04-16 12:05:46 -07002544 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2545 clock_.Now());
2546 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2547 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002548 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2549 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002550}
2551
fayang06bb1b02019-06-14 14:07:12 -07002552// Regression test for b/133771183.
fayangcff885a2019-10-22 07:39:04 -07002553TEST_F(QuicSentPacketManagerTest, PacketInLimbo) {
fayang06bb1b02019-06-14 14:07:12 -07002554 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
2555 // Send SHLO.
2556 SendCryptoPacket(1);
2557 // Send data packet.
2558 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2559 // Send Ack Packet.
2560 SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE);
2561 // Retransmit SHLO.
2562 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2563 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }));
2564 manager_.OnRetransmissionTimeout();
2565
2566 // Successfully decrypt a forward secure packet.
2567 manager_.SetHandshakeConfirmed();
2568 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
2569 // Send Ack packet.
2570 SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE);
2571
2572 // Retransmission alarm fires.
2573 manager_.OnRetransmissionTimeout();
2574 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2575 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2576 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2577 })));
2578 manager_.MaybeRetransmitTailLossProbe();
2579
2580 // Received Ack of packets 1, 3 and 4.
2581 uint64_t acked[] = {1, 3, 4};
bnc4e9283d2019-12-17 07:08:57 -08002582 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang06bb1b02019-06-14 14:07:12 -07002583 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2584 clock_.Now());
2585 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
2586 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2587 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002588 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2589 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002590
2591 uint64_t acked2[] = {5, 6};
2592 uint64_t loss[] = {2};
fayang897605d2019-08-21 13:26:45 -07002593 // Verify packet 2 is detected lost.
2594 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
bnc4e9283d2019-12-17 07:08:57 -08002595 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), loss,
2596 QUICHE_ARRAYSIZE(loss));
fayang06bb1b02019-06-14 14:07:12 -07002597 manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(),
2598 clock_.Now());
2599 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7));
2600 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002601 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2602 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002603}
2604
fayangcff885a2019-10-22 07:39:04 -07002605TEST_F(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) {
fayanga29eb242019-07-16 12:25:38 -07002606 // Send 10 packets.
2607 for (size_t i = 1; i <= 10; ++i) {
2608 SendDataPacket(i);
2609 }
2610 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2611 .Times(2)
2612 .WillOnce(WithArgs<1>(Invoke(
2613 [this](TransmissionType type) { RetransmitDataPacket(11, type); })))
2614 .WillOnce(WithArgs<1>(Invoke(
2615 [this](TransmissionType type) { RetransmitDataPacket(12, type); })));
2616 manager_.OnRetransmissionTimeout();
2617 EXPECT_EQ(1u, stats_.rto_count);
2618 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2619
2620 // RTO fires again, but there is no packet to be RTO retransmitted.
2621 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
2622 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
2623 manager_.OnRetransmissionTimeout();
2624 EXPECT_EQ(2u, stats_.rto_count);
fayange861aee2019-10-16 13:40:39 -07002625 // Verify a credit is raised up.
2626 EXPECT_EQ(1u, manager_.pending_timer_transmission_count());
fayanga29eb242019-07-16 12:25:38 -07002627}
2628
fayangcff885a2019-10-22 07:39:04 -07002629TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeout) {
fayangce0a3162019-08-15 09:05:36 -07002630 EnablePto(k2PTO);
2631 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2632 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2633 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2634 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2635 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2636 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2637 QuicTime::Delta::Zero(), QuicTime::Zero());
2638 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2639
2640 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2641 // Verify PTO is correctly set.
2642 QuicTime::Delta expected_pto_delay =
2643 srtt + 4 * rtt_stats->mean_deviation() +
2644 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2645 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2646 manager_.GetRetransmissionTime());
2647
2648 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2649 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2650 // Verify PTO is correctly set based on sent time of packet 2.
2651 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2652 manager_.GetRetransmissionTime());
2653 EXPECT_EQ(0u, stats_.pto_count);
2654
2655 // Invoke PTO.
2656 clock_.AdvanceTime(expected_pto_delay);
2657 manager_.OnRetransmissionTimeout();
2658 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2659 EXPECT_EQ(1u, stats_.pto_count);
2660
2661 // Verify two probe packets get sent.
2662 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2663 .Times(2)
2664 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2665 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2666 })))
2667 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2668 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2669 })));
2670 manager_.MaybeSendProbePackets();
2671 // Verify PTO period gets set to twice the current value.
2672 QuicTime sent_time = clock_.Now();
2673 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2674 manager_.GetRetransmissionTime());
2675
2676 // Received ACK for packets 1 and 2.
2677 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002678 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangce0a3162019-08-15 09:05:36 -07002679 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2680 clock_.Now());
2681 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2682 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2683 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2684 ENCRYPTION_FORWARD_SECURE));
2685 expected_pto_delay =
2686 rtt_stats->SmoothedOrInitialRtt() +
2687 std::max(4 * rtt_stats->mean_deviation(),
2688 QuicTime::Delta::FromMilliseconds(1)) +
2689 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2690
2691 // Verify PTO is correctly re-armed based on sent time of packet 4.
2692 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
2693}
2694
fayangcff885a2019-10-22 07:39:04 -07002695TEST_F(QuicSentPacketManagerTest, SendOneProbePacket) {
fayangce0a3162019-08-15 09:05:36 -07002696 EnablePto(k1PTO);
2697 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2698 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2699 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2700 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2701
2702 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2703 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2704 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2705
2706 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2707 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2708 QuicTime::Delta::Zero(), QuicTime::Zero());
2709 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2710 // Verify PTO period is correctly set.
2711 QuicTime::Delta expected_pto_delay =
2712 srtt + 4 * rtt_stats->mean_deviation() +
2713 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2714 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2715 manager_.GetRetransmissionTime());
2716
2717 // Invoke PTO.
2718 clock_.AdvanceTime(expected_pto_delay);
2719 manager_.OnRetransmissionTimeout();
2720 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2721
2722 // Verify one probe packet gets sent.
2723 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2724 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2725 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2726 })));
2727 manager_.MaybeSendProbePackets();
2728}
2729
fayangcff885a2019-10-22 07:39:04 -07002730TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeClient) {
fayang5f135052019-08-22 17:59:40 -07002731 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayang08a6c952019-09-18 14:29:45 -07002732 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002733 // Send CHLO.
2734 SendCryptoPacket(1);
2735 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2736 // Ack packet 1.
2737 ExpectAck(1);
2738 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2739 clock_.Now());
2740 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2741 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2742 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2743 ENCRYPTION_INITIAL));
2744 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2745 // Verify retransmission timeout is not zero because handshake is not
2746 // confirmed although there is no in flight packet.
2747 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2748 // Fire PTO.
2749 EXPECT_EQ(QuicSentPacketManager::PTO_MODE,
2750 manager_.OnRetransmissionTimeout());
2751}
2752
fayangcff885a2019-10-22 07:39:04 -07002753TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeServer) {
fayang08a6c952019-09-18 14:29:45 -07002754 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002755 // Send SHLO.
2756 SendCryptoPacket(1);
2757 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2758 // Ack packet 1.
2759 ExpectAck(1);
2760 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2761 clock_.Now());
2762 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2763 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2764 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2765 ENCRYPTION_INITIAL));
2766 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2767 // Verify retransmission timeout is not set on server side because there is
2768 // nothing in flight.
2769 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2770}
2771
fayang4c908f02019-11-01 07:26:17 -07002772TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) {
2773 EnablePto(k1PTO);
2774 // Use PTOS and PTOA.
2775 QuicConfig config;
2776 QuicTagVector options;
2777 options.push_back(kPTOS);
2778 options.push_back(kPTOA);
2779 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2780 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2781 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2782 manager_.SetFromConfig(config);
2783 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
2784 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
2785
2786 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2787 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2788 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2789 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2790 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2791 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2792 QuicTime::Delta::Zero(), QuicTime::Zero());
2793 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2794
2795 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2796 // Verify PTO is correctly set and ack delay is included.
2797 QuicTime::Delta expected_pto_delay =
2798 srtt + 4 * rtt_stats->mean_deviation() +
2799 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2800 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2801 manager_.GetRetransmissionTime());
2802
2803 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2804 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2805 // Verify PTO is correctly set based on sent time of packet 2 but ack delay is
2806 // not included as an immediate ACK is expected.
2807 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
2808 kDefaultDelayedAckTimeMs);
2809 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2810 manager_.GetRetransmissionTime());
2811 EXPECT_EQ(0u, stats_.pto_count);
2812
2813 // Invoke PTO.
2814 clock_.AdvanceTime(expected_pto_delay);
2815 manager_.OnRetransmissionTimeout();
2816 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2817 EXPECT_EQ(1u, stats_.pto_count);
2818
2819 // Verify 1 probe packets get sent and packet number gets skipped.
2820 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2821 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2822 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2823 })));
2824 manager_.MaybeSendProbePackets();
2825 // Verify PTO period gets set to twice the current value. Also, ack delay is
2826 // not included.
2827 QuicTime sent_time = clock_.Now();
2828 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2829 manager_.GetRetransmissionTime());
2830
2831 // Received ACK for packets 1 and 2.
2832 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002833 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang4c908f02019-11-01 07:26:17 -07002834 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2835 clock_.Now());
2836 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2837 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2838 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2839 ENCRYPTION_FORWARD_SECURE));
2840 expected_pto_delay =
2841 rtt_stats->SmoothedOrInitialRtt() +
2842 std::max(4 * rtt_stats->mean_deviation(),
2843 QuicTime::Delta::FromMilliseconds(1)) +
2844 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2845
2846 // Verify PTO is correctly re-armed based on sent time of packet 4. Because of
2847 // PTOS turns out to be spurious, ACK delay is included.
2848 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
2849
2850 // Received ACK for packets 4.
2851 ExpectAck(4);
2852 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2853 clock_.Now());
2854 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
2855 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2856 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2857 ENCRYPTION_FORWARD_SECURE));
2858 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2859 // Send more packets, such that peer will do ack decimation.
2860 std::vector<uint64_t> acked2;
2861 for (size_t i = 5; i <= 100; ++i) {
2862 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
2863 acked2.push_back(i);
2864 }
2865 // Received ACK for all sent packets.
2866 ExpectAcksAndLosses(true, &acked2[0], acked2.size(), nullptr, 0);
2867 manager_.OnAckFrameStart(QuicPacketNumber(100), QuicTime::Delta::Infinite(),
2868 clock_.Now());
2869 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(101));
2870 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2871 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(100),
2872 ENCRYPTION_FORWARD_SECURE));
2873
2874 expected_pto_delay =
2875 rtt_stats->SmoothedOrInitialRtt() +
2876 std::max(4 * rtt_stats->mean_deviation(),
2877 QuicTime::Delta::FromMilliseconds(1)) +
2878 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2879 for (size_t i = 101; i < 110; i++) {
2880 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
2881 // Verify PTO timeout includes ACK delay as there are less than 10 packets
2882 // outstanding.
2883 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2884 manager_.GetRetransmissionTime());
2885 }
2886 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
2887 kDefaultDelayedAckTimeMs);
2888 SendDataPacket(110, ENCRYPTION_FORWARD_SECURE);
2889 // Verify ACK delay is excluded.
2890 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2891 manager_.GetRetransmissionTime());
2892}
2893
fayang7085a6d2019-11-04 07:03:57 -08002894TEST_F(QuicSentPacketManagerTest, StartExponentialBackoffSince2ndPto) {
2895 EnablePto(k2PTO);
2896 QuicConfig config;
2897 QuicTagVector options;
2898 options.push_back(kPEB2);
2899 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2900 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2901 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2902 manager_.SetFromConfig(config);
2903
2904 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2905 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2906 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2907 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2908 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2909 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2910 QuicTime::Delta::Zero(), QuicTime::Zero());
2911 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2912
2913 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2914 // Verify PTO is correctly set.
2915 QuicTime::Delta expected_pto_delay =
2916 srtt + 4 * rtt_stats->mean_deviation() +
2917 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2918 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2919 manager_.GetRetransmissionTime());
2920
2921 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2922 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2923 // Verify PTO is correctly set based on sent time of packet 2.
2924 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2925 manager_.GetRetransmissionTime());
2926 EXPECT_EQ(0u, stats_.pto_count);
2927
2928 // Invoke PTO.
2929 clock_.AdvanceTime(expected_pto_delay);
2930 manager_.OnRetransmissionTimeout();
2931 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2932 EXPECT_EQ(1u, stats_.pto_count);
2933
2934 // Verify two probe packets get sent.
2935 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2936 .Times(2)
2937 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2938 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2939 })))
2940 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2941 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2942 })));
2943 manager_.MaybeSendProbePackets();
2944 // Verify no exponential backoff.
2945 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2946 manager_.GetRetransmissionTime());
2947
2948 // Invoke 2nd PTO.
2949 clock_.AdvanceTime(expected_pto_delay);
2950 manager_.OnRetransmissionTimeout();
2951 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2952 EXPECT_EQ(2u, stats_.pto_count);
2953
2954 // Verify two probe packets get sent.
2955 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2956 .Times(2)
2957 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2958 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
2959 })))
2960 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2961 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2962 })));
2963 manager_.MaybeSendProbePackets();
2964 // Verify still no exponential backoff.
2965 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2966 manager_.GetRetransmissionTime());
2967
2968 // Invoke 3rd PTO.
2969 clock_.AdvanceTime(expected_pto_delay);
2970 manager_.OnRetransmissionTimeout();
2971 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2972 EXPECT_EQ(3u, stats_.pto_count);
2973
2974 // Verify two probe packets get sent.
2975 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2976 .Times(2)
2977 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2978 RetransmitDataPacket(7, type, ENCRYPTION_FORWARD_SECURE);
2979 })))
2980 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2981 RetransmitDataPacket(8, type, ENCRYPTION_FORWARD_SECURE);
2982 })));
2983 manager_.MaybeSendProbePackets();
2984 // Verify exponential backoff starts.
2985 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
2986 manager_.GetRetransmissionTime());
2987
2988 // Invoke 4th PTO.
2989 clock_.AdvanceTime(expected_pto_delay * 2);
2990 manager_.OnRetransmissionTimeout();
2991 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2992 EXPECT_EQ(4u, stats_.pto_count);
2993
2994 // Verify two probe packets get sent.
2995 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2996 .Times(2)
2997 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2998 RetransmitDataPacket(9, type, ENCRYPTION_FORWARD_SECURE);
2999 })))
3000 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3001 RetransmitDataPacket(10, type, ENCRYPTION_FORWARD_SECURE);
3002 })));
3003 manager_.MaybeSendProbePackets();
3004 // Verify exponential backoff continues.
3005 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3006 manager_.GetRetransmissionTime());
3007}
3008
fayang75db4342019-11-04 13:29:14 -08003009TEST_F(QuicSentPacketManagerTest, PtoTimeoutRttVarMultiple) {
3010 EnablePto(k1PTO);
3011 // Use 2 * rttvar
3012 QuicConfig config;
3013 QuicTagVector options;
3014 options.push_back(kPVS1);
3015 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3016 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3017 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3018 manager_.SetFromConfig(config);
3019
3020 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3021 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3022 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3023 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3024 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3025 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3026 QuicTime::Delta::Zero(), QuicTime::Zero());
3027 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3028
3029 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3030 // Verify PTO is correctly set based on 2 times rtt var.
3031 QuicTime::Delta expected_pto_delay =
3032 srtt + 2 * rtt_stats->mean_deviation() +
3033 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3034 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3035 manager_.GetRetransmissionTime());
3036}
3037
fayang93c83942019-11-07 10:41:16 -08003038// Regression test for b/143962153
3039TEST_F(QuicSentPacketManagerTest, RtoNotInFlightPacket) {
3040 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
3041 // Send SHLO.
dmcardlecf0bfcf2019-12-13 08:08:21 -08003042 QuicStreamFrame crypto_frame(1, false, 0, quiche::QuicheStringPiece());
fayang93c83942019-11-07 10:41:16 -08003043 SendCryptoPacket(1);
3044 // Send data packet.
3045 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3046
3047 // Successfully decrypt a forward secure packet.
fayange1e81d22020-01-06 11:41:34 -08003048 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(1);
fayang93c83942019-11-07 10:41:16 -08003049 manager_.SetHandshakeConfirmed();
3050
3051 // 1st TLP.
3052 manager_.OnRetransmissionTimeout();
3053 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3054 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3055 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3056 })));
3057 manager_.MaybeRetransmitTailLossProbe();
3058
3059 // 2nd TLP.
3060 manager_.OnRetransmissionTimeout();
3061 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3062 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3063 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3064 })));
3065 manager_.MaybeRetransmitTailLossProbe();
3066
3067 // RTO retransmits SHLO although it is not in flight.
fayang93c83942019-11-07 10:41:16 -08003068 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
fayangac35d452019-11-08 12:35:15 -08003069 .WillOnce(WithArgs<0>(Invoke([&crypto_frame](const QuicFrames& frames) {
3070 EXPECT_EQ(1u, frames.size());
fayange1e81d22020-01-06 11:41:34 -08003071 EXPECT_NE(crypto_frame, frames[0].stream_frame);
fayangac35d452019-11-08 12:35:15 -08003072 })));
fayang93c83942019-11-07 10:41:16 -08003073 manager_.OnRetransmissionTimeout();
3074}
3075
fayang4aa22402020-01-07 11:36:07 -08003076TEST_F(QuicSentPacketManagerTest, Aggressive1Pto) {
3077 EnablePto(k1PTO);
3078 // Let the first PTO be aggressive.
3079 QuicConfig config;
3080 QuicTagVector options;
3081 options.push_back(kPTOS);
3082 options.push_back(kPAG1);
3083 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3084 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3085 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3086 manager_.SetFromConfig(config);
3087
3088 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3089 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3090 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3091 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3092 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3093 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3094 QuicTime::Delta::Zero(), QuicTime::Zero());
3095 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3096 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3097 // Verify PTO is correctly set.
3098 QuicTime::Delta expected_pto_delay = 2 * srtt;
3099 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3100 manager_.GetRetransmissionTime());
3101
3102 // Invoke PTO.
3103 clock_.AdvanceTime(expected_pto_delay);
3104 manager_.OnRetransmissionTimeout();
3105 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3106 EXPECT_EQ(1u, stats_.pto_count);
3107
3108 // Verify 1 probe packets get sent and packet number gets skipped.
3109 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3110 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3111 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3112 })));
3113 manager_.MaybeSendProbePackets();
3114
3115 // Verify PTO period gets set correctly.
3116 QuicTime sent_time = clock_.Now();
3117 expected_pto_delay =
3118 srtt + 4 * rtt_stats->mean_deviation() +
3119 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3120 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3121 manager_.GetRetransmissionTime());
3122}
3123
3124TEST_F(QuicSentPacketManagerTest, Aggressive2Ptos) {
3125 EnablePto(k1PTO);
3126 // Let the first PTO be aggressive.
3127 QuicConfig config;
3128 QuicTagVector options;
3129 options.push_back(kPTOS);
3130 options.push_back(kPAG2);
3131 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3132 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3133 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3134 manager_.SetFromConfig(config);
3135
3136 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3137 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3138 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3139 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3140 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3141 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3142 QuicTime::Delta::Zero(), QuicTime::Zero());
3143 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3144 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3145 // Verify PTO is correctly set.
3146 QuicTime::Delta expected_pto_delay = 2 * srtt;
3147 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3148 manager_.GetRetransmissionTime());
3149
3150 // Invoke PTO.
3151 clock_.AdvanceTime(expected_pto_delay);
3152 manager_.OnRetransmissionTimeout();
3153 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3154 EXPECT_EQ(1u, stats_.pto_count);
3155
3156 // Verify 1 probe packets get sent and packet number gets skipped.
3157 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3158 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3159 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3160 })));
3161 manager_.MaybeSendProbePackets();
3162
3163 // Verify PTO period gets set correctly.
3164 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3165 manager_.GetRetransmissionTime());
3166
3167 // Invoke 2nd PTO.
3168 clock_.AdvanceTime(expected_pto_delay);
3169 manager_.OnRetransmissionTimeout();
3170 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3171 EXPECT_EQ(2u, stats_.pto_count);
3172
3173 // Verify 1 probe packets get sent and packet number gets skipped.
3174 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3175 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3176 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3177 })));
3178 manager_.MaybeSendProbePackets();
3179 expected_pto_delay =
3180 srtt + 4 * rtt_stats->mean_deviation() +
3181 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3182
3183 // Verify PTO period gets set correctly.
3184 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3185 manager_.GetRetransmissionTime());
3186}
3187
fayang402103c2020-01-10 13:36:24 -08003188TEST_F(QuicSentPacketManagerTest, IW10ForUpAndDown) {
3189 SetQuicReloadableFlag(quic_bbr_mitigate_overly_large_bandwidth_sample, true);
3190 QuicConfig config;
3191 QuicTagVector options;
3192 options.push_back(kBWS5);
3193 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3194 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3195 EXPECT_CALL(*send_algorithm_, SetInitialCongestionWindowInPackets(10));
3196 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3197 manager_.SetFromConfig(config);
3198
3199 EXPECT_EQ(10u, manager_.initial_congestion_window());
3200}
3201
fayang18ff23b2020-01-28 09:19:00 -08003202TEST_F(QuicSentPacketManagerTest, ClientMultiplePacketNumberSpacePtoTimeout) {
3203 manager_.EnableMultiplePacketNumberSpacesSupport();
3204 EnablePto(k1PTO);
3205 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3206 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3207 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3208 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3209 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3210 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3211 QuicTime::Delta::Zero(), QuicTime::Zero());
3212 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3213
3214 // Send packet 1.
3215 SendDataPacket(1, ENCRYPTION_INITIAL);
3216 // Verify PTO is correctly set.
3217 QuicTime::Delta expected_pto_delay =
3218 srtt + 4 * rtt_stats->mean_deviation() +
3219 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3220 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3221 manager_.GetRetransmissionTime());
3222
3223 // Discard initial key and send packet 2 in handshake.
3224 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3225 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3226 manager_.NeuterUnencryptedPackets();
3227
3228 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
3229 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3230 // Verify PTO is correctly set based on sent time of packet 2.
3231 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3232 manager_.GetRetransmissionTime());
3233 // Invoke PTO.
3234 clock_.AdvanceTime(expected_pto_delay);
3235 manager_.OnRetransmissionTimeout();
3236 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3237 EXPECT_EQ(1u, stats_.pto_count);
3238
3239 // Verify probe packet gets sent.
3240 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3241 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3242 RetransmitDataPacket(3, type, ENCRYPTION_HANDSHAKE);
3243 })));
3244 manager_.MaybeSendProbePackets();
3245 // Verify PTO period gets set to twice the current value.
3246 const QuicTime packet3_sent_time = clock_.Now();
3247 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3248 manager_.GetRetransmissionTime());
3249
3250 // Send packet 4 in application data.
3251 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3252 SendDataPacket(4, ENCRYPTION_FORWARD_SECURE);
3253 const QuicTime packet4_sent_time = clock_.Now();
3254 // Verify PTO timeout is still based on packet 3.
3255 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3256 manager_.GetRetransmissionTime());
3257
3258 // Send packet 5 in handshake.
3259 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3260 SendDataPacket(5, ENCRYPTION_HANDSHAKE);
3261 // Verify PTO timeout is now based on packet 5.
3262 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3263 manager_.GetRetransmissionTime());
3264
3265 // Neuter handshake key.
3266 manager_.SetHandshakeConfirmed();
3267 // Verify PTO timeout is now based on packet 4.
3268 EXPECT_EQ(packet4_sent_time + expected_pto_delay * 2,
3269 manager_.GetRetransmissionTime());
3270}
3271
3272TEST_F(QuicSentPacketManagerTest, ServerMultiplePacketNumberSpacePtoTimeout) {
3273 manager_.EnableMultiplePacketNumberSpacesSupport();
3274 EnablePto(k1PTO);
3275 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3276 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3277 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3278 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3279 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3280 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3281 QuicTime::Delta::Zero(), QuicTime::Zero());
3282 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3283
3284 // Send packet 1.
3285 SendDataPacket(1, ENCRYPTION_INITIAL);
3286 const QuicTime packet1_sent_time = clock_.Now();
3287 // Verify PTO is correctly set.
3288 QuicTime::Delta expected_pto_delay =
3289 srtt + 4 * rtt_stats->mean_deviation() +
3290 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3291 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3292 manager_.GetRetransmissionTime());
3293
3294 // Send packet 2 in handshake.
3295 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3296 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3297 // Verify PTO timeout is still based on packet 1.
3298 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3299 manager_.GetRetransmissionTime());
3300
3301 // Discard both initial and handshake keys.
3302 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3303 manager_.NeuterUnencryptedPackets();
3304 manager_.SetHandshakeConfirmed();
3305 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
3306
3307 // Send packet 3 in application data.
3308 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3309 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
3310 // Verify PTO timeout is correctly set.
3311 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3312 manager_.GetRetransmissionTime());
3313}
3314
fayangd5c2ffb2020-02-04 11:49:05 -08003315// Regresstion test for b/148841700.
3316TEST_F(QuicSentPacketManagerTest, NeuterUnencryptedPackets) {
3317 SendCryptoPacket(1);
3318 SendPingPacket(2, ENCRYPTION_INITIAL);
3319 // Crypto data has been discarded but ping does not.
3320 if (GetQuicReloadableFlag(quic_neuter_unencrypted_control_frames)) {
3321 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
3322 .Times(2)
3323 .WillOnce(Return(false))
3324 .WillOnce(Return(true));
3325 } else {
3326 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(0);
3327 }
3328 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3329 manager_.NeuterUnencryptedPackets();
3330}
3331
QUICHE teama6ef0a62019-03-07 20:34:33 -05003332} // namespace
3333} // namespace test
3334} // namespace quic