blob: 86ee40a9b17fdd8f7be46d09bc02b23af451e6f0 [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:
88 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070089 : manager_(Perspective::IS_SERVER,
90 &clock_,
91 QuicRandom::GetInstance(),
92 &stats_,
93 kCubicBytes,
fayang01983412019-12-07 05:50:22 -080094 GetDefaultLossDetectionType()),
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
105 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
106 .Times(AnyNumber());
107 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
108 .Times(AnyNumber())
109 .WillRepeatedly(Return(QuicBandwidth::Zero()));
110 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
111 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
112 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
113 .Times(AnyNumber());
114 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
115 EXPECT_CALL(notifier_, HasUnackedCryptoData())
116 .WillRepeatedly(Return(false));
117 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
QUICHE team9467db02019-05-30 09:38:45 -0700118 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119 }
120
121 ~QuicSentPacketManagerTest() override {}
122
ianswett9f459cb2019-04-21 06:39:59 -0700123 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500124 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
125 if (num_packets == 0) {
126 EXPECT_TRUE(manager_.unacked_packets().empty());
127 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
128 &manager_));
129 return;
130 }
131
132 EXPECT_FALSE(manager_.unacked_packets().empty());
133 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
134 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700135 EXPECT_TRUE(
136 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500137 << packets[i];
138 }
139 }
140
141 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
142 EXPECT_EQ(
143 num_packets,
144 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
145 for (size_t i = 0; i < num_packets; ++i) {
146 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
147 &manager_, packets[i]))
148 << " packets[" << i << "]:" << packets[i];
149 }
150 }
151
152 void ExpectAck(uint64_t largest_observed) {
153 EXPECT_CALL(
154 *send_algorithm_,
155 // Ensure the AckedPacketVector argument contains largest_observed.
156 OnCongestionEvent(true, _, _,
157 Pointwise(PacketNumberEq(), {largest_observed}),
158 IsEmpty()));
159 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
160 }
161
dschinazi17d42422019-06-18 16:35:07 -0700162 void ExpectUpdatedRtt(uint64_t /*largest_observed*/) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500163 EXPECT_CALL(*send_algorithm_,
164 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
165 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
166 }
167
168 void ExpectAckAndLoss(bool rtt_updated,
169 uint64_t largest_observed,
170 uint64_t lost_packet) {
171 EXPECT_CALL(
172 *send_algorithm_,
173 OnCongestionEvent(rtt_updated, _, _,
174 Pointwise(PacketNumberEq(), {largest_observed}),
175 Pointwise(PacketNumberEq(), {lost_packet})));
176 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
177 }
178
179 // |packets_acked| and |packets_lost| should be in packet number order.
180 void ExpectAcksAndLosses(bool rtt_updated,
181 uint64_t* packets_acked,
182 size_t num_packets_acked,
183 uint64_t* packets_lost,
184 size_t num_packets_lost) {
185 std::vector<QuicPacketNumber> ack_vector;
186 for (size_t i = 0; i < num_packets_acked; ++i) {
187 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
188 }
189 std::vector<QuicPacketNumber> lost_vector;
190 for (size_t i = 0; i < num_packets_lost; ++i) {
191 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
192 }
193 EXPECT_CALL(*send_algorithm_,
194 OnCongestionEvent(rtt_updated, _, _,
195 Pointwise(PacketNumberEq(), ack_vector),
196 Pointwise(PacketNumberEq(), lost_vector)));
197 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
198 .Times(AnyNumber());
199 }
200
201 void RetransmitAndSendPacket(uint64_t old_packet_number,
202 uint64_t new_packet_number) {
203 RetransmitAndSendPacket(old_packet_number, new_packet_number,
204 TLP_RETRANSMISSION);
205 }
206
207 void RetransmitAndSendPacket(uint64_t old_packet_number,
208 uint64_t new_packet_number,
209 TransmissionType transmission_type) {
210 bool is_lost = false;
fayangcff885a2019-10-22 07:39:04 -0700211 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
212 transmission_type == TLP_RETRANSMISSION ||
213 transmission_type == RTO_RETRANSMISSION ||
214 transmission_type == PROBING_RETRANSMISSION) {
215 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
216 .WillOnce(WithArgs<1>(
217 Invoke([this, new_packet_number](TransmissionType type) {
218 RetransmitDataPacket(new_packet_number, type);
219 })));
220 } else {
221 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
222 is_lost = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500223 }
224 QuicSentPacketManagerPeer::MarkForRetransmission(
225 &manager_, old_packet_number, transmission_type);
fayangcff885a2019-10-22 07:39:04 -0700226 if (!is_lost) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500227 return;
228 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500229 EXPECT_CALL(
230 *send_algorithm_,
231 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
232 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
fayangcff885a2019-10-22 07:39:04 -0700233 SerializedPacket packet(CreatePacket(new_packet_number, true));
234 manager_.OnPacketSent(&packet, clock_.Now(), transmission_type,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500236 }
237
238 SerializedPacket CreateDataPacket(uint64_t packet_number) {
239 return CreatePacket(packet_number, true);
240 }
241
242 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
243 SerializedPacket packet(QuicPacketNumber(packet_number),
244 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
245 false, false);
246 if (retransmittable) {
dmcardlecf0bfcf2019-12-13 08:08:21 -0800247 packet.retransmittable_frames.push_back(QuicFrame(
248 QuicStreamFrame(kStreamId, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500249 }
250 return packet;
251 }
252
zhongyi1b2f7832019-06-14 13:31:34 -0700253 SerializedPacket CreatePingPacket(uint64_t packet_number) {
254 SerializedPacket packet(QuicPacketNumber(packet_number),
255 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
256 false, false);
257 packet.retransmittable_frames.push_back(QuicFrame(QuicPingFrame()));
258 return packet;
259 }
260
QUICHE teama6ef0a62019-03-07 20:34:33 -0500261 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700262 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
263 }
264
265 void SendDataPacket(uint64_t packet_number,
266 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500267 EXPECT_CALL(*send_algorithm_,
268 OnPacketSent(_, BytesInFlight(),
269 QuicPacketNumber(packet_number), _, _));
270 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700271 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700272 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
273 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274 }
275
zhongyi1b2f7832019-06-14 13:31:34 -0700276 void SendPingPacket(uint64_t packet_number,
277 EncryptionLevel encryption_level) {
278 EXPECT_CALL(*send_algorithm_,
279 OnPacketSent(_, BytesInFlight(),
280 QuicPacketNumber(packet_number), _, _));
281 SerializedPacket packet(CreatePingPacket(packet_number));
282 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700283 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
284 HAS_RETRANSMITTABLE_DATA);
zhongyi1b2f7832019-06-14 13:31:34 -0700285 }
286
QUICHE teama6ef0a62019-03-07 20:34:33 -0500287 void SendCryptoPacket(uint64_t packet_number) {
288 EXPECT_CALL(
289 *send_algorithm_,
290 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
291 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
292 SerializedPacket packet(CreatePacket(packet_number, false));
293 packet.retransmittable_frames.push_back(
dmcardlecf0bfcf2019-12-13 08:08:21 -0800294 QuicFrame(QuicStreamFrame(1, false, 0, quiche::QuicheStringPiece())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500295 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -0700296 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
297 HAS_RETRANSMITTABLE_DATA);
298 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500299 }
300
301 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
fayang06bb1b02019-06-14 14:07:12 -0700302 SendAckPacket(packet_number, largest_acked, ENCRYPTION_INITIAL);
303 }
304
305 void SendAckPacket(uint64_t packet_number,
306 uint64_t largest_acked,
307 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 EXPECT_CALL(
309 *send_algorithm_,
310 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
311 kDefaultLength, NO_RETRANSMITTABLE_DATA));
312 SerializedPacket packet(CreatePacket(packet_number, false));
313 packet.largest_acked = QuicPacketNumber(largest_acked);
fayang06bb1b02019-06-14 14:07:12 -0700314 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -0700315 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
316 NO_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500317 }
318
fayangce0a3162019-08-15 09:05:36 -0700319 void EnablePto(QuicTag tag) {
fayangce0a3162019-08-15 09:05:36 -0700320 QuicConfig config;
321 QuicTagVector options;
322 options.push_back(tag);
323 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
324 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
325 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
326 manager_.SetFromConfig(config);
fayang62f867a2019-08-22 12:05:01 -0700327 EXPECT_TRUE(manager_.pto_enabled());
fayangce0a3162019-08-15 09:05:36 -0700328 }
329
QUICHE teama6ef0a62019-03-07 20:34:33 -0500330 QuicSentPacketManager manager_;
331 MockClock clock_;
332 QuicConnectionStats stats_;
333 MockSendAlgorithm* send_algorithm_;
334 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
335 StrictMock<MockSessionNotifier> notifier_;
336};
337
fayangcff885a2019-10-22 07:39:04 -0700338TEST_F(QuicSentPacketManagerTest, IsUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500339 VerifyUnackedPackets(nullptr, 0);
340 SendDataPacket(1);
341
342 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800343 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500344 uint64_t retransmittable[] = {1};
345 VerifyRetransmittablePackets(retransmittable,
bnc4e9283d2019-12-17 07:08:57 -0800346 QUICHE_ARRAYSIZE(retransmittable));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500347}
348
fayangcff885a2019-10-22 07:39:04 -0700349TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500350 SendDataPacket(1);
351 RetransmitAndSendPacket(1, 2);
352
353 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
354 uint64_t unacked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800355 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700356 std::vector<uint64_t> retransmittable = {1, 2};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500357 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
358}
359
fayangcff885a2019-10-22 07:39:04 -0700360TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500361 SendDataPacket(1);
362 RetransmitAndSendPacket(1, 2);
363
364 // Ack 2 but not 1.
365 ExpectAck(2);
366 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
367 clock_.Now());
368 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700369 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700370 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
371 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700372 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500373 // Packet 1 is unacked, pending, but not retransmittable.
374 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800375 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700376 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500377 VerifyRetransmittablePackets(nullptr, 0);
378}
379
fayangcff885a2019-10-22 07:39:04 -0700380TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500381 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700382 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
383 .WillOnce(WithArgs<1>(Invoke(
384 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500385 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
386 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 // Ack 1.
388 ExpectAck(1);
389 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
390 clock_.Now());
391 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700392 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700393 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
394 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500395
fayangcff885a2019-10-22 07:39:04 -0700396 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
397 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800398 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700399 // We do not know packet 2 is a spurious retransmission until it gets acked.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500400 VerifyRetransmittablePackets(nullptr, 0);
401 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
402}
403
fayangcff885a2019-10-22 07:39:04 -0700404TEST_F(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700406 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500407 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
408 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500409
fayangcff885a2019-10-22 07:39:04 -0700410 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500411
412 uint64_t unacked[] = {1};
bnc4e9283d2019-12-17 07:08:57 -0800413 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500414 VerifyRetransmittablePackets(nullptr, 0);
415 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
416}
417
fayangcff885a2019-10-22 07:39:04 -0700418TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500419 SendDataPacket(1);
420 RetransmitAndSendPacket(1, 2);
421 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
422 clock_.AdvanceTime(rtt);
423
424 // Ack 1 but not 2.
425 ExpectAck(1);
426 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
427 clock_.Now());
428 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700429 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700430 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
431 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700432 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500433 // 2 remains unacked, but no packets have retransmittable data.
434 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800435 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700436 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500437 VerifyRetransmittablePackets(nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -0700438 // Ack 2 causes 2 be considered as spurious retransmission.
439 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
440 ExpectAck(2);
441 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
442 clock_.Now());
443 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
444 EXPECT_EQ(PACKETS_NEWLY_ACKED,
445 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
446 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500447
448 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
449}
450
fayangcff885a2019-10-22 07:39:04 -0700451TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500452 SendDataPacket(1);
453 RetransmitAndSendPacket(1, 2);
454 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
455 clock_.AdvanceTime(rtt);
456
457 // First, ACK packet 1 which makes packet 2 non-retransmittable.
458 ExpectAck(1);
459 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
460 clock_.Now());
461 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700462 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700463 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
464 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500465
466 SendDataPacket(3);
467 SendDataPacket(4);
468 SendDataPacket(5);
469 clock_.AdvanceTime(rtt);
470
471 // Next, NACK packet 2 three times.
fayang01983412019-12-07 05:50:22 -0800472 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
473 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
474 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
475 ExpectAckAndLoss(true, 3, 2);
476 } else {
477 ExpectAck(3);
478 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500479 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
480 clock_.Now());
481 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
482 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700483 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700484 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
485 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500486
487 ExpectAck(4);
488 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
489 clock_.Now());
490 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
491 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700492 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700493 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
494 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500495
fayang01983412019-12-07 05:50:22 -0800496 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
497 ExpectAck(5);
498 } else {
499 // Frames in all packets are acked.
500 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
501 // Notify session that stream frame in packet 2 gets lost although it is
502 // not outstanding.
503 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
504 ExpectAckAndLoss(true, 5, 2);
505 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500506 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
507 clock_.Now());
508 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
509 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700510 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700511 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
512 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500513
fayangcff885a2019-10-22 07:39:04 -0700514 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800515 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700516 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500517 VerifyRetransmittablePackets(nullptr, 0);
518
519 // Verify that the retransmission alarm would not fire,
520 // since there is no retransmittable data outstanding.
521 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
522}
523
fayangcff885a2019-10-22 07:39:04 -0700524TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500525 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
526 SendDataPacket(1);
527 RetransmitAndSendPacket(1, 2);
528
529 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
530 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
531 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
532 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500533
534 // Ack 1 but not 2, before 2 is able to be sent.
535 // Since 1 has been retransmitted, it has already been lost, and so the
536 // send algorithm is not informed that it has been ACK'd.
537 ExpectUpdatedRtt(1);
538 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
539 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
540 clock_.Now());
541 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700542 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700543 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
544 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500545
546 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
547 uint64_t unacked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800548 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700549 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500550 VerifyRetransmittablePackets(nullptr, 0);
551
552 // Verify that the retransmission alarm would not fire,
553 // since there is no retransmittable data outstanding.
554 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
555}
556
fayangcff885a2019-10-22 07:39:04 -0700557TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500558 StrictMock<MockDebugDelegate> debug_delegate;
fayangcff885a2019-10-22 07:39:04 -0700559 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION,
560 kDefaultLength))
561 .Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500562 manager_.SetDebugDelegate(&debug_delegate);
563
564 SendDataPacket(1);
565 RetransmitAndSendPacket(1, 2);
566 RetransmitAndSendPacket(2, 3);
567 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
568 clock_.AdvanceTime(rtt);
569
570 // Ack 1 but not 2 or 3.
571 ExpectAck(1);
572 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
573 clock_.Now());
574 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700575 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700576 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
577 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700578 // Frames in packets 2 and 3 are acked.
579 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
580 .Times(2)
581 .WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500582
583 // 2 and 3 remain unacked, but no packets have retransmittable data.
584 uint64_t unacked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -0800585 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700586 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500587 VerifyRetransmittablePackets(nullptr, 0);
588
589 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
590 SendDataPacket(4);
fayangcff885a2019-10-22 07:39:04 -0700591 // No new data gets acked in packet 3.
592 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
593 .WillOnce(Return(false))
594 .WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500595 uint64_t acked[] = {3, 4};
bnc4e9283d2019-12-17 07:08:57 -0800596 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500597 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
598 clock_.Now());
599 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
600 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700601 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700602 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
603 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500604
605 uint64_t unacked2[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800606 VerifyUnackedPackets(unacked2, QUICHE_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700607 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500608
609 SendDataPacket(5);
610 ExpectAckAndLoss(true, 5, 2);
611 EXPECT_CALL(debug_delegate,
612 OnPacketLoss(QuicPacketNumber(2), LOSS_RETRANSMISSION, _));
fayangcff885a2019-10-22 07:39:04 -0700613 // Frames in all packets are acked.
614 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
615 // Notify session that stream frame in packet 2 gets lost although it is
616 // not outstanding.
617 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500618 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
619 clock_.Now());
620 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
621 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700622 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700623 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
624 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500625
fayangcff885a2019-10-22 07:39:04 -0700626 uint64_t unacked3[] = {2};
bnc4e9283d2019-12-17 07:08:57 -0800627 VerifyUnackedPackets(unacked3, QUICHE_ARRAYSIZE(unacked3));
ianswett67d7a3c2019-04-19 10:58:47 -0700628 EXPECT_FALSE(manager_.HasInFlightPackets());
fayangcff885a2019-10-22 07:39:04 -0700629 // Spurious retransmission is detected when packet 3 gets acked. We cannot
630 // know packet 2 is a spurious until it gets acked.
631 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500632}
633
fayangcff885a2019-10-22 07:39:04 -0700634TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
vasilvv0fc587f2019-09-06 13:33:08 -0700635 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500636 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
637
638 SendDataPacket(1);
639 RetransmitAndSendPacket(1, 2);
640
641 // Ack original transmission, but that wasn't lost via fast retransmit,
642 // so no call on OnSpuriousRetransmission is expected.
643 {
644 ExpectAck(1);
645 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
646 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
647 clock_.Now());
648 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700649 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700650 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
651 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500652 }
653
654 SendDataPacket(3);
655 SendDataPacket(4);
656 // Ack 4, which causes 3 to be retransmitted.
657 {
658 ExpectAck(4);
659 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
660 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
661 clock_.Now());
662 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
663 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700664 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700665 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
666 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500667 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
668 }
669
670 // Ack 3, which causes SpuriousRetransmitDetected to be called.
671 {
672 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800673 ExpectAcksAndLosses(false, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500674 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
fayangcc4ea6a2019-10-25 08:44:03 -0700675 EXPECT_CALL(*loss_algorithm,
676 SpuriousLossDetected(_, _, _, QuicPacketNumber(3),
677 QuicPacketNumber(4)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500678 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
679 clock_.Now());
680 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
681 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700682 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700683 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
684 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700685 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
686 // 5 will cause 5 be considered as a spurious retransmission as no new
687 // data gets acked.
688 ExpectAck(5);
689 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
690 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
691 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
692 clock_.Now());
693 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
694 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
695 EXPECT_EQ(PACKETS_NEWLY_ACKED,
696 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
697 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500698 }
699}
700
fayangcff885a2019-10-22 07:39:04 -0700701TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500702 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
703}
704
fayangcff885a2019-10-22 07:39:04 -0700705TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500706 SendDataPacket(1);
707 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
708}
709
fayangcff885a2019-10-22 07:39:04 -0700710TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500711 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
712 SendDataPacket(1);
713 SendAckPacket(2, 1);
714
715 // Now ack the ack and expect an RTT update.
716 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800717 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500718 manager_.OnAckFrameStart(QuicPacketNumber(2),
719 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
720 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700721 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700722 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
723 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500724 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
725
726 SendAckPacket(3, 3);
727
728 // Now ack the ack and expect only an RTT update.
729 uint64_t acked2[] = {3};
bnc4e9283d2019-12-17 07:08:57 -0800730 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500731 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
732 clock_.Now());
733 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700734 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700735 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
736 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500737 EXPECT_EQ(QuicPacketNumber(3u),
738 manager_.largest_packet_peer_knows_is_acked());
739}
740
fayangcff885a2019-10-22 07:39:04 -0700741TEST_F(QuicSentPacketManagerTest, Rtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500742 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
743 SendDataPacket(1);
744 clock_.AdvanceTime(expected_rtt);
745
746 ExpectAck(1);
747 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
748 clock_.Now());
749 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700750 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700751 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
752 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500753 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
754}
755
fayangcff885a2019-10-22 07:39:04 -0700756TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500757 // Expect that the RTT is equal to the local time elapsed, since the
758 // ack_delay_time is larger than the local time elapsed
759 // and is hence invalid.
760 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
761 SendDataPacket(1);
762 clock_.AdvanceTime(expected_rtt);
763
764 ExpectAck(1);
765 manager_.OnAckFrameStart(QuicPacketNumber(1),
766 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
767 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700768 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700769 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
770 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500771 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
772}
773
fayangcff885a2019-10-22 07:39:04 -0700774TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500775 // Expect that the RTT is equal to the local time elapsed, since the
776 // ack_delay_time is infinite, and is hence invalid.
777 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
778 SendDataPacket(1);
779 clock_.AdvanceTime(expected_rtt);
780
781 ExpectAck(1);
782 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
783 clock_.Now());
784 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700785 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700786 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
787 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500788 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
789}
790
wub8ee29a02019-12-12 13:06:48 -0800791TEST_F(QuicSentPacketManagerTest, RttWithDeltaExceedingLimit) {
792 // Initialize min and smoothed rtt to 10ms.
793 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
794 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
795 QuicTime::Delta::Zero(), QuicTime::Zero());
796
797 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(100);
798 QuicTime::Delta ack_delay =
799 QuicTime::Delta::FromMilliseconds(5) + manager_.peer_max_ack_delay();
800 ASSERT_GT(send_delta - rtt_stats->min_rtt(), ack_delay);
801 SendDataPacket(1);
802 clock_.AdvanceTime(send_delta);
803
804 ExpectAck(1);
805 manager_.OnAckFrameStart(QuicPacketNumber(1), ack_delay, clock_.Now());
806 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
807 EXPECT_EQ(PACKETS_NEWLY_ACKED,
808 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
809 ENCRYPTION_FORWARD_SECURE));
810
811 QuicTime::Delta expected_rtt_sample =
812 GetQuicReloadableFlag(quic_sanitize_ack_delay)
813 ? send_delta - manager_.peer_max_ack_delay()
814 : send_delta - ack_delay;
815 EXPECT_EQ(expected_rtt_sample, manager_.GetRttStats()->latest_rtt());
816}
817
fayangcff885a2019-10-22 07:39:04 -0700818TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500819 // Expect that the RTT is the time between send and receive since the
820 // ack_delay_time is zero.
821 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
822 SendDataPacket(1);
823 clock_.AdvanceTime(expected_rtt);
824
825 ExpectAck(1);
826 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
827 clock_.Now());
828 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700829 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700830 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
831 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500832 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
833}
834
fayangcff885a2019-10-22 07:39:04 -0700835TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500836 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
837
838 // Send 1 packet.
839 SendDataPacket(1);
840
841 // The first tail loss probe retransmits 1 packet.
842 manager_.OnRetransmissionTimeout();
843 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700844 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
845 .WillOnce(WithArgs<1>(Invoke(
846 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500847 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500848
849 // The second tail loss probe retransmits 1 packet.
850 manager_.OnRetransmissionTimeout();
851 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700852 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
853 .WillOnce(WithArgs<1>(Invoke(
854 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500855 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500856 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
857 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500858
859 // Ack the third and ensure the first two are still pending.
860 ExpectAck(3);
861
862 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
863 clock_.Now());
864 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700865 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700866 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
867 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500868
ianswett67d7a3c2019-04-19 10:58:47 -0700869 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500870
871 // Acking two more packets will lose both of them due to nacks.
872 SendDataPacket(4);
873 SendDataPacket(5);
874 uint64_t acked[] = {4, 5};
875 uint64_t lost[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -0800876 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
877 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -0700878 // Frames in all packets are acked.
879 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
880 // Notify session that stream frame in packets 1 and 2 get lost although
881 // they are not outstanding.
882 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500883 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
884 clock_.Now());
885 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700886 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700887 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
888 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500889
ianswett67d7a3c2019-04-19 10:58:47 -0700890 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500891 EXPECT_EQ(2u, stats_.tlp_count);
892 EXPECT_EQ(0u, stats_.rto_count);
893}
894
fayangcff885a2019-10-22 07:39:04 -0700895TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500896 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
897
898 // Send 100 packets.
899 const size_t kNumSentPackets = 100;
900 for (size_t i = 1; i <= kNumSentPackets; ++i) {
901 SendDataPacket(i);
902 }
903 QuicTime rto_packet_time = clock_.Now();
904 // Advance the time.
905 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
906
907 // The first tail loss probe retransmits 1 packet.
908 manager_.OnRetransmissionTimeout();
909 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700910 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
911 .WillOnce(WithArgs<1>(Invoke(
912 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500913 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500914 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
915 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500916 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
917
918 // The second tail loss probe retransmits 1 packet.
919 manager_.OnRetransmissionTimeout();
920 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700921 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
922 .WillOnce(WithArgs<1>(Invoke(
923 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500924 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500925 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
926 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
927
928 // Ensure the RTO is set based on the correct packet.
929 rto_packet_time = clock_.Now();
930 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
931 manager_.GetRetransmissionTime());
932
933 // Advance the time enough to ensure all packets are RTO'd.
934 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
935
fayangcff885a2019-10-22 07:39:04 -0700936 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
937 .Times(2)
938 .WillOnce(WithArgs<1>(Invoke(
939 [this](TransmissionType type) { RetransmitDataPacket(103, type); })))
940 .WillOnce(WithArgs<1>(Invoke(
941 [this](TransmissionType type) { RetransmitDataPacket(104, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500942 manager_.OnRetransmissionTimeout();
943 EXPECT_EQ(2u, stats_.tlp_count);
944 EXPECT_EQ(1u, stats_.rto_count);
fayangcff885a2019-10-22 07:39:04 -0700945 // There are 2 RTO retransmissions.
946 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500947 QuicPacketNumber largest_acked = QuicPacketNumber(103);
948 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
949 EXPECT_CALL(*send_algorithm_,
950 OnCongestionEvent(
951 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
952 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -0700953 // Although frames in packet 3 gets acked, it would be kept for another
954 // RTT.
955 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
956 // Packets [1, 102] are lost, although stream frame in packet 3 is not
957 // outstanding.
958 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500959 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
960 clock_.Now());
961 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -0700962 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700963 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
964 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500965 // All packets before 103 should be lost.
fayangcff885a2019-10-22 07:39:04 -0700966 // Packet 104 is still in flight.
967 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500968}
969
fayangcff885a2019-10-22 07:39:04 -0700970TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500971 // Send 2 crypto packets and 3 data packets.
972 const size_t kNumSentCryptoPackets = 2;
973 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
974 SendCryptoPacket(i);
975 }
976 const size_t kNumSentDataPackets = 3;
977 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
978 SendDataPacket(kNumSentCryptoPackets + i);
979 }
ianswett0cc36802019-04-20 03:04:09 -0700980 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -0700981 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500982
983 // The first retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700984 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
985 .Times(2)
986 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
987 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500988 manager_.OnRetransmissionTimeout();
ianswett898306b2019-04-23 11:05:57 -0700989 // Expect all 4 handshake packets to be in flight and 3 data packets.
ianswett04004652019-09-03 18:46:57 -0700990 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -0700991 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500992
993 // The second retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700994 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
995 .Times(2)
996 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
997 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500998 manager_.OnRetransmissionTimeout();
ianswett04004652019-09-03 18:46:57 -0700999 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -07001000 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001001
1002 // Now ack the two crypto packets and the speculatively encrypted request,
1003 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett04004652019-09-03 18:46:57 -07001004 // Crypto packets remain in flight, so any that aren't acked will be lost.
1005 uint64_t acked[] = {3, 4, 5, 8, 9};
1006 uint64_t lost[] = {1, 2, 6};
bnc4e9283d2019-12-17 07:08:57 -08001007 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), lost,
1008 QUICHE_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -07001009 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
1010 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001011 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1012 clock_.Now());
1013 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1014 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001015 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001016 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1017 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001018
ianswett0cc36802019-04-20 03:04:09 -07001019 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001020}
1021
fayangcff885a2019-10-22 07:39:04 -07001022TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001023 // Send 2 crypto packets and 3 data packets.
1024 const size_t kNumSentCryptoPackets = 2;
1025 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1026 SendCryptoPacket(i);
1027 }
1028 const size_t kNumSentDataPackets = 3;
1029 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
1030 SendDataPacket(kNumSentCryptoPackets + i);
1031 }
ianswett0cc36802019-04-20 03:04:09 -07001032 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001033
fayangcff885a2019-10-22 07:39:04 -07001034 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1035 .Times(2)
1036 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1037 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001038 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001039 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001040
1041 // Now act like a version negotiation packet arrived, which would cause all
1042 // unacked packets to be retransmitted.
fayangcff885a2019-10-22 07:39:04 -07001043 // Mark packets [1, 7] lost. And the frames in 6 and 7 are same as packets 1
1044 // and 2, respectively.
1045 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(7);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001046 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
1047
1048 // Ensure the first two pending packets are the crypto retransmits.
fayangcff885a2019-10-22 07:39:04 -07001049 RetransmitCryptoPacket(8);
1050 RetransmitCryptoPacket(9);
1051 RetransmitDataPacket(10, ALL_UNACKED_RETRANSMISSION);
1052 RetransmitDataPacket(11, ALL_UNACKED_RETRANSMISSION);
1053 RetransmitDataPacket(12, ALL_UNACKED_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001054
1055 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
1056 // Least unacked isn't raised until an ack is received, so ack the
1057 // crypto packets.
1058 uint64_t acked[] = {8, 9};
bnc4e9283d2019-12-17 07:08:57 -08001059 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001060 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1061 clock_.Now());
1062 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
fayang3eb82212019-04-16 12:05:46 -07001063 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001064 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1065 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -07001066 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001067 EXPECT_EQ(QuicPacketNumber(10u), manager_.GetLeastUnacked());
1068}
1069
fayangcff885a2019-10-22 07:39:04 -07001070TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001071 // Send 1 crypto packet.
1072 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001073 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001074
1075 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001076 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1077 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001078 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001079
1080 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001081 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1082 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001083 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001084
1085 // Now ack the second crypto packet, and ensure the first gets removed, but
1086 // the third does not.
1087 uint64_t acked[] = {2};
bnc4e9283d2019-12-17 07:08:57 -08001088 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -07001089 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1090 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001091 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1092 clock_.Now());
1093 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001094 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001095 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1096 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001097
ianswett0cc36802019-04-20 03:04:09 -07001098 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett04004652019-09-03 18:46:57 -07001099 uint64_t unacked[] = {1, 3};
bnc4e9283d2019-12-17 07:08:57 -08001100 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001101}
1102
fayangcff885a2019-10-22 07:39:04 -07001103TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001104 // Send 2 crypto packets and 1 data packet.
1105 const size_t kNumSentCryptoPackets = 2;
1106 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1107 SendCryptoPacket(i);
1108 }
1109 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001110 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001111
1112 // Retransmit 2 crypto packets, but not the serialized packet.
fayangcff885a2019-10-22 07:39:04 -07001113 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1114 .Times(2)
1115 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1116 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001117 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001118 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001119}
1120
fayangcff885a2019-10-22 07:39:04 -07001121TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001122 CryptoHandshakeRetransmissionThenRetransmitAll) {
1123 // Send 1 crypto packet.
1124 SendCryptoPacket(1);
1125
ianswett0cc36802019-04-20 03:04:09 -07001126 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001127
1128 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001129 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1130 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001131 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001132 // Now retransmit all the unacked packets, which occurs when there is a
1133 // version negotiation.
fayangcff885a2019-10-22 07:39:04 -07001134 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001135 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
fayangcff885a2019-10-22 07:39:04 -07001136 // Both packets 1 and 2 are unackable.
1137 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(1)));
1138 EXPECT_FALSE(manager_.unacked_packets().IsUnacked(QuicPacketNumber(2)));
ianswett0cc36802019-04-20 03:04:09 -07001139 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001140 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001141}
1142
fayangcff885a2019-10-22 07:39:04 -07001143TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001144 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1145 // Send 1 crypto packet.
1146 SendCryptoPacket(1);
1147
ianswett0cc36802019-04-20 03:04:09 -07001148 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001149
1150 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001151 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1152 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001153 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001154 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001155
1156 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001157 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1158 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001159 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001160 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001161
1162 // Now neuter all unacked unencrypted packets, which occurs when the
1163 // connection goes forward secure.
fayangcff885a2019-10-22 07:39:04 -07001164 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1165 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
fayang93c83942019-11-07 10:41:16 -08001166 manager_.NeuterUnencryptedPackets();
ianswett0cc36802019-04-20 03:04:09 -07001167 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001168 uint64_t unacked[] = {1, 2, 3};
bnc4e9283d2019-12-17 07:08:57 -08001169 VerifyUnackedPackets(unacked, QUICHE_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001170 VerifyRetransmittablePackets(nullptr, 0);
ianswett0cc36802019-04-20 03:04:09 -07001171 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001172 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001173
1174 // Ensure both packets get discarded when packet 2 is acked.
1175 uint64_t acked[] = {3};
bnc4e9283d2019-12-17 07:08:57 -08001176 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001177 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1178 clock_.Now());
1179 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001180 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001181 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1182 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001183 VerifyUnackedPackets(nullptr, 0);
1184 VerifyRetransmittablePackets(nullptr, 0);
1185}
1186
fayangcff885a2019-10-22 07:39:04 -07001187TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001188 StrictMock<MockDebugDelegate> debug_delegate;
1189 manager_.SetDebugDelegate(&debug_delegate);
1190
1191 // Send 100 packets.
1192 const size_t kNumSentPackets = 100;
1193 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1194 SendDataPacket(i);
1195 }
1196
1197 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001198 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1199 .Times(2)
1200 .WillOnce(WithArgs<1>(Invoke(
1201 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1202 .WillOnce(WithArgs<1>(Invoke(
1203 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001204 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001205 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001206
1207 // Ack a retransmission.
1208 // Ensure no packets are lost.
1209 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1210 EXPECT_CALL(*send_algorithm_,
1211 OnCongestionEvent(true, _, _,
1212 Pointwise(PacketNumberEq(), {largest_acked}),
1213 /*lost_packets=*/IsEmpty()));
1214 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1215 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1216 // RTO's use loss detection instead of immediately declaring retransmitted
1217 // packets lost.
1218 for (int i = 1; i <= 99; ++i) {
1219 EXPECT_CALL(debug_delegate,
1220 OnPacketLoss(QuicPacketNumber(i), LOSS_RETRANSMISSION, _));
1221 }
fayangcff885a2019-10-22 07:39:04 -07001222 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1223 // Packets [1, 99] are considered as lost, although stream frame in packet
1224 // 2 is not outstanding.
1225 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001226 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1227 clock_.Now());
1228 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001229 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001230 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1231 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001232}
1233
fayangcff885a2019-10-22 07:39:04 -07001234TEST_F(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001235 // Set the 1RTO connection option.
1236 QuicConfig client_config;
1237 QuicTagVector options;
1238 options.push_back(k1RTO);
1239 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1240 client_config.SetConnectionOptionsToSend(options);
1241 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1242 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1243 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1244 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1245 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1246 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1247 manager_.SetFromConfig(client_config);
1248 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1249
1250 StrictMock<MockDebugDelegate> debug_delegate;
1251 manager_.SetDebugDelegate(&debug_delegate);
1252
1253 // Send 100 packets.
1254 const size_t kNumSentPackets = 100;
1255 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1256 SendDataPacket(i);
1257 }
1258
1259 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001260 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1261 .Times(1)
1262 .WillOnce(WithArgs<1>(Invoke(
1263 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001264 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001265 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001266}
1267
fayangcff885a2019-10-22 07:39:04 -07001268TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001269 QuicConfig client_config;
1270 QuicTagVector options;
1271 options.push_back(kNRTO);
1272 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1273 client_config.SetConnectionOptionsToSend(options);
1274 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1275 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1276 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1277 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1278 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1279 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1280 manager_.SetFromConfig(client_config);
1281 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1282 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1283
1284 // Send 100 packets.
1285 const size_t kNumSentPackets = 100;
1286 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1287 SendDataPacket(i);
1288 }
1289
1290 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001291 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1292 .Times(2)
1293 .WillOnce(WithArgs<1>(Invoke(
1294 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1295 .WillOnce(WithArgs<1>(Invoke(
1296 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001297 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001298 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001299
1300 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1301 // This will include packets in the lost packet map.
1302 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1303 EXPECT_CALL(*send_algorithm_,
1304 OnCongestionEvent(true, _, _,
1305 Pointwise(PacketNumberEq(), {largest_acked}),
1306 /*lost_packets=*/Not(IsEmpty())));
1307 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -07001308 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1309 // Packets [1, 99] are considered as lost, although stream frame in packet
1310 // 2 is not outstanding.
1311 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001312 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1313 clock_.Now());
1314 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001315 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001316 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1317 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001318}
1319
fayangcff885a2019-10-22 07:39:04 -07001320TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001321 // Send 1 packet.
1322 SendDataPacket(1);
1323
fayangcff885a2019-10-22 07:39:04 -07001324 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1325 .WillOnce(WithArgs<1>(Invoke(
1326 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001327 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001328 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001329
1330 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001331 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1332 .WillOnce(WithArgs<1>(Invoke(
1333 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001334 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001335 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001336
1337 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1338 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1339 ExpectAck(2);
1340 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1341 clock_.Now());
1342 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001343 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001344 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1345 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001346
1347 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001348 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001349}
1350
fayangcff885a2019-10-22 07:39:04 -07001351TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001352 // Send 1 packet.
1353 SendDataPacket(1);
1354
fayangcff885a2019-10-22 07:39:04 -07001355 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1356 .WillOnce(WithArgs<1>(Invoke(
1357 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001358 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001359 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001360
1361 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001362 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1363 .WillOnce(WithArgs<1>(Invoke(
1364 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001365 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001366 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001367
1368 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1369 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1370 ExpectAck(3);
1371 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1372 clock_.Now());
1373 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001374 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001375 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1376 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001377
1378 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001379 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001380}
1381
fayangcff885a2019-10-22 07:39:04 -07001382TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001383 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1384}
1385
fayangcff885a2019-10-22 07:39:04 -07001386TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001387 QuicTime crypto_packet_send_time = clock_.Now();
1388 SendCryptoPacket(1);
1389
1390 // Check the min.
1391 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1392 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1393 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1394 manager_.GetRetransmissionTime());
1395
1396 // Test with a standard smoothed RTT.
1397 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1398
1399 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1400 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1401 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1402
1403 // Retransmit the packet by invoking the retransmission timeout.
1404 clock_.AdvanceTime(1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001405 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1406 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1407 // When session decides what to write, crypto_packet_send_time gets updated.
1408 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001409 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001410
1411 // The retransmission time should now be twice as far in the future.
1412 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1413 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1414
1415 // Retransmit the packet for the 2nd time.
1416 clock_.AdvanceTime(2 * 1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001417 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1418 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1419 // When session decides what to write, crypto_packet_send_time gets updated.
1420 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001421 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001422
1423 // Verify exponential backoff of the retransmission timeout.
1424 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1425 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1426}
1427
fayangcff885a2019-10-22 07:39:04 -07001428TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001429 GetConservativeTransmissionTimeCryptoHandshake) {
1430 QuicConfig config;
1431 QuicTagVector options;
1432 options.push_back(kCONH);
1433 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1434 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1435 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1436 manager_.SetFromConfig(config);
1437 // Calling SetFromConfig requires mocking out some send algorithm methods.
1438 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1439 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1440 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1441 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1442
1443 QuicTime crypto_packet_send_time = clock_.Now();
1444 SendCryptoPacket(1);
1445
1446 // Check the min.
1447 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1448 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1449 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1450 manager_.GetRetransmissionTime());
1451
1452 // Test with a standard smoothed RTT.
1453 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1454
1455 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1456 QuicTime expected_time = clock_.Now() + 2 * srtt;
1457 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1458
1459 // Retransmit the packet by invoking the retransmission timeout.
1460 clock_.AdvanceTime(2 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001461 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1462 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1463 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001464 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001465
1466 // The retransmission time should now be twice as far in the future.
1467 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1468 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1469}
1470
fayangcff885a2019-10-22 07:39:04 -07001471TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001472 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1473 SendDataPacket(1);
1474 SendDataPacket(2);
1475
1476 // Check the min.
1477 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1478 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1479 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1480 manager_.GetRetransmissionTime());
1481
1482 // Test with a standard smoothed RTT.
1483 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1484 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1485 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1486 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1487 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1488
1489 // Retransmit the packet by invoking the retransmission timeout.
1490 clock_.AdvanceTime(expected_tlp_delay);
1491 manager_.OnRetransmissionTimeout();
1492 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -07001493 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1494 .WillOnce(WithArgs<1>(Invoke(
1495 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001496 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001497 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1498 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001499
1500 expected_time = clock_.Now() + expected_tlp_delay;
1501 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1502}
1503
fayangcff885a2019-10-22 07:39:04 -07001504TEST_F(QuicSentPacketManagerTest, TLPRWithPendingStreamData) {
zhongyi1b2f7832019-06-14 13:31:34 -07001505 QuicConfig config;
1506 QuicTagVector options;
1507
1508 options.push_back(kTLPR);
1509 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1510 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1511 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1512 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1513 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1514 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1515 .WillOnce(Return(10 * kDefaultTCPMSS));
1516 manager_.SetFromConfig(config);
1517 EXPECT_TRUE(
1518 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1519
1520 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1521
1522 SendDataPacket(1);
1523 SendDataPacket(2);
1524
1525 // Test with a standard smoothed RTT.
1526 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1527 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1528 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1529 // With pending stream data, TLPR is used.
1530 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1531 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(true));
1532
1533 EXPECT_EQ(expected_tlp_delay,
1534 manager_.GetRetransmissionTime() - clock_.Now());
1535
1536 // Retransmit the packet by invoking the retransmission timeout.
1537 clock_.AdvanceTime(expected_tlp_delay);
1538 manager_.OnRetransmissionTimeout();
1539 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001540 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1541 .WillOnce(WithArgs<1>(Invoke(
1542 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1543 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1544
1545 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1546 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001547
1548 // 2nd TLP.
1549 expected_tlp_delay = 2 * srtt;
1550 EXPECT_EQ(expected_tlp_delay,
1551 manager_.GetRetransmissionTime() - clock_.Now());
1552}
1553
fayangcff885a2019-10-22 07:39:04 -07001554TEST_F(QuicSentPacketManagerTest, TLPRWithoutPendingStreamData) {
zhongyi1b2f7832019-06-14 13:31:34 -07001555 QuicConfig config;
1556 QuicTagVector options;
1557
1558 options.push_back(kTLPR);
1559 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1560 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1561 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1562 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1563 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1564 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1565 .WillOnce(Return(10 * kDefaultTCPMSS));
1566 manager_.SetFromConfig(config);
1567 EXPECT_TRUE(
1568 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1569 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1570
1571 SendPingPacket(1, ENCRYPTION_INITIAL);
1572 SendPingPacket(2, ENCRYPTION_INITIAL);
1573
1574 // Test with a standard smoothed RTT.
1575 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1576 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1577 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1578 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
zhongyi9fa2be32019-09-10 12:39:01 -07001579 // With no pending stream data, TLPR is ignored.
1580 expected_tlp_delay = 2 * srtt;
zhongyi1b2f7832019-06-14 13:31:34 -07001581 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(false));
1582 EXPECT_EQ(expected_tlp_delay,
1583 manager_.GetRetransmissionTime() - clock_.Now());
1584
1585 // Retransmit the packet by invoking the retransmission timeout.
1586 clock_.AdvanceTime(expected_tlp_delay);
1587 manager_.OnRetransmissionTimeout();
1588 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001589 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1590 .WillOnce(WithArgs<1>(Invoke(
1591 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1592 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1593 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1594 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001595
1596 // 2nd TLP.
1597 expected_tlp_delay = 2 * srtt;
1598 EXPECT_EQ(expected_tlp_delay,
1599 manager_.GetRetransmissionTime() - clock_.Now());
1600}
1601
fayangcff885a2019-10-22 07:39:04 -07001602TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001603 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1604 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1605 QuicTime::Delta::Zero(), QuicTime::Zero());
1606
1607 SendDataPacket(1);
1608 SendDataPacket(2);
1609 SendDataPacket(3);
1610 SendDataPacket(4);
1611
1612 QuicTime::Delta expected_rto_delay =
1613 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1614 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1615 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1616
1617 // Retransmit the packet by invoking the retransmission timeout.
1618 clock_.AdvanceTime(expected_rto_delay);
fayangcff885a2019-10-22 07:39:04 -07001619 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1620 .Times(2)
1621 .WillOnce(WithArgs<1>(Invoke(
1622 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1623 .WillOnce(WithArgs<1>(Invoke(
1624 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001625 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001626 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001627 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001628
1629 // The delay should double the second time.
1630 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1631 // Once we always base the timer on the right edge, leaving the older packets
1632 // in flight doesn't change the timeout.
1633 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1634
1635 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1636 // original value and OnRetransmissionTimeout is not called or reverted.
fayang01983412019-12-07 05:50:22 -08001637 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08001638 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
wub8ee29a02019-12-12 13:06:48 -08001639 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001640 clock_.Now());
fayang01983412019-12-07 05:50:22 -08001641 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001642 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001643 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1644 ENCRYPTION_INITIAL));
fayang01983412019-12-07 05:50:22 -08001645 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001646
1647 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1648 // and the TLP time. In production, there would always be two TLP's first.
1649 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1650 // by the latest RTT sample of 500ms.
1651 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
1652 // Once we always base the timer on the right edge, leaving the older packets
1653 // in flight doesn't change the timeout.
1654 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1655}
1656
fayangcff885a2019-10-22 07:39:04 -07001657TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001658 SendDataPacket(1);
1659 // Provide a 1ms RTT sample.
1660 const_cast<RttStats*>(manager_.GetRttStats())
1661 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
1662 QuicTime::Zero());
1663 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1664
1665 // If the delay is smaller than the min, ensure it exponentially backs off
1666 // from the min.
1667 for (int i = 0; i < 5; ++i) {
1668 EXPECT_EQ(delay,
1669 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1670 EXPECT_EQ(delay,
1671 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1672 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001673 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1674 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1675 RetransmitDataPacket(i + 2, type);
1676 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001677 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001678 }
1679}
1680
fayangcff885a2019-10-22 07:39:04 -07001681TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001682 SendDataPacket(1);
1683 // Provide a 60s RTT sample.
1684 const_cast<RttStats*>(manager_.GetRttStats())
1685 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
1686 QuicTime::Zero());
1687
1688 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1689 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1690 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1691 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1692}
1693
fayangcff885a2019-10-22 07:39:04 -07001694TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001695 SendDataPacket(1);
1696 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1697
1698 // Delay should back off exponentially.
1699 for (int i = 0; i < 5; ++i) {
1700 EXPECT_EQ(delay,
1701 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1702 EXPECT_EQ(delay,
1703 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, i));
1704 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001705 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1706 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1707 RetransmitDataPacket(i + 2, type);
1708 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001709 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001710 }
1711}
1712
fayangcff885a2019-10-22 07:39:04 -07001713TEST_F(QuicSentPacketManagerTest, RetransmissionDelay) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001714 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1715 const int64_t kRttMs = 250;
1716 const int64_t kDeviationMs = 5;
1717
1718 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
1719 QuicTime::Delta::Zero(), clock_.Now());
1720
1721 // Initial value is to set the median deviation to half of the initial rtt,
1722 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
1723 // is added which is the initial rtt.
1724 QuicTime::Delta expected_delay =
1725 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
1726 EXPECT_EQ(expected_delay,
1727 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1728 EXPECT_EQ(expected_delay,
1729 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
1730
1731 for (int i = 0; i < 100; ++i) {
1732 // Run to make sure that we converge.
1733 rtt_stats->UpdateRtt(
1734 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
1735 QuicTime::Delta::Zero(), clock_.Now());
1736 rtt_stats->UpdateRtt(
1737 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
1738 QuicTime::Delta::Zero(), clock_.Now());
1739 }
1740 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
1741
1742 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
1743 EXPECT_NEAR(expected_delay.ToMilliseconds(),
1744 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
1745 .ToMilliseconds(),
1746 1);
1747 EXPECT_EQ(QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0),
1748 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1749}
1750
fayangcff885a2019-10-22 07:39:04 -07001751TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
vasilvv0fc587f2019-09-06 13:33:08 -07001752 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001753 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
1754
1755 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1756 .WillRepeatedly(Return(QuicTime::Zero()));
1757 SendDataPacket(1);
1758 SendDataPacket(2);
1759
1760 // Handle an ack which causes the loss algorithm to be evaluated and
1761 // set the loss timeout.
1762 ExpectAck(2);
1763 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1764 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1765 clock_.Now());
1766 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001767 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001768 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1769 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001770
1771 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
1772 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1773 .WillRepeatedly(Return(timeout));
1774 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1775
1776 // Fire the retransmission timeout and ensure the loss detection algorithm
1777 // is invoked.
1778 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1779 manager_.OnRetransmissionTimeout();
1780}
1781
fayangcff885a2019-10-22 07:39:04 -07001782TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
fayang01983412019-12-07 05:50:22 -08001783 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1784 return;
1785 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001786 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1787 ->GetLossDetectionType());
1788
1789 QuicConfig config;
1790 QuicTagVector options;
1791 options.push_back(kTIME);
1792 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1793 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1794 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1795 manager_.SetFromConfig(config);
1796
1797 EXPECT_EQ(kTime, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1798 ->GetLossDetectionType());
1799}
1800
fayangcff885a2019-10-22 07:39:04 -07001801TEST_F(QuicSentPacketManagerTest, NegotiateIetfLossDetectionFromOptions) {
fayangb0c7b4b2019-09-12 06:45:24 -07001802 SetQuicReloadableFlag(quic_enable_ietf_loss_detection, true);
fayang01983412019-12-07 05:50:22 -08001803 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1804 EXPECT_EQ(kIetfLossDetection,
1805 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1806 ->GetLossDetectionType());
1807 EXPECT_TRUE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1808 &manager_));
1809 EXPECT_FALSE(
1810 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1811 EXPECT_EQ(kDefaultLossDelayShift,
1812 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1813 } else {
1814 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1815 ->GetLossDetectionType());
1816 }
fayangb0c7b4b2019-09-12 06:45:24 -07001817
1818 QuicConfig config;
1819 QuicTagVector options;
1820 options.push_back(kILD0);
1821 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1822 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1823 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1824 manager_.SetFromConfig(config);
1825
1826 EXPECT_EQ(kIetfLossDetection,
1827 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1828 ->GetLossDetectionType());
1829 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1830 EXPECT_FALSE(
1831 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1832}
1833
fayangcff885a2019-10-22 07:39:04 -07001834TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001835 NegotiateIetfLossDetectionOneFourthRttFromOptions) {
1836 SetQuicReloadableFlag(quic_enable_ietf_loss_detection, true);
fayang01983412019-12-07 05:50:22 -08001837 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1838 EXPECT_EQ(kIetfLossDetection,
1839 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1840 ->GetLossDetectionType());
1841 EXPECT_TRUE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1842 &manager_));
1843 EXPECT_FALSE(
1844 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1845 EXPECT_EQ(kDefaultLossDelayShift,
1846 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1847 } else {
1848 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1849 ->GetLossDetectionType());
1850 }
fayangb0c7b4b2019-09-12 06:45:24 -07001851
1852 QuicConfig config;
1853 QuicTagVector options;
1854 options.push_back(kILD1);
1855 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1856 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1857 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1858 manager_.SetFromConfig(config);
1859
1860 EXPECT_EQ(kIetfLossDetection,
1861 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1862 ->GetLossDetectionType());
1863 EXPECT_EQ(kDefaultLossDelayShift,
1864 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1865 EXPECT_FALSE(
1866 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1867}
1868
fayangcff885a2019-10-22 07:39:04 -07001869TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001870 NegotiateIetfLossDetectionAdaptiveReorderingThreshold) {
1871 SetQuicReloadableFlag(quic_enable_ietf_loss_detection, true);
fayang01983412019-12-07 05:50:22 -08001872 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1873 EXPECT_EQ(kIetfLossDetection,
1874 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1875 ->GetLossDetectionType());
1876 EXPECT_TRUE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1877 &manager_));
1878 EXPECT_FALSE(
1879 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1880 EXPECT_EQ(kDefaultLossDelayShift,
1881 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1882 } else {
1883 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1884 ->GetLossDetectionType());
1885 EXPECT_FALSE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1886 &manager_));
1887 }
fayangb0c7b4b2019-09-12 06:45:24 -07001888
1889 QuicConfig config;
1890 QuicTagVector options;
1891 options.push_back(kILD2);
1892 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1893 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1894 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1895 manager_.SetFromConfig(config);
1896
1897 EXPECT_EQ(kIetfLossDetection,
1898 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1899 ->GetLossDetectionType());
1900 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1901 EXPECT_TRUE(
1902 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1903}
1904
fayangcff885a2019-10-22 07:39:04 -07001905TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001906 NegotiateIetfLossDetectionAdaptiveReorderingThreshold2) {
1907 SetQuicReloadableFlag(quic_enable_ietf_loss_detection, true);
fayang01983412019-12-07 05:50:22 -08001908 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1909 EXPECT_EQ(kIetfLossDetection,
1910 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1911 ->GetLossDetectionType());
1912 EXPECT_TRUE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1913 &manager_));
1914 EXPECT_FALSE(
1915 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1916 EXPECT_EQ(kDefaultLossDelayShift,
1917 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1918 } else {
1919 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1920 ->GetLossDetectionType());
1921 EXPECT_FALSE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1922 &manager_));
1923 }
fayangb0c7b4b2019-09-12 06:45:24 -07001924
1925 QuicConfig config;
1926 QuicTagVector options;
1927 options.push_back(kILD3);
1928 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1929 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1930 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1931 manager_.SetFromConfig(config);
fayangb0c7b4b2019-09-12 06:45:24 -07001932 EXPECT_EQ(kIetfLossDetection,
1933 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1934 ->GetLossDetectionType());
1935 EXPECT_EQ(kDefaultLossDelayShift,
1936 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1937 EXPECT_TRUE(
1938 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1939}
1940
fayangdb095652019-11-04 07:37:36 -08001941TEST_F(QuicSentPacketManagerTest,
1942 NegotiateIetfLossDetectionAdaptiveReorderingAndTimeThreshold) {
1943 SetQuicReloadableFlag(quic_enable_ietf_loss_detection, true);
fayang01983412019-12-07 05:50:22 -08001944 if (GetQuicRestartFlag(quic_default_on_ietf_loss_detection)) {
1945 EXPECT_EQ(kIetfLossDetection,
1946 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1947 ->GetLossDetectionType());
1948 EXPECT_TRUE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1949 &manager_));
1950 EXPECT_FALSE(
1951 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1952 EXPECT_EQ(kDefaultLossDelayShift,
1953 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1954 } else {
1955 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1956 ->GetLossDetectionType());
1957 EXPECT_FALSE(QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(
1958 &manager_));
1959 EXPECT_FALSE(
1960 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1961 }
fayangdb095652019-11-04 07:37:36 -08001962
1963 QuicConfig config;
1964 QuicTagVector options;
1965 options.push_back(kILD4);
1966 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1967 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1968 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1969 manager_.SetFromConfig(config);
1970
1971 EXPECT_EQ(kIetfLossDetection,
1972 QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_)
1973 ->GetLossDetectionType());
1974 EXPECT_EQ(kDefaultLossDelayShift,
1975 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1976 EXPECT_TRUE(
1977 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1978 EXPECT_TRUE(
1979 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1980}
1981
fayangcff885a2019-10-22 07:39:04 -07001982TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001983 QuicConfig config;
1984 QuicTagVector options;
1985
1986 options.push_back(kRENO);
1987 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1988 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1989 manager_.SetFromConfig(config);
1990 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1991 ->GetCongestionControlType());
1992
1993 options.clear();
1994 options.push_back(kTBBR);
1995 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1996 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1997 manager_.SetFromConfig(config);
1998 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1999 ->GetCongestionControlType());
2000
2001 options.clear();
2002 options.push_back(kBYTE);
2003 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2004 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2005 manager_.SetFromConfig(config);
2006 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2007 ->GetCongestionControlType());
2008 options.clear();
2009 options.push_back(kRENO);
2010 options.push_back(kBYTE);
2011 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2012 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2013 manager_.SetFromConfig(config);
2014 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2015 ->GetCongestionControlType());
2016}
2017
fayangcff885a2019-10-22 07:39:04 -07002018TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002019 QuicConfig config;
2020 QuicTagVector options;
2021
2022 // No change if the server receives client options.
2023 const SendAlgorithmInterface* mock_sender =
2024 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
2025 options.push_back(kRENO);
2026 config.SetClientConnectionOptions(options);
2027 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2028 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2029 manager_.SetFromConfig(config);
2030 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
2031
2032 // Change the congestion control on the client with client options.
2033 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2034 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2035 manager_.SetFromConfig(config);
2036 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2037 ->GetCongestionControlType());
2038
2039 options.clear();
2040 options.push_back(kTBBR);
2041 config.SetClientConnectionOptions(options);
2042 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2043 manager_.SetFromConfig(config);
2044 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2045 ->GetCongestionControlType());
2046
2047 options.clear();
2048 options.push_back(kBYTE);
2049 config.SetClientConnectionOptions(options);
2050 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2051 manager_.SetFromConfig(config);
2052 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2053 ->GetCongestionControlType());
2054
2055 options.clear();
2056 options.push_back(kRENO);
2057 options.push_back(kBYTE);
2058 config.SetClientConnectionOptions(options);
2059 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2060 manager_.SetFromConfig(config);
2061 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
2062 ->GetCongestionControlType());
2063}
2064
fayangcff885a2019-10-22 07:39:04 -07002065TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002066 QuicConfig config;
2067 QuicTagVector options;
2068
2069 options.push_back(kMAD2);
2070 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2071 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2072 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2073 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2074 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2075 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2076 .WillOnce(Return(10 * kDefaultTCPMSS));
2077 manager_.SetFromConfig(config);
2078 // Set the initial RTT to 1us.
2079 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2080 QuicTime::Delta::FromMicroseconds(1));
2081 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2082 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2083 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2084 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2085 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2086
ianswettad65ab92019-10-28 07:19:07 -07002087 // Send two packets, and the TLP should be 1ms.
2088 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002089 SendDataPacket(1);
2090 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002091 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002092 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002093 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002094 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2095}
2096
fayangcff885a2019-10-22 07:39:04 -07002097TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002098 QuicConfig client_config;
2099 QuicTagVector options;
2100
2101 options.push_back(kMAD2);
2102 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2103 client_config.SetConnectionOptionsToSend(options);
2104 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2105 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2106 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2107 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2108 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2109 .WillOnce(Return(10 * kDefaultTCPMSS));
2110 manager_.SetFromConfig(client_config);
2111 // Set the initial RTT to 1us.
2112 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2113 QuicTime::Delta::FromMicroseconds(1));
2114 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2115 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2116 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
2117 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2118 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
ianswettad65ab92019-10-28 07:19:07 -07002119 // Send two packets, and the TLP should be 1ms.
2120 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002121 SendDataPacket(1);
2122 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002123 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002124 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002125 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002126 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2127}
2128
fayangcff885a2019-10-22 07:39:04 -07002129TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002130 QuicConfig config;
2131 QuicTagVector options;
2132
2133 options.push_back(kMAD3);
2134 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2135 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2136 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2137 manager_.SetFromConfig(config);
2138 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2139 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2140 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2141 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002142 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002143 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002144 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002145 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002146 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2147 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002148 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002149 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002150 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002151 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002152 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2153}
2154
fayangcff885a2019-10-22 07:39:04 -07002155TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002156 QuicConfig client_config;
2157 QuicTagVector options;
2158
2159 options.push_back(kMAD3);
2160 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2161 client_config.SetConnectionOptionsToSend(options);
2162 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2163 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2164 manager_.SetFromConfig(client_config);
2165 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2166 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2167 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2168 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002169 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002170 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002171 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002172 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002173 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_, 0));
2174 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002175 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002176 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002177 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettdcc474e2019-08-06 08:22:38 -07002178 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002179 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_, 0));
2180}
2181
fayangcff885a2019-10-22 07:39:04 -07002182TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002183 QuicConfig config;
2184 QuicTagVector options;
2185
2186 options.push_back(kNTLP);
2187 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2188 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2189 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2190 manager_.SetFromConfig(config);
2191 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2192}
2193
fayangcff885a2019-10-22 07:39:04 -07002194TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002195 QuicConfig client_config;
2196 QuicTagVector options;
2197
2198 options.push_back(kNTLP);
2199 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2200 client_config.SetConnectionOptionsToSend(options);
2201 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2202 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2203 manager_.SetFromConfig(client_config);
2204 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2205}
2206
fayangcff885a2019-10-22 07:39:04 -07002207TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002208 QuicConfig config;
2209 QuicTagVector options;
2210
2211 options.push_back(k1TLP);
2212 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2213 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2214 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2215 manager_.SetFromConfig(config);
2216 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2217}
2218
fayangcff885a2019-10-22 07:39:04 -07002219TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002220 QuicConfig client_config;
2221 QuicTagVector options;
2222
2223 options.push_back(k1TLP);
2224 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2225 client_config.SetConnectionOptionsToSend(options);
2226 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2227 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2228 manager_.SetFromConfig(client_config);
2229 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2230}
2231
fayangcff885a2019-10-22 07:39:04 -07002232TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002233 QuicConfig config;
2234 QuicTagVector options;
2235
2236 options.push_back(kTLPR);
2237 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2238 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2239 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2240 manager_.SetFromConfig(config);
2241 EXPECT_TRUE(
2242 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2243}
2244
fayangcff885a2019-10-22 07:39:04 -07002245TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002246 QuicConfig client_config;
2247 QuicTagVector options;
2248
2249 options.push_back(kTLPR);
2250 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2251 client_config.SetConnectionOptionsToSend(options);
2252 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2253 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2254 manager_.SetFromConfig(client_config);
2255 EXPECT_TRUE(
2256 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2257}
2258
fayangcff885a2019-10-22 07:39:04 -07002259TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002260 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2261 QuicConfig config;
2262 QuicTagVector options;
2263
2264 options.push_back(kNRTO);
2265 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2266 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2267 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2268 manager_.SetFromConfig(config);
2269 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2270}
2271
fayangcff885a2019-10-22 07:39:04 -07002272TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002273 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2274 QuicConfig client_config;
2275 QuicTagVector options;
2276
2277 options.push_back(kNRTO);
2278 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2279 client_config.SetConnectionOptionsToSend(options);
2280 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2281 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2282 manager_.SetFromConfig(client_config);
2283 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2284}
2285
fayangcff885a2019-10-22 07:39:04 -07002286TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002287 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2288 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2289
2290 QuicConfig config;
2291 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2292 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2293 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2294 manager_.SetFromConfig(config);
2295
2296 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2297 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2298}
2299
fayangcff885a2019-10-22 07:39:04 -07002300TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002301 // The sent packet manager should use the RTT from CachedNetworkParameters if
2302 // it is provided.
2303 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(1234);
2304 CachedNetworkParameters cached_network_params;
2305 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2306
QUICHE teamb4e187c2019-11-14 06:22:50 -08002307 SendAlgorithmInterface::NetworkParams params;
2308 params.bandwidth = QuicBandwidth::Zero();
2309 params.allow_cwnd_to_decrease = false;
2310 params.rtt = kRtt;
2311
2312 EXPECT_CALL(*send_algorithm_, AdjustNetworkParameters(params));
fayangbe83ecd2019-04-26 13:58:09 -07002313 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2314 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002315 manager_.ResumeConnectionState(cached_network_params, false);
2316 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2317}
2318
fayangcff885a2019-10-22 07:39:04 -07002319TEST_F(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002320 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2321 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2322 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2323 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2324
2325 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2326 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2327 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2328 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2329
2330 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
2331 manager_.OnConnectionMigration(IPV4_TO_IPV4_CHANGE);
2332
2333 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2334 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2335 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2336}
2337
fayangcff885a2019-10-22 07:39:04 -07002338TEST_F(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002339 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2340 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2341 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2342 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2343
2344 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2345 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2346 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2347 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2348
2349 manager_.OnConnectionMigration(IPV4_SUBNET_CHANGE);
2350
2351 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2352 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2353 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2354}
2355
fayangcff885a2019-10-22 07:39:04 -07002356TEST_F(QuicSentPacketManagerTest, ConnectionMigrationPortChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002357 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2358 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2359 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2360 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2361
2362 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2363 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2364 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2365 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2366
2367 manager_.OnConnectionMigration(PORT_CHANGE);
2368
2369 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2370 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2371 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2372}
2373
fayangcff885a2019-10-22 07:39:04 -07002374TEST_F(QuicSentPacketManagerTest, PathMtuIncreased) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002375 EXPECT_CALL(*send_algorithm_,
2376 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2377 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2378 nullptr, kDefaultLength + 100, false, false);
fayangcff885a2019-10-22 07:39:04 -07002379 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
2380 HAS_RETRANSMITTABLE_DATA);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002381
2382 // Ack the large packet and expect the path MTU to increase.
2383 ExpectAck(1);
2384 EXPECT_CALL(*network_change_visitor_,
2385 OnPathMtuIncreased(kDefaultLength + 100));
2386 QuicAckFrame ack_frame = InitAckFrame(1);
2387 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2388 clock_.Now());
2389 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002390 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002391 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2392 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002393}
2394
fayangcff885a2019-10-22 07:39:04 -07002395TEST_F(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002396 // Send packets 1 - 20.
2397 for (size_t i = 1; i <= 20; ++i) {
2398 SendDataPacket(i);
2399 }
2400 // Ack [5, 7), [10, 12), [15, 17).
2401 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2402 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002403 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2404 QUICHE_ARRAYSIZE(lost1));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002405 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2406 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2407 clock_.Now());
2408 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2409 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2410 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2411 // Make sure empty range does not harm.
2412 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002413 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002414 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2415 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002416
2417 // Ack [4, 8), [9, 13), [14, 21).
2418 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
bnc4e9283d2019-12-17 07:08:57 -08002419 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002420 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2421 clock_.Now());
2422 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2423 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2424 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002425 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002426 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2427 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002428}
2429
fayangcff885a2019-10-22 07:39:04 -07002430TEST_F(QuicSentPacketManagerTest, TolerateReneging) {
QUICHE team9929cc42019-03-13 08:17:43 -07002431 // Send packets 1 - 20.
2432 for (size_t i = 1; i <= 20; ++i) {
2433 SendDataPacket(i);
2434 }
2435 // Ack [5, 7), [10, 12), [15, 17).
2436 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2437 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
bnc4e9283d2019-12-17 07:08:57 -08002438 ExpectAcksAndLosses(true, acked1, QUICHE_ARRAYSIZE(acked1), lost1,
2439 QUICHE_ARRAYSIZE(lost1));
QUICHE team9929cc42019-03-13 08:17:43 -07002440 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2441 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2442 clock_.Now());
2443 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2444 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2445 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002446 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002447 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2448 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002449
2450 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2451 uint64_t acked2[] = {4, 7, 9, 12};
bnc4e9283d2019-12-17 07:08:57 -08002452 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), nullptr, 0);
QUICHE team9929cc42019-03-13 08:17:43 -07002453 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2454 clock_.Now());
2455 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2456 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002457 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002458 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2459 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002460 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2461}
2462
fayangcff885a2019-10-22 07:39:04 -07002463TEST_F(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
QUICHE teamc279cec2019-03-22 06:51:48 -07002464 manager_.EnableMultiplePacketNumberSpacesSupport();
2465 EXPECT_FALSE(
2466 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL).IsInitialized());
2467 EXPECT_FALSE(
2468 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2469 // Send packet 1.
2470 SendDataPacket(1, ENCRYPTION_INITIAL);
2471 EXPECT_EQ(QuicPacketNumber(1),
2472 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2473 EXPECT_FALSE(
2474 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2475 // Ack packet 1.
2476 ExpectAck(1);
2477 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2478 clock_.Now());
2479 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002480 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002481 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2482 ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002483 EXPECT_EQ(QuicPacketNumber(1),
2484 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2485 EXPECT_FALSE(
2486 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2487 // Send packets 2 and 3.
2488 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2489 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2490 EXPECT_EQ(QuicPacketNumber(1),
2491 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2492 EXPECT_EQ(QuicPacketNumber(3),
2493 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2494 EXPECT_FALSE(
2495 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2496 // Ack packet 2.
2497 ExpectAck(2);
2498 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2499 clock_.Now());
2500 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002501 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002502 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2503 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002504 EXPECT_EQ(QuicPacketNumber(2),
2505 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2506 EXPECT_FALSE(
2507 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2508 // Ack packet 3.
2509 ExpectAck(3);
2510 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2511 clock_.Now());
2512 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002513 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002514 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2515 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002516 EXPECT_EQ(QuicPacketNumber(3),
2517 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2518 EXPECT_FALSE(
2519 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2520 // Send packets 4 and 5.
2521 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2522 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2523 EXPECT_EQ(QuicPacketNumber(1),
2524 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2525 EXPECT_EQ(QuicPacketNumber(3),
2526 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2527 EXPECT_EQ(QuicPacketNumber(5),
2528 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2529 EXPECT_EQ(QuicPacketNumber(5),
2530 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2531 // Ack packet 5.
2532 ExpectAck(5);
2533 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2534 clock_.Now());
2535 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002536 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002537 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2538 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002539 EXPECT_EQ(QuicPacketNumber(3),
2540 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2541 EXPECT_EQ(QuicPacketNumber(5),
2542 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2543 EXPECT_EQ(QuicPacketNumber(5),
2544 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2545
2546 // Send packets 6 - 8.
2547 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2548 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2549 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2550 EXPECT_EQ(QuicPacketNumber(1),
2551 manager_.GetLargestSentPacket(ENCRYPTION_INITIAL));
2552 EXPECT_EQ(QuicPacketNumber(3),
2553 manager_.GetLargestSentPacket(ENCRYPTION_HANDSHAKE));
2554 EXPECT_EQ(QuicPacketNumber(8),
2555 manager_.GetLargestSentPacket(ENCRYPTION_ZERO_RTT));
2556 EXPECT_EQ(QuicPacketNumber(8),
2557 manager_.GetLargestSentPacket(ENCRYPTION_FORWARD_SECURE));
2558 // Ack all packets.
2559 uint64_t acked[] = {4, 6, 7, 8};
bnc4e9283d2019-12-17 07:08:57 -08002560 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
QUICHE teamc279cec2019-03-22 06:51:48 -07002561 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2562 clock_.Now());
2563 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002564 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002565 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(5),
2566 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002567 EXPECT_EQ(QuicPacketNumber(3),
2568 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2569 EXPECT_EQ(QuicPacketNumber(8),
2570 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2571 EXPECT_EQ(QuicPacketNumber(8),
2572 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2573}
2574
fayangcff885a2019-10-22 07:39:04 -07002575TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002576 manager_.EnableMultiplePacketNumberSpacesSupport();
2577 // Send packet 1.
2578 SendDataPacket(1, ENCRYPTION_INITIAL);
2579 // Send packets 2 and 3.
2580 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2581 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2582
2583 // ACK packets 2 and 3 in the wrong packet number space.
2584 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2585 clock_.Now());
2586 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2587 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002588 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2589 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002590}
2591
fayangcff885a2019-10-22 07:39:04 -07002592TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
fayang3eb82212019-04-16 12:05:46 -07002593 manager_.EnableMultiplePacketNumberSpacesSupport();
2594 // Send packet 1.
2595 SendDataPacket(1, ENCRYPTION_INITIAL);
2596 // Send packets 2 and 3.
2597 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2598 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2599
2600 // ACK packet 1 in the wrong packet number space.
2601 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2602 clock_.Now());
2603 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2604 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002605 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2606 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002607}
2608
fayangcff885a2019-10-22 07:39:04 -07002609TEST_F(QuicSentPacketManagerTest,
fayang3eb82212019-04-16 12:05:46 -07002610 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002611 manager_.EnableMultiplePacketNumberSpacesSupport();
2612 // Send packet 1.
2613 SendDataPacket(1, ENCRYPTION_INITIAL);
2614 // Ack packet 1.
2615 ExpectAck(1);
2616 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2617 clock_.Now());
2618 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2619 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002620 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2621 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002622
2623 // Send packets 2 and 3.
2624 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2625 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2626
2627 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2628 // been acked in the correct packet number space, tolerate it.
2629 uint64_t acked[] = {2, 3};
bnc4e9283d2019-12-17 07:08:57 -08002630 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang3eb82212019-04-16 12:05:46 -07002631 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2632 clock_.Now());
2633 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2634 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002635 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2636 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002637}
2638
fayang06bb1b02019-06-14 14:07:12 -07002639// Regression test for b/133771183.
fayangcff885a2019-10-22 07:39:04 -07002640TEST_F(QuicSentPacketManagerTest, PacketInLimbo) {
fayang06bb1b02019-06-14 14:07:12 -07002641 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
2642 // Send SHLO.
2643 SendCryptoPacket(1);
2644 // Send data packet.
2645 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2646 // Send Ack Packet.
2647 SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE);
2648 // Retransmit SHLO.
2649 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2650 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }));
2651 manager_.OnRetransmissionTimeout();
2652
2653 // Successfully decrypt a forward secure packet.
2654 manager_.SetHandshakeConfirmed();
2655 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
2656 // Send Ack packet.
2657 SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE);
2658
2659 // Retransmission alarm fires.
2660 manager_.OnRetransmissionTimeout();
2661 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2662 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2663 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2664 })));
2665 manager_.MaybeRetransmitTailLossProbe();
2666
2667 // Received Ack of packets 1, 3 and 4.
2668 uint64_t acked[] = {1, 3, 4};
bnc4e9283d2019-12-17 07:08:57 -08002669 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang06bb1b02019-06-14 14:07:12 -07002670 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2671 clock_.Now());
2672 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
2673 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2674 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002675 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2676 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002677
2678 uint64_t acked2[] = {5, 6};
2679 uint64_t loss[] = {2};
fayang897605d2019-08-21 13:26:45 -07002680 // Verify packet 2 is detected lost.
2681 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
bnc4e9283d2019-12-17 07:08:57 -08002682 ExpectAcksAndLosses(true, acked2, QUICHE_ARRAYSIZE(acked2), loss,
2683 QUICHE_ARRAYSIZE(loss));
fayang06bb1b02019-06-14 14:07:12 -07002684 manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(),
2685 clock_.Now());
2686 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7));
2687 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002688 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2689 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002690}
2691
fayangcff885a2019-10-22 07:39:04 -07002692TEST_F(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) {
fayanga29eb242019-07-16 12:25:38 -07002693 // Send 10 packets.
2694 for (size_t i = 1; i <= 10; ++i) {
2695 SendDataPacket(i);
2696 }
2697 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2698 .Times(2)
2699 .WillOnce(WithArgs<1>(Invoke(
2700 [this](TransmissionType type) { RetransmitDataPacket(11, type); })))
2701 .WillOnce(WithArgs<1>(Invoke(
2702 [this](TransmissionType type) { RetransmitDataPacket(12, type); })));
2703 manager_.OnRetransmissionTimeout();
2704 EXPECT_EQ(1u, stats_.rto_count);
2705 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2706
2707 // RTO fires again, but there is no packet to be RTO retransmitted.
2708 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
2709 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
2710 manager_.OnRetransmissionTimeout();
2711 EXPECT_EQ(2u, stats_.rto_count);
fayange861aee2019-10-16 13:40:39 -07002712 // Verify a credit is raised up.
2713 EXPECT_EQ(1u, manager_.pending_timer_transmission_count());
fayanga29eb242019-07-16 12:25:38 -07002714}
2715
fayangcff885a2019-10-22 07:39:04 -07002716TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeout) {
fayangce0a3162019-08-15 09:05:36 -07002717 EnablePto(k2PTO);
2718 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2719 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2720 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2721 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2722 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2723 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2724 QuicTime::Delta::Zero(), QuicTime::Zero());
2725 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2726
2727 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2728 // Verify PTO is correctly set.
2729 QuicTime::Delta expected_pto_delay =
2730 srtt + 4 * rtt_stats->mean_deviation() +
2731 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2732 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2733 manager_.GetRetransmissionTime());
2734
2735 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2736 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2737 // Verify PTO is correctly set based on sent time of packet 2.
2738 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2739 manager_.GetRetransmissionTime());
2740 EXPECT_EQ(0u, stats_.pto_count);
2741
2742 // Invoke PTO.
2743 clock_.AdvanceTime(expected_pto_delay);
2744 manager_.OnRetransmissionTimeout();
2745 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2746 EXPECT_EQ(1u, stats_.pto_count);
2747
2748 // Verify two probe packets get sent.
2749 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2750 .Times(2)
2751 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2752 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2753 })))
2754 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2755 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2756 })));
2757 manager_.MaybeSendProbePackets();
2758 // Verify PTO period gets set to twice the current value.
2759 QuicTime sent_time = clock_.Now();
2760 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2761 manager_.GetRetransmissionTime());
2762
2763 // Received ACK for packets 1 and 2.
2764 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002765 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayangce0a3162019-08-15 09:05:36 -07002766 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2767 clock_.Now());
2768 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2769 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2770 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2771 ENCRYPTION_FORWARD_SECURE));
2772 expected_pto_delay =
2773 rtt_stats->SmoothedOrInitialRtt() +
2774 std::max(4 * rtt_stats->mean_deviation(),
2775 QuicTime::Delta::FromMilliseconds(1)) +
2776 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2777
2778 // Verify PTO is correctly re-armed based on sent time of packet 4.
2779 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
2780}
2781
fayangcff885a2019-10-22 07:39:04 -07002782TEST_F(QuicSentPacketManagerTest, SendOneProbePacket) {
fayangce0a3162019-08-15 09:05:36 -07002783 EnablePto(k1PTO);
2784 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2785 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2786 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2787 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2788
2789 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2790 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2791 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2792
2793 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2794 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2795 QuicTime::Delta::Zero(), QuicTime::Zero());
2796 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2797 // Verify PTO period is correctly set.
2798 QuicTime::Delta expected_pto_delay =
2799 srtt + 4 * rtt_stats->mean_deviation() +
2800 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2801 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2802 manager_.GetRetransmissionTime());
2803
2804 // Invoke PTO.
2805 clock_.AdvanceTime(expected_pto_delay);
2806 manager_.OnRetransmissionTimeout();
2807 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2808
2809 // Verify one probe packet gets sent.
2810 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2811 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2812 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2813 })));
2814 manager_.MaybeSendProbePackets();
2815}
2816
fayangcff885a2019-10-22 07:39:04 -07002817TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeClient) {
fayang5f135052019-08-22 17:59:40 -07002818 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayang08a6c952019-09-18 14:29:45 -07002819 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002820 // Send CHLO.
2821 SendCryptoPacket(1);
2822 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2823 // Ack packet 1.
2824 ExpectAck(1);
2825 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2826 clock_.Now());
2827 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2828 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2829 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2830 ENCRYPTION_INITIAL));
2831 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2832 // Verify retransmission timeout is not zero because handshake is not
2833 // confirmed although there is no in flight packet.
2834 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2835 // Fire PTO.
2836 EXPECT_EQ(QuicSentPacketManager::PTO_MODE,
2837 manager_.OnRetransmissionTimeout());
2838}
2839
fayangcff885a2019-10-22 07:39:04 -07002840TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeServer) {
fayang08a6c952019-09-18 14:29:45 -07002841 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002842 // Send SHLO.
2843 SendCryptoPacket(1);
2844 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2845 // Ack packet 1.
2846 ExpectAck(1);
2847 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2848 clock_.Now());
2849 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2850 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2851 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2852 ENCRYPTION_INITIAL));
2853 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2854 // Verify retransmission timeout is not set on server side because there is
2855 // nothing in flight.
2856 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2857}
2858
fayangcff885a2019-10-22 07:39:04 -07002859TEST_F(QuicSentPacketManagerTest, ForwardSecurePacketAcked) {
fayangfa3b1d62019-11-18 08:02:13 -08002860 EXPECT_LT(manager_.handshake_state(),
2861 QuicSentPacketManager::HANDSHAKE_CONFIRMED);
fayang70f9f932019-10-18 06:55:09 -07002862 SendDataPacket(1, ENCRYPTION_INITIAL);
2863 // Ack packet 1.
2864 ExpectAck(1);
2865 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2866 clock_.Now());
2867 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2868 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2869 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2870 ENCRYPTION_INITIAL));
fayangfa3b1d62019-11-18 08:02:13 -08002871 EXPECT_LT(manager_.handshake_state(),
2872 QuicSentPacketManager::HANDSHAKE_CONFIRMED);
fayang70f9f932019-10-18 06:55:09 -07002873
2874 SendDataPacket(2, ENCRYPTION_ZERO_RTT);
2875 // Ack packet 2.
2876 ExpectAck(2);
2877 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2878 clock_.Now());
2879 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
2880 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2881 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2882 ENCRYPTION_FORWARD_SECURE));
fayangfa3b1d62019-11-18 08:02:13 -08002883 EXPECT_LT(manager_.handshake_state(),
2884 QuicSentPacketManager::HANDSHAKE_CONFIRMED);
fayang70f9f932019-10-18 06:55:09 -07002885
2886 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
2887 // Ack packet 3.
2888 ExpectAck(3);
2889 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2890 clock_.Now());
2891 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
2892 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2893 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2894 ENCRYPTION_FORWARD_SECURE));
fayangfa3b1d62019-11-18 08:02:13 -08002895 EXPECT_EQ(manager_.handshake_state(),
2896 QuicSentPacketManager::HANDSHAKE_CONFIRMED);
fayang70f9f932019-10-18 06:55:09 -07002897}
2898
fayang4c908f02019-11-01 07:26:17 -07002899TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) {
2900 EnablePto(k1PTO);
2901 // Use PTOS and PTOA.
2902 QuicConfig config;
2903 QuicTagVector options;
2904 options.push_back(kPTOS);
2905 options.push_back(kPTOA);
2906 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2907 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2908 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2909 manager_.SetFromConfig(config);
2910 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
2911 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
2912
2913 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2914 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2915 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2916 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2917 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2918 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2919 QuicTime::Delta::Zero(), QuicTime::Zero());
2920 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2921
2922 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2923 // Verify PTO is correctly set and ack delay is included.
2924 QuicTime::Delta expected_pto_delay =
2925 srtt + 4 * rtt_stats->mean_deviation() +
2926 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2927 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2928 manager_.GetRetransmissionTime());
2929
2930 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2931 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2932 // Verify PTO is correctly set based on sent time of packet 2 but ack delay is
2933 // not included as an immediate ACK is expected.
2934 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
2935 kDefaultDelayedAckTimeMs);
2936 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2937 manager_.GetRetransmissionTime());
2938 EXPECT_EQ(0u, stats_.pto_count);
2939
2940 // Invoke PTO.
2941 clock_.AdvanceTime(expected_pto_delay);
2942 manager_.OnRetransmissionTimeout();
2943 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2944 EXPECT_EQ(1u, stats_.pto_count);
2945
2946 // Verify 1 probe packets get sent and packet number gets skipped.
2947 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2948 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2949 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2950 })));
2951 manager_.MaybeSendProbePackets();
2952 // Verify PTO period gets set to twice the current value. Also, ack delay is
2953 // not included.
2954 QuicTime sent_time = clock_.Now();
2955 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2956 manager_.GetRetransmissionTime());
2957
2958 // Received ACK for packets 1 and 2.
2959 uint64_t acked[] = {1, 2};
bnc4e9283d2019-12-17 07:08:57 -08002960 ExpectAcksAndLosses(true, acked, QUICHE_ARRAYSIZE(acked), nullptr, 0);
fayang4c908f02019-11-01 07:26:17 -07002961 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2962 clock_.Now());
2963 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2964 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2965 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2966 ENCRYPTION_FORWARD_SECURE));
2967 expected_pto_delay =
2968 rtt_stats->SmoothedOrInitialRtt() +
2969 std::max(4 * rtt_stats->mean_deviation(),
2970 QuicTime::Delta::FromMilliseconds(1)) +
2971 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2972
2973 // Verify PTO is correctly re-armed based on sent time of packet 4. Because of
2974 // PTOS turns out to be spurious, ACK delay is included.
2975 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
2976
2977 // Received ACK for packets 4.
2978 ExpectAck(4);
2979 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2980 clock_.Now());
2981 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
2982 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2983 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2984 ENCRYPTION_FORWARD_SECURE));
2985 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2986 // Send more packets, such that peer will do ack decimation.
2987 std::vector<uint64_t> acked2;
2988 for (size_t i = 5; i <= 100; ++i) {
2989 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
2990 acked2.push_back(i);
2991 }
2992 // Received ACK for all sent packets.
2993 ExpectAcksAndLosses(true, &acked2[0], acked2.size(), nullptr, 0);
2994 manager_.OnAckFrameStart(QuicPacketNumber(100), QuicTime::Delta::Infinite(),
2995 clock_.Now());
2996 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(101));
2997 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2998 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(100),
2999 ENCRYPTION_FORWARD_SECURE));
3000
3001 expected_pto_delay =
3002 rtt_stats->SmoothedOrInitialRtt() +
3003 std::max(4 * rtt_stats->mean_deviation(),
3004 QuicTime::Delta::FromMilliseconds(1)) +
3005 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3006 for (size_t i = 101; i < 110; i++) {
3007 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
3008 // Verify PTO timeout includes ACK delay as there are less than 10 packets
3009 // outstanding.
3010 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3011 manager_.GetRetransmissionTime());
3012 }
3013 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
3014 kDefaultDelayedAckTimeMs);
3015 SendDataPacket(110, ENCRYPTION_FORWARD_SECURE);
3016 // Verify ACK delay is excluded.
3017 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3018 manager_.GetRetransmissionTime());
3019}
3020
fayang7085a6d2019-11-04 07:03:57 -08003021TEST_F(QuicSentPacketManagerTest, StartExponentialBackoffSince2ndPto) {
3022 EnablePto(k2PTO);
3023 QuicConfig config;
3024 QuicTagVector options;
3025 options.push_back(kPEB2);
3026 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3027 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3028 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3029 manager_.SetFromConfig(config);
3030
3031 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3032 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3033 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3034 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3035 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3036 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3037 QuicTime::Delta::Zero(), QuicTime::Zero());
3038 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3039
3040 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3041 // Verify PTO is correctly set.
3042 QuicTime::Delta expected_pto_delay =
3043 srtt + 4 * rtt_stats->mean_deviation() +
3044 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3045 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3046 manager_.GetRetransmissionTime());
3047
3048 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3049 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3050 // Verify PTO is correctly set based on sent time of packet 2.
3051 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3052 manager_.GetRetransmissionTime());
3053 EXPECT_EQ(0u, stats_.pto_count);
3054
3055 // Invoke PTO.
3056 clock_.AdvanceTime(expected_pto_delay);
3057 manager_.OnRetransmissionTimeout();
3058 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3059 EXPECT_EQ(1u, stats_.pto_count);
3060
3061 // Verify two probe packets get sent.
3062 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3063 .Times(2)
3064 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3065 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3066 })))
3067 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3068 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3069 })));
3070 manager_.MaybeSendProbePackets();
3071 // Verify no exponential backoff.
3072 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3073 manager_.GetRetransmissionTime());
3074
3075 // Invoke 2nd PTO.
3076 clock_.AdvanceTime(expected_pto_delay);
3077 manager_.OnRetransmissionTimeout();
3078 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3079 EXPECT_EQ(2u, stats_.pto_count);
3080
3081 // Verify two probe packets get sent.
3082 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3083 .Times(2)
3084 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3085 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3086 })))
3087 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3088 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
3089 })));
3090 manager_.MaybeSendProbePackets();
3091 // Verify still no exponential backoff.
3092 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3093 manager_.GetRetransmissionTime());
3094
3095 // Invoke 3rd PTO.
3096 clock_.AdvanceTime(expected_pto_delay);
3097 manager_.OnRetransmissionTimeout();
3098 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3099 EXPECT_EQ(3u, stats_.pto_count);
3100
3101 // Verify two probe packets get sent.
3102 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3103 .Times(2)
3104 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3105 RetransmitDataPacket(7, type, ENCRYPTION_FORWARD_SECURE);
3106 })))
3107 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3108 RetransmitDataPacket(8, type, ENCRYPTION_FORWARD_SECURE);
3109 })));
3110 manager_.MaybeSendProbePackets();
3111 // Verify exponential backoff starts.
3112 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3113 manager_.GetRetransmissionTime());
3114
3115 // Invoke 4th PTO.
3116 clock_.AdvanceTime(expected_pto_delay * 2);
3117 manager_.OnRetransmissionTimeout();
3118 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3119 EXPECT_EQ(4u, stats_.pto_count);
3120
3121 // Verify two probe packets get sent.
3122 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3123 .Times(2)
3124 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3125 RetransmitDataPacket(9, type, ENCRYPTION_FORWARD_SECURE);
3126 })))
3127 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3128 RetransmitDataPacket(10, type, ENCRYPTION_FORWARD_SECURE);
3129 })));
3130 manager_.MaybeSendProbePackets();
3131 // Verify exponential backoff continues.
3132 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3133 manager_.GetRetransmissionTime());
3134}
3135
fayang75db4342019-11-04 13:29:14 -08003136TEST_F(QuicSentPacketManagerTest, PtoTimeoutRttVarMultiple) {
3137 EnablePto(k1PTO);
3138 // Use 2 * rttvar
3139 QuicConfig config;
3140 QuicTagVector options;
3141 options.push_back(kPVS1);
3142 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3143 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3144 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3145 manager_.SetFromConfig(config);
3146
3147 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3148 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3149 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3150 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3151 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3152 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3153 QuicTime::Delta::Zero(), QuicTime::Zero());
3154 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3155
3156 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3157 // Verify PTO is correctly set based on 2 times rtt var.
3158 QuicTime::Delta expected_pto_delay =
3159 srtt + 2 * rtt_stats->mean_deviation() +
3160 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3161 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3162 manager_.GetRetransmissionTime());
3163}
3164
fayang93c83942019-11-07 10:41:16 -08003165// Regression test for b/143962153
3166TEST_F(QuicSentPacketManagerTest, RtoNotInFlightPacket) {
3167 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
3168 // Send SHLO.
dmcardlecf0bfcf2019-12-13 08:08:21 -08003169 QuicStreamFrame crypto_frame(1, false, 0, quiche::QuicheStringPiece());
fayang93c83942019-11-07 10:41:16 -08003170 SendCryptoPacket(1);
3171 // Send data packet.
3172 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3173
3174 // Successfully decrypt a forward secure packet.
fayange1e81d22020-01-06 11:41:34 -08003175 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(1);
fayang93c83942019-11-07 10:41:16 -08003176 manager_.SetHandshakeConfirmed();
3177
3178 // 1st TLP.
3179 manager_.OnRetransmissionTimeout();
3180 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3181 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3182 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3183 })));
3184 manager_.MaybeRetransmitTailLossProbe();
3185
3186 // 2nd TLP.
3187 manager_.OnRetransmissionTimeout();
3188 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3189 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3190 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3191 })));
3192 manager_.MaybeRetransmitTailLossProbe();
3193
3194 // RTO retransmits SHLO although it is not in flight.
fayang93c83942019-11-07 10:41:16 -08003195 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
fayangac35d452019-11-08 12:35:15 -08003196 .WillOnce(WithArgs<0>(Invoke([&crypto_frame](const QuicFrames& frames) {
3197 EXPECT_EQ(1u, frames.size());
fayange1e81d22020-01-06 11:41:34 -08003198 EXPECT_NE(crypto_frame, frames[0].stream_frame);
fayangac35d452019-11-08 12:35:15 -08003199 })));
fayang93c83942019-11-07 10:41:16 -08003200 manager_.OnRetransmissionTimeout();
3201}
3202
fayang4aa22402020-01-07 11:36:07 -08003203TEST_F(QuicSentPacketManagerTest, Aggressive1Pto) {
3204 EnablePto(k1PTO);
3205 // Let the first PTO be aggressive.
3206 QuicConfig config;
3207 QuicTagVector options;
3208 options.push_back(kPTOS);
3209 options.push_back(kPAG1);
3210 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3211 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3212 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3213 manager_.SetFromConfig(config);
3214
3215 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3216 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3217 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3218 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3219 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3220 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3221 QuicTime::Delta::Zero(), QuicTime::Zero());
3222 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3223 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3224 // Verify PTO is correctly set.
3225 QuicTime::Delta expected_pto_delay = 2 * srtt;
3226 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3227 manager_.GetRetransmissionTime());
3228
3229 // Invoke PTO.
3230 clock_.AdvanceTime(expected_pto_delay);
3231 manager_.OnRetransmissionTimeout();
3232 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3233 EXPECT_EQ(1u, stats_.pto_count);
3234
3235 // Verify 1 probe packets get sent and packet number gets skipped.
3236 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3237 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3238 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3239 })));
3240 manager_.MaybeSendProbePackets();
3241
3242 // Verify PTO period gets set correctly.
3243 QuicTime sent_time = clock_.Now();
3244 expected_pto_delay =
3245 srtt + 4 * rtt_stats->mean_deviation() +
3246 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3247 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3248 manager_.GetRetransmissionTime());
3249}
3250
3251TEST_F(QuicSentPacketManagerTest, Aggressive2Ptos) {
3252 EnablePto(k1PTO);
3253 // Let the first PTO be aggressive.
3254 QuicConfig config;
3255 QuicTagVector options;
3256 options.push_back(kPTOS);
3257 options.push_back(kPAG2);
3258 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3259 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3260 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3261 manager_.SetFromConfig(config);
3262
3263 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3264 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3265 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3266 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3267 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3268 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3269 QuicTime::Delta::Zero(), QuicTime::Zero());
3270 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3271 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3272 // Verify PTO is correctly set.
3273 QuicTime::Delta expected_pto_delay = 2 * srtt;
3274 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3275 manager_.GetRetransmissionTime());
3276
3277 // Invoke PTO.
3278 clock_.AdvanceTime(expected_pto_delay);
3279 manager_.OnRetransmissionTimeout();
3280 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3281 EXPECT_EQ(1u, stats_.pto_count);
3282
3283 // Verify 1 probe packets get sent and packet number gets skipped.
3284 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3285 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3286 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3287 })));
3288 manager_.MaybeSendProbePackets();
3289
3290 // Verify PTO period gets set correctly.
3291 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3292 manager_.GetRetransmissionTime());
3293
3294 // Invoke 2nd PTO.
3295 clock_.AdvanceTime(expected_pto_delay);
3296 manager_.OnRetransmissionTimeout();
3297 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3298 EXPECT_EQ(2u, stats_.pto_count);
3299
3300 // Verify 1 probe packets get sent and packet number gets skipped.
3301 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3302 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3303 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3304 })));
3305 manager_.MaybeSendProbePackets();
3306 expected_pto_delay =
3307 srtt + 4 * rtt_stats->mean_deviation() +
3308 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3309
3310 // Verify PTO period gets set correctly.
3311 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3312 manager_.GetRetransmissionTime());
3313}
3314
fayang402103c2020-01-10 13:36:24 -08003315TEST_F(QuicSentPacketManagerTest, IW10ForUpAndDown) {
3316 SetQuicReloadableFlag(quic_bbr_mitigate_overly_large_bandwidth_sample, true);
3317 QuicConfig config;
3318 QuicTagVector options;
3319 options.push_back(kBWS5);
3320 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3321 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3322 EXPECT_CALL(*send_algorithm_, SetInitialCongestionWindowInPackets(10));
3323 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3324 manager_.SetFromConfig(config);
3325
3326 EXPECT_EQ(10u, manager_.initial_congestion_window());
3327}
3328
QUICHE teama6ef0a62019-03-07 20:34:33 -05003329} // namespace
3330} // namespace test
3331} // namespace quic