blob: 388a662096e760e60f9bf091706abd2576ad5713 [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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "quic/core/quic_sent_packet_manager.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
7#include <memory>
bnc463f2352019-10-10 04:49:34 -07008#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -05009
vasilvvbed67c62020-10-20 06:38:43 -070010#include "absl/base/macros.h"
vasilvvc872ee42020-10-07 19:50:22 -070011#include "absl/strings/string_view.h"
QUICHE team5be974e2020-12-29 18:35:24 -050012#include "quic/core/frames/quic_ack_frequency_frame.h"
13#include "quic/core/quic_time.h"
14#include "quic/core/quic_types.h"
15#include "quic/platform/api/quic_expect_bug.h"
16#include "quic/platform/api/quic_flags.h"
17#include "quic/platform/api/quic_test.h"
18#include "quic/test_tools/quic_config_peer.h"
19#include "quic/test_tools/quic_sent_packet_manager_peer.h"
20#include "quic/test_tools/quic_test_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050021
22using testing::_;
23using testing::AnyNumber;
24using testing::Invoke;
25using testing::InvokeWithoutArgs;
26using testing::IsEmpty;
27using testing::Not;
28using testing::Pointwise;
29using testing::Return;
30using testing::StrictMock;
31using testing::WithArgs;
32
33namespace quic {
34namespace test {
35namespace {
36// Default packet length.
37const uint32_t kDefaultLength = 1000;
38
39// Stream ID for data sent in CreatePacket().
40const QuicStreamId kStreamId = 7;
41
42// Matcher to check that the packet number matches the second argument.
43MATCHER(PacketNumberEq, "") {
44 return ::testing::get<0>(arg).packet_number ==
45 QuicPacketNumber(::testing::get<1>(arg));
46}
47
48class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate {
49 public:
wub713afae2020-04-27 07:48:31 -070050 MOCK_METHOD(void,
51 OnSpuriousPacketRetransmission,
52 (TransmissionType transmission_type, QuicByteCount byte_size),
53 (override));
54 MOCK_METHOD(void,
55 OnPacketLoss,
56 (QuicPacketNumber lost_packet_number,
57 EncryptionLevel encryption_level,
58 TransmissionType transmission_type,
59 QuicTime detection_time),
60 (override));
QUICHE teama6ef0a62019-03-07 20:34:33 -050061};
62
fayangcff885a2019-10-22 07:39:04 -070063class QuicSentPacketManagerTest : public QuicTest {
QUICHE teama6ef0a62019-03-07 20:34:33 -050064 public:
65 void RetransmitCryptoPacket(uint64_t packet_number) {
66 EXPECT_CALL(
67 *send_algorithm_,
68 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
69 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
70 SerializedPacket packet(CreatePacket(packet_number, false));
71 packet.retransmittable_frames.push_back(
vasilvvc872ee42020-10-07 19:50:22 -070072 QuicFrame(QuicStreamFrame(1, false, 0, absl::string_view())));
QUICHE teama6ef0a62019-03-07 20:34:33 -050073 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -070074 manager_.OnPacketSent(&packet, clock_.Now(), HANDSHAKE_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -070075 HAS_RETRANSMITTABLE_DATA, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -050076 }
77
fayang06bb1b02019-06-14 14:07:12 -070078 void RetransmitDataPacket(uint64_t packet_number,
79 TransmissionType type,
80 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050081 EXPECT_CALL(
82 *send_algorithm_,
83 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
84 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
85 SerializedPacket packet(CreatePacket(packet_number, true));
fayang06bb1b02019-06-14 14:07:12 -070086 packet.encryption_level = level;
danzh8c7d1192020-08-25 08:01:43 -070087 manager_.OnPacketSent(&packet, clock_.Now(), type, HAS_RETRANSMITTABLE_DATA,
88 true);
QUICHE teama6ef0a62019-03-07 20:34:33 -050089 }
90
fayang06bb1b02019-06-14 14:07:12 -070091 void RetransmitDataPacket(uint64_t packet_number, TransmissionType type) {
92 RetransmitDataPacket(packet_number, type, ENCRYPTION_INITIAL);
93 }
94
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 protected:
wub18773d62020-01-28 14:14:06 -080096 const CongestionControlType kInitialCongestionControlType = kCubicBytes;
QUICHE teama6ef0a62019-03-07 20:34:33 -050097 QuicSentPacketManagerTest()
QUICHE team73957f12019-04-18 16:21:52 -070098 : manager_(Perspective::IS_SERVER,
99 &clock_,
100 QuicRandom::GetInstance(),
101 &stats_,
fayang3be090d2020-02-11 14:05:08 -0800102 kInitialCongestionControlType),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500103 send_algorithm_(new StrictMock<MockSendAlgorithm>),
104 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
105 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
106 // Disable tail loss probes for most tests.
107 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
108 // Advance the time 1s so the send times are never QuicTime::Zero.
109 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
110 manager_.SetNetworkChangeVisitor(network_change_visitor_.get());
111 manager_.SetSessionNotifier(&notifier_);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500112
wub18773d62020-01-28 14:14:06 -0800113 EXPECT_CALL(*send_algorithm_, GetCongestionControlType())
114 .WillRepeatedly(Return(kInitialCongestionControlType));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500115 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
116 .Times(AnyNumber())
117 .WillRepeatedly(Return(QuicBandwidth::Zero()));
118 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
119 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
wubf4ab9652020-02-20 14:45:43 -0800120 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(_)).Times(AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500121 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000))
122 .Times(AnyNumber());
123 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
124 EXPECT_CALL(notifier_, HasUnackedCryptoData())
125 .WillRepeatedly(Return(false));
126 EXPECT_CALL(notifier_, OnStreamFrameRetransmitted(_)).Times(AnyNumber());
QUICHE team9467db02019-05-30 09:38:45 -0700127 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500128 }
129
130 ~QuicSentPacketManagerTest() override {}
131
ianswett9f459cb2019-04-21 06:39:59 -0700132 QuicByteCount BytesInFlight() { return manager_.GetBytesInFlight(); }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500133 void VerifyUnackedPackets(uint64_t* packets, size_t num_packets) {
134 if (num_packets == 0) {
135 EXPECT_TRUE(manager_.unacked_packets().empty());
136 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
137 &manager_));
138 return;
139 }
140
141 EXPECT_FALSE(manager_.unacked_packets().empty());
142 EXPECT_EQ(QuicPacketNumber(packets[0]), manager_.GetLeastUnacked());
143 for (size_t i = 0; i < num_packets; ++i) {
ianswette129b0c2019-04-20 00:27:00 -0700144 EXPECT_TRUE(
145 manager_.unacked_packets().IsUnacked(QuicPacketNumber(packets[i])))
QUICHE teama6ef0a62019-03-07 20:34:33 -0500146 << packets[i];
147 }
148 }
149
150 void VerifyRetransmittablePackets(uint64_t* packets, size_t num_packets) {
151 EXPECT_EQ(
152 num_packets,
153 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_));
154 for (size_t i = 0; i < num_packets; ++i) {
155 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames(
156 &manager_, packets[i]))
157 << " packets[" << i << "]:" << packets[i];
158 }
159 }
160
161 void ExpectAck(uint64_t largest_observed) {
162 EXPECT_CALL(
163 *send_algorithm_,
164 // Ensure the AckedPacketVector argument contains largest_observed.
165 OnCongestionEvent(true, _, _,
166 Pointwise(PacketNumberEq(), {largest_observed}),
167 IsEmpty()));
168 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
169 }
170
dschinazi17d42422019-06-18 16:35:07 -0700171 void ExpectUpdatedRtt(uint64_t /*largest_observed*/) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500172 EXPECT_CALL(*send_algorithm_,
173 OnCongestionEvent(true, _, _, IsEmpty(), IsEmpty()));
174 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
175 }
176
177 void ExpectAckAndLoss(bool rtt_updated,
178 uint64_t largest_observed,
179 uint64_t lost_packet) {
180 EXPECT_CALL(
181 *send_algorithm_,
182 OnCongestionEvent(rtt_updated, _, _,
183 Pointwise(PacketNumberEq(), {largest_observed}),
184 Pointwise(PacketNumberEq(), {lost_packet})));
185 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
186 }
187
188 // |packets_acked| and |packets_lost| should be in packet number order.
189 void ExpectAcksAndLosses(bool rtt_updated,
190 uint64_t* packets_acked,
191 size_t num_packets_acked,
192 uint64_t* packets_lost,
193 size_t num_packets_lost) {
194 std::vector<QuicPacketNumber> ack_vector;
195 for (size_t i = 0; i < num_packets_acked; ++i) {
196 ack_vector.push_back(QuicPacketNumber(packets_acked[i]));
197 }
198 std::vector<QuicPacketNumber> lost_vector;
199 for (size_t i = 0; i < num_packets_lost; ++i) {
200 lost_vector.push_back(QuicPacketNumber(packets_lost[i]));
201 }
202 EXPECT_CALL(*send_algorithm_,
203 OnCongestionEvent(rtt_updated, _, _,
204 Pointwise(PacketNumberEq(), ack_vector),
205 Pointwise(PacketNumberEq(), lost_vector)));
206 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
207 .Times(AnyNumber());
208 }
209
210 void RetransmitAndSendPacket(uint64_t old_packet_number,
211 uint64_t new_packet_number) {
212 RetransmitAndSendPacket(old_packet_number, new_packet_number,
213 TLP_RETRANSMISSION);
214 }
215
216 void RetransmitAndSendPacket(uint64_t old_packet_number,
217 uint64_t new_packet_number,
218 TransmissionType transmission_type) {
219 bool is_lost = false;
fayangcff885a2019-10-22 07:39:04 -0700220 if (transmission_type == HANDSHAKE_RETRANSMISSION ||
221 transmission_type == TLP_RETRANSMISSION ||
222 transmission_type == RTO_RETRANSMISSION ||
223 transmission_type == PROBING_RETRANSMISSION) {
224 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
225 .WillOnce(WithArgs<1>(
226 Invoke([this, new_packet_number](TransmissionType type) {
227 RetransmitDataPacket(new_packet_number, type);
228 })));
229 } else {
230 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
231 is_lost = true;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500232 }
233 QuicSentPacketManagerPeer::MarkForRetransmission(
234 &manager_, old_packet_number, transmission_type);
fayangcff885a2019-10-22 07:39:04 -0700235 if (!is_lost) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500236 return;
237 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500238 EXPECT_CALL(
239 *send_algorithm_,
240 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(new_packet_number),
241 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
fayangcff885a2019-10-22 07:39:04 -0700242 SerializedPacket packet(CreatePacket(new_packet_number, true));
243 manager_.OnPacketSent(&packet, clock_.Now(), transmission_type,
danzh8c7d1192020-08-25 08:01:43 -0700244 HAS_RETRANSMITTABLE_DATA, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500245 }
246
247 SerializedPacket CreateDataPacket(uint64_t packet_number) {
248 return CreatePacket(packet_number, true);
249 }
250
251 SerializedPacket CreatePacket(uint64_t packet_number, bool retransmittable) {
252 SerializedPacket packet(QuicPacketNumber(packet_number),
253 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
254 false, false);
255 if (retransmittable) {
vasilvvc872ee42020-10-07 19:50:22 -0700256 packet.retransmittable_frames.push_back(
257 QuicFrame(QuicStreamFrame(kStreamId, false, 0, absl::string_view())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500258 }
259 return packet;
260 }
261
zhongyi1b2f7832019-06-14 13:31:34 -0700262 SerializedPacket CreatePingPacket(uint64_t packet_number) {
263 SerializedPacket packet(QuicPacketNumber(packet_number),
264 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
265 false, false);
266 packet.retransmittable_frames.push_back(QuicFrame(QuicPingFrame()));
267 return packet;
268 }
269
QUICHE teama6ef0a62019-03-07 20:34:33 -0500270 void SendDataPacket(uint64_t packet_number) {
QUICHE teamc279cec2019-03-22 06:51:48 -0700271 SendDataPacket(packet_number, ENCRYPTION_INITIAL);
272 }
273
274 void SendDataPacket(uint64_t packet_number,
275 EncryptionLevel encryption_level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500276 EXPECT_CALL(*send_algorithm_,
277 OnPacketSent(_, BytesInFlight(),
278 QuicPacketNumber(packet_number), _, _));
279 SerializedPacket packet(CreateDataPacket(packet_number));
QUICHE teamc279cec2019-03-22 06:51:48 -0700280 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700281 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -0700282 HAS_RETRANSMITTABLE_DATA, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500283 }
284
zhongyi1b2f7832019-06-14 13:31:34 -0700285 void SendPingPacket(uint64_t packet_number,
286 EncryptionLevel encryption_level) {
287 EXPECT_CALL(*send_algorithm_,
288 OnPacketSent(_, BytesInFlight(),
289 QuicPacketNumber(packet_number), _, _));
290 SerializedPacket packet(CreatePingPacket(packet_number));
291 packet.encryption_level = encryption_level;
fayangcff885a2019-10-22 07:39:04 -0700292 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -0700293 HAS_RETRANSMITTABLE_DATA, true);
zhongyi1b2f7832019-06-14 13:31:34 -0700294 }
295
QUICHE teama6ef0a62019-03-07 20:34:33 -0500296 void SendCryptoPacket(uint64_t packet_number) {
297 EXPECT_CALL(
298 *send_algorithm_,
299 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
300 kDefaultLength, HAS_RETRANSMITTABLE_DATA));
301 SerializedPacket packet(CreatePacket(packet_number, false));
302 packet.retransmittable_frames.push_back(
vasilvvc872ee42020-10-07 19:50:22 -0700303 QuicFrame(QuicStreamFrame(1, false, 0, absl::string_view())));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500304 packet.has_crypto_handshake = IS_HANDSHAKE;
fayangcff885a2019-10-22 07:39:04 -0700305 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -0700306 HAS_RETRANSMITTABLE_DATA, true);
fayangcff885a2019-10-22 07:39:04 -0700307 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500308 }
309
310 void SendAckPacket(uint64_t packet_number, uint64_t largest_acked) {
fayang06bb1b02019-06-14 14:07:12 -0700311 SendAckPacket(packet_number, largest_acked, ENCRYPTION_INITIAL);
312 }
313
314 void SendAckPacket(uint64_t packet_number,
315 uint64_t largest_acked,
316 EncryptionLevel level) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500317 EXPECT_CALL(
318 *send_algorithm_,
319 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(packet_number),
320 kDefaultLength, NO_RETRANSMITTABLE_DATA));
321 SerializedPacket packet(CreatePacket(packet_number, false));
322 packet.largest_acked = QuicPacketNumber(largest_acked);
fayang06bb1b02019-06-14 14:07:12 -0700323 packet.encryption_level = level;
fayangcff885a2019-10-22 07:39:04 -0700324 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -0700325 NO_RETRANSMITTABLE_DATA, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500326 }
327
fayangce0a3162019-08-15 09:05:36 -0700328 void EnablePto(QuicTag tag) {
fayangce0a3162019-08-15 09:05:36 -0700329 QuicConfig config;
330 QuicTagVector options;
331 options.push_back(tag);
332 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
333 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
334 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
335 manager_.SetFromConfig(config);
fayang62f867a2019-08-22 12:05:01 -0700336 EXPECT_TRUE(manager_.pto_enabled());
fayangce0a3162019-08-15 09:05:36 -0700337 }
338
fayang1760b082020-09-22 11:08:27 -0700339 int GetPtoRttvarMultiplier() {
fayang2f1037e2020-11-30 13:57:07 -0800340 if (GetQuicReloadableFlag(quic_default_on_pto) ||
fayang1760b082020-09-22 11:08:27 -0700341 manager_.handshake_mode_disabled()) {
342 return 2;
343 }
344 return 4;
345 }
346
haoyuewang11a54a12020-09-21 14:17:29 -0700347 SimpleBufferAllocator allocator_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500348 QuicSentPacketManager manager_;
349 MockClock clock_;
350 QuicConnectionStats stats_;
351 MockSendAlgorithm* send_algorithm_;
352 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_;
353 StrictMock<MockSessionNotifier> notifier_;
354};
355
fayangcff885a2019-10-22 07:39:04 -0700356TEST_F(QuicSentPacketManagerTest, IsUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500357 VerifyUnackedPackets(nullptr, 0);
358 SendDataPacket(1);
359
360 uint64_t unacked[] = {1};
vasilvvbed67c62020-10-20 06:38:43 -0700361 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500362 uint64_t retransmittable[] = {1};
363 VerifyRetransmittablePackets(retransmittable,
vasilvvbed67c62020-10-20 06:38:43 -0700364 ABSL_ARRAYSIZE(retransmittable));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500365}
366
fayangcff885a2019-10-22 07:39:04 -0700367TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500368 SendDataPacket(1);
369 RetransmitAndSendPacket(1, 2);
370
371 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
372 uint64_t unacked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -0700373 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700374 std::vector<uint64_t> retransmittable = {1, 2};
QUICHE teama6ef0a62019-03-07 20:34:33 -0500375 VerifyRetransmittablePackets(&retransmittable[0], retransmittable.size());
376}
377
fayangcff885a2019-10-22 07:39:04 -0700378TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500379 SendDataPacket(1);
380 RetransmitAndSendPacket(1, 2);
381
382 // Ack 2 but not 1.
383 ExpectAck(2);
384 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
385 clock_.Now());
386 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700387 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700388 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
389 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700390 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500391 // Packet 1 is unacked, pending, but not retransmittable.
392 uint64_t unacked[] = {1};
vasilvvbed67c62020-10-20 06:38:43 -0700393 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700394 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500395 VerifyRetransmittablePackets(nullptr, 0);
396}
397
fayangcff885a2019-10-22 07:39:04 -0700398TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500399 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700400 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
401 .WillOnce(WithArgs<1>(Invoke(
402 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500403 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
404 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500405 // Ack 1.
406 ExpectAck(1);
407 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
408 clock_.Now());
409 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700410 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700411 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
412 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500413
fayangcff885a2019-10-22 07:39:04 -0700414 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
415 uint64_t unacked[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700416 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
fayangcff885a2019-10-22 07:39:04 -0700417 // We do not know packet 2 is a spurious retransmission until it gets acked.
QUICHE teama6ef0a62019-03-07 20:34:33 -0500418 VerifyRetransmittablePackets(nullptr, 0);
419 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
420}
421
fayangcff885a2019-10-22 07:39:04 -0700422TEST_F(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500423 SendDataPacket(1);
fayangcff885a2019-10-22 07:39:04 -0700424 EXPECT_CALL(notifier_, RetransmitFrames(_, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500425 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, 1,
426 TLP_RETRANSMISSION);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500427
fayangcff885a2019-10-22 07:39:04 -0700428 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500429
430 uint64_t unacked[] = {1};
vasilvvbed67c62020-10-20 06:38:43 -0700431 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500432 VerifyRetransmittablePackets(nullptr, 0);
433 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
434}
435
fayangcff885a2019-10-22 07:39:04 -0700436TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500437 SendDataPacket(1);
438 RetransmitAndSendPacket(1, 2);
439 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
440 clock_.AdvanceTime(rtt);
441
442 // Ack 1 but not 2.
443 ExpectAck(1);
444 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
445 clock_.Now());
446 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700447 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700448 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
449 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700450 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500451 // 2 remains unacked, but no packets have retransmittable data.
452 uint64_t unacked[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700453 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700454 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500455 VerifyRetransmittablePackets(nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -0700456 // Ack 2 causes 2 be considered as spurious retransmission.
457 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
458 ExpectAck(2);
459 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
460 clock_.Now());
461 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
462 EXPECT_EQ(PACKETS_NEWLY_ACKED,
463 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
464 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500465
466 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
467}
468
fayangcff885a2019-10-22 07:39:04 -0700469TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500470 SendDataPacket(1);
471 RetransmitAndSendPacket(1, 2);
472 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
473 clock_.AdvanceTime(rtt);
474
475 // First, ACK packet 1 which makes packet 2 non-retransmittable.
476 ExpectAck(1);
477 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
478 clock_.Now());
479 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700480 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700481 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
482 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500483
484 SendDataPacket(3);
485 SendDataPacket(4);
486 SendDataPacket(5);
487 clock_.AdvanceTime(rtt);
488
489 // Next, NACK packet 2 three times.
fayang3be090d2020-02-11 14:05:08 -0800490 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
491 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
492 ExpectAckAndLoss(true, 3, 2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500493 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
494 clock_.Now());
495 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
496 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700497 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700498 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
499 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500500
501 ExpectAck(4);
502 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
503 clock_.Now());
504 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
505 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700506 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700507 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
508 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500509
fayang3be090d2020-02-11 14:05:08 -0800510 ExpectAck(5);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500511 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
512 clock_.Now());
513 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
514 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700515 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700516 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
517 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500518
fayangcff885a2019-10-22 07:39:04 -0700519 uint64_t unacked[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700520 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700521 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500522 VerifyRetransmittablePackets(nullptr, 0);
523
524 // Verify that the retransmission alarm would not fire,
525 // since there is no retransmittable data outstanding.
526 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
527}
528
fayangcff885a2019-10-22 07:39:04 -0700529TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500530 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) {
531 SendDataPacket(1);
532 RetransmitAndSendPacket(1, 2);
533
534 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
535 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
536 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
537 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500538
539 // Ack 1 but not 2, before 2 is able to be sent.
540 // Since 1 has been retransmitted, it has already been lost, and so the
541 // send algorithm is not informed that it has been ACK'd.
542 ExpectUpdatedRtt(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500543 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
544 clock_.Now());
545 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700546 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700547 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
548 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500549
550 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
551 uint64_t unacked[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700552 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700553 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500554 VerifyRetransmittablePackets(nullptr, 0);
555
556 // Verify that the retransmission alarm would not fire,
557 // since there is no retransmittable data outstanding.
558 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
559}
560
fayangcff885a2019-10-22 07:39:04 -0700561TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500562 StrictMock<MockDebugDelegate> debug_delegate;
fayangcff885a2019-10-22 07:39:04 -0700563 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION,
564 kDefaultLength))
565 .Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500566 manager_.SetDebugDelegate(&debug_delegate);
567
568 SendDataPacket(1);
569 RetransmitAndSendPacket(1, 2);
570 RetransmitAndSendPacket(2, 3);
571 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
572 clock_.AdvanceTime(rtt);
573
574 // Ack 1 but not 2 or 3.
575 ExpectAck(1);
576 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
577 clock_.Now());
578 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700579 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700580 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
581 ENCRYPTION_INITIAL));
fayangcff885a2019-10-22 07:39:04 -0700582 // Frames in packets 2 and 3 are acked.
583 EXPECT_CALL(notifier_, IsFrameOutstanding(_))
584 .Times(2)
585 .WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500586
587 // 2 and 3 remain unacked, but no packets have retransmittable data.
588 uint64_t unacked[] = {2, 3};
vasilvvbed67c62020-10-20 06:38:43 -0700589 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
ianswett67d7a3c2019-04-19 10:58:47 -0700590 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500591 VerifyRetransmittablePackets(nullptr, 0);
592
593 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
594 SendDataPacket(4);
fayangcff885a2019-10-22 07:39:04 -0700595 // No new data gets acked in packet 3.
596 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
597 .WillOnce(Return(false))
598 .WillRepeatedly(Return(true));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500599 uint64_t acked[] = {3, 4};
vasilvvbed67c62020-10-20 06:38:43 -0700600 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500601 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
602 clock_.Now());
603 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
604 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700605 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700606 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
607 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500608
609 uint64_t unacked2[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700610 VerifyUnackedPackets(unacked2, ABSL_ARRAYSIZE(unacked2));
ianswett67d7a3c2019-04-19 10:58:47 -0700611 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500612
613 SendDataPacket(5);
614 ExpectAckAndLoss(true, 5, 2);
615 EXPECT_CALL(debug_delegate,
vasilvv923b6d22020-03-23 11:17:58 -0700616 OnPacketLoss(QuicPacketNumber(2), _, LOSS_RETRANSMISSION, _));
fayangcff885a2019-10-22 07:39:04 -0700617 // Frames in all packets are acked.
618 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
619 // Notify session that stream frame in packet 2 gets lost although it is
620 // not outstanding.
621 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500622 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
623 clock_.Now());
624 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
625 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700626 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700627 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
628 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500629
fayangcff885a2019-10-22 07:39:04 -0700630 uint64_t unacked3[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -0700631 VerifyUnackedPackets(unacked3, ABSL_ARRAYSIZE(unacked3));
ianswett67d7a3c2019-04-19 10:58:47 -0700632 EXPECT_FALSE(manager_.HasInFlightPackets());
fayangcff885a2019-10-22 07:39:04 -0700633 // Spurious retransmission is detected when packet 3 gets acked. We cannot
634 // know packet 2 is a spurious until it gets acked.
635 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
wube330aa42020-02-27 07:49:09 -0800636 EXPECT_EQ(1u, stats_.packets_lost);
wub050d2d42020-06-22 14:45:27 -0700637 EXPECT_LT(0.0, stats_.total_loss_detection_response_time);
wubaa51f0e2020-05-12 15:08:16 -0700638 EXPECT_LE(1u, stats_.sent_packets_max_sequence_reordering);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500639}
640
fayangcff885a2019-10-22 07:39:04 -0700641TEST_F(QuicSentPacketManagerTest, AckOriginalTransmission) {
vasilvv0fc587f2019-09-06 13:33:08 -0700642 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500643 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
644
645 SendDataPacket(1);
646 RetransmitAndSendPacket(1, 2);
647
648 // Ack original transmission, but that wasn't lost via fast retransmit,
649 // so no call on OnSpuriousRetransmission is expected.
650 {
651 ExpectAck(1);
652 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
653 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
654 clock_.Now());
655 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700656 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700657 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
658 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500659 }
660
661 SendDataPacket(3);
662 SendDataPacket(4);
663 // Ack 4, which causes 3 to be retransmitted.
664 {
665 ExpectAck(4);
666 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
667 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
668 clock_.Now());
669 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
670 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700671 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700672 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
673 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500674 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION);
675 }
676
677 // Ack 3, which causes SpuriousRetransmitDetected to be called.
678 {
679 uint64_t acked[] = {3};
vasilvvbed67c62020-10-20 06:38:43 -0700680 ExpectAcksAndLosses(false, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500681 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
fayangcc4ea6a2019-10-25 08:44:03 -0700682 EXPECT_CALL(*loss_algorithm,
683 SpuriousLossDetected(_, _, _, QuicPacketNumber(3),
684 QuicPacketNumber(4)));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500685 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
686 clock_.Now());
687 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
688 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
wub02831dc2020-02-28 12:00:54 -0800689 EXPECT_EQ(0u, stats_.packet_spuriously_detected_lost);
fayang3eb82212019-04-16 12:05:46 -0700690 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700691 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
692 ENCRYPTION_INITIAL));
wub02831dc2020-02-28 12:00:54 -0800693 EXPECT_EQ(1u, stats_.packet_spuriously_detected_lost);
fayangcff885a2019-10-22 07:39:04 -0700694 // Ack 3 will not cause 5 be considered as a spurious retransmission. Ack
695 // 5 will cause 5 be considered as a spurious retransmission as no new
696 // data gets acked.
697 ExpectAck(5);
698 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
699 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).WillOnce(Return(false));
700 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
701 clock_.Now());
702 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
703 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
704 EXPECT_EQ(PACKETS_NEWLY_ACKED,
705 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
706 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500707 }
708}
709
fayangcff885a2019-10-22 07:39:04 -0700710TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500711 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
712}
713
fayangcff885a2019-10-22 07:39:04 -0700714TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500715 SendDataPacket(1);
716 EXPECT_EQ(QuicPacketNumber(1u), manager_.GetLeastUnacked());
717}
718
fayangcff885a2019-10-22 07:39:04 -0700719TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500720 EXPECT_FALSE(manager_.largest_packet_peer_knows_is_acked().IsInitialized());
721 SendDataPacket(1);
722 SendAckPacket(2, 1);
723
724 // Now ack the ack and expect an RTT update.
725 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -0700726 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500727 manager_.OnAckFrameStart(QuicPacketNumber(2),
728 QuicTime::Delta::FromMilliseconds(5), clock_.Now());
729 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -0700730 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700731 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
732 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500733 EXPECT_EQ(QuicPacketNumber(1), manager_.largest_packet_peer_knows_is_acked());
734
735 SendAckPacket(3, 3);
736
737 // Now ack the ack and expect only an RTT update.
738 uint64_t acked2[] = {3};
vasilvvbed67c62020-10-20 06:38:43 -0700739 ExpectAcksAndLosses(true, acked2, ABSL_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500740 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
741 clock_.Now());
742 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700743 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700744 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
745 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500746 EXPECT_EQ(QuicPacketNumber(3u),
747 manager_.largest_packet_peer_knows_is_acked());
748}
749
fayangcff885a2019-10-22 07:39:04 -0700750TEST_F(QuicSentPacketManagerTest, Rtt) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500751 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(20);
752 SendDataPacket(1);
753 clock_.AdvanceTime(expected_rtt);
754
755 ExpectAck(1);
756 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
757 clock_.Now());
758 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700759 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700760 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
761 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500762 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
763}
764
fayangcff885a2019-10-22 07:39:04 -0700765TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500766 // Expect that the RTT is equal to the local time elapsed, since the
767 // ack_delay_time is larger than the local time elapsed
768 // and is hence invalid.
769 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
770 SendDataPacket(1);
771 clock_.AdvanceTime(expected_rtt);
772
773 ExpectAck(1);
774 manager_.OnAckFrameStart(QuicPacketNumber(1),
775 QuicTime::Delta::FromMilliseconds(11), clock_.Now());
776 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700777 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700778 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
779 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500780 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
781}
782
fayangcff885a2019-10-22 07:39:04 -0700783TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500784 // Expect that the RTT is equal to the local time elapsed, since the
785 // ack_delay_time is infinite, and is hence invalid.
786 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
787 SendDataPacket(1);
788 clock_.AdvanceTime(expected_rtt);
789
790 ExpectAck(1);
791 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
792 clock_.Now());
793 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700794 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700795 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
796 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500797 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
798}
799
wub8ee29a02019-12-12 13:06:48 -0800800TEST_F(QuicSentPacketManagerTest, RttWithDeltaExceedingLimit) {
801 // Initialize min and smoothed rtt to 10ms.
802 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
803 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
804 QuicTime::Delta::Zero(), QuicTime::Zero());
805
806 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(100);
807 QuicTime::Delta ack_delay =
808 QuicTime::Delta::FromMilliseconds(5) + manager_.peer_max_ack_delay();
809 ASSERT_GT(send_delta - rtt_stats->min_rtt(), ack_delay);
810 SendDataPacket(1);
811 clock_.AdvanceTime(send_delta);
812
813 ExpectAck(1);
814 manager_.OnAckFrameStart(QuicPacketNumber(1), ack_delay, clock_.Now());
815 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
816 EXPECT_EQ(PACKETS_NEWLY_ACKED,
817 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
818 ENCRYPTION_FORWARD_SECURE));
819
820 QuicTime::Delta expected_rtt_sample =
wub81c9b662020-02-14 09:08:07 -0800821 send_delta - manager_.peer_max_ack_delay();
wub8ee29a02019-12-12 13:06:48 -0800822 EXPECT_EQ(expected_rtt_sample, manager_.GetRttStats()->latest_rtt());
823}
824
fayangcff885a2019-10-22 07:39:04 -0700825TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500826 // Expect that the RTT is the time between send and receive since the
827 // ack_delay_time is zero.
828 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
829 SendDataPacket(1);
830 clock_.AdvanceTime(expected_rtt);
831
832 ExpectAck(1);
833 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Zero(),
834 clock_.Now());
835 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -0700836 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700837 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
838 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500839 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt());
840}
841
fayangcff885a2019-10-22 07:39:04 -0700842TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
fayang5d011982020-05-13 14:14:38 -0700843 if (GetQuicReloadableFlag(quic_default_on_pto)) {
844 return;
845 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500846 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
847
848 // Send 1 packet.
849 SendDataPacket(1);
850
851 // The first tail loss probe retransmits 1 packet.
852 manager_.OnRetransmissionTimeout();
853 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700854 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
855 .WillOnce(WithArgs<1>(Invoke(
856 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500857 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500858
859 // The second tail loss probe retransmits 1 packet.
860 manager_.OnRetransmissionTimeout();
861 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700862 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
863 .WillOnce(WithArgs<1>(Invoke(
864 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500865 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500866 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
867 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500868
869 // Ack the third and ensure the first two are still pending.
870 ExpectAck(3);
871
872 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
873 clock_.Now());
874 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -0700875 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700876 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
877 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500878
ianswett67d7a3c2019-04-19 10:58:47 -0700879 EXPECT_TRUE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500880
881 // Acking two more packets will lose both of them due to nacks.
882 SendDataPacket(4);
883 SendDataPacket(5);
884 uint64_t acked[] = {4, 5};
885 uint64_t lost[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -0700886 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), lost,
887 ABSL_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -0700888 // Frames in all packets are acked.
889 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
890 // Notify session that stream frame in packets 1 and 2 get lost although
891 // they are not outstanding.
892 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(2);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500893 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
894 clock_.Now());
895 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -0700896 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700897 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
898 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500899
ianswett67d7a3c2019-04-19 10:58:47 -0700900 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500901 EXPECT_EQ(2u, stats_.tlp_count);
902 EXPECT_EQ(0u, stats_.rto_count);
903}
904
fayangcff885a2019-10-22 07:39:04 -0700905TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
fayang5d011982020-05-13 14:14:38 -0700906 if (GetQuicReloadableFlag(quic_default_on_pto)) {
907 return;
908 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500909 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
910
911 // Send 100 packets.
912 const size_t kNumSentPackets = 100;
913 for (size_t i = 1; i <= kNumSentPackets; ++i) {
914 SendDataPacket(i);
915 }
916 QuicTime rto_packet_time = clock_.Now();
917 // Advance the time.
918 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
919
920 // The first tail loss probe retransmits 1 packet.
921 manager_.OnRetransmissionTimeout();
922 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700923 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
924 .WillOnce(WithArgs<1>(Invoke(
925 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500926 manager_.MaybeRetransmitTailLossProbe();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500927 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
928 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500929 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now());
930
931 // The second tail loss probe retransmits 1 packet.
932 manager_.OnRetransmissionTimeout();
933 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -0700934 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
935 .WillOnce(WithArgs<1>(Invoke(
936 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500937 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500938 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
939 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
940
941 // Ensure the RTO is set based on the correct packet.
942 rto_packet_time = clock_.Now();
943 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromMilliseconds(500),
944 manager_.GetRetransmissionTime());
945
946 // Advance the time enough to ensure all packets are RTO'd.
947 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
948
fayangcff885a2019-10-22 07:39:04 -0700949 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
950 .Times(2)
951 .WillOnce(WithArgs<1>(Invoke(
952 [this](TransmissionType type) { RetransmitDataPacket(103, type); })))
953 .WillOnce(WithArgs<1>(Invoke(
954 [this](TransmissionType type) { RetransmitDataPacket(104, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500955 manager_.OnRetransmissionTimeout();
956 EXPECT_EQ(2u, stats_.tlp_count);
957 EXPECT_EQ(1u, stats_.rto_count);
fayang2a379bf2020-05-18 11:49:25 -0700958 EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress);
fayangcff885a2019-10-22 07:39:04 -0700959 // There are 2 RTO retransmissions.
960 EXPECT_EQ(104 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500961 QuicPacketNumber largest_acked = QuicPacketNumber(103);
962 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
963 EXPECT_CALL(*send_algorithm_,
964 OnCongestionEvent(
965 true, _, _, Pointwise(PacketNumberEq(), {largest_acked}), _));
966 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -0700967 // Although frames in packet 3 gets acked, it would be kept for another
968 // RTT.
969 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
970 // Packets [1, 102] are lost, although stream frame in packet 3 is not
971 // outstanding.
972 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(102);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500973 manager_.OnAckFrameStart(QuicPacketNumber(103), QuicTime::Delta::Infinite(),
974 clock_.Now());
975 manager_.OnAckRange(QuicPacketNumber(103), QuicPacketNumber(104));
fayang3eb82212019-04-16 12:05:46 -0700976 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -0700977 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
978 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500979 // All packets before 103 should be lost.
fayangcff885a2019-10-22 07:39:04 -0700980 // Packet 104 is still in flight.
981 EXPECT_EQ(1000u, manager_.GetBytesInFlight());
fayang2a379bf2020-05-18 11:49:25 -0700982 EXPECT_EQ(1u, stats_.max_consecutive_rto_with_forward_progress);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500983}
984
fayangcff885a2019-10-22 07:39:04 -0700985TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500986 // Send 2 crypto packets and 3 data packets.
987 const size_t kNumSentCryptoPackets = 2;
988 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
989 SendCryptoPacket(i);
990 }
991 const size_t kNumSentDataPackets = 3;
992 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
993 SendDataPacket(kNumSentCryptoPackets + i);
994 }
ianswett0cc36802019-04-20 03:04:09 -0700995 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
ianswett898306b2019-04-23 11:05:57 -0700996 EXPECT_EQ(5 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500997
998 // The first retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -0700999 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1000 .Times(2)
1001 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(6); }))
1002 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(7); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001003 manager_.OnRetransmissionTimeout();
ianswett898306b2019-04-23 11:05:57 -07001004 // Expect all 4 handshake packets to be in flight and 3 data packets.
ianswett04004652019-09-03 18:46:57 -07001005 EXPECT_EQ(7 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -07001006 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001007
1008 // The second retransmits 2 packets.
fayangcff885a2019-10-22 07:39:04 -07001009 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1010 .Times(2)
1011 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(8); }))
1012 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(9); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001013 manager_.OnRetransmissionTimeout();
ianswett04004652019-09-03 18:46:57 -07001014 EXPECT_EQ(9 * kDefaultLength, manager_.GetBytesInFlight());
ianswett0cc36802019-04-20 03:04:09 -07001015 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001016
1017 // Now ack the two crypto packets and the speculatively encrypted request,
1018 // and ensure the first four crypto packets get abandoned, but not lost.
ianswett04004652019-09-03 18:46:57 -07001019 // Crypto packets remain in flight, so any that aren't acked will be lost.
1020 uint64_t acked[] = {3, 4, 5, 8, 9};
1021 uint64_t lost[] = {1, 2, 6};
vasilvvbed67c62020-10-20 06:38:43 -07001022 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), lost,
1023 ABSL_ARRAYSIZE(lost));
fayangcff885a2019-10-22 07:39:04 -07001024 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(3);
1025 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001026 manager_.OnAckFrameStart(QuicPacketNumber(9), QuicTime::Delta::Infinite(),
1027 clock_.Now());
1028 manager_.OnAckRange(QuicPacketNumber(8), QuicPacketNumber(10));
1029 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07001030 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001031 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1032 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001033
ianswett0cc36802019-04-20 03:04:09 -07001034 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001035}
1036
fayangcff885a2019-10-22 07:39:04 -07001037TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001038 // Send 1 crypto packet.
1039 SendCryptoPacket(1);
ianswett0cc36802019-04-20 03:04:09 -07001040 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001041
1042 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001043 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1044 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001045 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001046
1047 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001048 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1049 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001050 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001051
1052 // Now ack the second crypto packet, and ensure the first gets removed, but
1053 // the third does not.
1054 uint64_t acked[] = {2};
vasilvvbed67c62020-10-20 06:38:43 -07001055 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayangcff885a2019-10-22 07:39:04 -07001056 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1057 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001058 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1059 clock_.Now());
1060 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001061 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001062 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1063 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001064
ianswett0cc36802019-04-20 03:04:09 -07001065 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett04004652019-09-03 18:46:57 -07001066 uint64_t unacked[] = {1, 3};
vasilvvbed67c62020-10-20 06:38:43 -07001067 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001068}
1069
fayangcff885a2019-10-22 07:39:04 -07001070TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001071 // Send 2 crypto packets and 1 data packet.
1072 const size_t kNumSentCryptoPackets = 2;
1073 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
1074 SendCryptoPacket(i);
1075 }
1076 SendDataPacket(3);
ianswett0cc36802019-04-20 03:04:09 -07001077 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001078
1079 // Retransmit 2 crypto packets, but not the serialized packet.
fayangcff885a2019-10-22 07:39:04 -07001080 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1081 .Times(2)
1082 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }))
1083 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(5); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001084 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001085 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001086}
1087
fayangcff885a2019-10-22 07:39:04 -07001088TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001089 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1090 // Send 1 crypto packet.
1091 SendCryptoPacket(1);
1092
ianswett0cc36802019-04-20 03:04:09 -07001093 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001094
1095 // Retransmit the crypto packet as 2.
fayangcff885a2019-10-22 07:39:04 -07001096 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1097 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001098 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001099 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001100
1101 // Retransmit the crypto packet as 3.
fayangcff885a2019-10-22 07:39:04 -07001102 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1103 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001104 manager_.OnRetransmissionTimeout();
ianswett0cc36802019-04-20 03:04:09 -07001105 EXPECT_TRUE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001106
1107 // Now neuter all unacked unencrypted packets, which occurs when the
1108 // connection goes forward secure.
fayangcff885a2019-10-22 07:39:04 -07001109 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
1110 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
fayang93c83942019-11-07 10:41:16 -08001111 manager_.NeuterUnencryptedPackets();
ianswett0cc36802019-04-20 03:04:09 -07001112 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001113 uint64_t unacked[] = {1, 2, 3};
vasilvvbed67c62020-10-20 06:38:43 -07001114 VerifyUnackedPackets(unacked, ABSL_ARRAYSIZE(unacked));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001115 VerifyRetransmittablePackets(nullptr, 0);
ianswett0cc36802019-04-20 03:04:09 -07001116 EXPECT_FALSE(manager_.HasUnackedCryptoPackets());
ianswett67d7a3c2019-04-19 10:58:47 -07001117 EXPECT_FALSE(manager_.HasInFlightPackets());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001118
1119 // Ensure both packets get discarded when packet 2 is acked.
1120 uint64_t acked[] = {3};
vasilvvbed67c62020-10-20 06:38:43 -07001121 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001122 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
1123 clock_.Now());
1124 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001125 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001126 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1127 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001128 VerifyUnackedPackets(nullptr, 0);
1129 VerifyRetransmittablePackets(nullptr, 0);
1130}
1131
fayangcff885a2019-10-22 07:39:04 -07001132TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
fayang5d011982020-05-13 14:14:38 -07001133 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1134 return;
1135 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001136 StrictMock<MockDebugDelegate> debug_delegate;
1137 manager_.SetDebugDelegate(&debug_delegate);
1138
1139 // Send 100 packets.
1140 const size_t kNumSentPackets = 100;
1141 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1142 SendDataPacket(i);
1143 }
1144
1145 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001146 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1147 .Times(2)
1148 .WillOnce(WithArgs<1>(Invoke(
1149 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1150 .WillOnce(WithArgs<1>(Invoke(
1151 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001152 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001153 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001154
1155 // Ack a retransmission.
1156 // Ensure no packets are lost.
1157 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1158 EXPECT_CALL(*send_algorithm_,
1159 OnCongestionEvent(true, _, _,
1160 Pointwise(PacketNumberEq(), {largest_acked}),
1161 /*lost_packets=*/IsEmpty()));
1162 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1163 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1164 // RTO's use loss detection instead of immediately declaring retransmitted
1165 // packets lost.
1166 for (int i = 1; i <= 99; ++i) {
1167 EXPECT_CALL(debug_delegate,
vasilvv923b6d22020-03-23 11:17:58 -07001168 OnPacketLoss(QuicPacketNumber(i), _, LOSS_RETRANSMISSION, _));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001169 }
fayangcff885a2019-10-22 07:39:04 -07001170 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1171 // Packets [1, 99] are considered as lost, although stream frame in packet
1172 // 2 is not outstanding.
1173 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001174 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1175 clock_.Now());
1176 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001177 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001178 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1179 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001180}
1181
fayangcff885a2019-10-22 07:39:04 -07001182TEST_F(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
fayang5d011982020-05-13 14:14:38 -07001183 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1184 return;
1185 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001186 // Set the 1RTO connection option.
1187 QuicConfig client_config;
1188 QuicTagVector options;
1189 options.push_back(k1RTO);
1190 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1191 client_config.SetConnectionOptionsToSend(options);
1192 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1193 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1194 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1195 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1196 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1197 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1198 manager_.SetFromConfig(client_config);
1199 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1200
1201 StrictMock<MockDebugDelegate> debug_delegate;
1202 manager_.SetDebugDelegate(&debug_delegate);
1203
1204 // Send 100 packets.
1205 const size_t kNumSentPackets = 100;
1206 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1207 SendDataPacket(i);
1208 }
1209
1210 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001211 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1212 .Times(1)
1213 .WillOnce(WithArgs<1>(Invoke(
1214 [this](TransmissionType type) { RetransmitDataPacket(101, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001215 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001216 EXPECT_EQ(101 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001217}
1218
fayangcff885a2019-10-22 07:39:04 -07001219TEST_F(QuicSentPacketManagerTest, NewRetransmissionTimeout) {
fayang5d011982020-05-13 14:14:38 -07001220 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1221 return;
1222 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001223 QuicConfig client_config;
1224 QuicTagVector options;
1225 options.push_back(kNRTO);
1226 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1227 client_config.SetConnectionOptionsToSend(options);
1228 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1229 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1230 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1231 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1232 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1233 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1234 manager_.SetFromConfig(client_config);
1235 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
1236 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
1237
1238 // Send 100 packets.
1239 const size_t kNumSentPackets = 100;
1240 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1241 SendDataPacket(i);
1242 }
1243
1244 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
fayangcff885a2019-10-22 07:39:04 -07001245 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1246 .Times(2)
1247 .WillOnce(WithArgs<1>(Invoke(
1248 [this](TransmissionType type) { RetransmitDataPacket(101, type); })))
1249 .WillOnce(WithArgs<1>(Invoke(
1250 [this](TransmissionType type) { RetransmitDataPacket(102, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001251 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001252 EXPECT_EQ(102 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001253
1254 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1255 // This will include packets in the lost packet map.
1256 QuicPacketNumber largest_acked = QuicPacketNumber(102);
1257 EXPECT_CALL(*send_algorithm_,
1258 OnCongestionEvent(true, _, _,
1259 Pointwise(PacketNumberEq(), {largest_acked}),
1260 /*lost_packets=*/Not(IsEmpty())));
1261 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
fayangcff885a2019-10-22 07:39:04 -07001262 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
1263 // Packets [1, 99] are considered as lost, although stream frame in packet
1264 // 2 is not outstanding.
1265 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(99);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001266 manager_.OnAckFrameStart(QuicPacketNumber(102), QuicTime::Delta::Zero(),
1267 clock_.Now());
1268 manager_.OnAckRange(QuicPacketNumber(102), QuicPacketNumber(103));
fayang3eb82212019-04-16 12:05:46 -07001269 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001270 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1271 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001272}
1273
fayangcff885a2019-10-22 07:39:04 -07001274TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) {
fayang5d011982020-05-13 14:14:38 -07001275 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1276 return;
1277 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001278 // Send 1 packet.
1279 SendDataPacket(1);
1280
fayangcff885a2019-10-22 07:39:04 -07001281 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1282 .WillOnce(WithArgs<1>(Invoke(
1283 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001284 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001285 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001286
1287 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001288 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1289 .WillOnce(WithArgs<1>(Invoke(
1290 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001291 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001292 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001293
1294 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1295 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1296 ExpectAck(2);
1297 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
1298 clock_.Now());
1299 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001300 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001301 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1302 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001303
1304 // The original packet and newest should be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001305 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001306}
1307
fayangcff885a2019-10-22 07:39:04 -07001308TEST_F(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) {
fayang5d011982020-05-13 14:14:38 -07001309 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1310 return;
1311 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001312 // Send 1 packet.
1313 SendDataPacket(1);
1314
fayangcff885a2019-10-22 07:39:04 -07001315 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1316 .WillOnce(WithArgs<1>(Invoke(
1317 [this](TransmissionType type) { RetransmitDataPacket(2, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001318 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001319 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001320
1321 // Rto a second time.
fayangcff885a2019-10-22 07:39:04 -07001322 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1323 .WillOnce(WithArgs<1>(Invoke(
1324 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001325 manager_.OnRetransmissionTimeout();
fayangcff885a2019-10-22 07:39:04 -07001326 EXPECT_EQ(3 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001327
1328 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1329 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1330 ExpectAck(3);
1331 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Zero(),
1332 clock_.Now());
1333 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07001334 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001335 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1336 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001337
1338 // The first two packets should still be outstanding.
ianswett9f459cb2019-04-21 06:39:59 -07001339 EXPECT_EQ(2 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001340}
1341
fayangcff885a2019-10-22 07:39:04 -07001342TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001343 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1344}
1345
fayangcff885a2019-10-22 07:39:04 -07001346TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001347 QuicTime crypto_packet_send_time = clock_.Now();
1348 SendCryptoPacket(1);
1349
1350 // Check the min.
1351 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1352 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1353 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1354 manager_.GetRetransmissionTime());
1355
1356 // Test with a standard smoothed RTT.
1357 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1358
1359 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1360 QuicTime expected_time = clock_.Now() + 1.5 * srtt;
1361 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1362
1363 // Retransmit the packet by invoking the retransmission timeout.
1364 clock_.AdvanceTime(1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001365 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1366 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1367 // When session decides what to write, crypto_packet_send_time gets updated.
1368 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001369 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001370
1371 // The retransmission time should now be twice as far in the future.
1372 expected_time = crypto_packet_send_time + srtt * 2 * 1.5;
1373 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1374
1375 // Retransmit the packet for the 2nd time.
1376 clock_.AdvanceTime(2 * 1.5 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001377 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1378 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(3); }));
1379 // When session decides what to write, crypto_packet_send_time gets updated.
1380 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001381 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001382
1383 // Verify exponential backoff of the retransmission timeout.
1384 expected_time = crypto_packet_send_time + srtt * 4 * 1.5;
1385 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1386}
1387
fayangcff885a2019-10-22 07:39:04 -07001388TEST_F(QuicSentPacketManagerTest,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001389 GetConservativeTransmissionTimeCryptoHandshake) {
1390 QuicConfig config;
1391 QuicTagVector options;
1392 options.push_back(kCONH);
1393 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1394 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1395 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1396 manager_.SetFromConfig(config);
1397 // Calling SetFromConfig requires mocking out some send algorithm methods.
1398 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1399 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1400 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1401 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
1402
1403 QuicTime crypto_packet_send_time = clock_.Now();
1404 SendCryptoPacket(1);
1405
1406 // Check the min.
1407 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1408 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1409 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(25),
1410 manager_.GetRetransmissionTime());
1411
1412 // Test with a standard smoothed RTT.
1413 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1414
1415 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1416 QuicTime expected_time = clock_.Now() + 2 * srtt;
1417 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1418
1419 // Retransmit the packet by invoking the retransmission timeout.
1420 clock_.AdvanceTime(2 * srtt);
fayangcff885a2019-10-22 07:39:04 -07001421 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1422 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(2); }));
1423 crypto_packet_send_time = clock_.Now();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001424 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001425
1426 // The retransmission time should now be twice as far in the future.
1427 expected_time = crypto_packet_send_time + srtt * 2 * 2;
1428 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1429}
1430
fayangcff885a2019-10-22 07:39:04 -07001431TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
fayang5d011982020-05-13 14:14:38 -07001432 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1433 return;
1434 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001435 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1436 SendDataPacket(1);
1437 SendDataPacket(2);
1438
1439 // Check the min.
1440 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1441 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(1));
1442 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10),
1443 manager_.GetRetransmissionTime());
1444
1445 // Test with a standard smoothed RTT.
1446 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1447 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1448 QuicTime::Delta expected_tlp_delay = 2 * srtt;
1449 QuicTime expected_time = clock_.Now() + expected_tlp_delay;
1450 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1451
1452 // Retransmit the packet by invoking the retransmission timeout.
1453 clock_.AdvanceTime(expected_tlp_delay);
1454 manager_.OnRetransmissionTimeout();
1455 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
fayangcff885a2019-10-22 07:39:04 -07001456 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1457 .WillOnce(WithArgs<1>(Invoke(
1458 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001459 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001460 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1461 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001462
1463 expected_time = clock_.Now() + expected_tlp_delay;
1464 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1465}
1466
fayangcff885a2019-10-22 07:39:04 -07001467TEST_F(QuicSentPacketManagerTest, TLPRWithPendingStreamData) {
fayang5d011982020-05-13 14:14:38 -07001468 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1469 return;
1470 }
zhongyi1b2f7832019-06-14 13:31:34 -07001471 QuicConfig config;
1472 QuicTagVector options;
1473
1474 options.push_back(kTLPR);
1475 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1476 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1477 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1478 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1479 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1480 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1481 .WillOnce(Return(10 * kDefaultTCPMSS));
1482 manager_.SetFromConfig(config);
1483 EXPECT_TRUE(
1484 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1485
1486 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1487
1488 SendDataPacket(1);
1489 SendDataPacket(2);
1490
1491 // Test with a standard smoothed RTT.
1492 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1493 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1494 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1495 // With pending stream data, TLPR is used.
1496 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
1497 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(true));
1498
1499 EXPECT_EQ(expected_tlp_delay,
1500 manager_.GetRetransmissionTime() - clock_.Now());
1501
1502 // Retransmit the packet by invoking the retransmission timeout.
1503 clock_.AdvanceTime(expected_tlp_delay);
1504 manager_.OnRetransmissionTimeout();
1505 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001506 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1507 .WillOnce(WithArgs<1>(Invoke(
1508 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1509 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1510
1511 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1512 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001513
1514 // 2nd TLP.
1515 expected_tlp_delay = 2 * srtt;
1516 EXPECT_EQ(expected_tlp_delay,
1517 manager_.GetRetransmissionTime() - clock_.Now());
1518}
1519
fayangcff885a2019-10-22 07:39:04 -07001520TEST_F(QuicSentPacketManagerTest, TLPRWithoutPendingStreamData) {
fayang5d011982020-05-13 14:14:38 -07001521 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1522 return;
1523 }
zhongyi1b2f7832019-06-14 13:31:34 -07001524 QuicConfig config;
1525 QuicTagVector options;
1526
1527 options.push_back(kTLPR);
1528 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1529 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1530 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1531 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1532 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1533 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1534 .WillOnce(Return(10 * kDefaultTCPMSS));
1535 manager_.SetFromConfig(config);
1536 EXPECT_TRUE(
1537 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
1538 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1539
1540 SendPingPacket(1, ENCRYPTION_INITIAL);
1541 SendPingPacket(2, ENCRYPTION_INITIAL);
1542
1543 // Test with a standard smoothed RTT.
1544 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1545 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMilliseconds(100));
1546 QuicTime::Delta srtt = rtt_stats->initial_rtt();
1547 QuicTime::Delta expected_tlp_delay = 0.5 * srtt;
zhongyi9fa2be32019-09-10 12:39:01 -07001548 // With no pending stream data, TLPR is ignored.
1549 expected_tlp_delay = 2 * srtt;
zhongyi1b2f7832019-06-14 13:31:34 -07001550 EXPECT_CALL(notifier_, HasUnackedStreamData()).WillRepeatedly(Return(false));
1551 EXPECT_EQ(expected_tlp_delay,
1552 manager_.GetRetransmissionTime() - clock_.Now());
1553
1554 // Retransmit the packet by invoking the retransmission timeout.
1555 clock_.AdvanceTime(expected_tlp_delay);
1556 manager_.OnRetransmissionTimeout();
1557 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001558 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1559 .WillOnce(WithArgs<1>(Invoke(
1560 [this](TransmissionType type) { RetransmitDataPacket(3, type); })));
1561 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1562 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(Return(false));
1563 EXPECT_EQ(QuicTime::Delta::Infinite(), manager_.TimeUntilSend(clock_.Now()));
zhongyi1b2f7832019-06-14 13:31:34 -07001564
1565 // 2nd TLP.
1566 expected_tlp_delay = 2 * srtt;
1567 EXPECT_EQ(expected_tlp_delay,
1568 manager_.GetRetransmissionTime() - clock_.Now());
1569}
1570
fayangcff885a2019-10-22 07:39:04 -07001571TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) {
fayang5d011982020-05-13 14:14:38 -07001572 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1573 return;
1574 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001575 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1576 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
1577 QuicTime::Delta::Zero(), QuicTime::Zero());
1578
1579 SendDataPacket(1);
1580 SendDataPacket(2);
1581 SendDataPacket(3);
1582 SendDataPacket(4);
1583
1584 QuicTime::Delta expected_rto_delay =
1585 rtt_stats->smoothed_rtt() + 4 * rtt_stats->mean_deviation();
1586 QuicTime expected_time = clock_.Now() + expected_rto_delay;
1587 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1588
1589 // Retransmit the packet by invoking the retransmission timeout.
1590 clock_.AdvanceTime(expected_rto_delay);
fayangcff885a2019-10-22 07:39:04 -07001591 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1592 .Times(2)
1593 .WillOnce(WithArgs<1>(Invoke(
1594 [this](TransmissionType type) { RetransmitDataPacket(5, type); })))
1595 .WillOnce(WithArgs<1>(Invoke(
1596 [this](TransmissionType type) { RetransmitDataPacket(6, type); })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001597 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001598 // All previous packets are inflight, plus two rto retransmissions.
ianswett9f459cb2019-04-21 06:39:59 -07001599 EXPECT_EQ(6 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001600
1601 // The delay should double the second time.
1602 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay;
1603 // Once we always base the timer on the right edge, leaving the older packets
1604 // in flight doesn't change the timeout.
1605 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1606
1607 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1608 // original value and OnRetransmissionTimeout is not called or reverted.
fayang01983412019-12-07 05:50:22 -08001609 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -07001610 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
wub8ee29a02019-12-12 13:06:48 -08001611 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Zero(),
QUICHE teama6ef0a62019-03-07 20:34:33 -05001612 clock_.Now());
fayang01983412019-12-07 05:50:22 -08001613 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001614 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001615 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1616 ENCRYPTION_INITIAL));
fayang01983412019-12-07 05:50:22 -08001617 EXPECT_EQ(4 * kDefaultLength, manager_.GetBytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001618
1619 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1620 // and the TLP time. In production, there would always be two TLP's first.
1621 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1622 // by the latest RTT sample of 500ms.
1623 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000);
1624 // Once we always base the timer on the right edge, leaving the older packets
1625 // in flight doesn't change the timeout.
1626 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1627}
1628
fayangcff885a2019-10-22 07:39:04 -07001629TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
fayang5d011982020-05-13 14:14:38 -07001630 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1631 return;
1632 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001633 SendDataPacket(1);
1634 // Provide a 1ms RTT sample.
1635 const_cast<RttStats*>(manager_.GetRttStats())
1636 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(1), QuicTime::Delta::Zero(),
1637 QuicTime::Zero());
1638 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1639
1640 // If the delay is smaller than the min, ensure it exponentially backs off
1641 // from the min.
1642 for (int i = 0; i < 5; ++i) {
1643 EXPECT_EQ(delay,
1644 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001645 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001646 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1647 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1648 RetransmitDataPacket(i + 2, type);
1649 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001650 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001651 }
1652}
1653
fayangcff885a2019-10-22 07:39:04 -07001654TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
fayang5d011982020-05-13 14:14:38 -07001655 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1656 return;
1657 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001658 SendDataPacket(1);
1659 // Provide a 60s RTT sample.
1660 const_cast<RttStats*>(manager_.GetRttStats())
1661 ->UpdateRtt(QuicTime::Delta::FromSeconds(60), QuicTime::Delta::Zero(),
1662 QuicTime::Zero());
1663
1664 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1665 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001666}
1667
fayangcff885a2019-10-22 07:39:04 -07001668TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayExponentialBackoff) {
fayang5d011982020-05-13 14:14:38 -07001669 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1670 return;
1671 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001672 SendDataPacket(1);
1673 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1674
1675 // Delay should back off exponentially.
1676 for (int i = 0; i < 5; ++i) {
1677 EXPECT_EQ(delay,
1678 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001679 delay = delay + delay;
fayangcff885a2019-10-22 07:39:04 -07001680 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
1681 .WillOnce(WithArgs<1>(Invoke([this, i](TransmissionType type) {
1682 RetransmitDataPacket(i + 2, type);
1683 })));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001684 manager_.OnRetransmissionTimeout();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001685 }
1686}
1687
fayangcff885a2019-10-22 07:39:04 -07001688TEST_F(QuicSentPacketManagerTest, RetransmissionDelay) {
fayang5d011982020-05-13 14:14:38 -07001689 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1690 return;
1691 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001692 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
1693 const int64_t kRttMs = 250;
1694 const int64_t kDeviationMs = 5;
1695
1696 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRttMs),
1697 QuicTime::Delta::Zero(), clock_.Now());
1698
1699 // Initial value is to set the median deviation to half of the initial rtt,
1700 // the median in then multiplied by a factor of 4 and finally the smoothed rtt
1701 // is added which is the initial rtt.
1702 QuicTime::Delta expected_delay =
1703 QuicTime::Delta::FromMilliseconds(kRttMs + kRttMs / 2 * 4);
1704 EXPECT_EQ(expected_delay,
1705 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001706
1707 for (int i = 0; i < 100; ++i) {
1708 // Run to make sure that we converge.
1709 rtt_stats->UpdateRtt(
1710 QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs),
1711 QuicTime::Delta::Zero(), clock_.Now());
1712 rtt_stats->UpdateRtt(
1713 QuicTime::Delta::FromMilliseconds(kRttMs - kDeviationMs),
1714 QuicTime::Delta::Zero(), clock_.Now());
1715 }
1716 expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
1717
1718 EXPECT_NEAR(kRttMs, rtt_stats->smoothed_rtt().ToMilliseconds(), 1);
1719 EXPECT_NEAR(expected_delay.ToMilliseconds(),
1720 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)
1721 .ToMilliseconds(),
1722 1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001723}
1724
fayangcff885a2019-10-22 07:39:04 -07001725TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
vasilvv0fc587f2019-09-06 13:33:08 -07001726 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
QUICHE teama6ef0a62019-03-07 20:34:33 -05001727 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
1728
1729 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1730 .WillRepeatedly(Return(QuicTime::Zero()));
1731 SendDataPacket(1);
1732 SendDataPacket(2);
1733
1734 // Handle an ack which causes the loss algorithm to be evaluated and
1735 // set the loss timeout.
1736 ExpectAck(2);
1737 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1738 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
1739 clock_.Now());
1740 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07001741 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07001742 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
1743 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001744
1745 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10));
1746 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1747 .WillRepeatedly(Return(timeout));
1748 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1749
1750 // Fire the retransmission timeout and ensure the loss detection algorithm
1751 // is invoked.
1752 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
1753 manager_.OnRetransmissionTimeout();
1754}
1755
fayangcff885a2019-10-22 07:39:04 -07001756TEST_F(QuicSentPacketManagerTest, NegotiateIetfLossDetectionFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001757 EXPECT_TRUE(
1758 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1759 EXPECT_FALSE(
1760 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1761 EXPECT_EQ(kDefaultLossDelayShift,
1762 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001763
1764 QuicConfig config;
1765 QuicTagVector options;
1766 options.push_back(kILD0);
1767 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1768 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1769 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1770 manager_.SetFromConfig(config);
1771
fayangb0c7b4b2019-09-12 06:45:24 -07001772 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1773 EXPECT_FALSE(
1774 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1775}
1776
fayangcff885a2019-10-22 07:39:04 -07001777TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001778 NegotiateIetfLossDetectionOneFourthRttFromOptions) {
fayang3be090d2020-02-11 14:05:08 -08001779 EXPECT_TRUE(
1780 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1781 EXPECT_FALSE(
1782 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1783 EXPECT_EQ(kDefaultLossDelayShift,
1784 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001785
1786 QuicConfig config;
1787 QuicTagVector options;
1788 options.push_back(kILD1);
1789 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1790 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1791 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1792 manager_.SetFromConfig(config);
1793
fayangb0c7b4b2019-09-12 06:45:24 -07001794 EXPECT_EQ(kDefaultLossDelayShift,
1795 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1796 EXPECT_FALSE(
1797 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1798}
1799
fayangcff885a2019-10-22 07:39:04 -07001800TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001801 NegotiateIetfLossDetectionAdaptiveReorderingThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001802 EXPECT_TRUE(
1803 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1804 EXPECT_FALSE(
1805 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1806 EXPECT_EQ(kDefaultLossDelayShift,
1807 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001808
1809 QuicConfig config;
1810 QuicTagVector options;
1811 options.push_back(kILD2);
1812 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1813 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1814 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1815 manager_.SetFromConfig(config);
1816
fayangb0c7b4b2019-09-12 06:45:24 -07001817 EXPECT_EQ(3, QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1818 EXPECT_TRUE(
1819 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1820}
1821
fayangcff885a2019-10-22 07:39:04 -07001822TEST_F(QuicSentPacketManagerTest,
fayangb0c7b4b2019-09-12 06:45:24 -07001823 NegotiateIetfLossDetectionAdaptiveReorderingThreshold2) {
fayang3be090d2020-02-11 14:05:08 -08001824 EXPECT_TRUE(
1825 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1826 EXPECT_FALSE(
1827 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1828 EXPECT_EQ(kDefaultLossDelayShift,
1829 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangb0c7b4b2019-09-12 06:45:24 -07001830
1831 QuicConfig config;
1832 QuicTagVector options;
1833 options.push_back(kILD3);
1834 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1835 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1836 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1837 manager_.SetFromConfig(config);
fayangb0c7b4b2019-09-12 06:45:24 -07001838 EXPECT_EQ(kDefaultLossDelayShift,
1839 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1840 EXPECT_TRUE(
1841 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1842}
1843
fayangdb095652019-11-04 07:37:36 -08001844TEST_F(QuicSentPacketManagerTest,
1845 NegotiateIetfLossDetectionAdaptiveReorderingAndTimeThreshold) {
fayang3be090d2020-02-11 14:05:08 -08001846 EXPECT_TRUE(
1847 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1848 EXPECT_FALSE(
1849 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1850 EXPECT_EQ(kDefaultLossDelayShift,
1851 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
fayangdb095652019-11-04 07:37:36 -08001852
1853 QuicConfig config;
1854 QuicTagVector options;
1855 options.push_back(kILD4);
1856 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1857 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1858 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1859 manager_.SetFromConfig(config);
1860
fayangdb095652019-11-04 07:37:36 -08001861 EXPECT_EQ(kDefaultLossDelayShift,
1862 QuicSentPacketManagerPeer::GetReorderingShift(&manager_));
1863 EXPECT_TRUE(
1864 QuicSentPacketManagerPeer::AdaptiveReorderingThresholdEnabled(&manager_));
1865 EXPECT_TRUE(
1866 QuicSentPacketManagerPeer::AdaptiveTimeThresholdEnabled(&manager_));
1867}
1868
fayangcff885a2019-10-22 07:39:04 -07001869TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001870 QuicConfig config;
1871 QuicTagVector options;
1872
1873 options.push_back(kRENO);
1874 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1875 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1876 manager_.SetFromConfig(config);
1877 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1878 ->GetCongestionControlType());
1879
1880 options.clear();
1881 options.push_back(kTBBR);
1882 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1883 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1884 manager_.SetFromConfig(config);
1885 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1886 ->GetCongestionControlType());
1887
1888 options.clear();
1889 options.push_back(kBYTE);
1890 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1891 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1892 manager_.SetFromConfig(config);
1893 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1894 ->GetCongestionControlType());
1895 options.clear();
1896 options.push_back(kRENO);
1897 options.push_back(kBYTE);
1898 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1899 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1900 manager_.SetFromConfig(config);
1901 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1902 ->GetCongestionControlType());
1903}
1904
fayangcff885a2019-10-22 07:39:04 -07001905TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001906 QuicConfig config;
1907 QuicTagVector options;
1908
1909 // No change if the server receives client options.
1910 const SendAlgorithmInterface* mock_sender =
1911 QuicSentPacketManagerPeer::GetSendAlgorithm(manager_);
1912 options.push_back(kRENO);
1913 config.SetClientConnectionOptions(options);
1914 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1915 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1916 manager_.SetFromConfig(config);
1917 EXPECT_EQ(mock_sender, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_));
1918
1919 // Change the congestion control on the client with client options.
1920 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1921 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1922 manager_.SetFromConfig(config);
1923 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1924 ->GetCongestionControlType());
1925
1926 options.clear();
1927 options.push_back(kTBBR);
1928 config.SetClientConnectionOptions(options);
1929 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1930 manager_.SetFromConfig(config);
1931 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1932 ->GetCongestionControlType());
1933
1934 options.clear();
1935 options.push_back(kBYTE);
1936 config.SetClientConnectionOptions(options);
1937 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1938 manager_.SetFromConfig(config);
1939 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1940 ->GetCongestionControlType());
1941
1942 options.clear();
1943 options.push_back(kRENO);
1944 options.push_back(kBYTE);
1945 config.SetClientConnectionOptions(options);
1946 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1947 manager_.SetFromConfig(config);
1948 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_)
1949 ->GetCongestionControlType());
1950}
1951
fayangcff885a2019-10-22 07:39:04 -07001952TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07001953 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1954 return;
1955 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001956 QuicConfig config;
1957 QuicTagVector options;
1958
1959 options.push_back(kMAD2);
1960 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1961 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1962 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1963 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1964 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1965 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1966 .WillOnce(Return(10 * kDefaultTCPMSS));
1967 manager_.SetFromConfig(config);
1968 // Set the initial RTT to 1us.
1969 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
1970 QuicTime::Delta::FromMicroseconds(1));
1971 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
1972 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
1973 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001974
ianswettad65ab92019-10-28 07:19:07 -07001975 // Send two packets, and the TLP should be 1ms.
1976 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001977 SendDataPacket(1);
1978 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07001979 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05001980 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05001981}
1982
fayangcff885a2019-10-22 07:39:04 -07001983TEST_F(QuicSentPacketManagerTest, NegotiateNoMinTLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07001984 if (GetQuicReloadableFlag(quic_default_on_pto)) {
1985 return;
1986 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05001987 QuicConfig client_config;
1988 QuicTagVector options;
1989
1990 options.push_back(kMAD2);
1991 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
1992 client_config.SetConnectionOptionsToSend(options);
1993 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
1994 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1995 EXPECT_CALL(*send_algorithm_, PacingRate(_))
1996 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1997 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
1998 .WillOnce(Return(10 * kDefaultTCPMSS));
1999 manager_.SetFromConfig(client_config);
2000 // Set the initial RTT to 1us.
2001 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt(
2002 QuicTime::Delta::FromMicroseconds(1));
2003 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(200ms).
2004 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(100002),
2005 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
ianswettad65ab92019-10-28 07:19:07 -07002006 // Send two packets, and the TLP should be 1ms.
2007 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMilliseconds(1);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002008 SendDataPacket(1);
2009 SendDataPacket(2);
ianswettdcc474e2019-08-06 08:22:38 -07002010 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002011 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002012}
2013
fayangcff885a2019-10-22 07:39:04 -07002014TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002015 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2016 return;
2017 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002018 QuicConfig config;
2019 QuicTagVector options;
2020
2021 options.push_back(kMAD3);
2022 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2023 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2024 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2025 manager_.SetFromConfig(config);
2026 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2027 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2028 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2029 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002030 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002031 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002032 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002033 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002034 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002035 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002036 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002037}
2038
fayangcff885a2019-10-22 07:39:04 -07002039TEST_F(QuicSentPacketManagerTest, NegotiateNoMinRTOFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002040 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2041 return;
2042 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002043 QuicConfig client_config;
2044 QuicTagVector options;
2045
2046 options.push_back(kMAD3);
2047 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2048 client_config.SetConnectionOptionsToSend(options);
2049 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2050 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2051 manager_.SetFromConfig(client_config);
2052 // Provide one RTT measurement, because otherwise we use the default of 500ms.
2053 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2054 rtt_stats->UpdateRtt(QuicTime::Delta::FromMicroseconds(1),
2055 QuicTime::Delta::Zero(), QuicTime::Zero());
ianswettad65ab92019-10-28 07:19:07 -07002056 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(1);
ianswettdcc474e2019-08-06 08:22:38 -07002057 EXPECT_EQ(expected_rto_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002058 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002059 // The TLP with fewer than 2 packets outstanding includes 1/2 min RTO(0ms).
ianswettad65ab92019-10-28 07:19:07 -07002060 QuicTime::Delta expected_tlp_delay = QuicTime::Delta::FromMicroseconds(502);
ianswettdcc474e2019-08-06 08:22:38 -07002061 EXPECT_EQ(expected_tlp_delay,
QUICHE teama6ef0a62019-03-07 20:34:33 -05002062 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002063}
2064
fayangcff885a2019-10-22 07:39:04 -07002065TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002066 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2067 return;
2068 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002069 QuicConfig config;
2070 QuicTagVector options;
2071
2072 options.push_back(kNTLP);
2073 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2074 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2075 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2076 manager_.SetFromConfig(config);
2077 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2078}
2079
fayangcff885a2019-10-22 07:39:04 -07002080TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002081 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2082 return;
2083 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002084 QuicConfig client_config;
2085 QuicTagVector options;
2086
2087 options.push_back(kNTLP);
2088 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2089 client_config.SetConnectionOptionsToSend(options);
2090 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2091 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2092 manager_.SetFromConfig(client_config);
2093 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2094}
2095
fayangcff885a2019-10-22 07:39:04 -07002096TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002097 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2098 return;
2099 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002100 QuicConfig config;
2101 QuicTagVector options;
2102
2103 options.push_back(k1TLP);
2104 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2105 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2106 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2107 manager_.SetFromConfig(config);
2108 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2109}
2110
fayangcff885a2019-10-22 07:39:04 -07002111TEST_F(QuicSentPacketManagerTest, Negotiate1TLPFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002112 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2113 return;
2114 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002115 QuicConfig client_config;
2116 QuicTagVector options;
2117
2118 options.push_back(k1TLP);
2119 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2120 client_config.SetConnectionOptionsToSend(options);
2121 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2122 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2123 manager_.SetFromConfig(client_config);
2124 EXPECT_EQ(1u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
2125}
2126
fayangcff885a2019-10-22 07:39:04 -07002127TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002128 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2129 return;
2130 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002131 QuicConfig config;
2132 QuicTagVector options;
2133
2134 options.push_back(kTLPR);
2135 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2136 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2137 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2138 manager_.SetFromConfig(config);
2139 EXPECT_TRUE(
2140 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2141}
2142
fayangcff885a2019-10-22 07:39:04 -07002143TEST_F(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002144 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2145 return;
2146 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002147 QuicConfig client_config;
2148 QuicTagVector options;
2149
2150 options.push_back(kTLPR);
2151 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2152 client_config.SetConnectionOptionsToSend(options);
2153 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2154 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2155 manager_.SetFromConfig(client_config);
2156 EXPECT_TRUE(
2157 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
2158}
2159
fayangcff885a2019-10-22 07:39:04 -07002160TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) {
fayang5d011982020-05-13 14:14:38 -07002161 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2162 return;
2163 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002164 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2165 QuicConfig config;
2166 QuicTagVector options;
2167
2168 options.push_back(kNRTO);
2169 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2170 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2171 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2172 manager_.SetFromConfig(config);
2173 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2174}
2175
fayangcff885a2019-10-22 07:39:04 -07002176TEST_F(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) {
fayang5d011982020-05-13 14:14:38 -07002177 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2178 return;
2179 }
QUICHE teama6ef0a62019-03-07 20:34:33 -05002180 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2181 QuicConfig client_config;
2182 QuicTagVector options;
2183
2184 options.push_back(kNRTO);
2185 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
2186 client_config.SetConnectionOptionsToSend(options);
2187 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2188 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2189 manager_.SetFromConfig(client_config);
2190 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_));
2191}
2192
fayangcff885a2019-10-22 07:39:04 -07002193TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002194 QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(325);
2195 EXPECT_NE(initial_rtt, manager_.GetRttStats()->smoothed_rtt());
2196
2197 QuicConfig config;
2198 config.SetInitialRoundTripTimeUsToSend(initial_rtt.ToMicroseconds());
2199 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2200 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2201 manager_.SetFromConfig(config);
2202
2203 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.GetRttStats()->smoothed_rtt());
2204 EXPECT_EQ(initial_rtt, manager_.GetRttStats()->initial_rtt());
2205}
2206
fayangcff885a2019-10-22 07:39:04 -07002207TEST_F(QuicSentPacketManagerTest, ResumeConnectionState) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002208 // The sent packet manager should use the RTT from CachedNetworkParameters if
2209 // it is provided.
fayangde9ad9f2020-09-16 10:27:16 -07002210 const QuicTime::Delta kRtt = QuicTime::Delta::FromMilliseconds(123);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002211 CachedNetworkParameters cached_network_params;
2212 cached_network_params.set_min_rtt_ms(kRtt.ToMilliseconds());
2213
QUICHE teamb4e187c2019-11-14 06:22:50 -08002214 SendAlgorithmInterface::NetworkParams params;
2215 params.bandwidth = QuicBandwidth::Zero();
2216 params.allow_cwnd_to_decrease = false;
2217 params.rtt = kRtt;
2218
2219 EXPECT_CALL(*send_algorithm_, AdjustNetworkParameters(params));
fayangbe83ecd2019-04-26 13:58:09 -07002220 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2221 .Times(testing::AnyNumber());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002222 manager_.ResumeConnectionState(cached_network_params, false);
2223 EXPECT_EQ(kRtt, manager_.GetRttStats()->initial_rtt());
2224}
2225
fayangcff885a2019-10-22 07:39:04 -07002226TEST_F(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002227 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2228 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2229 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2230 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2231
2232 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2233 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2234 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2235 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2236
2237 EXPECT_CALL(*send_algorithm_, OnConnectionMigration());
danzhb11d12d2021-01-12 10:39:32 -08002238 EXPECT_EQ(nullptr,
2239 manager_.OnConnectionMigration(/*reset_send_algorithm=*/false));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002240
2241 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2242 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2243 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2244}
2245
danzhb11d12d2021-01-12 10:39:32 -08002246// Tests that ResetCongestionControlUponPeerAddressChange() resets send
2247// algorithm and RTT. And unACK'ed packets are handled correctly.
2248TEST_F(QuicSentPacketManagerTest,
2249 ConnectionMigrationUnspecifiedChangeResetSendAlgorithm) {
2250 auto loss_algorithm = std::make_unique<MockLossAlgorithm>();
2251 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm.get());
2252
QUICHE teama6ef0a62019-03-07 20:34:33 -05002253 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2254 QuicTime::Delta default_init_rtt = rtt_stats->initial_rtt();
2255 rtt_stats->set_initial_rtt(default_init_rtt * 2);
2256 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt());
2257
2258 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1);
2259 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount());
2260 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2);
2261 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount());
2262
danzhb11d12d2021-01-12 10:39:32 -08002263 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002264
danzhb11d12d2021-01-12 10:39:32 -08002265 RttStats old_rtt_stats;
2266 old_rtt_stats.CloneFrom(*manager_.GetRttStats());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002267
danzhb11d12d2021-01-12 10:39:32 -08002268 // Packet1 will be mark for retransmission upon migration.
2269 EXPECT_CALL(notifier_, OnFrameLost(_));
2270 std::unique_ptr<SendAlgorithmInterface> old_send_algorithm =
2271 manager_.OnConnectionMigration(/*reset_send_algorithm=*/true);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002272
danzhb11d12d2021-01-12 10:39:32 -08002273 EXPECT_NE(old_send_algorithm.get(), manager_.GetSendAlgorithm());
2274 EXPECT_EQ(old_send_algorithm->GetCongestionControlType(),
2275 manager_.GetSendAlgorithm()->GetCongestionControlType());
2276 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2277 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2278 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2279 // Packets sent earlier shouldn't be regarded as in flight.
2280 EXPECT_EQ(0u, BytesInFlight());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002281
danzhb11d12d2021-01-12 10:39:32 -08002282 // Replace the new send algorithm with the mock object.
2283 manager_.SetSendAlgorithm(old_send_algorithm.release());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002284
danzhb11d12d2021-01-12 10:39:32 -08002285 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2286 // Application retransmit the data as LOSS_RETRANSMISSION.
2287 RetransmitDataPacket(2, LOSS_RETRANSMISSION, ENCRYPTION_FORWARD_SECURE);
2288 EXPECT_EQ(kDefaultLength, BytesInFlight());
2289
2290 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2291 // Receiving an ACK for packet1 20s later shouldn't update the RTT, and
2292 // shouldn't be treated as spurious retransmission.
2293 EXPECT_CALL(*send_algorithm_,
2294 OnCongestionEvent(/*rtt_updated=*/false, kDefaultLength, _, _, _))
2295 .WillOnce(testing::WithArg<3>(
2296 Invoke([](const AckedPacketVector& acked_packets) {
2297 EXPECT_EQ(1u, acked_packets.size());
2298 EXPECT_EQ(QuicPacketNumber(1), acked_packets[0].packet_number);
2299 // The bytes in packet1 shouldn't contribute to congestion control.
2300 EXPECT_EQ(0u, acked_packets[0].bytes_acked);
2301 })));
2302 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2303 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2304 clock_.Now());
2305 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2306 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2307 EXPECT_CALL(*loss_algorithm, SpuriousLossDetected(_, _, _, _, _)).Times(0u);
2308 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2309 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2310 ENCRYPTION_FORWARD_SECURE));
2311 EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero());
2312
2313 // Receiving an ACK for packet2 should update RTT and congestion control.
2314 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2315 clock_.Now());
2316 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
2317 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2318 EXPECT_CALL(*send_algorithm_,
2319 OnCongestionEvent(/*rtt_updated=*/true, kDefaultLength, _, _, _))
2320 .WillOnce(testing::WithArg<3>(
2321 Invoke([](const AckedPacketVector& acked_packets) {
2322 EXPECT_EQ(1u, acked_packets.size());
2323 EXPECT_EQ(QuicPacketNumber(2), acked_packets[0].packet_number);
2324 // The bytes in packet2 should contribute to congestion control.
2325 EXPECT_EQ(kDefaultLength, acked_packets[0].bytes_acked);
2326 })));
2327 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2328 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2329 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2330 ENCRYPTION_FORWARD_SECURE));
2331 EXPECT_EQ(0u, BytesInFlight());
2332 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10),
2333 manager_.GetRttStats()->latest_rtt());
2334
2335 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
danzha6906502021-01-25 09:10:59 -08002336 // Trigger loss timeout and mark packet3 for retransmission.
danzhb11d12d2021-01-12 10:39:32 -08002337 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
2338 .WillOnce(Return(clock_.Now() + QuicTime::Delta::FromMilliseconds(10)));
2339 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _))
2340 .WillOnce(WithArgs<5>(Invoke([](LostPacketVector* packet_lost) {
2341 packet_lost->emplace_back(QuicPacketNumber(3u), kDefaultLength);
2342 return LossDetectionInterface::DetectionStats();
2343 })));
2344 EXPECT_CALL(notifier_, OnFrameLost(_));
2345 EXPECT_CALL(*send_algorithm_,
2346 OnCongestionEvent(false, kDefaultLength, _, _, _));
2347 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2348 manager_.OnRetransmissionTimeout();
2349 EXPECT_EQ(0u, BytesInFlight());
2350
2351 // Migrate again with unACK'ed but not in-flight packet.
danzha6906502021-01-25 09:10:59 -08002352 // Packet3 shouldn't be marked for retransmission again as it is not in
2353 // flight.
danzhb11d12d2021-01-12 10:39:32 -08002354 old_send_algorithm =
2355 manager_.OnConnectionMigration(/*reset_send_algorithm=*/true);
2356
2357 EXPECT_NE(old_send_algorithm.get(), manager_.GetSendAlgorithm());
2358 EXPECT_EQ(old_send_algorithm->GetCongestionControlType(),
2359 manager_.GetSendAlgorithm()->GetCongestionControlType());
2360 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2361 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2362 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2363 EXPECT_EQ(0u, BytesInFlight());
2364 EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero());
2365
2366 manager_.SetSendAlgorithm(old_send_algorithm.release());
2367
2368 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(30));
2369 // Receiving an ACK for packet3 shouldn't update RTT. Though packet 3 was
2370 // marked lost, this spurious retransmission shouldn't be reported to the loss
2371 // algorithm.
2372 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2373 clock_.Now());
2374 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
2375 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2376 EXPECT_CALL(*loss_algorithm, SpuriousLossDetected(_, _, _, _, _)).Times(0u);
2377 EXPECT_CALL(*send_algorithm_,
2378 OnCongestionEvent(/*rtt_updated=*/false, 0, _, _, _));
2379 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2380 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2381 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2382 ENCRYPTION_FORWARD_SECURE));
2383 EXPECT_EQ(0u, BytesInFlight());
2384 EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero());
danzha6906502021-01-25 09:10:59 -08002385
2386 SendDataPacket(4, ENCRYPTION_FORWARD_SECURE);
2387 // Trigger loss timeout and mark packet4 for retransmission.
2388 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
2389 .WillOnce(Return(clock_.Now() + QuicTime::Delta::FromMilliseconds(10)));
2390 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _))
2391 .WillOnce(WithArgs<5>(Invoke([](LostPacketVector* packet_lost) {
2392 packet_lost->emplace_back(QuicPacketNumber(4u), kDefaultLength);
2393 return LossDetectionInterface::DetectionStats();
2394 })));
2395 EXPECT_CALL(notifier_, OnFrameLost(_));
2396 EXPECT_CALL(*send_algorithm_,
2397 OnCongestionEvent(false, kDefaultLength, _, _, _));
2398 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2399 manager_.OnRetransmissionTimeout();
2400 EXPECT_EQ(0u, BytesInFlight());
2401
2402 // Application retransmit the data as LOSS_RETRANSMISSION.
2403 RetransmitDataPacket(5, LOSS_RETRANSMISSION, ENCRYPTION_FORWARD_SECURE);
2404 EXPECT_EQ(kDefaultLength, BytesInFlight());
2405
2406 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(30));
2407 // Receiving an ACK for packet4 should update RTT, but not bytes in flight.
2408 // This spurious retransmission should be reported to the loss algorithm.
2409 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2410 clock_.Now());
2411 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
2412 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2413 EXPECT_CALL(*loss_algorithm, SpuriousLossDetected(_, _, _, _, _));
2414 EXPECT_CALL(*send_algorithm_,
2415 OnCongestionEvent(/*rtt_updated=*/true, kDefaultLength, _, _, _));
2416 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2417 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _));
2418 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2419 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2420 ENCRYPTION_FORWARD_SECURE));
2421 EXPECT_EQ(kDefaultLength, BytesInFlight());
2422 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(30),
2423 manager_.GetRttStats()->latest_rtt());
2424
2425 // Migrate again with in-flight packet5 whose retransmittable frames are all
2426 // ACKed. Packet5 should be marked for retransmission but nothing to
2427 // retransmit.
2428 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillOnce(Return(false));
2429 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(0u);
2430 old_send_algorithm =
2431 manager_.OnConnectionMigration(/*reset_send_algorithm=*/true);
2432 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt());
2433 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount());
2434 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount());
2435 EXPECT_EQ(0u, BytesInFlight());
2436 EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero());
2437
2438 manager_.SetSendAlgorithm(old_send_algorithm.release());
2439
2440 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2441 // Receiving an ACK for packet5 shouldn't update RTT. Though packet 5 was
2442 // marked for retransmission, this spurious retransmission shouldn't be
2443 // reported to the loss algorithm.
2444 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2445 clock_.Now());
2446 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
2447 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _, _));
2448 EXPECT_CALL(*loss_algorithm, SpuriousLossDetected(_, _, _, _, _)).Times(0u);
2449 EXPECT_CALL(*send_algorithm_,
2450 OnCongestionEvent(/*rtt_updated=*/false, 0, _, _, _));
2451 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2452 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _));
2453 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2454 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2455 ENCRYPTION_FORWARD_SECURE));
2456 EXPECT_EQ(0u, BytesInFlight());
2457 EXPECT_TRUE(manager_.GetRttStats()->latest_rtt().IsZero());
QUICHE teama6ef0a62019-03-07 20:34:33 -05002458}
2459
fayangcff885a2019-10-22 07:39:04 -07002460TEST_F(QuicSentPacketManagerTest, PathMtuIncreased) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002461 EXPECT_CALL(*send_algorithm_,
2462 OnPacketSent(_, BytesInFlight(), QuicPacketNumber(1), _, _));
2463 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
2464 nullptr, kDefaultLength + 100, false, false);
fayangcff885a2019-10-22 07:39:04 -07002465 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
danzh8c7d1192020-08-25 08:01:43 -07002466 HAS_RETRANSMITTABLE_DATA, true);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002467
2468 // Ack the large packet and expect the path MTU to increase.
2469 ExpectAck(1);
2470 EXPECT_CALL(*network_change_visitor_,
2471 OnPathMtuIncreased(kDefaultLength + 100));
2472 QuicAckFrame ack_frame = InitAckFrame(1);
2473 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2474 clock_.Now());
2475 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002476 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002477 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2478 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002479}
2480
fayangcff885a2019-10-22 07:39:04 -07002481TEST_F(QuicSentPacketManagerTest, OnAckRangeSlowPath) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05002482 // Send packets 1 - 20.
2483 for (size_t i = 1; i <= 20; ++i) {
2484 SendDataPacket(i);
2485 }
2486 // Ack [5, 7), [10, 12), [15, 17).
2487 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2488 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
vasilvvbed67c62020-10-20 06:38:43 -07002489 ExpectAcksAndLosses(true, acked1, ABSL_ARRAYSIZE(acked1), lost1,
2490 ABSL_ARRAYSIZE(lost1));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002491 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2492 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2493 clock_.Now());
2494 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2495 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2496 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
2497 // Make sure empty range does not harm.
2498 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002499 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002500 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2501 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002502
2503 // Ack [4, 8), [9, 13), [14, 21).
2504 uint64_t acked2[] = {4, 7, 9, 12, 14, 17, 18, 19, 20};
vasilvvbed67c62020-10-20 06:38:43 -07002505 ExpectAcksAndLosses(true, acked2, ABSL_ARRAYSIZE(acked2), nullptr, 0);
QUICHE teama6ef0a62019-03-07 20:34:33 -05002506 manager_.OnAckFrameStart(QuicPacketNumber(20), QuicTime::Delta::Infinite(),
2507 clock_.Now());
2508 manager_.OnAckRange(QuicPacketNumber(14), QuicPacketNumber(21));
2509 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2510 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002511 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002512 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2513 ENCRYPTION_INITIAL));
QUICHE teama6ef0a62019-03-07 20:34:33 -05002514}
2515
fayangcff885a2019-10-22 07:39:04 -07002516TEST_F(QuicSentPacketManagerTest, TolerateReneging) {
QUICHE team9929cc42019-03-13 08:17:43 -07002517 // Send packets 1 - 20.
2518 for (size_t i = 1; i <= 20; ++i) {
2519 SendDataPacket(i);
2520 }
2521 // Ack [5, 7), [10, 12), [15, 17).
2522 uint64_t acked1[] = {5, 6, 10, 11, 15, 16};
2523 uint64_t lost1[] = {1, 2, 3, 4, 7, 8, 9, 12, 13};
vasilvvbed67c62020-10-20 06:38:43 -07002524 ExpectAcksAndLosses(true, acked1, ABSL_ARRAYSIZE(acked1), lost1,
2525 ABSL_ARRAYSIZE(lost1));
QUICHE team9929cc42019-03-13 08:17:43 -07002526 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(AnyNumber());
2527 manager_.OnAckFrameStart(QuicPacketNumber(16), QuicTime::Delta::Infinite(),
2528 clock_.Now());
2529 manager_.OnAckRange(QuicPacketNumber(15), QuicPacketNumber(17));
2530 manager_.OnAckRange(QuicPacketNumber(10), QuicPacketNumber(12));
2531 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(7));
fayang3eb82212019-04-16 12:05:46 -07002532 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002533 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2534 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002535
2536 // Making sure reneged ACK does not harm. Ack [4, 8), [9, 13).
2537 uint64_t acked2[] = {4, 7, 9, 12};
vasilvvbed67c62020-10-20 06:38:43 -07002538 ExpectAcksAndLosses(true, acked2, ABSL_ARRAYSIZE(acked2), nullptr, 0);
QUICHE team9929cc42019-03-13 08:17:43 -07002539 manager_.OnAckFrameStart(QuicPacketNumber(12), QuicTime::Delta::Infinite(),
2540 clock_.Now());
2541 manager_.OnAckRange(QuicPacketNumber(9), QuicPacketNumber(13));
2542 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(8));
fayang3eb82212019-04-16 12:05:46 -07002543 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002544 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2545 ENCRYPTION_INITIAL));
QUICHE team9929cc42019-03-13 08:17:43 -07002546 EXPECT_EQ(QuicPacketNumber(16), manager_.GetLargestObserved());
2547}
2548
fayangcff885a2019-10-22 07:39:04 -07002549TEST_F(QuicSentPacketManagerTest, MultiplePacketNumberSpaces) {
QUICHE teamc279cec2019-03-22 06:51:48 -07002550 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang533cb1b2020-01-28 08:05:08 -08002551 const QuicUnackedPacketMap* unacked_packets =
2552 QuicSentPacketManagerPeer::GetUnackedPacketMap(&manager_);
QUICHE teamc279cec2019-03-22 06:51:48 -07002553 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002554 unacked_packets
2555 ->GetLargestSentRetransmittableOfPacketNumberSpace(INITIAL_DATA)
2556 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002557 EXPECT_FALSE(
2558 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL).IsInitialized());
2559 // Send packet 1.
2560 SendDataPacket(1, ENCRYPTION_INITIAL);
2561 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002562 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2563 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002564 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002565 unacked_packets
2566 ->GetLargestSentRetransmittableOfPacketNumberSpace(HANDSHAKE_DATA)
2567 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002568 // Ack packet 1.
2569 ExpectAck(1);
2570 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2571 clock_.Now());
2572 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
fayang3eb82212019-04-16 12:05:46 -07002573 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002574 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2575 ENCRYPTION_INITIAL));
QUICHE teamc279cec2019-03-22 06:51:48 -07002576 EXPECT_EQ(QuicPacketNumber(1),
2577 manager_.GetLargestAckedPacket(ENCRYPTION_INITIAL));
2578 EXPECT_FALSE(
2579 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE).IsInitialized());
2580 // Send packets 2 and 3.
2581 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2582 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2583 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002584 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2585 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002586 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002587 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2588 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002589 EXPECT_FALSE(
fayang533cb1b2020-01-28 08:05:08 -08002590 unacked_packets
2591 ->GetLargestSentRetransmittableOfPacketNumberSpace(APPLICATION_DATA)
2592 .IsInitialized());
QUICHE teamc279cec2019-03-22 06:51:48 -07002593 // Ack packet 2.
2594 ExpectAck(2);
2595 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2596 clock_.Now());
2597 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
fayang3eb82212019-04-16 12:05:46 -07002598 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002599 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2600 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002601 EXPECT_EQ(QuicPacketNumber(2),
2602 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2603 EXPECT_FALSE(
2604 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2605 // Ack packet 3.
2606 ExpectAck(3);
2607 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2608 clock_.Now());
2609 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(4));
fayang3eb82212019-04-16 12:05:46 -07002610 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002611 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(3),
2612 ENCRYPTION_HANDSHAKE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002613 EXPECT_EQ(QuicPacketNumber(3),
2614 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2615 EXPECT_FALSE(
2616 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT).IsInitialized());
2617 // Send packets 4 and 5.
2618 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
2619 SendDataPacket(5, ENCRYPTION_ZERO_RTT);
2620 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002621 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2622 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002623 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002624 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2625 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002626 EXPECT_EQ(QuicPacketNumber(5),
fayang533cb1b2020-01-28 08:05:08 -08002627 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2628 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002629 // Ack packet 5.
2630 ExpectAck(5);
2631 manager_.OnAckFrameStart(QuicPacketNumber(5), QuicTime::Delta::Infinite(),
2632 clock_.Now());
2633 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(6));
fayang3eb82212019-04-16 12:05:46 -07002634 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002635 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
2636 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002637 EXPECT_EQ(QuicPacketNumber(3),
2638 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2639 EXPECT_EQ(QuicPacketNumber(5),
2640 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2641 EXPECT_EQ(QuicPacketNumber(5),
2642 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2643
2644 // Send packets 6 - 8.
2645 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
2646 SendDataPacket(7, ENCRYPTION_FORWARD_SECURE);
2647 SendDataPacket(8, ENCRYPTION_FORWARD_SECURE);
2648 EXPECT_EQ(QuicPacketNumber(1),
fayang533cb1b2020-01-28 08:05:08 -08002649 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2650 INITIAL_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002651 EXPECT_EQ(QuicPacketNumber(3),
fayang533cb1b2020-01-28 08:05:08 -08002652 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2653 HANDSHAKE_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002654 EXPECT_EQ(QuicPacketNumber(8),
fayang533cb1b2020-01-28 08:05:08 -08002655 unacked_packets->GetLargestSentRetransmittableOfPacketNumberSpace(
2656 APPLICATION_DATA));
QUICHE teamc279cec2019-03-22 06:51:48 -07002657 // Ack all packets.
2658 uint64_t acked[] = {4, 6, 7, 8};
vasilvvbed67c62020-10-20 06:38:43 -07002659 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
QUICHE teamc279cec2019-03-22 06:51:48 -07002660 manager_.OnAckFrameStart(QuicPacketNumber(8), QuicTime::Delta::Infinite(),
2661 clock_.Now());
2662 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(9));
fayang3eb82212019-04-16 12:05:46 -07002663 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002664 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(5),
2665 ENCRYPTION_FORWARD_SECURE));
QUICHE teamc279cec2019-03-22 06:51:48 -07002666 EXPECT_EQ(QuicPacketNumber(3),
2667 manager_.GetLargestAckedPacket(ENCRYPTION_HANDSHAKE));
2668 EXPECT_EQ(QuicPacketNumber(8),
2669 manager_.GetLargestAckedPacket(ENCRYPTION_ZERO_RTT));
2670 EXPECT_EQ(QuicPacketNumber(8),
2671 manager_.GetLargestAckedPacket(ENCRYPTION_FORWARD_SECURE));
2672}
2673
fayangcff885a2019-10-22 07:39:04 -07002674TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002675 manager_.EnableMultiplePacketNumberSpacesSupport();
2676 // Send packet 1.
2677 SendDataPacket(1, ENCRYPTION_INITIAL);
2678 // Send packets 2 and 3.
2679 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2680 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2681
2682 // ACK packets 2 and 3 in the wrong packet number space.
2683 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2684 clock_.Now());
2685 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2686 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002687 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2688 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002689}
2690
fayangcff885a2019-10-22 07:39:04 -07002691TEST_F(QuicSentPacketManagerTest, PacketsGetAckedInWrongPacketNumberSpace2) {
fayang3eb82212019-04-16 12:05:46 -07002692 manager_.EnableMultiplePacketNumberSpacesSupport();
2693 // Send packet 1.
2694 SendDataPacket(1, ENCRYPTION_INITIAL);
2695 // Send packets 2 and 3.
2696 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2697 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2698
2699 // ACK packet 1 in the wrong packet number space.
2700 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2701 clock_.Now());
2702 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2703 EXPECT_EQ(PACKETS_ACKED_IN_WRONG_PACKET_NUMBER_SPACE,
fayangf8e918b2019-07-16 13:03:16 -07002704 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2705 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002706}
2707
fayangcff885a2019-10-22 07:39:04 -07002708TEST_F(QuicSentPacketManagerTest,
fayang3eb82212019-04-16 12:05:46 -07002709 ToleratePacketsGetAckedInWrongPacketNumberSpace) {
fayang3eb82212019-04-16 12:05:46 -07002710 manager_.EnableMultiplePacketNumberSpacesSupport();
2711 // Send packet 1.
2712 SendDataPacket(1, ENCRYPTION_INITIAL);
2713 // Ack packet 1.
2714 ExpectAck(1);
2715 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2716 clock_.Now());
2717 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2718 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002719 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2720 ENCRYPTION_INITIAL));
fayang3eb82212019-04-16 12:05:46 -07002721
2722 // Send packets 2 and 3.
2723 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2724 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
2725
2726 // Packet 1 gets acked in the wrong packet number space. Since packet 1 has
2727 // been acked in the correct packet number space, tolerate it.
2728 uint64_t acked[] = {2, 3};
vasilvvbed67c62020-10-20 06:38:43 -07002729 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayang3eb82212019-04-16 12:05:46 -07002730 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
2731 clock_.Now());
2732 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
2733 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002734 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2735 ENCRYPTION_HANDSHAKE));
fayang3eb82212019-04-16 12:05:46 -07002736}
2737
fayang06bb1b02019-06-14 14:07:12 -07002738// Regression test for b/133771183.
fayangcff885a2019-10-22 07:39:04 -07002739TEST_F(QuicSentPacketManagerTest, PacketInLimbo) {
fayang5d011982020-05-13 14:14:38 -07002740 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2741 return;
2742 }
fayang06bb1b02019-06-14 14:07:12 -07002743 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
2744 // Send SHLO.
2745 SendCryptoPacket(1);
2746 // Send data packet.
2747 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2748 // Send Ack Packet.
2749 SendAckPacket(3, 1, ENCRYPTION_FORWARD_SECURE);
2750 // Retransmit SHLO.
2751 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2752 .WillOnce(InvokeWithoutArgs([this]() { RetransmitCryptoPacket(4); }));
2753 manager_.OnRetransmissionTimeout();
2754
2755 // Successfully decrypt a forward secure packet.
2756 manager_.SetHandshakeConfirmed();
2757 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
2758 // Send Ack packet.
2759 SendAckPacket(5, 2, ENCRYPTION_FORWARD_SECURE);
2760
2761 // Retransmission alarm fires.
2762 manager_.OnRetransmissionTimeout();
2763 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2764 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2765 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
2766 })));
2767 manager_.MaybeRetransmitTailLossProbe();
2768
2769 // Received Ack of packets 1, 3 and 4.
2770 uint64_t acked[] = {1, 3, 4};
vasilvvbed67c62020-10-20 06:38:43 -07002771 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayang06bb1b02019-06-14 14:07:12 -07002772 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
2773 clock_.Now());
2774 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(5));
2775 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2776 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002777 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2778 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002779
2780 uint64_t acked2[] = {5, 6};
2781 uint64_t loss[] = {2};
fayang897605d2019-08-21 13:26:45 -07002782 // Verify packet 2 is detected lost.
2783 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
vasilvvbed67c62020-10-20 06:38:43 -07002784 ExpectAcksAndLosses(true, acked2, ABSL_ARRAYSIZE(acked2), loss,
2785 ABSL_ARRAYSIZE(loss));
fayang06bb1b02019-06-14 14:07:12 -07002786 manager_.OnAckFrameStart(QuicPacketNumber(6), QuicTime::Delta::Infinite(),
2787 clock_.Now());
2788 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(7));
2789 EXPECT_EQ(PACKETS_NEWLY_ACKED,
fayangf8e918b2019-07-16 13:03:16 -07002790 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2791 ENCRYPTION_INITIAL));
fayang06bb1b02019-06-14 14:07:12 -07002792}
2793
fayangcff885a2019-10-22 07:39:04 -07002794TEST_F(QuicSentPacketManagerTest, RtoFiresNoPacketToRetransmit) {
fayang5d011982020-05-13 14:14:38 -07002795 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2796 return;
2797 }
fayanga29eb242019-07-16 12:25:38 -07002798 // Send 10 packets.
2799 for (size_t i = 1; i <= 10; ++i) {
2800 SendDataPacket(i);
2801 }
2802 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2803 .Times(2)
2804 .WillOnce(WithArgs<1>(Invoke(
2805 [this](TransmissionType type) { RetransmitDataPacket(11, type); })))
2806 .WillOnce(WithArgs<1>(Invoke(
2807 [this](TransmissionType type) { RetransmitDataPacket(12, type); })));
2808 manager_.OnRetransmissionTimeout();
2809 EXPECT_EQ(1u, stats_.rto_count);
2810 EXPECT_EQ(0u, manager_.pending_timer_transmission_count());
2811
2812 // RTO fires again, but there is no packet to be RTO retransmitted.
2813 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
2814 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
2815 manager_.OnRetransmissionTimeout();
2816 EXPECT_EQ(2u, stats_.rto_count);
fayange861aee2019-10-16 13:40:39 -07002817 // Verify a credit is raised up.
2818 EXPECT_EQ(1u, manager_.pending_timer_transmission_count());
fayanga29eb242019-07-16 12:25:38 -07002819}
2820
fayangcff885a2019-10-22 07:39:04 -07002821TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeout) {
fayangce0a3162019-08-15 09:05:36 -07002822 EnablePto(k2PTO);
2823 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2824 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2825 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2826 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2827 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2828 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2829 QuicTime::Delta::Zero(), QuicTime::Zero());
2830 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2831
2832 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
2833 // Verify PTO is correctly set.
2834 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07002835 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayangce0a3162019-08-15 09:05:36 -07002836 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002837 QuicTime packet1_sent_time = clock_.Now();
fayangce0a3162019-08-15 09:05:36 -07002838 EXPECT_EQ(clock_.Now() + expected_pto_delay,
2839 manager_.GetRetransmissionTime());
2840
2841 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2842 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2843 // Verify PTO is correctly set based on sent time of packet 2.
fayang5d011982020-05-13 14:14:38 -07002844 QuicTime deadline = clock_.Now() + expected_pto_delay;
2845 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2846 // Verify PTO is set based on left edge.
2847 deadline = packet1_sent_time + expected_pto_delay;
2848 }
2849 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayangce0a3162019-08-15 09:05:36 -07002850 EXPECT_EQ(0u, stats_.pto_count);
2851
2852 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002853 clock_.AdvanceTime(deadline - clock_.Now());
fayangce0a3162019-08-15 09:05:36 -07002854 manager_.OnRetransmissionTimeout();
2855 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2856 EXPECT_EQ(1u, stats_.pto_count);
fayang2a379bf2020-05-18 11:49:25 -07002857 EXPECT_EQ(0u, stats_.max_consecutive_rto_with_forward_progress);
fayangce0a3162019-08-15 09:05:36 -07002858
2859 // Verify two probe packets get sent.
2860 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2861 .Times(2)
2862 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2863 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2864 })))
2865 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2866 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
2867 })));
2868 manager_.MaybeSendProbePackets();
2869 // Verify PTO period gets set to twice the current value.
2870 QuicTime sent_time = clock_.Now();
2871 EXPECT_EQ(sent_time + expected_pto_delay * 2,
2872 manager_.GetRetransmissionTime());
2873
2874 // Received ACK for packets 1 and 2.
2875 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -07002876 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayangce0a3162019-08-15 09:05:36 -07002877 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2878 clock_.Now());
2879 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
2880 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2881 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2882 ENCRYPTION_FORWARD_SECURE));
2883 expected_pto_delay =
2884 rtt_stats->SmoothedOrInitialRtt() +
fayang1760b082020-09-22 11:08:27 -07002885 std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(),
fayangce0a3162019-08-15 09:05:36 -07002886 QuicTime::Delta::FromMilliseconds(1)) +
2887 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
2888
2889 // Verify PTO is correctly re-armed based on sent time of packet 4.
2890 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
fayang2a379bf2020-05-18 11:49:25 -07002891 EXPECT_EQ(1u, stats_.max_consecutive_rto_with_forward_progress);
fayangce0a3162019-08-15 09:05:36 -07002892}
2893
fayangcff885a2019-10-22 07:39:04 -07002894TEST_F(QuicSentPacketManagerTest, SendOneProbePacket) {
fayangce0a3162019-08-15 09:05:36 -07002895 EnablePto(k1PTO);
2896 EXPECT_CALL(*send_algorithm_, PacingRate(_))
2897 .WillRepeatedly(Return(QuicBandwidth::Zero()));
2898 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
2899 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
2900
2901 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07002902 QuicTime packet1_sent_time = clock_.Now();
fayangce0a3162019-08-15 09:05:36 -07002903 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
2904 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
2905
2906 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
2907 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
2908 QuicTime::Delta::Zero(), QuicTime::Zero());
2909 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
2910 // Verify PTO period is correctly set.
2911 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07002912 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayangce0a3162019-08-15 09:05:36 -07002913 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07002914 QuicTime deadline = clock_.Now() + expected_pto_delay;
2915 if (GetQuicReloadableFlag(quic_default_on_pto)) {
2916 // Verify PTO is set based on left edge.
2917 deadline = packet1_sent_time + expected_pto_delay;
2918 }
2919 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayangce0a3162019-08-15 09:05:36 -07002920
2921 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07002922 clock_.AdvanceTime(deadline - clock_.Now());
fayangce0a3162019-08-15 09:05:36 -07002923 manager_.OnRetransmissionTimeout();
2924 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
2925
2926 // Verify one probe packet gets sent.
2927 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
2928 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
2929 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
2930 })));
2931 manager_.MaybeSendProbePackets();
2932}
2933
fayangcff885a2019-10-22 07:39:04 -07002934TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeClient) {
fayang5f135052019-08-22 17:59:40 -07002935 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayangaf9903b2020-05-14 14:34:28 -07002936 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang5f135052019-08-22 17:59:40 -07002937 // Send CHLO.
2938 SendCryptoPacket(1);
2939 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2940 // Ack packet 1.
2941 ExpectAck(1);
2942 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2943 clock_.Now());
2944 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2945 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2946 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2947 ENCRYPTION_INITIAL));
2948 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2949 // Verify retransmission timeout is not zero because handshake is not
2950 // confirmed although there is no in flight packet.
2951 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2952 // Fire PTO.
2953 EXPECT_EQ(QuicSentPacketManager::PTO_MODE,
2954 manager_.OnRetransmissionTimeout());
fayang53ddf442020-07-16 12:18:44 -07002955 // Send handshake packet.
2956 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
2957 // Ack packet 2.
2958 ExpectAck(2);
2959 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
2960 clock_.Now());
2961 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
2962 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2963 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
2964 ENCRYPTION_HANDSHAKE));
2965 // Verify retransmission timeout is zero because server has successfully
2966 // processed HANDSHAKE packet.
2967 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
fayang5f135052019-08-22 17:59:40 -07002968}
2969
fayangcff885a2019-10-22 07:39:04 -07002970TEST_F(QuicSentPacketManagerTest, DisableHandshakeModeServer) {
fayang08a6c952019-09-18 14:29:45 -07002971 manager_.EnableIetfPtoAndLossDetection();
fayang5f135052019-08-22 17:59:40 -07002972 // Send SHLO.
2973 SendCryptoPacket(1);
2974 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
2975 // Ack packet 1.
2976 ExpectAck(1);
2977 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
2978 clock_.Now());
2979 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
2980 EXPECT_EQ(PACKETS_NEWLY_ACKED,
2981 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
2982 ENCRYPTION_INITIAL));
2983 EXPECT_EQ(0u, manager_.GetBytesInFlight());
2984 // Verify retransmission timeout is not set on server side because there is
2985 // nothing in flight.
2986 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
2987}
2988
fayang4c908f02019-11-01 07:26:17 -07002989TEST_F(QuicSentPacketManagerTest, PtoTimeoutIncludesMaxAckDelay) {
2990 EnablePto(k1PTO);
2991 // Use PTOS and PTOA.
2992 QuicConfig config;
2993 QuicTagVector options;
2994 options.push_back(kPTOS);
2995 options.push_back(kPTOA);
2996 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
2997 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
2998 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
2999 manager_.SetFromConfig(config);
3000 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3001 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3002
3003 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3004 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3005 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3006 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3007 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3008 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3009 QuicTime::Delta::Zero(), QuicTime::Zero());
3010 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3011
3012 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07003013 QuicTime packet1_sent_time = clock_.Now();
fayang4c908f02019-11-01 07:26:17 -07003014 // Verify PTO is correctly set and ack delay is included.
3015 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003016 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang4c908f02019-11-01 07:26:17 -07003017 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3018 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3019 manager_.GetRetransmissionTime());
3020
3021 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3022 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3023 // Verify PTO is correctly set based on sent time of packet 2 but ack delay is
3024 // not included as an immediate ACK is expected.
3025 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
3026 kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07003027 QuicTime deadline = clock_.Now() + expected_pto_delay;
3028 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3029 deadline = packet1_sent_time + expected_pto_delay;
3030 }
3031 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayang4c908f02019-11-01 07:26:17 -07003032 EXPECT_EQ(0u, stats_.pto_count);
3033
3034 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07003035 clock_.AdvanceTime(deadline - clock_.Now());
fayang4c908f02019-11-01 07:26:17 -07003036 manager_.OnRetransmissionTimeout();
3037 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3038 EXPECT_EQ(1u, stats_.pto_count);
3039
3040 // Verify 1 probe packets get sent and packet number gets skipped.
3041 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3042 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3043 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3044 })));
3045 manager_.MaybeSendProbePackets();
3046 // Verify PTO period gets set to twice the current value. Also, ack delay is
3047 // not included.
3048 QuicTime sent_time = clock_.Now();
3049 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3050 manager_.GetRetransmissionTime());
3051
3052 // Received ACK for packets 1 and 2.
3053 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -07003054 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayang4c908f02019-11-01 07:26:17 -07003055 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3056 clock_.Now());
3057 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3058 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3059 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3060 ENCRYPTION_FORWARD_SECURE));
3061 expected_pto_delay =
3062 rtt_stats->SmoothedOrInitialRtt() +
fayang1760b082020-09-22 11:08:27 -07003063 std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(),
fayang4c908f02019-11-01 07:26:17 -07003064 QuicTime::Delta::FromMilliseconds(1)) +
3065 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3066
3067 // Verify PTO is correctly re-armed based on sent time of packet 4. Because of
3068 // PTOS turns out to be spurious, ACK delay is included.
3069 EXPECT_EQ(sent_time + expected_pto_delay, manager_.GetRetransmissionTime());
3070
3071 // Received ACK for packets 4.
3072 ExpectAck(4);
3073 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
3074 clock_.Now());
3075 manager_.OnAckRange(QuicPacketNumber(4), QuicPacketNumber(5));
3076 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3077 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
3078 ENCRYPTION_FORWARD_SECURE));
3079 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
3080 // Send more packets, such that peer will do ack decimation.
3081 std::vector<uint64_t> acked2;
3082 for (size_t i = 5; i <= 100; ++i) {
3083 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
3084 acked2.push_back(i);
3085 }
3086 // Received ACK for all sent packets.
3087 ExpectAcksAndLosses(true, &acked2[0], acked2.size(), nullptr, 0);
3088 manager_.OnAckFrameStart(QuicPacketNumber(100), QuicTime::Delta::Infinite(),
3089 clock_.Now());
3090 manager_.OnAckRange(QuicPacketNumber(5), QuicPacketNumber(101));
3091 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3092 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(100),
3093 ENCRYPTION_FORWARD_SECURE));
3094
3095 expected_pto_delay =
3096 rtt_stats->SmoothedOrInitialRtt() +
fayang1760b082020-09-22 11:08:27 -07003097 std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(),
fayang4c908f02019-11-01 07:26:17 -07003098 QuicTime::Delta::FromMilliseconds(1)) +
3099 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3100 for (size_t i = 101; i < 110; i++) {
3101 SendDataPacket(i, ENCRYPTION_FORWARD_SECURE);
3102 // Verify PTO timeout includes ACK delay as there are less than 10 packets
3103 // outstanding.
3104 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3105 manager_.GetRetransmissionTime());
3106 }
3107 expected_pto_delay = expected_pto_delay - QuicTime::Delta::FromMilliseconds(
3108 kDefaultDelayedAckTimeMs);
3109 SendDataPacket(110, ENCRYPTION_FORWARD_SECURE);
3110 // Verify ACK delay is excluded.
3111 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3112 manager_.GetRetransmissionTime());
3113}
3114
fayang7085a6d2019-11-04 07:03:57 -08003115TEST_F(QuicSentPacketManagerTest, StartExponentialBackoffSince2ndPto) {
3116 EnablePto(k2PTO);
3117 QuicConfig config;
3118 QuicTagVector options;
3119 options.push_back(kPEB2);
3120 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3121 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3122 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3123 manager_.SetFromConfig(config);
3124
3125 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3126 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3127 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3128 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3129 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3130 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3131 QuicTime::Delta::Zero(), QuicTime::Zero());
3132 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3133
3134 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
fayang5d011982020-05-13 14:14:38 -07003135 QuicTime packet1_sent_time = clock_.Now();
fayang7085a6d2019-11-04 07:03:57 -08003136 // Verify PTO is correctly set.
3137 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003138 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang7085a6d2019-11-04 07:03:57 -08003139 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang5d011982020-05-13 14:14:38 -07003140 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
fayang7085a6d2019-11-04 07:03:57 -08003141 manager_.GetRetransmissionTime());
3142
3143 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3144 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3145 // Verify PTO is correctly set based on sent time of packet 2.
fayang5d011982020-05-13 14:14:38 -07003146 QuicTime deadline = clock_.Now() + expected_pto_delay;
3147 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3148 // Verify PTO is set based on left edge.
3149 deadline = packet1_sent_time + expected_pto_delay;
3150 }
3151 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
fayang7085a6d2019-11-04 07:03:57 -08003152 EXPECT_EQ(0u, stats_.pto_count);
3153
3154 // Invoke PTO.
fayang5d011982020-05-13 14:14:38 -07003155 clock_.AdvanceTime(deadline - clock_.Now());
fayang7085a6d2019-11-04 07:03:57 -08003156 manager_.OnRetransmissionTimeout();
3157 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3158 EXPECT_EQ(1u, stats_.pto_count);
3159
3160 // Verify two probe packets get sent.
3161 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3162 .Times(2)
3163 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3164 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3165 })))
3166 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3167 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3168 })));
3169 manager_.MaybeSendProbePackets();
3170 // Verify no exponential backoff.
3171 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3172 manager_.GetRetransmissionTime());
3173
3174 // Invoke 2nd PTO.
3175 clock_.AdvanceTime(expected_pto_delay);
3176 manager_.OnRetransmissionTimeout();
3177 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3178 EXPECT_EQ(2u, stats_.pto_count);
3179
3180 // Verify two probe packets get sent.
3181 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3182 .Times(2)
3183 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3184 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3185 })))
3186 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3187 RetransmitDataPacket(6, type, ENCRYPTION_FORWARD_SECURE);
3188 })));
3189 manager_.MaybeSendProbePackets();
3190 // Verify still no exponential backoff.
3191 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3192 manager_.GetRetransmissionTime());
3193
3194 // Invoke 3rd PTO.
3195 clock_.AdvanceTime(expected_pto_delay);
3196 manager_.OnRetransmissionTimeout();
3197 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3198 EXPECT_EQ(3u, stats_.pto_count);
3199
3200 // Verify two probe packets get sent.
3201 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3202 .Times(2)
3203 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3204 RetransmitDataPacket(7, type, ENCRYPTION_FORWARD_SECURE);
3205 })))
3206 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3207 RetransmitDataPacket(8, type, ENCRYPTION_FORWARD_SECURE);
3208 })));
3209 manager_.MaybeSendProbePackets();
3210 // Verify exponential backoff starts.
3211 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3212 manager_.GetRetransmissionTime());
3213
3214 // Invoke 4th PTO.
3215 clock_.AdvanceTime(expected_pto_delay * 2);
3216 manager_.OnRetransmissionTimeout();
3217 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3218 EXPECT_EQ(4u, stats_.pto_count);
3219
3220 // Verify two probe packets get sent.
3221 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3222 .Times(2)
3223 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3224 RetransmitDataPacket(9, type, ENCRYPTION_FORWARD_SECURE);
3225 })))
3226 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3227 RetransmitDataPacket(10, type, ENCRYPTION_FORWARD_SECURE);
3228 })));
3229 manager_.MaybeSendProbePackets();
3230 // Verify exponential backoff continues.
3231 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3232 manager_.GetRetransmissionTime());
3233}
3234
fayang75db4342019-11-04 13:29:14 -08003235TEST_F(QuicSentPacketManagerTest, PtoTimeoutRttVarMultiple) {
3236 EnablePto(k1PTO);
3237 // Use 2 * rttvar
3238 QuicConfig config;
3239 QuicTagVector options;
3240 options.push_back(kPVS1);
3241 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3242 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3243 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3244 manager_.SetFromConfig(config);
3245
3246 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3247 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3248 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3249 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3250 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3251 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3252 QuicTime::Delta::Zero(), QuicTime::Zero());
3253 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3254
3255 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3256 // Verify PTO is correctly set based on 2 times rtt var.
3257 QuicTime::Delta expected_pto_delay =
3258 srtt + 2 * rtt_stats->mean_deviation() +
3259 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3260 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3261 manager_.GetRetransmissionTime());
3262}
3263
fayang93c83942019-11-07 10:41:16 -08003264// Regression test for b/143962153
3265TEST_F(QuicSentPacketManagerTest, RtoNotInFlightPacket) {
fayang5d011982020-05-13 14:14:38 -07003266 if (GetQuicReloadableFlag(quic_default_on_pto)) {
3267 return;
3268 }
fayang93c83942019-11-07 10:41:16 -08003269 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
3270 // Send SHLO.
vasilvvc872ee42020-10-07 19:50:22 -07003271 QuicStreamFrame crypto_frame(1, false, 0, absl::string_view());
fayang93c83942019-11-07 10:41:16 -08003272 SendCryptoPacket(1);
3273 // Send data packet.
3274 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3275
3276 // Successfully decrypt a forward secure packet.
fayange1e81d22020-01-06 11:41:34 -08003277 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _)).Times(1);
fayang93c83942019-11-07 10:41:16 -08003278 manager_.SetHandshakeConfirmed();
3279
3280 // 1st TLP.
3281 manager_.OnRetransmissionTimeout();
3282 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3283 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3284 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3285 })));
3286 manager_.MaybeRetransmitTailLossProbe();
3287
3288 // 2nd TLP.
3289 manager_.OnRetransmissionTimeout();
3290 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3291 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3292 RetransmitDataPacket(4, type, ENCRYPTION_FORWARD_SECURE);
3293 })));
3294 manager_.MaybeRetransmitTailLossProbe();
3295
3296 // RTO retransmits SHLO although it is not in flight.
fayang93c83942019-11-07 10:41:16 -08003297 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
fayangac35d452019-11-08 12:35:15 -08003298 .WillOnce(WithArgs<0>(Invoke([&crypto_frame](const QuicFrames& frames) {
3299 EXPECT_EQ(1u, frames.size());
fayange1e81d22020-01-06 11:41:34 -08003300 EXPECT_NE(crypto_frame, frames[0].stream_frame);
fayangac35d452019-11-08 12:35:15 -08003301 })));
fayang93c83942019-11-07 10:41:16 -08003302 manager_.OnRetransmissionTimeout();
3303}
3304
fayang4aa22402020-01-07 11:36:07 -08003305TEST_F(QuicSentPacketManagerTest, Aggressive1Pto) {
3306 EnablePto(k1PTO);
3307 // Let the first PTO be aggressive.
3308 QuicConfig config;
3309 QuicTagVector options;
3310 options.push_back(kPTOS);
3311 options.push_back(kPAG1);
3312 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3313 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3314 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3315 manager_.SetFromConfig(config);
3316
3317 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3318 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3319 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3320 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3321 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3322 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3323 QuicTime::Delta::Zero(), QuicTime::Zero());
3324 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3325 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3326 // Verify PTO is correctly set.
3327 QuicTime::Delta expected_pto_delay = 2 * srtt;
3328 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3329 manager_.GetRetransmissionTime());
3330
3331 // Invoke PTO.
3332 clock_.AdvanceTime(expected_pto_delay);
3333 manager_.OnRetransmissionTimeout();
3334 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3335 EXPECT_EQ(1u, stats_.pto_count);
3336
3337 // Verify 1 probe packets get sent and packet number gets skipped.
3338 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3339 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3340 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3341 })));
3342 manager_.MaybeSendProbePackets();
3343
3344 // Verify PTO period gets set correctly.
3345 QuicTime sent_time = clock_.Now();
3346 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003347 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang4aa22402020-01-07 11:36:07 -08003348 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3349 EXPECT_EQ(sent_time + expected_pto_delay * 2,
3350 manager_.GetRetransmissionTime());
3351}
3352
3353TEST_F(QuicSentPacketManagerTest, Aggressive2Ptos) {
3354 EnablePto(k1PTO);
3355 // Let the first PTO be aggressive.
3356 QuicConfig config;
3357 QuicTagVector options;
3358 options.push_back(kPTOS);
3359 options.push_back(kPAG2);
3360 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3361 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3362 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3363 manager_.SetFromConfig(config);
3364
3365 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3366 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3367 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3368 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3369 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3370 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3371 QuicTime::Delta::Zero(), QuicTime::Zero());
3372 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3373 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3374 // Verify PTO is correctly set.
3375 QuicTime::Delta expected_pto_delay = 2 * srtt;
3376 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3377 manager_.GetRetransmissionTime());
3378
3379 // Invoke PTO.
3380 clock_.AdvanceTime(expected_pto_delay);
3381 manager_.OnRetransmissionTimeout();
3382 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3383 EXPECT_EQ(1u, stats_.pto_count);
3384
3385 // Verify 1 probe packets get sent and packet number gets skipped.
3386 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3387 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3388 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3389 })));
3390 manager_.MaybeSendProbePackets();
3391
3392 // Verify PTO period gets set correctly.
3393 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3394 manager_.GetRetransmissionTime());
3395
3396 // Invoke 2nd PTO.
3397 clock_.AdvanceTime(expected_pto_delay);
3398 manager_.OnRetransmissionTimeout();
3399 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3400 EXPECT_EQ(2u, stats_.pto_count);
3401
3402 // Verify 1 probe packets get sent and packet number gets skipped.
3403 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3404 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3405 RetransmitDataPacket(5, type, ENCRYPTION_FORWARD_SECURE);
3406 })));
3407 manager_.MaybeSendProbePackets();
3408 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003409 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang4aa22402020-01-07 11:36:07 -08003410 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3411
3412 // Verify PTO period gets set correctly.
3413 EXPECT_EQ(clock_.Now() + expected_pto_delay * 4,
3414 manager_.GetRetransmissionTime());
3415}
3416
fayang402103c2020-01-10 13:36:24 -08003417TEST_F(QuicSentPacketManagerTest, IW10ForUpAndDown) {
fayang402103c2020-01-10 13:36:24 -08003418 QuicConfig config;
3419 QuicTagVector options;
3420 options.push_back(kBWS5);
3421 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3422 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3423 EXPECT_CALL(*send_algorithm_, SetInitialCongestionWindowInPackets(10));
3424 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3425 manager_.SetFromConfig(config);
3426
3427 EXPECT_EQ(10u, manager_.initial_congestion_window());
3428}
3429
fayang18ff23b2020-01-28 09:19:00 -08003430TEST_F(QuicSentPacketManagerTest, ClientMultiplePacketNumberSpacePtoTimeout) {
3431 manager_.EnableMultiplePacketNumberSpacesSupport();
3432 EnablePto(k1PTO);
3433 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3434 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3435 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3436 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3437 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3438 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3439 QuicTime::Delta::Zero(), QuicTime::Zero());
3440 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
fayang9a0e1bd2020-02-19 13:13:04 -08003441 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayang18ff23b2020-01-28 09:19:00 -08003442
3443 // Send packet 1.
3444 SendDataPacket(1, ENCRYPTION_INITIAL);
3445 // Verify PTO is correctly set.
3446 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003447 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07003448 QuicTime::Delta::Zero();
fayang18ff23b2020-01-28 09:19:00 -08003449 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3450 manager_.GetRetransmissionTime());
3451
3452 // Discard initial key and send packet 2 in handshake.
3453 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3454 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3455 manager_.NeuterUnencryptedPackets();
3456
3457 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(true));
3458 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3459 // Verify PTO is correctly set based on sent time of packet 2.
3460 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3461 manager_.GetRetransmissionTime());
3462 // Invoke PTO.
3463 clock_.AdvanceTime(expected_pto_delay);
3464 manager_.OnRetransmissionTimeout();
3465 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3466 EXPECT_EQ(1u, stats_.pto_count);
fayangaf9903b2020-05-14 14:34:28 -07003467 EXPECT_EQ(1u, stats_.crypto_retransmit_count);
fayang18ff23b2020-01-28 09:19:00 -08003468
3469 // Verify probe packet gets sent.
3470 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3471 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3472 RetransmitDataPacket(3, type, ENCRYPTION_HANDSHAKE);
3473 })));
3474 manager_.MaybeSendProbePackets();
3475 // Verify PTO period gets set to twice the current value.
3476 const QuicTime packet3_sent_time = clock_.Now();
3477 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3478 manager_.GetRetransmissionTime());
3479
fayang9a0e1bd2020-02-19 13:13:04 -08003480 // Send packet 4 in application data with 0-RTT.
fayang18ff23b2020-01-28 09:19:00 -08003481 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
fayang9a0e1bd2020-02-19 13:13:04 -08003482 SendDataPacket(4, ENCRYPTION_ZERO_RTT);
fayang42834942020-03-30 10:56:15 -07003483 const QuicTime packet4_sent_time = clock_.Now();
fayang18ff23b2020-01-28 09:19:00 -08003484 // Verify PTO timeout is still based on packet 3.
3485 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3486 manager_.GetRetransmissionTime());
3487
3488 // Send packet 5 in handshake.
3489 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3490 SendDataPacket(5, ENCRYPTION_HANDSHAKE);
fayang9a0e1bd2020-02-19 13:13:04 -08003491 const QuicTime packet5_sent_time = clock_.Now();
3492 // Verify PTO timeout is now based on packet 5 because packet 4 should be
3493 // ignored.
fayang18ff23b2020-01-28 09:19:00 -08003494 EXPECT_EQ(clock_.Now() + expected_pto_delay * 2,
3495 manager_.GetRetransmissionTime());
3496
fayang9a0e1bd2020-02-19 13:13:04 -08003497 // Send packet 6 in 1-RTT.
3498 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3499 SendDataPacket(6, ENCRYPTION_FORWARD_SECURE);
fayang9a0e1bd2020-02-19 13:13:04 -08003500 // Verify PTO timeout is now based on packet 5.
3501 EXPECT_EQ(packet5_sent_time + expected_pto_delay * 2,
3502 manager_.GetRetransmissionTime());
3503
3504 // Send packet 7 in handshake.
3505 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
fayang37b3c5c2020-09-16 15:20:41 -07003506 const QuicTime packet7_sent_time = clock_.Now();
fayang9a0e1bd2020-02-19 13:13:04 -08003507 SendDataPacket(7, ENCRYPTION_HANDSHAKE);
fayang37b3c5c2020-09-16 15:20:41 -07003508
fayang06d4c1f2020-12-03 08:15:27 -08003509 expected_pto_delay =
3510 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation();
3511 // Verify PTO timeout is now based on packet 7.
3512 EXPECT_EQ(packet7_sent_time + expected_pto_delay * 2,
3513 manager_.GetRetransmissionTime());
fayang9a0e1bd2020-02-19 13:13:04 -08003514
fayang18ff23b2020-01-28 09:19:00 -08003515 // Neuter handshake key.
3516 manager_.SetHandshakeConfirmed();
fayang42834942020-03-30 10:56:15 -07003517 // Forward progress has been made, verify PTO counter gets reset. PTO timeout
3518 // is armed by left edge.
fayang37b3c5c2020-09-16 15:20:41 -07003519 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003520 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang37b3c5c2020-09-16 15:20:41 -07003521 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang42834942020-03-30 10:56:15 -07003522 EXPECT_EQ(packet4_sent_time + expected_pto_delay,
fayang18ff23b2020-01-28 09:19:00 -08003523 manager_.GetRetransmissionTime());
3524}
3525
3526TEST_F(QuicSentPacketManagerTest, ServerMultiplePacketNumberSpacePtoTimeout) {
3527 manager_.EnableMultiplePacketNumberSpacesSupport();
3528 EnablePto(k1PTO);
3529 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3530 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3531 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3532 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3533 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3534 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3535 QuicTime::Delta::Zero(), QuicTime::Zero());
3536 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3537
3538 // Send packet 1.
3539 SendDataPacket(1, ENCRYPTION_INITIAL);
3540 const QuicTime packet1_sent_time = clock_.Now();
3541 // Verify PTO is correctly set.
3542 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003543 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07003544 QuicTime::Delta::Zero();
fayang18ff23b2020-01-28 09:19:00 -08003545 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3546 manager_.GetRetransmissionTime());
3547
3548 // Send packet 2 in handshake.
3549 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3550 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
fayang9a0e1bd2020-02-19 13:13:04 -08003551 const QuicTime packet2_sent_time = clock_.Now();
fayang18ff23b2020-01-28 09:19:00 -08003552 // Verify PTO timeout is still based on packet 1.
3553 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3554 manager_.GetRetransmissionTime());
3555
fayang9a0e1bd2020-02-19 13:13:04 -08003556 // Discard initial keys.
fayang18ff23b2020-01-28 09:19:00 -08003557 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3558 manager_.NeuterUnencryptedPackets();
fayang18ff23b2020-01-28 09:19:00 -08003559
fayang9a0e1bd2020-02-19 13:13:04 -08003560 // Send packet 3 in 1-RTT.
fayang18ff23b2020-01-28 09:19:00 -08003561 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3562 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
fayang9a0e1bd2020-02-19 13:13:04 -08003563 // Verify PTO timeout is based on packet 2.
3564 const QuicTime packet3_sent_time = clock_.Now();
3565 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3566 manager_.GetRetransmissionTime());
3567
3568 // Send packet 4 in handshake.
3569 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3570 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3571 // Verify PTO timeout is based on packet 4 as application data is ignored.
fayang18ff23b2020-01-28 09:19:00 -08003572 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3573 manager_.GetRetransmissionTime());
fayang9a0e1bd2020-02-19 13:13:04 -08003574
3575 // Discard handshake keys.
3576 manager_.SetHandshakeConfirmed();
fayange1d2a272020-06-26 10:18:41 -07003577 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003578 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayange1d2a272020-06-26 10:18:41 -07003579 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang9a0e1bd2020-02-19 13:13:04 -08003580 // Verify PTO timeout is now based on packet 3 as handshake is
3581 // complete/confirmed.
3582 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3583 manager_.GetRetransmissionTime());
fayang18ff23b2020-01-28 09:19:00 -08003584}
3585
fayang2ccfbcf2020-02-28 12:37:08 -08003586TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge) {
fayang2ccfbcf2020-02-28 12:37:08 -08003587 EnablePto(k1PTO);
3588 // Use PTOS and PLE1.
3589 QuicConfig config;
3590 QuicTagVector options;
3591 options.push_back(kPTOS);
3592 options.push_back(kPLE1);
3593 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3594 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3595 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3596 manager_.SetFromConfig(config);
3597 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3598 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3599 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3600 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3601 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3602 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3603 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3604 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3605 QuicTime::Delta::Zero(), QuicTime::Zero());
3606 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3607
3608 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3609 // Verify PTO is correctly set.
3610 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003611 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang2ccfbcf2020-02-28 12:37:08 -08003612 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3613 const QuicTime packet1_sent_time = clock_.Now();
3614 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3615 manager_.GetRetransmissionTime());
3616
3617 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3618 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3619 // Verify PTO is still based on packet 1.
3620 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3621 manager_.GetRetransmissionTime());
3622 EXPECT_EQ(0u, stats_.pto_count);
3623
3624 // Invoke PTO.
3625 clock_.AdvanceTime(expected_pto_delay);
3626 manager_.OnRetransmissionTimeout();
3627 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3628 EXPECT_EQ(1u, stats_.pto_count);
3629
3630 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3631 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3632 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3633 })));
3634 manager_.MaybeSendProbePackets();
3635 // Verify PTO period gets set to twice the current value and based on packet3.
3636 QuicTime packet3_sent_time = clock_.Now();
3637 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3638 manager_.GetRetransmissionTime());
3639
3640 // Received ACK for packets 1 and 2.
3641 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -07003642 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayang2ccfbcf2020-02-28 12:37:08 -08003643 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3644 clock_.Now());
3645 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3646 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3647 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3648 ENCRYPTION_FORWARD_SECURE));
3649 expected_pto_delay =
3650 rtt_stats->SmoothedOrInitialRtt() +
fayang1760b082020-09-22 11:08:27 -07003651 std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(),
fayang2ccfbcf2020-02-28 12:37:08 -08003652 QuicTime::Delta::FromMilliseconds(1)) +
3653 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3654
3655 // Verify PTO is correctly re-armed based on sent time of packet 4.
3656 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3657 manager_.GetRetransmissionTime());
3658}
3659
fayangc5d9b2c2020-03-02 11:12:26 -08003660TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutByLeftEdge2) {
fayangc5d9b2c2020-03-02 11:12:26 -08003661 EnablePto(k1PTO);
3662 // Use PTOS and PLE2.
3663 QuicConfig config;
3664 QuicTagVector options;
3665 options.push_back(kPTOS);
3666 options.push_back(kPLE2);
3667 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3668 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3669 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3670 manager_.SetFromConfig(config);
3671 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3672 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3673 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3674 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3675 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3676 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3677 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3678 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3679 QuicTime::Delta::Zero(), QuicTime::Zero());
3680 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3681
3682 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3683 // Verify PTO is correctly set.
3684 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003685 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayangc5d9b2c2020-03-02 11:12:26 -08003686 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3687 const QuicTime packet1_sent_time = clock_.Now();
3688 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3689 manager_.GetRetransmissionTime());
3690
3691 // Sent a packet 10ms before PTO expiring.
3692 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(
3693 expected_pto_delay.ToMilliseconds() - 10));
3694 SendDataPacket(2, ENCRYPTION_FORWARD_SECURE);
3695 // Verify PTO expands to packet 2 sent time + 1.5 * srtt.
3696 expected_pto_delay = 1.5 * rtt_stats->smoothed_rtt();
3697 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3698 manager_.GetRetransmissionTime());
3699 EXPECT_EQ(0u, stats_.pto_count);
3700
3701 // Invoke PTO.
3702 clock_.AdvanceTime(expected_pto_delay);
3703 manager_.OnRetransmissionTimeout();
3704 EXPECT_EQ(QuicTime::Delta::Zero(), manager_.TimeUntilSend(clock_.Now()));
3705 EXPECT_EQ(1u, stats_.pto_count);
3706
3707 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
3708 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
3709 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
3710 })));
3711 manager_.MaybeSendProbePackets();
3712 // Verify PTO period gets set to twice the expected value and based on
3713 // packet3 (right edge).
3714 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003715 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayangc5d9b2c2020-03-02 11:12:26 -08003716 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3717 QuicTime packet3_sent_time = clock_.Now();
3718 EXPECT_EQ(packet3_sent_time + expected_pto_delay * 2,
3719 manager_.GetRetransmissionTime());
3720
3721 // Received ACK for packets 1 and 2.
3722 uint64_t acked[] = {1, 2};
vasilvvbed67c62020-10-20 06:38:43 -07003723 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayangc5d9b2c2020-03-02 11:12:26 -08003724 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
3725 clock_.Now());
3726 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
3727 EXPECT_EQ(PACKETS_NEWLY_ACKED,
3728 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
3729 ENCRYPTION_FORWARD_SECURE));
3730 expected_pto_delay =
3731 rtt_stats->SmoothedOrInitialRtt() +
fayang1760b082020-09-22 11:08:27 -07003732 std::max(GetPtoRttvarMultiplier() * rtt_stats->mean_deviation(),
fayangc5d9b2c2020-03-02 11:12:26 -08003733 QuicTime::Delta::FromMilliseconds(1)) +
3734 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3735
3736 // Verify PTO is correctly re-armed based on sent time of packet 3 (left
3737 // edge).
3738 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3739 manager_.GetRetransmissionTime());
3740}
3741
fayangc2fd6102020-03-02 17:27:38 -08003742TEST_F(QuicSentPacketManagerTest, ComputingProbeTimeoutUsingStandardDeviation) {
fayangc2fd6102020-03-02 17:27:38 -08003743 EnablePto(k1PTO);
3744 // Use PTOS and PSDA.
3745 QuicConfig config;
3746 QuicTagVector options;
3747 options.push_back(kPTOS);
3748 options.push_back(kPSDA);
3749 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3750 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3751 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3752 manager_.SetFromConfig(config);
3753 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3754 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3755 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3756 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3757 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3758 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3759 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3760 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3761 QuicTime::Delta::Zero(), QuicTime::Zero());
3762 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
3763 QuicTime::Delta::Zero(), QuicTime::Zero());
3764 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
3765 QuicTime::Delta::Zero(), QuicTime::Zero());
3766 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(75),
3767 QuicTime::Delta::Zero(), QuicTime::Zero());
3768 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3769
3770 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
3771 // Verify PTO is correctly set using standard deviation.
3772 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003773 srtt +
3774 GetPtoRttvarMultiplier() * rtt_stats->GetStandardOrMeanDeviation() +
fayangc2fd6102020-03-02 17:27:38 -08003775 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
3776 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3777 manager_.GetRetransmissionTime());
3778}
3779
fayang2ccfbcf2020-02-28 12:37:08 -08003780TEST_F(QuicSentPacketManagerTest,
3781 ComputingProbeTimeoutByLeftEdgeMultiplePacketNumberSpaces) {
fayang2ccfbcf2020-02-28 12:37:08 -08003782 manager_.EnableMultiplePacketNumberSpacesSupport();
3783 EnablePto(k1PTO);
3784 // Use PTOS and PLE1.
3785 QuicConfig config;
3786 QuicTagVector options;
3787 options.push_back(kPTOS);
3788 options.push_back(kPLE1);
3789 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3790 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3791 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3792 manager_.SetFromConfig(config);
3793 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3794 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3795 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3796 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3797 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3798 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3799 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3800 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3801 QuicTime::Delta::Zero(), QuicTime::Zero());
3802 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3803
3804 // Send packet 1.
3805 SendDataPacket(1, ENCRYPTION_INITIAL);
3806 const QuicTime packet1_sent_time = clock_.Now();
3807 // Verify PTO is correctly set.
3808 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003809 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07003810 QuicTime::Delta::Zero();
fayang2ccfbcf2020-02-28 12:37:08 -08003811 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3812 manager_.GetRetransmissionTime());
3813
3814 // Send packet 2 in handshake.
3815 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3816 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3817 const QuicTime packet2_sent_time = clock_.Now();
3818 // Verify PTO timeout is still based on packet 1.
3819 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3820 manager_.GetRetransmissionTime());
3821
3822 // Discard initial keys.
3823 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3824 manager_.NeuterUnencryptedPackets();
3825
3826 // Send packet 3 in 1-RTT.
3827 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3828 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
3829 // Verify PTO timeout is based on packet 2.
3830 const QuicTime packet3_sent_time = clock_.Now();
3831 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3832 manager_.GetRetransmissionTime());
3833
3834 // Send packet 4 in handshake.
3835 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3836 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3837 // Verify PTO timeout is based on packet 4 as application data is ignored.
3838 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3839 manager_.GetRetransmissionTime());
3840
3841 // Discard handshake keys.
3842 manager_.SetHandshakeConfirmed();
3843 // Verify PTO timeout is now based on packet 3 as handshake is
3844 // complete/confirmed.
fayange1d2a272020-06-26 10:18:41 -07003845 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003846 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayange1d2a272020-06-26 10:18:41 -07003847 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayang2ccfbcf2020-02-28 12:37:08 -08003848 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3849 manager_.GetRetransmissionTime());
3850
3851 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3852 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
3853 // Verify PTO timeout is still based on packet 3.
3854 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3855 manager_.GetRetransmissionTime());
3856}
3857
fayangc5d9b2c2020-03-02 11:12:26 -08003858TEST_F(QuicSentPacketManagerTest,
3859 ComputingProbeTimeoutByLeftEdge2MultiplePacketNumberSpaces) {
fayangc5d9b2c2020-03-02 11:12:26 -08003860 manager_.EnableMultiplePacketNumberSpacesSupport();
3861 EnablePto(k1PTO);
3862 // Use PTOS and PLE2.
3863 QuicConfig config;
3864 QuicTagVector options;
3865 options.push_back(kPTOS);
3866 options.push_back(kPLE2);
3867 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3868 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3869 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3870 manager_.SetFromConfig(config);
3871 EXPECT_TRUE(manager_.skip_packet_number_for_pto());
3872 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
3873 EXPECT_CALL(*send_algorithm_, PacingRate(_))
3874 .WillRepeatedly(Return(QuicBandwidth::Zero()));
3875 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
3876 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
3877 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
3878 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
3879 QuicTime::Delta::Zero(), QuicTime::Zero());
3880 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
3881
3882 // Send packet 1.
3883 SendDataPacket(1, ENCRYPTION_INITIAL);
3884 const QuicTime packet1_sent_time = clock_.Now();
3885 // Verify PTO is correctly set.
3886 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003887 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07003888 QuicTime::Delta::Zero();
fayangc5d9b2c2020-03-02 11:12:26 -08003889 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3890 manager_.GetRetransmissionTime());
3891
3892 // Send packet 2 in handshake.
3893 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3894 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3895 const QuicTime packet2_sent_time = clock_.Now();
3896 // Verify PTO timeout is still based on packet 1.
3897 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
3898 manager_.GetRetransmissionTime());
3899
3900 // Discard initial keys.
3901 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
3902 manager_.NeuterUnencryptedPackets();
3903
3904 // Send packet 3 in 1-RTT.
3905 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3906 SendDataPacket(3, ENCRYPTION_FORWARD_SECURE);
3907 // Verify PTO timeout is based on packet 2.
3908 const QuicTime packet3_sent_time = clock_.Now();
3909 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
3910 manager_.GetRetransmissionTime());
3911
3912 // Send packet 4 in handshake.
3913 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
3914 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
3915 // Verify PTO timeout is based on packet 4 as application data is ignored.
3916 EXPECT_EQ(clock_.Now() + expected_pto_delay,
3917 manager_.GetRetransmissionTime());
3918
3919 // Discard handshake keys.
3920 manager_.SetHandshakeConfirmed();
3921 // Verify PTO timeout is now based on packet 3 as handshake is
3922 // complete/confirmed.
fayange1d2a272020-06-26 10:18:41 -07003923 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07003924 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayange1d2a272020-06-26 10:18:41 -07003925 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
fayangc5d9b2c2020-03-02 11:12:26 -08003926 EXPECT_EQ(packet3_sent_time + expected_pto_delay,
3927 manager_.GetRetransmissionTime());
3928
3929 // Send packet 5 10ms before PTO expiring.
3930 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(
3931 expected_pto_delay.ToMilliseconds() - 10));
3932 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
3933 // Verify PTO timeout expands to packet 5 sent time + 1.5 * srtt.
3934 EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->smoothed_rtt(),
3935 manager_.GetRetransmissionTime());
3936}
3937
wubf4ab9652020-02-20 14:45:43 -08003938TEST_F(QuicSentPacketManagerTest, SetHandshakeConfirmed) {
3939 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
3940 manager_.EnableMultiplePacketNumberSpacesSupport();
3941
3942 SendDataPacket(1, ENCRYPTION_INITIAL);
3943
3944 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
3945
3946 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
3947 .WillOnce(
3948 Invoke([](const QuicFrame& /*frame*/, QuicTime::Delta ack_delay_time,
3949 QuicTime receive_timestamp) {
3950 EXPECT_TRUE(ack_delay_time.IsZero());
3951 EXPECT_EQ(receive_timestamp, QuicTime::Zero());
3952 return true;
3953 }));
3954
wub64863212020-05-28 10:33:59 -07003955 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(QuicPacketNumber(2))).Times(1);
wubf4ab9652020-02-20 14:45:43 -08003956 manager_.SetHandshakeConfirmed();
3957}
3958
fayangd5c2ffb2020-02-04 11:49:05 -08003959// Regresstion test for b/148841700.
3960TEST_F(QuicSentPacketManagerTest, NeuterUnencryptedPackets) {
3961 SendCryptoPacket(1);
3962 SendPingPacket(2, ENCRYPTION_INITIAL);
3963 // Crypto data has been discarded but ping does not.
fayang1f8619f2020-03-16 08:39:58 -07003964 EXPECT_CALL(notifier_, OnFrameAcked(_, _, _))
3965 .Times(2)
3966 .WillOnce(Return(false))
3967 .WillOnce(Return(true));
fayangd5c2ffb2020-02-04 11:49:05 -08003968 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
wub64863212020-05-28 10:33:59 -07003969
3970 EXPECT_CALL(*send_algorithm_, OnPacketNeutered(QuicPacketNumber(1))).Times(1);
fayangd5c2ffb2020-02-04 11:49:05 -08003971 manager_.NeuterUnencryptedPackets();
3972}
3973
renjietang74ae0912021-01-12 16:43:14 -08003974TEST_F(QuicSentPacketManagerTest, MarkInitialPacketsForRetransmission) {
renjietang74ae0912021-01-12 16:43:14 -08003975 SendCryptoPacket(1);
3976 SendPingPacket(2, ENCRYPTION_HANDSHAKE);
3977 // Only the INITIAL packet will be retransmitted.
3978 EXPECT_CALL(notifier_, OnFrameLost(_)).Times(1);
3979 manager_.MarkInitialPacketsForRetransmission();
3980}
3981
fayang84427fc2020-03-09 12:43:26 -07003982TEST_F(QuicSentPacketManagerTest, NoPacketThresholdDetectionForRuntPackets) {
3983 EXPECT_TRUE(
3984 QuicSentPacketManagerPeer::UsePacketThresholdForRuntPackets(&manager_));
3985
fayang84427fc2020-03-09 12:43:26 -07003986 QuicConfig config;
3987 QuicTagVector options;
3988 options.push_back(kRUNT);
3989 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
3990 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
3991 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
3992 manager_.SetFromConfig(config);
3993
3994 EXPECT_FALSE(
3995 QuicSentPacketManagerPeer::UsePacketThresholdForRuntPackets(&manager_));
3996}
3997
fayang1640cc22020-03-21 14:11:02 -07003998TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelay) {
3999 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
4000 // Before RTT sample is available.
4001 // 2 TLPs + 2 RTOs.
4002 QuicTime::Delta expected_delay = QuicTime::Delta::Zero();
4003 for (size_t i = 0; i < 2; ++i) {
4004 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i);
4005 expected_delay =
4006 expected_delay +
4007 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_);
4008 }
4009 for (size_t i = 0; i < 2; ++i) {
4010 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i);
4011 expected_delay =
4012 expected_delay +
4013 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_);
4014 }
4015 EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay());
4016
4017 expected_delay = QuicTime::Delta::Zero();
4018 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 0);
4019 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 0);
4020
4021 // After RTT sample is available.
4022 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4023 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
4024 QuicTime::Delta::Zero(), QuicTime::Zero());
4025 // 2 TLPs + 2 RTOs.
4026 for (size_t i = 0; i < 2; ++i) {
4027 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, i);
4028 expected_delay =
4029 expected_delay +
4030 QuicSentPacketManagerPeer::GetTailLossProbeDelay(&manager_);
4031 }
4032 for (size_t i = 0; i < 2; ++i) {
4033 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, i);
4034 expected_delay =
4035 expected_delay +
4036 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_);
4037 }
4038 EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay());
4039}
4040
renjietang89b32a62020-11-19 12:32:41 -08004041TEST_F(QuicSentPacketManagerTest, GetPathDegradingDelayUsingPTO) {
4042 QuicConfig client_config;
4043 QuicTagVector options;
4044 options.push_back(k1PTO);
4045 QuicTagVector client_options;
4046 client_options.push_back(kPDP2);
4047 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
4048 client_config.SetConnectionOptionsToSend(options);
4049 client_config.SetClientConnectionOptions(client_options);
4050 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4051 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4052 manager_.SetFromConfig(client_config);
4053 EXPECT_TRUE(manager_.pto_enabled());
4054 QuicTime::Delta expected_delay = 2 * manager_.GetPtoDelay();
4055 EXPECT_EQ(expected_delay, manager_.GetPathDegradingDelay());
4056}
4057
fayange0b2bb02020-11-23 11:29:48 -08004058TEST_F(QuicSentPacketManagerTest, ClientsIgnorePings) {
4059 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
4060 QuicConfig client_config;
4061 QuicTagVector options;
4062 QuicTagVector client_options;
4063 client_options.push_back(kIGNP);
4064 client_config.SetConnectionOptionsToSend(options);
4065 client_config.SetClientConnectionOptions(client_options);
4066 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4067 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4068 manager_.SetFromConfig(client_config);
4069
4070 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4071 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4072 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4073 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4074 EXPECT_CALL(*send_algorithm_, CanSend(_)).WillRepeatedly(Return(true));
4075
4076 SendPingPacket(1, ENCRYPTION_INITIAL);
4077 // Verify PING only packet is not considered in flight.
4078 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
4079 SendDataPacket(2, ENCRYPTION_INITIAL);
4080 EXPECT_NE(QuicTime::Zero(), manager_.GetRetransmissionTime());
4081
4082 uint64_t acked[] = {1};
4083 ExpectAcksAndLosses(/*rtt_updated=*/false, acked, ABSL_ARRAYSIZE(acked),
4084 nullptr, 0);
4085 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4086 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4087 clock_.Now());
4088 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4089 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4090 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4091 ENCRYPTION_INITIAL));
4092 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4093 // Verify no RTT samples for PING only packet.
4094 EXPECT_TRUE(rtt_stats->smoothed_rtt().IsZero());
4095
4096 ExpectAck(2);
4097 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4098 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
4099 clock_.Now());
4100 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
4101 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4102 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
4103 ENCRYPTION_INITIAL));
4104 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100), rtt_stats->smoothed_rtt());
4105}
4106
fayang6c7313c2020-04-23 12:10:35 -07004107// Regression test for b/154050235.
4108TEST_F(QuicSentPacketManagerTest, ExponentialBackoffWithNoRttMeasurement) {
4109 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
fayangaf9903b2020-05-14 14:34:28 -07004110 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang6c7313c2020-04-23 12:10:35 -07004111 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4112 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kInitialRttMs),
4113 rtt_stats->initial_rtt());
4114 EXPECT_TRUE(rtt_stats->smoothed_rtt().IsZero());
4115
4116 SendCryptoPacket(1);
4117 QuicTime::Delta expected_pto_delay =
4118 QuicTime::Delta::FromMilliseconds(3 * kInitialRttMs);
4119 EXPECT_EQ(clock_.Now() + expected_pto_delay,
4120 manager_.GetRetransmissionTime());
4121
4122 // Invoke PTO.
4123 clock_.AdvanceTime(expected_pto_delay);
4124 manager_.OnRetransmissionTimeout();
4125
4126 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4127 .WillOnce(WithArgs<1>(Invoke([this]() { RetransmitCryptoPacket(3); })));
4128 manager_.MaybeSendProbePackets();
fayang5d011982020-05-13 14:14:38 -07004129 if (GetQuicReloadableFlag(quic_default_on_pto)) {
4130 manager_.AdjustPendingTimerTransmissions();
4131 }
fayang6c7313c2020-04-23 12:10:35 -07004132 // Verify exponential backoff of the PTO timeout.
4133 EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay,
4134 manager_.GetRetransmissionTime());
4135}
4136
4137TEST_F(QuicSentPacketManagerTest, PtoDelayWithTinyInitialRtt) {
fayangaf9903b2020-05-14 14:34:28 -07004138 manager_.EnableMultiplePacketNumberSpacesSupport();
fayang6c7313c2020-04-23 12:10:35 -07004139 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4140 // Assume client provided a tiny initial RTT.
4141 rtt_stats->set_initial_rtt(QuicTime::Delta::FromMicroseconds(1));
4142 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1), rtt_stats->initial_rtt());
4143 EXPECT_TRUE(rtt_stats->smoothed_rtt().IsZero());
4144
4145 SendCryptoPacket(1);
4146 QuicTime::Delta expected_pto_delay = QuicTime::Delta::FromMilliseconds(10);
4147 // Verify kMinHandshakeTimeoutMs is respected.
4148 EXPECT_EQ(clock_.Now() + expected_pto_delay,
4149 manager_.GetRetransmissionTime());
4150
4151 // Invoke PTO.
4152 clock_.AdvanceTime(expected_pto_delay);
4153 manager_.OnRetransmissionTimeout();
4154
4155 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4156 .WillOnce(WithArgs<1>(Invoke([this]() { RetransmitCryptoPacket(3); })));
4157 manager_.MaybeSendProbePackets();
fayang5d011982020-05-13 14:14:38 -07004158 if (GetQuicReloadableFlag(quic_default_on_pto)) {
4159 manager_.AdjustPendingTimerTransmissions();
4160 }
fayang6c7313c2020-04-23 12:10:35 -07004161 // Verify exponential backoff of the PTO timeout.
4162 EXPECT_EQ(clock_.Now() + 2 * expected_pto_delay,
4163 manager_.GetRetransmissionTime());
4164}
4165
fayangaecfd532020-04-28 12:35:12 -07004166TEST_F(QuicSentPacketManagerTest, HandshakeAckCausesInitialKeyDropping) {
4167 manager_.EnableMultiplePacketNumberSpacesSupport();
4168 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
4169 // Send INITIAL packet 1.
4170 SendDataPacket(1, ENCRYPTION_INITIAL);
4171 QuicTime::Delta expected_pto_delay =
4172 QuicTime::Delta::FromMilliseconds(3 * kInitialRttMs);
4173 EXPECT_EQ(clock_.Now() + expected_pto_delay,
4174 manager_.GetRetransmissionTime());
4175 // Send HANDSHAKE ack.
4176 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4177 SendAckPacket(2, /*largest_acked=*/1, ENCRYPTION_HANDSHAKE);
4178 // Sending HANDSHAKE packet causes dropping of INITIAL key.
4179 EXPECT_CALL(notifier_, HasUnackedCryptoData()).WillRepeatedly(Return(false));
4180 EXPECT_CALL(notifier_, IsFrameOutstanding(_)).WillRepeatedly(Return(false));
4181 manager_.NeuterUnencryptedPackets();
4182 // There is no in flight packets.
4183 EXPECT_FALSE(manager_.HasInFlightPackets());
4184 // Verify PTO timer gets rearmed from now because of anti-amplification.
4185 EXPECT_EQ(clock_.Now() + expected_pto_delay,
4186 manager_.GetRetransmissionTime());
4187
4188 // Invoke PTO.
4189 clock_.AdvanceTime(expected_pto_delay);
4190 manager_.OnRetransmissionTimeout();
4191 // Verify nothing to probe (and connection will send PING for current
4192 // encryption level).
4193 EXPECT_CALL(notifier_, RetransmitFrames(_, _)).Times(0);
4194 manager_.MaybeSendProbePackets();
4195}
4196
fayang40334262020-05-19 15:18:28 -07004197// Regression test for b/156487311
4198TEST_F(QuicSentPacketManagerTest, ClearLastInflightPacketsSentTime) {
4199 manager_.EnableMultiplePacketNumberSpacesSupport();
4200 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4201 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4202 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4203 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4204
4205 // Send INITIAL 1.
4206 SendDataPacket(1, ENCRYPTION_INITIAL);
fayang40334262020-05-19 15:18:28 -07004207 // Send HANDSHAKE 2.
4208 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4209 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
4210 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
4211 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
4212 const QuicTime packet2_sent_time = clock_.Now();
4213
4214 // Send half RTT 5.
4215 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4216 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
4217
4218 // Received ACK for INITIAL 1.
4219 ExpectAck(1);
4220 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4221 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4222 clock_.Now());
4223 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4224 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4225 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4226 ENCRYPTION_INITIAL));
4227 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
fayang40334262020-05-19 15:18:28 -07004228 const QuicTime::Delta pto_delay =
4229 rtt_stats->smoothed_rtt() +
fayang1760b082020-09-22 11:08:27 -07004230 GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07004231 QuicTime::Delta::Zero();
fayang4ae5f982020-06-29 07:56:37 -07004232 // Verify PTO is armed based on handshake data.
4233 EXPECT_EQ(packet2_sent_time + pto_delay, manager_.GetRetransmissionTime());
fayang40334262020-05-19 15:18:28 -07004234}
4235
fayangd0907232020-06-02 12:56:48 -07004236// Regression test for b/157895910.
4237TEST_F(QuicSentPacketManagerTest, EarliestSentTimeNotInitializedWhenPtoFires) {
fayangd0907232020-06-02 12:56:48 -07004238 manager_.EnableMultiplePacketNumberSpacesSupport();
4239 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4240 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4241 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4242 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4243
4244 // Send INITIAL 1.
4245 SendDataPacket(1, ENCRYPTION_INITIAL);
4246
4247 // Send HANDSHAKE packets.
4248 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4249 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
4250 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
4251 SendDataPacket(4, ENCRYPTION_HANDSHAKE);
4252
4253 // Send half RTT packet.
4254 SendDataPacket(5, ENCRYPTION_FORWARD_SECURE);
4255
4256 // Received ACK for INITIAL packet 1.
4257 ExpectAck(1);
4258 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4259 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4260 clock_.Now());
4261 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4262 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4263 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4264 ENCRYPTION_INITIAL));
4265
4266 // Received ACK for HANDSHAKE packets.
4267 uint64_t acked[] = {2, 3, 4};
vasilvvbed67c62020-10-20 06:38:43 -07004268 ExpectAcksAndLosses(true, acked, ABSL_ARRAYSIZE(acked), nullptr, 0);
fayangd0907232020-06-02 12:56:48 -07004269 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(90));
4270 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
4271 clock_.Now());
4272 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(5));
4273 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4274 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(4),
4275 ENCRYPTION_HANDSHAKE));
fayang4d08e812020-07-13 08:28:36 -07004276 // Verify PTO will not be armed.
4277 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
fayangd0907232020-06-02 12:56:48 -07004278}
4279
fayang7d4b0172020-06-18 14:05:45 -07004280TEST_F(QuicSentPacketManagerTest, MaybeRetransmitInitialData) {
4281 manager_.EnableMultiplePacketNumberSpacesSupport();
4282 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4283 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4284 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4285 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4286 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4287 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
4288 QuicTime::Delta::Zero(), QuicTime::Zero());
4289 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
4290
4291 // Send packet 1.
4292 SendDataPacket(1, ENCRYPTION_INITIAL);
4293 QuicTime packet1_sent_time = clock_.Now();
4294
4295 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4296 // Send packets 2 and 3.
4297 SendDataPacket(2, ENCRYPTION_HANDSHAKE);
4298 QuicTime packet2_sent_time = clock_.Now();
4299 SendDataPacket(3, ENCRYPTION_HANDSHAKE);
4300 // Verify PTO is correctly set based on packet 1.
fayang7d4b0172020-06-18 14:05:45 -07004301 QuicTime::Delta expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07004302 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang319fb622020-07-13 07:34:37 -07004303 QuicTime::Delta::Zero();
fayang7d4b0172020-06-18 14:05:45 -07004304 EXPECT_EQ(packet1_sent_time + expected_pto_delay,
4305 manager_.GetRetransmissionTime());
4306
4307 // Assume connection is going to send INITIAL ACK.
4308 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4309 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4310 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
4311 RetransmitDataPacket(4, type, ENCRYPTION_INITIAL);
4312 })));
fayanga39d0362020-06-22 08:57:35 -07004313 manager_.RetransmitDataOfSpaceIfAny(INITIAL_DATA);
fayang7d4b0172020-06-18 14:05:45 -07004314 // Verify PTO is re-armed based on packet 2.
4315 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
4316 manager_.GetRetransmissionTime());
4317
4318 // Connection is going to send another INITIAL ACK.
4319 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4320 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4321 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
4322 RetransmitDataPacket(5, type, ENCRYPTION_INITIAL);
4323 })));
fayanga39d0362020-06-22 08:57:35 -07004324 manager_.RetransmitDataOfSpaceIfAny(INITIAL_DATA);
fayang7d4b0172020-06-18 14:05:45 -07004325 // Verify PTO does not change.
4326 EXPECT_EQ(packet2_sent_time + expected_pto_delay,
4327 manager_.GetRetransmissionTime());
4328}
4329
fayangbc9f56f2020-06-19 03:49:22 -07004330TEST_F(QuicSentPacketManagerTest,
4331 AggressivePtoBeforeAnyRttSamplesAreAvailable) {
4332 manager_.EnableMultiplePacketNumberSpacesSupport();
4333 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4334 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4335 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4336 .WillRepeatedly(Return(10 * kDefaultTCPMSS));
4337 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4338
4339 QuicConfig config;
4340 QuicTagVector options;
4341 options.push_back(kAPTO);
4342 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
4343 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4344 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4345 manager_.SetFromConfig(config);
4346
4347 // Send INITIAL 1.
4348 SendDataPacket(1, ENCRYPTION_INITIAL);
4349 // Verify retransmission timeout is expected.
4350 EXPECT_EQ(clock_.Now() + 1.5 * rtt_stats->initial_rtt(),
4351 manager_.GetRetransmissionTime());
4352}
4353
fayang3a018972020-07-01 12:25:13 -07004354TEST_F(QuicSentPacketManagerTest, ClientOnlyTLPRServer) {
4355 QuicConfig config;
4356 QuicTagVector options;
4357
4358 options.push_back(kTLPR);
4359 config.SetClientConnectionOptions(options);
4360 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4361 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4362 manager_.SetFromConfig(config);
4363 // No change if the server receives client options.
4364 EXPECT_FALSE(
4365 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
4366}
4367
4368TEST_F(QuicSentPacketManagerTest, ClientOnlyTLPR) {
4369 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT);
4370 QuicConfig config;
4371 QuicTagVector options;
4372
4373 options.push_back(kTLPR);
4374 config.SetClientConnectionOptions(options);
4375 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4376 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4377 manager_.SetFromConfig(config);
4378 EXPECT_TRUE(
4379 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
4380}
4381
fayang23206ea2020-07-29 08:29:05 -07004382TEST_F(QuicSentPacketManagerTest, PtoWithTlpr) {
fayang23206ea2020-07-29 08:29:05 -07004383 QuicConfig config;
4384 QuicTagVector options;
4385
4386 options.push_back(kTLPR);
4387 options.push_back(k1PTO);
4388 options.push_back(kPTOS);
4389 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
4390 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4391 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4392 EXPECT_CALL(*send_algorithm_, PacingRate(_))
4393 .WillRepeatedly(Return(QuicBandwidth::Zero()));
4394 EXPECT_CALL(*send_algorithm_, GetCongestionWindow())
4395 .WillOnce(Return(10 * kDefaultTCPMSS));
4396 manager_.SetFromConfig(config);
4397 EXPECT_TRUE(
4398 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_));
4399 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
4400 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(100),
4401 QuicTime::Delta::Zero(), QuicTime::Zero());
4402 QuicTime::Delta srtt = rtt_stats->smoothed_rtt();
4403 manager_.SetHandshakeConfirmed();
4404
4405 SendDataPacket(1, ENCRYPTION_FORWARD_SECURE);
4406 // Verify PTO is correctly set.
4407 QuicTime::Delta expected_pto_delay = 0.5 * srtt;
4408 QuicTime deadline = clock_.Now() + expected_pto_delay;
4409 EXPECT_EQ(deadline, manager_.GetRetransmissionTime());
4410
4411 // Invoke PTO.
4412 clock_.AdvanceTime(deadline - clock_.Now());
4413 manager_.OnRetransmissionTimeout();
4414 EXPECT_CALL(notifier_, RetransmitFrames(_, _))
4415 .WillOnce(WithArgs<1>(Invoke([this](TransmissionType type) {
4416 RetransmitDataPacket(3, type, ENCRYPTION_FORWARD_SECURE);
4417 })));
4418 manager_.MaybeSendProbePackets();
4419
4420 // Verify PTO period gets set correctly.
fayang23206ea2020-07-29 08:29:05 -07004421 expected_pto_delay =
fayang1760b082020-09-22 11:08:27 -07004422 srtt + GetPtoRttvarMultiplier() * rtt_stats->mean_deviation() +
fayang23206ea2020-07-29 08:29:05 -07004423 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs);
4424 QuicTime sent_time = clock_.Now();
4425 EXPECT_EQ(sent_time + expected_pto_delay * 2,
4426 manager_.GetRetransmissionTime());
4427}
4428
danzh8c7d1192020-08-25 08:01:43 -07004429TEST_F(QuicSentPacketManagerTest, SendPathChallengeAndGetAck) {
4430 QuicPacketNumber packet_number(1);
4431 EXPECT_CALL(*send_algorithm_,
4432 OnPacketSent(_, BytesInFlight(), packet_number, _, _));
4433 SerializedPacket packet(packet_number, PACKET_4BYTE_PACKET_NUMBER, nullptr,
4434 kDefaultLength, false, false);
4435 QuicPathFrameBuffer path_frame_buffer{0, 1, 2, 3, 4, 5, 6, 7};
4436 packet.nonretransmittable_frames.push_back(
4437 QuicFrame(new QuicPathChallengeFrame(0, path_frame_buffer)));
4438 packet.encryption_level = ENCRYPTION_FORWARD_SECURE;
4439 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
4440 NO_RETRANSMITTABLE_DATA, false);
4441 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
4442 EXPECT_CALL(*send_algorithm_,
4443 OnCongestionEvent(/*rtt_updated=*/false, _, _,
4444 Pointwise(PacketNumberEq(), {1}), IsEmpty()));
4445 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4446
4447 // Get ACK for the packet.
4448 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4449 clock_.Now());
4450 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4451 EXPECT_EQ(PACKETS_NEWLY_ACKED,
4452 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4453 ENCRYPTION_FORWARD_SECURE));
4454}
4455
haoyuewang5b0f14f2020-09-18 14:31:54 -07004456SerializedPacket MakePacketWithAckFrequencyFrame(
4457 int packet_number,
4458 int ack_frequency_sequence_number,
4459 QuicTime::Delta max_ack_delay) {
4460 auto* ack_frequency_frame = new QuicAckFrequencyFrame();
4461 ack_frequency_frame->max_ack_delay = max_ack_delay;
4462 ack_frequency_frame->sequence_number = ack_frequency_sequence_number;
4463 SerializedPacket packet(QuicPacketNumber(packet_number),
4464 PACKET_4BYTE_PACKET_NUMBER, nullptr, kDefaultLength,
4465 /*has_ack=*/false,
4466 /*has_stop_waiting=*/false);
4467 packet.retransmittable_frames.push_back(QuicFrame(ack_frequency_frame));
4468 packet.has_ack_frequency = true;
4469 packet.encryption_level = ENCRYPTION_FORWARD_SECURE;
4470 return packet;
4471}
4472
4473TEST_F(QuicSentPacketManagerTest,
4474 PeerMaxAckDelayUpdatedFromAckFrequencyFrameOneAtATime) {
4475 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber());
4476 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _))
4477 .Times(AnyNumber());
4478 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
4479 .Times(AnyNumber());
4480
4481 auto initial_peer_max_ack_delay = manager_.peer_max_ack_delay();
4482 auto one_ms = QuicTime::Delta::FromMilliseconds(1);
4483 auto plus_1_ms_delay = initial_peer_max_ack_delay + one_ms;
4484 auto minus_1_ms_delay = initial_peer_max_ack_delay - one_ms;
4485
4486 // Send and Ack frame1.
4487 SerializedPacket packet1 = MakePacketWithAckFrequencyFrame(
4488 /*packet_number=*/1, /*ack_frequency_sequence_number=*/1,
4489 plus_1_ms_delay);
4490 // Higher on the fly max_ack_delay changes peer_max_ack_delay.
4491 manager_.OnPacketSent(&packet1, clock_.Now(), NOT_RETRANSMISSION,
4492 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4493 EXPECT_EQ(manager_.peer_max_ack_delay(), plus_1_ms_delay);
4494 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4495 clock_.Now());
4496 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4497 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4498 ENCRYPTION_FORWARD_SECURE);
4499 EXPECT_EQ(manager_.peer_max_ack_delay(), plus_1_ms_delay);
4500
4501 // Send and Ack frame2.
4502 SerializedPacket packet2 = MakePacketWithAckFrequencyFrame(
4503 /*packet_number=*/2, /*ack_frequency_sequence_number=*/2,
4504 minus_1_ms_delay);
4505 // Lower on the fly max_ack_delay does not change peer_max_ack_delay.
4506 manager_.OnPacketSent(&packet2, clock_.Now(), NOT_RETRANSMISSION,
4507 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4508 EXPECT_EQ(manager_.peer_max_ack_delay(), plus_1_ms_delay);
4509 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
4510 clock_.Now());
4511 manager_.OnAckRange(QuicPacketNumber(2), QuicPacketNumber(3));
4512 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(2),
4513 ENCRYPTION_FORWARD_SECURE);
4514 EXPECT_EQ(manager_.peer_max_ack_delay(), minus_1_ms_delay);
4515}
4516
4517TEST_F(QuicSentPacketManagerTest,
4518 PeerMaxAckDelayUpdatedFromInOrderAckFrequencyFrames) {
4519 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber());
4520 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _))
4521 .Times(AnyNumber());
4522 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
4523 .Times(AnyNumber());
4524
4525 auto initial_peer_max_ack_delay = manager_.peer_max_ack_delay();
4526 auto one_ms = QuicTime::Delta::FromMilliseconds(1);
4527 auto extra_1_ms = initial_peer_max_ack_delay + one_ms;
4528 auto extra_2_ms = initial_peer_max_ack_delay + 2 * one_ms;
4529 auto extra_3_ms = initial_peer_max_ack_delay + 3 * one_ms;
4530 SerializedPacket packet1 = MakePacketWithAckFrequencyFrame(
4531 /*packet_number=*/1, /*ack_frequency_sequence_number=*/1, extra_1_ms);
4532 SerializedPacket packet2 = MakePacketWithAckFrequencyFrame(
4533 /*packet_number=*/2, /*ack_frequency_sequence_number=*/2, extra_3_ms);
4534 SerializedPacket packet3 = MakePacketWithAckFrequencyFrame(
4535 /*packet_number=*/3, /*ack_frequency_sequence_number=*/3, extra_2_ms);
4536
4537 // Send frame1, farme2, frame3.
4538 manager_.OnPacketSent(&packet1, clock_.Now(), NOT_RETRANSMISSION,
4539 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4540 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_1_ms);
4541 manager_.OnPacketSent(&packet2, clock_.Now(), NOT_RETRANSMISSION,
4542 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4543 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_3_ms);
4544 manager_.OnPacketSent(&packet3, clock_.Now(), NOT_RETRANSMISSION,
4545 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4546 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_3_ms);
4547
4548 // Ack frame1, farme2, frame3.
4549 manager_.OnAckFrameStart(QuicPacketNumber(1), QuicTime::Delta::Infinite(),
4550 clock_.Now());
4551 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4552 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4553 ENCRYPTION_FORWARD_SECURE);
4554 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_3_ms);
4555 manager_.OnAckFrameStart(QuicPacketNumber(2), QuicTime::Delta::Infinite(),
4556 clock_.Now());
4557 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(3));
4558 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4559 ENCRYPTION_FORWARD_SECURE);
4560 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_3_ms);
4561 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
4562 clock_.Now());
4563 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
4564 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4565 ENCRYPTION_FORWARD_SECURE);
4566 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_2_ms);
4567}
4568
4569TEST_F(QuicSentPacketManagerTest,
4570 PeerMaxAckDelayUpdatedFromOutOfOrderAckedAckFrequencyFrames) {
4571 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber());
4572 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _, _))
4573 .Times(AnyNumber());
4574 EXPECT_CALL(*network_change_visitor_, OnCongestionChange())
4575 .Times(AnyNumber());
4576
4577 auto initial_peer_max_ack_delay = manager_.peer_max_ack_delay();
4578 auto one_ms = QuicTime::Delta::FromMilliseconds(1);
4579 auto extra_1_ms = initial_peer_max_ack_delay + one_ms;
4580 auto extra_2_ms = initial_peer_max_ack_delay + 2 * one_ms;
4581 auto extra_3_ms = initial_peer_max_ack_delay + 3 * one_ms;
4582 auto extra_4_ms = initial_peer_max_ack_delay + 4 * one_ms;
4583 SerializedPacket packet1 = MakePacketWithAckFrequencyFrame(
4584 /*packet_number=*/1, /*ack_frequency_sequence_number=*/1, extra_4_ms);
4585 SerializedPacket packet2 = MakePacketWithAckFrequencyFrame(
4586 /*packet_number=*/2, /*ack_frequency_sequence_number=*/2, extra_3_ms);
4587 SerializedPacket packet3 = MakePacketWithAckFrequencyFrame(
4588 /*packet_number=*/3, /*ack_frequency_sequence_number=*/3, extra_2_ms);
4589 SerializedPacket packet4 = MakePacketWithAckFrequencyFrame(
4590 /*packet_number=*/4, /*ack_frequency_sequence_number=*/4, extra_1_ms);
4591
4592 // Send frame1, farme2, frame3, frame4.
4593 manager_.OnPacketSent(&packet1, clock_.Now(), NOT_RETRANSMISSION,
4594 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4595 manager_.OnPacketSent(&packet2, clock_.Now(), NOT_RETRANSMISSION,
4596 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4597 manager_.OnPacketSent(&packet3, clock_.Now(), NOT_RETRANSMISSION,
4598 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4599 manager_.OnPacketSent(&packet4, clock_.Now(), NOT_RETRANSMISSION,
4600 NO_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4601 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_4_ms);
4602
4603 // Ack frame3.
4604 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
4605 clock_.Now());
4606 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
4607 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4608 ENCRYPTION_FORWARD_SECURE);
4609 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_2_ms);
4610 // Acking frame1 do not affect peer_max_ack_delay after frame3 is acked.
4611 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
4612 clock_.Now());
4613 manager_.OnAckRange(QuicPacketNumber(3), QuicPacketNumber(4));
4614 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(2));
4615 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4616 ENCRYPTION_FORWARD_SECURE);
4617 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_2_ms);
4618 // Acking frame2 do not affect peer_max_ack_delay after frame3 is acked.
4619 manager_.OnAckFrameStart(QuicPacketNumber(3), QuicTime::Delta::Infinite(),
4620 clock_.Now());
4621 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(4));
4622 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4623 ENCRYPTION_FORWARD_SECURE);
4624 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_2_ms);
4625 // Acking frame4 updates peer_max_ack_delay.
4626 manager_.OnAckFrameStart(QuicPacketNumber(4), QuicTime::Delta::Infinite(),
4627 clock_.Now());
4628 manager_.OnAckRange(QuicPacketNumber(1), QuicPacketNumber(5));
4629 manager_.OnAckFrameEnd(clock_.Now(), QuicPacketNumber(1),
4630 ENCRYPTION_FORWARD_SECURE);
4631 EXPECT_EQ(manager_.peer_max_ack_delay(), extra_1_ms);
4632}
4633
haoyuewang11a54a12020-09-21 14:17:29 -07004634TEST_F(QuicSentPacketManagerTest, ClearDataInMessageFrameAfterPacketSent) {
haoyuewang11a54a12020-09-21 14:17:29 -07004635 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
4636
4637 QuicMessageFrame* message_frame = nullptr;
4638 {
4639 QuicMemSlice slice(MakeUniqueBuffer(&allocator_, 1024), 1024);
4640 message_frame =
4641 new QuicMessageFrame(/*message_id=*/1, QuicMemSliceSpan(&slice));
4642 EXPECT_FALSE(message_frame->message_data.empty());
4643 EXPECT_EQ(message_frame->message_length, 1024);
4644
4645 SerializedPacket packet(QuicPacketNumber(1), PACKET_4BYTE_PACKET_NUMBER,
4646 /*encrypted_buffer=*/nullptr, kDefaultLength,
4647 /*has_ack=*/false,
4648 /*has_stop_waiting*/ false);
4649 packet.encryption_level = ENCRYPTION_FORWARD_SECURE;
4650 packet.retransmittable_frames.push_back(QuicFrame(message_frame));
4651 packet.has_message = true;
4652 manager_.OnPacketSent(&packet, clock_.Now(), NOT_RETRANSMISSION,
4653 HAS_RETRANSMITTABLE_DATA, /*measure_rtt=*/true);
4654 }
4655
4656 EXPECT_TRUE(message_frame->message_data.empty());
4657 EXPECT_EQ(message_frame->message_length, 0);
4658}
4659
haoyuewanged303572020-10-15 14:21:12 -07004660TEST_F(QuicSentPacketManagerTest, BuildAckFrequencyFrame) {
haoyuewangc921f8d2020-10-14 18:06:52 -07004661 SetQuicReloadableFlag(quic_can_send_ack_frequency, true);
4662 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4663 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4664 QuicConfig config;
4665 QuicConfigPeer::SetReceivedMinAckDelayMs(&config, /*min_ack_delay_ms=*/1);
4666 manager_.SetFromConfig(config);
4667 manager_.SetHandshakeConfirmed();
4668
4669 // Set up RTTs.
4670 auto* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
haoyuewang24d8d702020-10-19 08:05:01 -07004671 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(80),
haoyuewangc921f8d2020-10-14 18:06:52 -07004672 /*ack_delay=*/QuicTime::Delta::Zero(),
4673 /*now=*/QuicTime::Zero());
4674 // Make sure srtt and min_rtt are different.
4675 rtt_stats->UpdateRtt(
haoyuewang24d8d702020-10-19 08:05:01 -07004676 QuicTime::Delta::FromMilliseconds(160),
haoyuewangc921f8d2020-10-14 18:06:52 -07004677 /*ack_delay=*/QuicTime::Delta::Zero(),
4678 /*now=*/QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(24));
4679
4680 auto frame = manager_.GetUpdatedAckFrequencyFrame();
4681 EXPECT_EQ(frame.max_ack_delay,
4682 std::max(rtt_stats->min_rtt() * 0.25,
4683 QuicTime::Delta::FromMilliseconds(1u)));
4684 EXPECT_EQ(frame.packet_tolerance, 10u);
4685}
4686
haoyuewanged303572020-10-15 14:21:12 -07004687TEST_F(QuicSentPacketManagerTest, BuildAckFrequencyFrameWithSRTT) {
4688 SetQuicReloadableFlag(quic_can_send_ack_frequency, true);
4689 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
4690 EXPECT_CALL(*network_change_visitor_, OnCongestionChange());
4691 QuicConfig config;
4692 QuicConfigPeer::SetReceivedMinAckDelayMs(&config, /*min_ack_delay_ms=*/1);
4693 QuicTagVector quic_tag_vector;
4694 quic_tag_vector.push_back(kAFF1); // SRTT enabling tag.
4695 QuicConfigPeer::SetReceivedConnectionOptions(&config, quic_tag_vector);
4696 manager_.SetFromConfig(config);
4697 manager_.SetHandshakeConfirmed();
4698
4699 // Set up RTTs.
4700 auto* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats());
haoyuewang24d8d702020-10-19 08:05:01 -07004701 rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(80),
haoyuewanged303572020-10-15 14:21:12 -07004702 /*ack_delay=*/QuicTime::Delta::Zero(),
4703 /*now=*/QuicTime::Zero());
4704 // Make sure srtt and min_rtt are different.
4705 rtt_stats->UpdateRtt(
haoyuewang24d8d702020-10-19 08:05:01 -07004706 QuicTime::Delta::FromMilliseconds(160),
haoyuewanged303572020-10-15 14:21:12 -07004707 /*ack_delay=*/QuicTime::Delta::Zero(),
4708 /*now=*/QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(24));
4709
4710 auto frame = manager_.GetUpdatedAckFrequencyFrame();
4711 EXPECT_EQ(frame.max_ack_delay,
4712 std::max(rtt_stats->SmoothedOrInitialRtt() * 0.25,
4713 QuicTime::Delta::FromMilliseconds(1u)));
4714}
4715
QUICHE teama6ef0a62019-03-07 20:34:33 -05004716} // namespace
4717} // namespace test
4718} // namespace quic