1 // 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.
5 #include "net/quic/quic_sent_packet_manager.h"
7 #include "base/stl_util.h"
8 #include "net/quic/quic_flags.h"
9 #include "net/quic/test_tools/quic_config_peer.h"
10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
11 #include "net/quic/test_tools/quic_test_utils.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
16 using testing::AnyNumber
;
17 using testing::ElementsAre
;
18 using testing::IsEmpty
;
21 using testing::Pointwise
;
22 using testing::Return
;
23 using testing::StrictMock
;
30 // Default packet length.
31 const uint32 kDefaultLength
= 1000;
33 // Stream ID for data sent in CreatePacket().
34 const QuicStreamId kStreamId
= 7;
36 // Matcher to check the key of the key-value pair it receives as first argument
37 // equals its second argument.
39 return std::tr1::get
<0>(arg
).first
== std::tr1::get
<1>(arg
);
42 class MockDebugDelegate
: public QuicSentPacketManager::DebugDelegate
{
44 MOCK_METHOD2(OnSpuriousPacketRetransmission
,
45 void(TransmissionType transmission_type
,
46 QuicByteCount byte_size
));
49 class QuicSentPacketManagerTest
: public ::testing::TestWithParam
<bool> {
51 QuicSentPacketManagerTest()
52 : manager_(Perspective::IS_SERVER
, &clock_
, &stats_
, kCubic
, kNack
, true),
53 send_algorithm_(new StrictMock
<MockSendAlgorithm
>),
54 network_change_visitor_(new StrictMock
<MockNetworkChangeVisitor
>) {
55 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_
, send_algorithm_
);
56 // Disable tail loss probes for most tests.
57 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_
, 0);
58 // Advance the time 1s so the send times are never QuicTime::Zero.
59 clock_
.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
60 manager_
.set_network_change_visitor(network_change_visitor_
.get());
62 EXPECT_CALL(*send_algorithm_
, HasReliableBandwidthEstimate())
64 EXPECT_CALL(*send_algorithm_
, BandwidthEstimate())
66 .WillRepeatedly(Return(QuicBandwidth::Zero()));
67 EXPECT_CALL(*send_algorithm_
, InSlowStart()).Times(AnyNumber());
68 EXPECT_CALL(*send_algorithm_
, InRecovery()).Times(AnyNumber());
71 ~QuicSentPacketManagerTest() override
{ STLDeleteElements(&packets_
); }
73 QuicByteCount
BytesInFlight() {
74 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
);
76 void VerifyUnackedPackets(QuicPacketNumber
* packets
, size_t num_packets
) {
77 if (num_packets
== 0) {
78 EXPECT_FALSE(manager_
.HasUnackedPackets());
79 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
84 EXPECT_TRUE(manager_
.HasUnackedPackets());
85 EXPECT_EQ(packets
[0], manager_
.GetLeastUnacked());
86 for (size_t i
= 0; i
< num_packets
; ++i
) {
87 EXPECT_TRUE(manager_
.IsUnacked(packets
[i
])) << packets
[i
];
91 void VerifyRetransmittablePackets(QuicPacketNumber
* packets
,
93 EXPECT_EQ(num_packets
,
94 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
96 for (size_t i
= 0; i
< num_packets
; ++i
) {
97 EXPECT_TRUE(manager_
.HasRetransmittableFrames(packets
[i
]))
98 << " packets[" << i
<< "]:" << packets
[i
];
102 void ExpectAck(QuicPacketNumber largest_observed
) {
103 EXPECT_CALL(*send_algorithm_
, OnCongestionEvent(
104 true, _
, ElementsAre(Pair(largest_observed
, _
)), IsEmpty()));
105 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
106 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
109 void ExpectUpdatedRtt(QuicPacketNumber largest_observed
) {
110 EXPECT_CALL(*send_algorithm_
,
111 OnCongestionEvent(true, _
, IsEmpty(), IsEmpty()));
112 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
113 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
116 void ExpectAckAndLoss(bool rtt_updated
,
117 QuicPacketNumber largest_observed
,
118 QuicPacketNumber lost_packet
) {
119 EXPECT_CALL(*send_algorithm_
, OnCongestionEvent(
120 rtt_updated
, _
, ElementsAre(Pair(largest_observed
, _
)),
121 ElementsAre(Pair(lost_packet
, _
))));
122 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
123 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
126 // |packets_acked| and |packets_lost| should be in packet number order.
127 void ExpectAcksAndLosses(bool rtt_updated
,
128 QuicPacketNumber
* packets_acked
,
129 size_t num_packets_acked
,
130 QuicPacketNumber
* packets_lost
,
131 size_t num_packets_lost
) {
132 vector
<QuicPacketNumber
> ack_vector
;
133 for (size_t i
= 0; i
< num_packets_acked
; ++i
) {
134 ack_vector
.push_back(packets_acked
[i
]);
136 vector
<QuicPacketNumber
> lost_vector
;
137 for (size_t i
= 0; i
< num_packets_lost
; ++i
) {
138 lost_vector
.push_back(packets_lost
[i
]);
140 EXPECT_CALL(*send_algorithm_
,
141 OnCongestionEvent(rtt_updated
, _
,
142 Pointwise(KeyEq(), ack_vector
),
143 Pointwise(KeyEq(), lost_vector
)));
144 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange()).
146 EXPECT_CALL(*network_change_visitor_
, OnRttChange()).Times(AnyNumber());
149 void RetransmitAndSendPacket(QuicPacketNumber old_packet_number
,
150 QuicPacketNumber new_packet_number
) {
151 QuicSentPacketManagerPeer::MarkForRetransmission(
152 &manager_
, old_packet_number
, TLP_RETRANSMISSION
);
153 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
154 QuicSentPacketManager::PendingRetransmission next_retransmission
=
155 manager_
.NextPendingRetransmission();
156 EXPECT_EQ(old_packet_number
, next_retransmission
.packet_number
);
157 EXPECT_EQ(TLP_RETRANSMISSION
,
158 next_retransmission
.transmission_type
);
160 EXPECT_CALL(*send_algorithm_
,
161 OnPacketSent(_
, BytesInFlight(), new_packet_number
,
162 kDefaultLength
, HAS_RETRANSMITTABLE_DATA
))
163 .WillOnce(Return(true));
164 SerializedPacket
packet(CreatePacket(new_packet_number
, false));
165 manager_
.OnPacketSent(&packet
, old_packet_number
, clock_
.Now(),
166 kDefaultLength
, TLP_RETRANSMISSION
,
167 HAS_RETRANSMITTABLE_DATA
);
168 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_
,
172 SerializedPacket
CreateDataPacket(QuicPacketNumber packet_number
) {
173 return CreatePacket(packet_number
, true);
176 SerializedPacket
CreatePacket(QuicPacketNumber packet_number
,
177 bool retransmittable
) {
178 packets_
.push_back(new QuicEncryptedPacket(nullptr, kDefaultLength
));
179 RetransmittableFrames
* frames
= nullptr;
180 if (retransmittable
) {
181 frames
= new RetransmittableFrames(ENCRYPTION_NONE
);
183 QuicFrame(new QuicStreamFrame(kStreamId
, false, 0, StringPiece())));
185 return SerializedPacket(packet_number
, PACKET_6BYTE_PACKET_NUMBER
,
186 packets_
.back(), 0u, frames
, false, false);
189 SerializedPacket
CreateFecPacket(QuicPacketNumber packet_number
) {
190 packets_
.push_back(new QuicEncryptedPacket(nullptr, kDefaultLength
));
191 SerializedPacket
serialized(packet_number
, PACKET_6BYTE_PACKET_NUMBER
,
192 packets_
.back(), 0u, nullptr, false, false);
193 serialized
.is_fec_packet
= true;
197 void SendDataPacket(QuicPacketNumber packet_number
) {
198 EXPECT_CALL(*send_algorithm_
,
199 OnPacketSent(_
, BytesInFlight(), packet_number
, _
, _
))
201 .WillOnce(Return(true));
202 SerializedPacket
packet(CreateDataPacket(packet_number
));
203 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(),
204 packet
.packet
->length(), NOT_RETRANSMISSION
,
205 HAS_RETRANSMITTABLE_DATA
);
208 void SendCryptoPacket(QuicPacketNumber packet_number
) {
209 EXPECT_CALL(*send_algorithm_
,
210 OnPacketSent(_
, BytesInFlight(), packet_number
, kDefaultLength
,
211 HAS_RETRANSMITTABLE_DATA
))
213 .WillOnce(Return(true));
214 SerializedPacket
packet(CreateDataPacket(packet_number
));
215 packet
.retransmittable_frames
->AddFrame(
216 QuicFrame(new QuicStreamFrame(1, false, 0, StringPiece())));
217 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(),
218 packet
.packet
->length(), NOT_RETRANSMISSION
,
219 HAS_RETRANSMITTABLE_DATA
);
222 void SendFecPacket(QuicPacketNumber packet_number
) {
223 EXPECT_CALL(*send_algorithm_
,
224 OnPacketSent(_
, BytesInFlight(), packet_number
, kDefaultLength
,
225 HAS_RETRANSMITTABLE_DATA
))
227 .WillOnce(Return(true));
228 SerializedPacket
packet(CreateFecPacket(packet_number
));
229 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(),
230 packet
.packet
->length(), NOT_RETRANSMISSION
,
231 NO_RETRANSMITTABLE_DATA
);
234 void SendAckPacket(QuicPacketNumber packet_number
) {
235 EXPECT_CALL(*send_algorithm_
,
236 OnPacketSent(_
, BytesInFlight(), packet_number
, kDefaultLength
,
237 NO_RETRANSMITTABLE_DATA
))
239 .WillOnce(Return(false));
240 SerializedPacket
packet(CreatePacket(packet_number
, false));
241 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(),
242 packet
.packet
->length(), NOT_RETRANSMISSION
,
243 NO_RETRANSMITTABLE_DATA
);
246 // Based on QuicConnection's WritePendingRetransmissions.
247 void RetransmitNextPacket(QuicPacketNumber retransmission_packet_number
) {
248 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
249 EXPECT_CALL(*send_algorithm_
,
250 OnPacketSent(_
, _
, retransmission_packet_number
, kDefaultLength
,
251 HAS_RETRANSMITTABLE_DATA
))
253 .WillOnce(Return(true));
254 const QuicSentPacketManager::PendingRetransmission pending
=
255 manager_
.NextPendingRetransmission();
256 SerializedPacket
packet(CreatePacket(retransmission_packet_number
, false));
257 manager_
.OnPacketSent(&packet
, pending
.packet_number
, clock_
.Now(),
258 kDefaultLength
, pending
.transmission_type
,
259 HAS_RETRANSMITTABLE_DATA
);
262 QuicSentPacketManager manager_
;
263 vector
<QuicEncryptedPacket
*> packets_
;
265 QuicConnectionStats stats_
;
266 MockSendAlgorithm
* send_algorithm_
;
267 scoped_ptr
<MockNetworkChangeVisitor
> network_change_visitor_
;
270 TEST_F(QuicSentPacketManagerTest
, IsUnacked
) {
271 VerifyUnackedPackets(nullptr, 0);
274 QuicPacketNumber unacked
[] = {1};
275 VerifyUnackedPackets(unacked
, arraysize(unacked
));
276 QuicPacketNumber retransmittable
[] = {1};
277 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
280 TEST_F(QuicSentPacketManagerTest
, IsUnAckedRetransmit
) {
282 RetransmitAndSendPacket(1, 2);
284 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_
, 2));
285 QuicPacketNumber unacked
[] = {1, 2};
286 VerifyUnackedPackets(unacked
, arraysize(unacked
));
287 QuicPacketNumber retransmittable
[] = {2};
288 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
291 TEST_F(QuicSentPacketManagerTest
, RetransmitThenAck
) {
293 RetransmitAndSendPacket(1, 2);
296 QuicAckFrame ack_frame
;
297 ack_frame
.largest_observed
= 2;
298 ack_frame
.missing_packets
.insert(1);
300 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
302 // Packet 1 is unacked, pending, but not retransmittable.
303 QuicPacketNumber unacked
[] = {1};
304 VerifyUnackedPackets(unacked
, arraysize(unacked
));
305 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
306 VerifyRetransmittablePackets(nullptr, 0);
309 TEST_F(QuicSentPacketManagerTest
, RetransmitThenAckBeforeSend
) {
311 QuicSentPacketManagerPeer::MarkForRetransmission(
312 &manager_
, 1, TLP_RETRANSMISSION
);
313 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
316 QuicAckFrame ack_frame
;
317 ack_frame
.largest_observed
= 1;
319 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
321 // There should no longer be a pending retransmission.
322 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
324 // No unacked packets remain.
325 VerifyUnackedPackets(nullptr, 0);
326 VerifyRetransmittablePackets(nullptr, 0);
327 EXPECT_EQ(0u, stats_
.packets_spuriously_retransmitted
);
330 TEST_F(QuicSentPacketManagerTest
, RetransmitThenStopRetransmittingBeforeSend
) {
332 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_
, 1,
334 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
336 manager_
.CancelRetransmissionsForStream(kStreamId
);
338 // There should no longer be a pending retransmission.
339 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
341 QuicPacketNumber unacked
[] = {1};
342 VerifyUnackedPackets(unacked
, arraysize(unacked
));
343 VerifyRetransmittablePackets(nullptr, 0);
344 EXPECT_EQ(0u, stats_
.packets_spuriously_retransmitted
);
347 TEST_F(QuicSentPacketManagerTest
, RetransmitThenAckPrevious
) {
349 RetransmitAndSendPacket(1, 2);
350 QuicTime::Delta rtt
= QuicTime::Delta::FromMilliseconds(15);
351 clock_
.AdvanceTime(rtt
);
355 QuicAckFrame ack_frame
;
356 ack_frame
.largest_observed
= 1;
357 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
359 // 2 remains unacked, but no packets have retransmittable data.
360 QuicPacketNumber unacked
[] = {2};
361 VerifyUnackedPackets(unacked
, arraysize(unacked
));
362 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
363 VerifyRetransmittablePackets(nullptr, 0);
365 EXPECT_EQ(1u, stats_
.packets_spuriously_retransmitted
);
368 TEST_F(QuicSentPacketManagerTest
, RetransmitThenAckPreviousThenNackRetransmit
) {
370 RetransmitAndSendPacket(1, 2);
371 QuicTime::Delta rtt
= QuicTime::Delta::FromMilliseconds(15);
372 clock_
.AdvanceTime(rtt
);
374 // First, ACK packet 1 which makes packet 2 non-retransmittable.
376 QuicAckFrame ack_frame
;
377 ack_frame
.largest_observed
= 1;
378 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
383 clock_
.AdvanceTime(rtt
);
385 // Next, NACK packet 2 three times.
386 ack_frame
.largest_observed
= 3;
387 ack_frame
.missing_packets
.insert(2);
389 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
391 ack_frame
.largest_observed
= 4;
393 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
395 ack_frame
.largest_observed
= 5;
396 ExpectAckAndLoss(true, 5, 2);
397 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
399 // No packets remain unacked.
400 VerifyUnackedPackets(nullptr, 0);
401 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
402 VerifyRetransmittablePackets(nullptr, 0);
404 // Verify that the retransmission alarm would not fire,
405 // since there is no retransmittable data outstanding.
406 EXPECT_EQ(QuicTime::Zero(), manager_
.GetRetransmissionTime());
409 TEST_F(QuicSentPacketManagerTest
,
410 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend
) {
412 RetransmitAndSendPacket(1, 2);
414 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
415 EXPECT_CALL(*send_algorithm_
, OnRetransmissionTimeout(true));
416 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
417 manager_
.OnRetransmissionTimeout();
418 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
420 // Ack 1 but not 2, before 2 is able to be sent.
421 // Since 1 has been retransmitted, it has already been lost, and so the
422 // send algorithm is not informed that it has been ACK'd.
423 QuicAckFrame ack_frame
;
424 ack_frame
.largest_observed
= 1;
426 EXPECT_CALL(*send_algorithm_
, RevertRetransmissionTimeout());
427 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
429 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
430 QuicPacketNumber unacked
[] = {2};
431 VerifyUnackedPackets(unacked
, arraysize(unacked
));
432 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
433 VerifyRetransmittablePackets(nullptr, 0);
435 // Verify that the retransmission alarm would not fire,
436 // since there is no retransmittable data outstanding.
437 EXPECT_EQ(QuicTime::Zero(), manager_
.GetRetransmissionTime());
440 TEST_F(QuicSentPacketManagerTest
, RetransmitTwiceThenAckFirst
) {
441 StrictMock
<MockDebugDelegate
> debug_delegate
;
442 EXPECT_CALL(debug_delegate
, OnSpuriousPacketRetransmission(
443 TLP_RETRANSMISSION
, kDefaultLength
)).Times(2);
444 manager_
.set_debug_delegate(&debug_delegate
);
447 RetransmitAndSendPacket(1, 2);
448 RetransmitAndSendPacket(2, 3);
449 QuicTime::Delta rtt
= QuicTime::Delta::FromMilliseconds(15);
450 clock_
.AdvanceTime(rtt
);
452 // Ack 1 but not 2 or 3.
454 QuicAckFrame ack_frame
;
455 ack_frame
.largest_observed
= 1;
456 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
458 // 2 and 3 remain unacked, but no packets have retransmittable data.
459 QuicPacketNumber unacked
[] = {2, 3};
460 VerifyUnackedPackets(unacked
, arraysize(unacked
));
461 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
462 VerifyRetransmittablePackets(nullptr, 0);
464 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
466 ack_frame
.largest_observed
= 4;
467 ack_frame
.missing_packets
.insert(2);
468 QuicPacketNumber acked
[] = {3, 4};
469 ExpectAcksAndLosses(true, acked
, arraysize(acked
), nullptr, 0);
470 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
472 QuicPacketNumber unacked2
[] = {2};
473 VerifyUnackedPackets(unacked2
, arraysize(unacked2
));
474 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
477 ack_frame
.largest_observed
= 5;
478 ExpectAckAndLoss(true, 5, 2);
479 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
481 VerifyUnackedPackets(nullptr, 0);
482 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
483 EXPECT_EQ(2u, stats_
.packets_spuriously_retransmitted
);
486 TEST_F(QuicSentPacketManagerTest
, LoseButDontRetransmitRevivedPacket
) {
492 // Ack 2 and 3, and mark 1 as revived.
493 QuicAckFrame ack_frame
;
494 ack_frame
.largest_observed
= 3;
495 ack_frame
.missing_packets
.insert(1);
496 ack_frame
.revived_packets
.insert(1);
497 QuicPacketNumber acked
[] = {2, 3};
498 ExpectAcksAndLosses(true, acked
, arraysize(acked
), nullptr, 0);
499 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
501 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
502 QuicPacketNumber unacked
[] = {1, 4};
503 VerifyUnackedPackets(unacked
, arraysize(unacked
));
504 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
505 QuicPacketNumber retransmittable
[] = {4};
506 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
508 // Ack the 4th packet and expect the 1st to be considered lost.
509 ack_frame
.largest_observed
= 4;
510 ExpectAckAndLoss(true, 4, 1);
511 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
513 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
514 VerifyRetransmittablePackets(nullptr, 0);
517 TEST_F(QuicSentPacketManagerTest
, MarkLostThenReviveAndDontRetransmitPacket
) {
524 // Ack 2, 3, and 4, and expect the 1st to be considered lost.
525 QuicAckFrame ack_frame
;
526 ack_frame
.largest_observed
= 4;
527 ack_frame
.missing_packets
.insert(1);
528 QuicPacketNumber acked
[] = {2, 3, 4};
529 QuicPacketNumber lost
[] = {1};
530 ExpectAcksAndLosses(true, acked
, arraysize(acked
), lost
, arraysize(lost
));
531 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
533 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
534 QuicPacketNumber unacked
[] = {1, 5};
535 VerifyUnackedPackets(unacked
, arraysize(unacked
));
536 QuicPacketNumber retransmittable
[] = {1};
537 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
539 // Ack 5th packet (FEC) and revive 1st packet. 1st packet should now be
540 // removed from pending retransmissions map.
541 ack_frame
.largest_observed
= 5;
542 ack_frame
.revived_packets
.insert(1);
544 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
546 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
547 VerifyRetransmittablePackets(nullptr, 0);
550 TEST_F(QuicSentPacketManagerTest
, TruncatedAck
) {
551 ValueRestore
<bool> old_flag(&FLAGS_quic_disable_truncated_ack_handling
,
554 RetransmitAndSendPacket(1, 2);
555 RetransmitAndSendPacket(2, 3);
556 RetransmitAndSendPacket(3, 4);
557 RetransmitAndSendPacket(4, 5);
559 // Truncated ack with 4 NACKs, so the first packet is lost.
560 QuicAckFrame ack_frame
;
561 ack_frame
.largest_observed
= 4;
562 ack_frame
.missing_packets
.insert(1);
563 ack_frame
.missing_packets
.insert(2);
564 ack_frame
.missing_packets
.insert(3);
565 ack_frame
.missing_packets
.insert(4);
566 ack_frame
.is_truncated
= true;
568 QuicPacketNumber lost
[] = {1};
569 ExpectAcksAndLosses(true, nullptr, 0, lost
, arraysize(lost
));
570 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
572 // High water mark will be raised.
573 QuicPacketNumber unacked
[] = {2, 3, 4, 5};
574 VerifyUnackedPackets(unacked
, arraysize(unacked
));
575 QuicPacketNumber retransmittable
[] = {5};
576 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
579 TEST_F(QuicSentPacketManagerTest
, AckPreviousTransmissionThenTruncatedAck
) {
581 RetransmitAndSendPacket(1, 2);
582 RetransmitAndSendPacket(2, 3);
583 RetransmitAndSendPacket(3, 4);
590 // Ack previous transmission
592 QuicAckFrame ack_frame
;
593 ack_frame
.largest_observed
= 2;
594 ack_frame
.missing_packets
.insert(1);
596 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
597 EXPECT_TRUE(manager_
.IsUnacked(4));
600 // Truncated ack with 4 NACKs
602 QuicAckFrame ack_frame
;
603 ack_frame
.largest_observed
= 6;
604 ack_frame
.missing_packets
.insert(3);
605 ack_frame
.missing_packets
.insert(4);
606 ack_frame
.missing_packets
.insert(5);
607 ack_frame
.missing_packets
.insert(6);
608 ack_frame
.is_truncated
= true;
609 ExpectAckAndLoss(true, 1, 3);
610 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
613 // High water mark will be raised.
614 QuicPacketNumber unacked
[] = {4, 5, 6, 7, 8, 9};
615 VerifyUnackedPackets(unacked
, arraysize(unacked
));
616 QuicPacketNumber retransmittable
[] = {5, 6, 7, 8, 9};
617 VerifyRetransmittablePackets(retransmittable
, arraysize(retransmittable
));
620 TEST_F(QuicSentPacketManagerTest
, GetLeastUnacked
) {
621 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
624 TEST_F(QuicSentPacketManagerTest
, GetLeastUnackedUnacked
) {
626 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
629 TEST_F(QuicSentPacketManagerTest
, GetLeastUnackedUnackedFec
) {
631 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
634 TEST_F(QuicSentPacketManagerTest
, GetLeastUnackedAndDiscard
) {
635 VerifyUnackedPackets(nullptr, 0);
638 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
641 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
644 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
646 QuicPacketNumber unacked
[] = {1, 2, 3};
647 VerifyUnackedPackets(unacked
, arraysize(unacked
));
648 VerifyRetransmittablePackets(nullptr, 0);
650 // Ack 2, so there's an rtt update.
652 QuicAckFrame ack_frame
;
653 ack_frame
.largest_observed
= 2;
654 ack_frame
.missing_packets
.insert(1);
655 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
657 EXPECT_EQ(1u, manager_
.GetLeastUnacked());
660 TEST_F(QuicSentPacketManagerTest
, GetSentTime
) {
661 VerifyUnackedPackets(nullptr, 0);
663 QuicTime sent_time
= clock_
.Now();
665 QuicTime sent_time2
= clock_
.Now();
667 QuicPacketNumber unacked
[] = {1, 2};
668 VerifyUnackedPackets(unacked
, arraysize(unacked
));
669 VerifyRetransmittablePackets(nullptr, 0);
671 EXPECT_TRUE(manager_
.HasUnackedPackets());
672 EXPECT_EQ(sent_time
, QuicSentPacketManagerPeer::GetSentTime(&manager_
, 1));
673 EXPECT_EQ(sent_time2
, QuicSentPacketManagerPeer::GetSentTime(&manager_
, 2));
676 TEST_F(QuicSentPacketManagerTest
, AckAckAndUpdateRtt
) {
680 // Now ack the ack and expect an RTT update.
681 QuicAckFrame ack_frame
;
682 ack_frame
.largest_observed
= 2;
683 ack_frame
.delta_time_largest_observed
=
684 QuicTime::Delta::FromMilliseconds(5);
687 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
691 // Now ack the ack and expect only an RTT update.
692 ack_frame
.largest_observed
= 3;
694 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
697 TEST_F(QuicSentPacketManagerTest
, Rtt
) {
698 QuicPacketNumber packet_number
= 1;
699 QuicTime::Delta expected_rtt
= QuicTime::Delta::FromMilliseconds(15);
700 SendDataPacket(packet_number
);
701 clock_
.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
703 ExpectAck(packet_number
);
704 QuicAckFrame ack_frame
;
705 ack_frame
.largest_observed
= packet_number
;
706 ack_frame
.delta_time_largest_observed
=
707 QuicTime::Delta::FromMilliseconds(5);
708 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
709 EXPECT_EQ(expected_rtt
,
710 QuicSentPacketManagerPeer::GetRttStats(&manager_
)->latest_rtt());
713 TEST_F(QuicSentPacketManagerTest
, RttWithInvalidDelta
) {
714 // Expect that the RTT is equal to the local time elapsed, since the
715 // delta_time_largest_observed is larger than the local time elapsed
716 // and is hence invalid.
717 QuicPacketNumber packet_number
= 1;
718 QuicTime::Delta expected_rtt
= QuicTime::Delta::FromMilliseconds(10);
719 SendDataPacket(packet_number
);
720 clock_
.AdvanceTime(expected_rtt
);
722 ExpectAck(packet_number
);
723 QuicAckFrame ack_frame
;
724 ack_frame
.largest_observed
= packet_number
;
725 ack_frame
.delta_time_largest_observed
=
726 QuicTime::Delta::FromMilliseconds(11);
727 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
728 EXPECT_EQ(expected_rtt
,
729 QuicSentPacketManagerPeer::GetRttStats(&manager_
)->latest_rtt());
732 TEST_F(QuicSentPacketManagerTest
, RttWithInfiniteDelta
) {
733 // Expect that the RTT is equal to the local time elapsed, since the
734 // delta_time_largest_observed is infinite, and is hence invalid.
735 QuicPacketNumber packet_number
= 1;
736 QuicTime::Delta expected_rtt
= QuicTime::Delta::FromMilliseconds(10);
737 SendDataPacket(packet_number
);
738 clock_
.AdvanceTime(expected_rtt
);
740 ExpectAck(packet_number
);
741 QuicAckFrame ack_frame
;
742 ack_frame
.largest_observed
= packet_number
;
743 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Infinite();
744 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
745 EXPECT_EQ(expected_rtt
,
746 QuicSentPacketManagerPeer::GetRttStats(&manager_
)->latest_rtt());
749 TEST_F(QuicSentPacketManagerTest
, RttZeroDelta
) {
750 // Expect that the RTT is the time between send and receive since the
751 // delta_time_largest_observed is zero.
752 QuicPacketNumber packet_number
= 1;
753 QuicTime::Delta expected_rtt
= QuicTime::Delta::FromMilliseconds(10);
754 SendDataPacket(packet_number
);
755 clock_
.AdvanceTime(expected_rtt
);
757 ExpectAck(packet_number
);
758 QuicAckFrame ack_frame
;
759 ack_frame
.largest_observed
= packet_number
;
760 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Zero();
761 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
762 EXPECT_EQ(expected_rtt
,
763 QuicSentPacketManagerPeer::GetRttStats(&manager_
)->latest_rtt());
766 TEST_F(QuicSentPacketManagerTest
, TailLossProbeTimeout
) {
767 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_
, 2);
770 QuicPacketNumber packet_number
= 1;
771 SendDataPacket(packet_number
);
773 // The first tail loss probe retransmits 1 packet.
774 manager_
.OnRetransmissionTimeout();
775 EXPECT_EQ(QuicTime::Delta::Zero(),
776 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
777 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
778 manager_
.MaybeRetransmitTailLossProbe();
779 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
780 RetransmitNextPacket(2);
781 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
783 // The second tail loss probe retransmits 1 packet.
784 manager_
.OnRetransmissionTimeout();
785 EXPECT_EQ(QuicTime::Delta::Zero(),
786 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
787 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
788 manager_
.MaybeRetransmitTailLossProbe();
789 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
790 RetransmitNextPacket(3);
791 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
792 QuicTime::Delta::Infinite()));
793 EXPECT_EQ(QuicTime::Delta::Infinite(),
794 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
795 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
797 // Ack the third and ensure the first two are still pending.
799 QuicAckFrame ack_frame
;
800 ack_frame
.largest_observed
= 3;
801 ack_frame
.missing_packets
.insert(1);
802 ack_frame
.missing_packets
.insert(2);
803 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
805 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
807 // Acking two more packets will lose both of them due to nacks.
808 ack_frame
.largest_observed
= 5;
809 QuicPacketNumber lost
[] = {1, 2};
810 ExpectAcksAndLosses(false, nullptr, 0, lost
, arraysize(lost
));
811 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
813 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
814 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
815 EXPECT_EQ(2u, stats_
.tlp_count
);
816 EXPECT_EQ(0u, stats_
.rto_count
);
819 TEST_F(QuicSentPacketManagerTest
, TailLossProbeThenRTO
) {
820 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_
, 2);
823 const size_t kNumSentPackets
= 100;
824 for (size_t i
= 1; i
<= kNumSentPackets
; ++i
) {
827 QuicTime rto_packet_time
= clock_
.Now();
829 clock_
.AdvanceTime(manager_
.GetRetransmissionTime().Subtract(clock_
.Now()));
831 // The first tail loss probe retransmits 1 packet.
832 manager_
.OnRetransmissionTimeout();
833 EXPECT_EQ(QuicTime::Delta::Zero(),
834 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
835 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
836 manager_
.MaybeRetransmitTailLossProbe();
837 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
838 RetransmitNextPacket(101);
839 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
840 QuicTime::Delta::Infinite()));
841 EXPECT_EQ(QuicTime::Delta::Infinite(),
842 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
843 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
844 clock_
.AdvanceTime(manager_
.GetRetransmissionTime().Subtract(clock_
.Now()));
846 // The second tail loss probe retransmits 1 packet.
847 manager_
.OnRetransmissionTimeout();
848 EXPECT_EQ(QuicTime::Delta::Zero(),
849 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
850 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
851 EXPECT_TRUE(manager_
.MaybeRetransmitTailLossProbe());
852 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
853 RetransmitNextPacket(102);
854 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
855 QuicTime::Delta::Infinite()));
856 EXPECT_EQ(QuicTime::Delta::Infinite(),
857 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
859 // Ensure the RTO is set based on the correct packet.
860 rto_packet_time
= clock_
.Now();
861 EXPECT_CALL(*send_algorithm_
, RetransmissionDelay())
862 .WillOnce(Return(QuicTime::Delta::FromSeconds(1)));
863 EXPECT_EQ(rto_packet_time
.Add(QuicTime::Delta::FromSeconds(1)),
864 manager_
.GetRetransmissionTime());
866 // Advance the time enough to ensure all packets are RTO'd.
867 clock_
.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
869 manager_
.OnRetransmissionTimeout();
870 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
871 EXPECT_EQ(2u, stats_
.tlp_count
);
872 EXPECT_EQ(1u, stats_
.rto_count
);
874 // Send and Ack the RTO and ensure OnRetransmissionTimeout is called.
875 EXPECT_EQ(102 * kDefaultLength
,
876 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
878 RetransmitNextPacket(103);
879 QuicAckFrame ack_frame
;
880 ack_frame
.largest_observed
= 103;
881 for (int i
= 0; i
< 103; ++i
) {
882 ack_frame
.missing_packets
.insert(i
);
884 EXPECT_CALL(*send_algorithm_
, OnRetransmissionTimeout(true));
885 EXPECT_CALL(*send_algorithm_
,
886 OnCongestionEvent(true, _
, ElementsAre(Pair(103, _
)), _
));
887 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
888 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
889 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
890 // All packets before 103 should be lost.
891 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
894 TEST_F(QuicSentPacketManagerTest
, CryptoHandshakeTimeout
) {
895 // Send 2 crypto packets and 3 data packets.
896 const size_t kNumSentCryptoPackets
= 2;
897 for (size_t i
= 1; i
<= kNumSentCryptoPackets
; ++i
) {
900 const size_t kNumSentDataPackets
= 3;
901 for (size_t i
= 1; i
<= kNumSentDataPackets
; ++i
) {
902 SendDataPacket(kNumSentCryptoPackets
+ i
);
904 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
906 // The first retransmits 2 packets.
907 manager_
.OnRetransmissionTimeout();
908 EXPECT_EQ(QuicTime::Delta::Zero(),
909 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
910 RetransmitNextPacket(6);
911 RetransmitNextPacket(7);
912 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
913 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
915 // The second retransmits 2 packets.
916 manager_
.OnRetransmissionTimeout();
917 EXPECT_EQ(QuicTime::Delta::Zero(),
918 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
919 RetransmitNextPacket(8);
920 RetransmitNextPacket(9);
921 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
922 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
924 // Now ack the two crypto packets and the speculatively encrypted request,
925 // and ensure the first four crypto packets get abandoned, but not lost.
926 QuicPacketNumber acked
[] = {3, 4, 5, 8, 9};
927 ExpectAcksAndLosses(true, acked
, arraysize(acked
), nullptr, 0);
928 QuicAckFrame ack_frame
;
929 ack_frame
.largest_observed
= 9;
930 ack_frame
.missing_packets
.insert(1);
931 ack_frame
.missing_packets
.insert(2);
932 ack_frame
.missing_packets
.insert(6);
933 ack_frame
.missing_packets
.insert(7);
934 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
936 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
939 TEST_F(QuicSentPacketManagerTest
, CryptoHandshakeTimeoutVersionNegotiation
) {
940 // Send 2 crypto packets and 3 data packets.
941 const size_t kNumSentCryptoPackets
= 2;
942 for (size_t i
= 1; i
<= kNumSentCryptoPackets
; ++i
) {
945 const size_t kNumSentDataPackets
= 3;
946 for (size_t i
= 1; i
<= kNumSentDataPackets
; ++i
) {
947 SendDataPacket(kNumSentCryptoPackets
+ i
);
949 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
951 // The first retransmission timeout retransmits 2 crypto packets.
952 manager_
.OnRetransmissionTimeout();
953 RetransmitNextPacket(6);
954 RetransmitNextPacket(7);
955 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
956 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
958 // Now act like a version negotiation packet arrived, which would cause all
959 // unacked packets to be retransmitted.
960 manager_
.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION
);
962 // Ensure the first two pending packets are the crypto retransmits.
963 ASSERT_TRUE(manager_
.HasPendingRetransmissions());
964 EXPECT_EQ(6u, manager_
.NextPendingRetransmission().packet_number
);
965 RetransmitNextPacket(8);
966 EXPECT_EQ(7u, manager_
.NextPendingRetransmission().packet_number
);
967 RetransmitNextPacket(9);
969 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
970 // Send 3 more data packets and ensure the least unacked is raised.
971 RetransmitNextPacket(10);
972 RetransmitNextPacket(11);
973 RetransmitNextPacket(12);
974 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
976 EXPECT_EQ(8u, manager_
.GetLeastUnacked());
979 TEST_F(QuicSentPacketManagerTest
, CryptoHandshakeSpuriousRetransmission
) {
980 // Send 1 crypto packet.
982 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
984 // Retransmit the crypto packet as 2.
985 manager_
.OnRetransmissionTimeout();
986 RetransmitNextPacket(2);
988 // Retransmit the crypto packet as 3.
989 manager_
.OnRetransmissionTimeout();
990 RetransmitNextPacket(3);
992 // Now ack the second crypto packet, and ensure the first gets removed, but
993 // the third does not.
995 QuicAckFrame ack_frame
;
996 ack_frame
.largest_observed
= 2;
997 ack_frame
.missing_packets
.insert(1);
998 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
1000 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1001 QuicPacketNumber unacked
[] = {3};
1002 VerifyUnackedPackets(unacked
, arraysize(unacked
));
1005 TEST_F(QuicSentPacketManagerTest
, CryptoHandshakeTimeoutUnsentDataPacket
) {
1006 // Send 2 crypto packets and 1 data packet.
1007 const size_t kNumSentCryptoPackets
= 2;
1008 for (size_t i
= 1; i
<= kNumSentCryptoPackets
; ++i
) {
1009 SendCryptoPacket(i
);
1012 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1014 // Retransmit 2 crypto packets, but not the serialized packet.
1015 manager_
.OnRetransmissionTimeout();
1016 RetransmitNextPacket(4);
1017 RetransmitNextPacket(5);
1018 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1019 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1022 TEST_F(QuicSentPacketManagerTest
,
1023 CryptoHandshakeRetransmissionThenRetransmitAll
) {
1024 // Send 1 crypto packet.
1025 SendCryptoPacket(1);
1026 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1028 // Retransmit the crypto packet as 2.
1029 manager_
.OnRetransmissionTimeout();
1030 RetransmitNextPacket(2);
1032 // Now retransmit all the unacked packets, which occurs when there is a
1033 // version negotiation.
1034 manager_
.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION
);
1035 QuicPacketNumber unacked
[] = {1, 2};
1036 VerifyUnackedPackets(unacked
, arraysize(unacked
));
1037 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1038 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1039 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
1042 TEST_F(QuicSentPacketManagerTest
,
1043 CryptoHandshakeRetransmissionThenNeuterAndAck
) {
1044 // Send 1 crypto packet.
1045 SendCryptoPacket(1);
1046 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1048 // Retransmit the crypto packet as 2.
1049 manager_
.OnRetransmissionTimeout();
1050 RetransmitNextPacket(2);
1052 // Retransmit the crypto packet as 3.
1053 manager_
.OnRetransmissionTimeout();
1054 RetransmitNextPacket(3);
1056 // Now neuter all unacked unencrypted packets, which occurs when the
1057 // connection goes forward secure.
1058 manager_
.NeuterUnencryptedPackets();
1059 QuicPacketNumber unacked
[] = {1, 2, 3};
1060 VerifyUnackedPackets(unacked
, arraysize(unacked
));
1061 VerifyRetransmittablePackets(nullptr, 0);
1062 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1063 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_
));
1064 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_
));
1066 // Ensure both packets get discarded when packet 2 is acked.
1067 QuicAckFrame ack_frame
;
1068 ack_frame
.largest_observed
= 3;
1069 ack_frame
.missing_packets
.insert(1);
1070 ack_frame
.missing_packets
.insert(2);
1071 ExpectUpdatedRtt(3);
1072 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
1073 VerifyUnackedPackets(nullptr, 0);
1074 VerifyRetransmittablePackets(nullptr, 0);
1077 TEST_F(QuicSentPacketManagerTest
, RetransmissionTimeout
) {
1078 // Send 100 packets.
1079 const size_t kNumSentPackets
= 100;
1080 for (size_t i
= 1; i
<= kNumSentPackets
; ++i
) {
1084 EXPECT_FALSE(manager_
.MaybeRetransmitTailLossProbe());
1085 manager_
.OnRetransmissionTimeout();
1086 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1087 EXPECT_EQ(100 * kDefaultLength
,
1088 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1089 RetransmitNextPacket(101);
1090 RetransmitNextPacket(102);
1091 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1093 // Ack a retransmission.
1094 QuicAckFrame ack_frame
;
1095 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Zero();
1096 ack_frame
.largest_observed
= 102;
1097 for (int i
= 0; i
< 102; ++i
) {
1098 ack_frame
.missing_packets
.insert(i
);
1100 // Ensure no packets are lost.
1101 EXPECT_CALL(*send_algorithm_
,
1102 OnCongestionEvent(true, _
, ElementsAre(Pair(102, _
)),
1103 /*lost_packets=*/IsEmpty()));
1104 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1105 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1106 EXPECT_CALL(*send_algorithm_
, OnRetransmissionTimeout(true));
1107 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
1110 TEST_F(QuicSentPacketManagerTest
, NewRetransmissionTimeout
) {
1111 QuicConfig client_config
;
1112 QuicTagVector options
;
1113 options
.push_back(kNRTO
);
1114 QuicSentPacketManagerPeer::SetPerspective(&manager_
, Perspective::IS_CLIENT
);
1115 client_config
.SetConnectionOptionsToSend(options
);
1116 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1117 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1118 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1119 EXPECT_CALL(*send_algorithm_
, PacingRate())
1120 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1121 EXPECT_CALL(*send_algorithm_
, GetCongestionWindow())
1122 .WillOnce(Return(10 * kDefaultTCPMSS
));
1123 manager_
.SetFromConfig(client_config
);
1124 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_
));
1126 // Send 100 packets.
1127 const size_t kNumSentPackets
= 100;
1128 for (size_t i
= 1; i
<= kNumSentPackets
; ++i
) {
1132 EXPECT_FALSE(manager_
.MaybeRetransmitTailLossProbe());
1133 manager_
.OnRetransmissionTimeout();
1134 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1135 EXPECT_EQ(100 * kDefaultLength
,
1136 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1137 RetransmitNextPacket(101);
1138 RetransmitNextPacket(102);
1139 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1141 // Ack a retransmission and expect no call to OnRetransmissionTimeout.
1142 QuicAckFrame ack_frame
;
1143 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Zero();
1144 ack_frame
.largest_observed
= 102;
1145 for (int i
= 0; i
< 102; ++i
) {
1146 ack_frame
.missing_packets
.insert(i
);
1148 // This will include packets in the lost packet map.
1149 EXPECT_CALL(*send_algorithm_
,
1150 OnCongestionEvent(true, _
, ElementsAre(Pair(102, _
)),
1151 /*lost_packets=*/Not(IsEmpty())));
1152 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1153 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1154 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
1157 TEST_F(QuicSentPacketManagerTest
, TwoRetransmissionTimeoutsAckSecond
) {
1161 manager_
.OnRetransmissionTimeout();
1162 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1163 EXPECT_EQ(kDefaultLength
,
1164 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1165 RetransmitNextPacket(2);
1166 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1168 // Rto a second time.
1169 manager_
.OnRetransmissionTimeout();
1170 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1171 EXPECT_EQ(2 * kDefaultLength
,
1172 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1173 RetransmitNextPacket(3);
1174 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1176 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1177 EXPECT_CALL(*send_algorithm_
, OnRetransmissionTimeout(true));
1178 QuicAckFrame ack_frame
;
1179 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Zero();
1180 ack_frame
.largest_observed
= 2;
1181 ack_frame
.missing_packets
.insert(1);
1183 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
1185 // The original packet and newest should be outstanding.
1186 EXPECT_EQ(2 * kDefaultLength
,
1187 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1190 TEST_F(QuicSentPacketManagerTest
, TwoRetransmissionTimeoutsAckFirst
) {
1194 manager_
.OnRetransmissionTimeout();
1195 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1196 EXPECT_EQ(kDefaultLength
,
1197 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1198 RetransmitNextPacket(2);
1199 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1201 // Rto a second time.
1202 manager_
.OnRetransmissionTimeout();
1203 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1204 EXPECT_EQ(2 * kDefaultLength
,
1205 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1206 RetransmitNextPacket(3);
1207 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1209 // Ack a retransmission and ensure OnRetransmissionTimeout is called.
1210 EXPECT_CALL(*send_algorithm_
, OnRetransmissionTimeout(true));
1211 QuicAckFrame ack_frame
;
1212 ack_frame
.delta_time_largest_observed
= QuicTime::Delta::Zero();
1213 ack_frame
.largest_observed
= 3;
1214 ack_frame
.missing_packets
.insert(1);
1215 ack_frame
.missing_packets
.insert(2);
1217 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
1219 // The first two packets should still be outstanding.
1220 EXPECT_EQ(2 * kDefaultLength
,
1221 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1224 TEST_F(QuicSentPacketManagerTest
, GetTransmissionTime
) {
1225 EXPECT_EQ(QuicTime::Zero(), manager_
.GetRetransmissionTime());
1228 TEST_F(QuicSentPacketManagerTest
, GetTransmissionTimeCryptoHandshake
) {
1229 SendCryptoPacket(1);
1232 RttStats
* rtt_stats
= QuicSentPacketManagerPeer::GetRttStats(&manager_
);
1233 rtt_stats
->set_initial_rtt_us(1 * kNumMicrosPerMilli
);
1234 EXPECT_EQ(clock_
.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1235 manager_
.GetRetransmissionTime());
1237 // Test with a standard smoothed RTT.
1238 rtt_stats
->set_initial_rtt_us(100 * kNumMicrosPerMilli
);
1240 QuicTime::Delta srtt
=
1241 QuicTime::Delta::FromMicroseconds(rtt_stats
->initial_rtt_us());
1242 QuicTime expected_time
= clock_
.Now().Add(srtt
.Multiply(1.5));
1243 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1245 // Retransmit the packet by invoking the retransmission timeout.
1246 clock_
.AdvanceTime(srtt
.Multiply(1.5));
1247 manager_
.OnRetransmissionTimeout();
1248 RetransmitNextPacket(2);
1250 // The retransmission time should now be twice as far in the future.
1251 expected_time
= clock_
.Now().Add(srtt
.Multiply(2).Multiply(1.5));
1252 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1255 TEST_F(QuicSentPacketManagerTest
, GetTransmissionTimeTailLossProbe
) {
1256 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_
, 2);
1261 RttStats
* rtt_stats
= QuicSentPacketManagerPeer::GetRttStats(&manager_
);
1262 rtt_stats
->set_initial_rtt_us(1 * kNumMicrosPerMilli
);
1263 EXPECT_EQ(clock_
.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1264 manager_
.GetRetransmissionTime());
1266 // Test with a standard smoothed RTT.
1267 rtt_stats
->set_initial_rtt_us(100 * kNumMicrosPerMilli
);
1268 QuicTime::Delta srtt
=
1269 QuicTime::Delta::FromMicroseconds(rtt_stats
->initial_rtt_us());
1270 QuicTime::Delta expected_tlp_delay
= srtt
.Multiply(2);
1271 QuicTime expected_time
= clock_
.Now().Add(expected_tlp_delay
);
1272 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1274 // Retransmit the packet by invoking the retransmission timeout.
1275 clock_
.AdvanceTime(expected_tlp_delay
);
1276 manager_
.OnRetransmissionTimeout();
1277 EXPECT_EQ(QuicTime::Delta::Zero(),
1278 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1279 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1280 EXPECT_TRUE(manager_
.MaybeRetransmitTailLossProbe());
1281 EXPECT_TRUE(manager_
.HasPendingRetransmissions());
1282 RetransmitNextPacket(3);
1283 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
1284 QuicTime::Delta::Infinite()));
1285 EXPECT_EQ(QuicTime::Delta::Infinite(),
1286 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1287 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1289 expected_time
= clock_
.Now().Add(expected_tlp_delay
);
1290 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1293 TEST_F(QuicSentPacketManagerTest
, GetTransmissionTimeSpuriousRTO
) {
1294 QuicSentPacketManagerPeer::GetRttStats(&manager_
)->UpdateRtt(
1295 QuicTime::Delta::FromMilliseconds(100),
1296 QuicTime::Delta::Zero(),
1304 QuicTime::Delta expected_rto_delay
= QuicTime::Delta::FromMilliseconds(500);
1305 EXPECT_CALL(*send_algorithm_
, RetransmissionDelay())
1306 .WillRepeatedly(Return(expected_rto_delay
));
1307 QuicTime expected_time
= clock_
.Now().Add(expected_rto_delay
);
1308 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1310 // Retransmit the packet by invoking the retransmission timeout.
1311 clock_
.AdvanceTime(expected_rto_delay
);
1312 manager_
.OnRetransmissionTimeout();
1313 // All packets are still considered inflight.
1314 EXPECT_EQ(4 * kDefaultLength
,
1315 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1316 RetransmitNextPacket(5);
1317 RetransmitNextPacket(6);
1318 // All previous packets are inflight, plus two rto retransmissions.
1319 EXPECT_EQ(6 * kDefaultLength
,
1320 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1321 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1323 // The delay should double the second time.
1324 expected_time
= clock_
.Now().Add(expected_rto_delay
).Add(expected_rto_delay
);
1325 // Once we always base the timer on the right edge, leaving the older packets
1326 // in flight doesn't change the timeout.
1327 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1329 // Ack a packet before the first RTO and ensure the RTO timeout returns to the
1330 // original value and OnRetransmissionTimeout is not called or reverted.
1331 QuicAckFrame ack_frame
;
1332 ack_frame
.largest_observed
= 2;
1333 ack_frame
.missing_packets
.insert(1);
1335 manager_
.OnIncomingAck(ack_frame
, clock_
.ApproximateNow());
1336 EXPECT_FALSE(manager_
.HasPendingRetransmissions());
1337 EXPECT_EQ(5 * kDefaultLength
,
1338 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_
));
1340 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1341 // and the TLP time. In production, there would always be two TLP's first.
1342 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1343 // by the latest RTT sample of 500ms.
1344 expected_time
= clock_
.Now().Add(QuicTime::Delta::FromMilliseconds(1000));
1345 // Once we always base the timer on the right edge, leaving the older packets
1346 // in flight doesn't change the timeout.
1347 EXPECT_EQ(expected_time
, manager_
.GetRetransmissionTime());
1350 TEST_F(QuicSentPacketManagerTest
, GetTransmissionDelayMin
) {
1352 EXPECT_CALL(*send_algorithm_
, RetransmissionDelay())
1353 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1)));
1354 QuicTime::Delta delay
= QuicTime::Delta::FromMilliseconds(200);
1356 // If the delay is smaller than the min, ensure it exponentially backs off
1358 for (int i
= 0; i
< 5; ++i
) {
1360 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_
));
1361 delay
= delay
.Add(delay
);
1362 manager_
.OnRetransmissionTimeout();
1363 RetransmitNextPacket(i
+ 2);
1367 TEST_F(QuicSentPacketManagerTest
, GetTransmissionDelayMax
) {
1368 EXPECT_CALL(*send_algorithm_
, RetransmissionDelay())
1369 .WillOnce(Return(QuicTime::Delta::FromSeconds(500)));
1371 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1372 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_
));
1375 TEST_F(QuicSentPacketManagerTest
, GetTransmissionDelay
) {
1377 QuicTime::Delta delay
= QuicTime::Delta::FromMilliseconds(500);
1378 EXPECT_CALL(*send_algorithm_
, RetransmissionDelay())
1379 .WillRepeatedly(Return(delay
));
1381 // Delay should back off exponentially.
1382 for (int i
= 0; i
< 5; ++i
) {
1384 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_
));
1385 delay
= delay
.Add(delay
);
1386 manager_
.OnRetransmissionTimeout();
1387 RetransmitNextPacket(i
+ 2);
1391 TEST_F(QuicSentPacketManagerTest
, GetLossDelay
) {
1392 MockLossAlgorithm
* loss_algorithm
= new MockLossAlgorithm();
1393 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_
, loss_algorithm
);
1395 EXPECT_CALL(*loss_algorithm
, GetLossTimeout())
1396 .WillRepeatedly(Return(QuicTime::Zero()));
1400 // Handle an ack which causes the loss algorithm to be evaluated and
1401 // set the loss timeout.
1403 EXPECT_CALL(*loss_algorithm
, DetectLostPackets(_
, _
, _
, _
))
1404 .WillOnce(Return(PacketNumberSet()));
1405 QuicAckFrame ack_frame
;
1406 ack_frame
.largest_observed
= 2;
1407 ack_frame
.missing_packets
.insert(1);
1408 manager_
.OnIncomingAck(ack_frame
, clock_
.Now());
1410 QuicTime
timeout(clock_
.Now().Add(QuicTime::Delta::FromMilliseconds(10)));
1411 EXPECT_CALL(*loss_algorithm
, GetLossTimeout())
1412 .WillRepeatedly(Return(timeout
));
1413 EXPECT_EQ(timeout
, manager_
.GetRetransmissionTime());
1415 // Fire the retransmission timeout and ensure the loss detection algorithm
1417 EXPECT_CALL(*loss_algorithm
, DetectLostPackets(_
, _
, _
, _
))
1418 .WillOnce(Return(PacketNumberSet()));
1419 manager_
.OnRetransmissionTimeout();
1422 TEST_F(QuicSentPacketManagerTest
, NegotiateTimeLossDetectionFromOptions
) {
1424 QuicSentPacketManagerPeer::GetLossAlgorithm(
1425 &manager_
)->GetLossDetectionType());
1428 QuicTagVector options
;
1429 options
.push_back(kTIME
);
1430 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1431 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1432 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1433 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1434 manager_
.SetFromConfig(config
);
1437 QuicSentPacketManagerPeer::GetLossAlgorithm(
1438 &manager_
)->GetLossDetectionType());
1441 TEST_F(QuicSentPacketManagerTest
, NegotiateCongestionControlFromOptions
) {
1442 ValueRestore
<bool> old_flag(&FLAGS_quic_allow_bbr
, true);
1444 QuicTagVector options
;
1446 options
.push_back(kRENO
);
1447 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1448 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1449 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1450 manager_
.SetFromConfig(config
);
1451 EXPECT_EQ(kReno
, QuicSentPacketManagerPeer::GetSendAlgorithm(
1452 manager_
)->GetCongestionControlType());
1454 // TODO(rtenneti): Enable the following code after BBR code is checked in.
1457 options
.push_back(kTBBR
);
1458 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1459 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1460 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1461 manager_
.SetFromConfig(config
);
1462 EXPECT_EQ(kBBR
, QuicSentPacketManagerPeer::GetSendAlgorithm(
1463 manager_
)->GetCongestionControlType());
1467 options
.push_back(kBYTE
);
1468 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1469 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1470 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1471 manager_
.SetFromConfig(config
);
1472 EXPECT_EQ(kCubicBytes
, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_
)
1473 ->GetCongestionControlType());
1476 options
.push_back(kRENO
);
1477 options
.push_back(kBYTE
);
1478 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1479 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1480 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1481 manager_
.SetFromConfig(config
);
1482 EXPECT_EQ(kRenoBytes
, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_
)
1483 ->GetCongestionControlType());
1486 TEST_F(QuicSentPacketManagerTest
, NegotiateNumConnectionsFromOptions
) {
1488 QuicTagVector options
;
1490 options
.push_back(k1CON
);
1491 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1492 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1493 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1494 EXPECT_CALL(*send_algorithm_
, SetNumEmulatedConnections(1));
1495 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1496 manager_
.SetFromConfig(config
);
1498 QuicSentPacketManagerPeer::SetPerspective(&manager_
, Perspective::IS_CLIENT
);
1499 QuicConfig client_config
;
1500 client_config
.SetConnectionOptionsToSend(options
);
1501 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1502 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1503 EXPECT_CALL(*send_algorithm_
, SetNumEmulatedConnections(1));
1504 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1505 manager_
.SetFromConfig(client_config
);
1508 TEST_F(QuicSentPacketManagerTest
, NegotiateNConnectionFromOptions
) {
1509 // By default, changing the number of open streams does nothing.
1510 manager_
.SetNumOpenStreams(5);
1513 QuicTagVector options
;
1515 options
.push_back(kNCON
);
1516 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1517 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1518 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1519 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1520 manager_
.SetFromConfig(config
);
1522 EXPECT_CALL(*send_algorithm_
, SetNumEmulatedConnections(5));
1523 manager_
.SetNumOpenStreams(5);
1526 TEST_F(QuicSentPacketManagerTest
, NegotiateNoTLPFromOptionsAtServer
) {
1528 QuicTagVector options
;
1530 options
.push_back(kNTLP
);
1531 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1532 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1533 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1534 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1535 manager_
.SetFromConfig(config
);
1536 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_
));
1539 TEST_F(QuicSentPacketManagerTest
, NegotiateNoTLPFromOptionsAtClient
) {
1540 QuicConfig client_config
;
1541 QuicTagVector options
;
1543 options
.push_back(kNTLP
);
1544 QuicSentPacketManagerPeer::SetPerspective(&manager_
, Perspective::IS_CLIENT
);
1545 client_config
.SetConnectionOptionsToSend(options
);
1546 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1547 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1548 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1549 manager_
.SetFromConfig(client_config
);
1550 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_
));
1553 TEST_F(QuicSentPacketManagerTest
, NegotiateTLPRttFromOptionsAtServer
) {
1555 QuicTagVector options
;
1557 options
.push_back(kTLPR
);
1558 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1559 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1560 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1561 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1562 manager_
.SetFromConfig(config
);
1564 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_
));
1567 TEST_F(QuicSentPacketManagerTest
, NegotiateTLPRttFromOptionsAtClient
) {
1568 QuicConfig client_config
;
1569 QuicTagVector options
;
1571 options
.push_back(kTLPR
);
1572 QuicSentPacketManagerPeer::SetPerspective(&manager_
, Perspective::IS_CLIENT
);
1573 client_config
.SetConnectionOptionsToSend(options
);
1574 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1575 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1576 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1577 manager_
.SetFromConfig(client_config
);
1579 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_
));
1582 TEST_F(QuicSentPacketManagerTest
, NegotiateNewRTOFromOptionsAtServer
) {
1583 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_
));
1585 QuicTagVector options
;
1587 options
.push_back(kNRTO
);
1588 QuicConfigPeer::SetReceivedConnectionOptions(&config
, options
);
1589 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1590 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1591 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1592 manager_
.SetFromConfig(config
);
1593 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_
));
1596 TEST_F(QuicSentPacketManagerTest
, NegotiateNewRTOFromOptionsAtClient
) {
1597 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_
));
1598 QuicConfig client_config
;
1599 QuicTagVector options
;
1601 options
.push_back(kNRTO
);
1602 QuicSentPacketManagerPeer::SetPerspective(&manager_
, Perspective::IS_CLIENT
);
1603 client_config
.SetConnectionOptionsToSend(options
);
1604 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1605 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1606 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1607 manager_
.SetFromConfig(client_config
);
1608 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_
));
1611 TEST_F(QuicSentPacketManagerTest
, NegotiateReceiveWindowFromOptions
) {
1612 ValueRestore
<bool> old_flag(&FLAGS_quic_use_conservative_receive_buffer
,
1614 EXPECT_EQ(kDefaultSocketReceiveBuffer
,
1615 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_
));
1617 // Try to set a size below the minimum and ensure it gets set to the min.
1618 QuicConfig client_config
;
1619 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config
, 1024);
1620 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1621 EXPECT_CALL(*send_algorithm_
,
1622 SetMaxCongestionWindow(kMinSocketReceiveBuffer
* 0.95));
1623 EXPECT_CALL(*send_algorithm_
, PacingRate())
1624 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1625 EXPECT_CALL(*send_algorithm_
, GetCongestionWindow())
1626 .WillOnce(Return(10 * kDefaultTCPMSS
));
1627 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1628 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1629 manager_
.SetFromConfig(client_config
);
1631 EXPECT_EQ(kMinSocketReceiveBuffer
,
1632 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_
));
1634 // Ensure the smaller send window only allows 16 packets to be sent.
1635 for (QuicPacketNumber i
= 1; i
<= 16; ++i
) {
1636 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
1637 QuicTime::Delta::Zero()));
1638 EXPECT_EQ(QuicTime::Delta::Zero(),
1639 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1640 EXPECT_CALL(*send_algorithm_
, OnPacketSent(_
, BytesInFlight(), i
, 1024,
1641 HAS_RETRANSMITTABLE_DATA
))
1642 .WillOnce(Return(true));
1643 SerializedPacket
packet(CreatePacket(i
, true));
1644 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(), 1024, NOT_RETRANSMISSION
,
1645 HAS_RETRANSMITTABLE_DATA
);
1647 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
))
1648 .WillOnce(Return(QuicTime::Delta::Infinite()));
1649 EXPECT_EQ(QuicTime::Delta::Infinite(),
1650 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1653 TEST_F(QuicSentPacketManagerTest
,
1654 NegotiateConservativeReceiveWindowFromOptions
) {
1655 ValueRestore
<bool> old_flag(&FLAGS_quic_use_conservative_receive_buffer
,
1657 EXPECT_EQ(kDefaultSocketReceiveBuffer
,
1658 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_
));
1660 // Try to set a size below the minimum and ensure it gets set to the min.
1661 QuicConfig client_config
;
1662 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config
, 1024);
1663 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1664 EXPECT_CALL(*send_algorithm_
,
1665 SetMaxCongestionWindow(kMinSocketReceiveBuffer
* 0.6));
1666 EXPECT_CALL(*send_algorithm_
, PacingRate())
1667 .WillRepeatedly(Return(QuicBandwidth::Zero()));
1668 EXPECT_CALL(*send_algorithm_
, GetCongestionWindow())
1669 .WillOnce(Return(10 * kDefaultTCPMSS
));
1670 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1671 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1672 manager_
.SetFromConfig(client_config
);
1674 EXPECT_EQ(kMinSocketReceiveBuffer
,
1675 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_
));
1677 // Ensure the smaller send window only allows 16 packets to be sent.
1678 for (QuicPacketNumber i
= 1; i
<= 16; ++i
) {
1679 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
))
1680 .WillOnce(Return(QuicTime::Delta::Zero()));
1681 EXPECT_EQ(QuicTime::Delta::Zero(),
1682 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1683 EXPECT_CALL(*send_algorithm_
, OnPacketSent(_
, BytesInFlight(), i
, 1024,
1684 HAS_RETRANSMITTABLE_DATA
))
1685 .WillOnce(Return(true));
1686 SerializedPacket
packet(CreatePacket(i
, true));
1687 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(), 1024, NOT_RETRANSMISSION
,
1688 HAS_RETRANSMITTABLE_DATA
);
1690 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
))
1691 .WillOnce(Return(QuicTime::Delta::Infinite()));
1692 EXPECT_EQ(QuicTime::Delta::Infinite(),
1693 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1696 TEST_F(QuicSentPacketManagerTest
, ReceiveWindowLimited
) {
1697 EXPECT_EQ(kDefaultSocketReceiveBuffer
,
1698 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_
));
1700 // Ensure the smaller send window only allows 256 * 0.95 packets to be sent.
1701 for (QuicPacketNumber i
= 1; i
<= 244; ++i
) {
1702 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
)).WillOnce(Return(
1703 QuicTime::Delta::Zero()));
1704 EXPECT_EQ(QuicTime::Delta::Zero(),
1705 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1706 EXPECT_CALL(*send_algorithm_
, OnPacketSent(_
, BytesInFlight(), i
, 1024,
1707 HAS_RETRANSMITTABLE_DATA
))
1708 .WillOnce(Return(true));
1709 SerializedPacket
packet(CreatePacket(i
, true));
1710 manager_
.OnPacketSent(&packet
, 0, clock_
.Now(), 1024, NOT_RETRANSMISSION
,
1711 HAS_RETRANSMITTABLE_DATA
);
1713 EXPECT_CALL(*send_algorithm_
, TimeUntilSend(_
, _
, _
))
1714 .WillOnce(Return(QuicTime::Delta::Infinite()));
1715 EXPECT_EQ(QuicTime::Delta::Infinite(),
1716 manager_
.TimeUntilSend(clock_
.Now(), HAS_RETRANSMITTABLE_DATA
));
1719 TEST_F(QuicSentPacketManagerTest
, UseInitialRoundTripTimeToSend
) {
1720 uint32 initial_rtt_us
= 325000;
1721 EXPECT_NE(initial_rtt_us
,
1722 manager_
.GetRttStats()->smoothed_rtt().ToMicroseconds());
1725 config
.SetInitialRoundTripTimeUsToSend(initial_rtt_us
);
1726 EXPECT_CALL(*send_algorithm_
, SetFromConfig(_
, _
));
1727 EXPECT_CALL(*network_change_visitor_
, OnCongestionWindowChange());
1728 EXPECT_CALL(*network_change_visitor_
, OnRttChange());
1729 manager_
.SetFromConfig(config
);
1731 EXPECT_EQ(0, manager_
.GetRttStats()->smoothed_rtt().ToMicroseconds());
1732 EXPECT_EQ(initial_rtt_us
, manager_
.GetRttStats()->initial_rtt_us());
1735 TEST_F(QuicSentPacketManagerTest
, ResumeConnectionState
) {
1736 // The sent packet manager should use the RTT from CachedNetworkParameters if
1738 const int kRttMs
= 1234;
1739 CachedNetworkParameters cached_network_params
;
1740 cached_network_params
.set_min_rtt_ms(kRttMs
);
1742 EXPECT_CALL(*send_algorithm_
, ResumeConnectionState(_
, false));
1743 manager_
.ResumeConnectionState(cached_network_params
, false);
1744 EXPECT_EQ(kRttMs
* kNumMicrosPerMilli
,
1745 static_cast<uint64
>(manager_
.GetRttStats()->initial_rtt_us()));