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;
20 using testing::Pointwise;
21 using testing::Return;
22 using testing::StrictMock;
29 // Default packet length.
30 const uint32 kDefaultLength = 1000;
32 // Matcher to check the key of the key-value pair it receives as first argument
33 // equals its second argument.
35 return std::tr1::get<0>(arg).first == std::tr1::get<1>(arg);
38 class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate {
40 MOCK_METHOD2(OnSpuriousPacketRetransmition,
41 void(TransmissionType transmission_type,
42 QuicByteCount byte_size));
45 class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> {
47 QuicSentPacketManagerTest()
48 : manager_(true, &clock_, &stats_, kCubic, kNack),
49 send_algorithm_(new StrictMock<MockSendAlgorithm>),
50 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) {
51 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
52 // Disable tail loss probes for most tests.
53 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
54 // Advance the time 1s so the send times are never QuicTime::Zero.
55 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
56 manager_.set_network_change_visitor(network_change_visitor_.get());
58 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
60 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
62 .WillRepeatedly(Return(QuicBandwidth::Zero()));
63 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
64 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
67 virtual ~QuicSentPacketManagerTest() override {
68 STLDeleteElements(&packets_);
71 QuicByteCount BytesInFlight() {
72 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_);
74 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets,
76 if (num_packets == 0) {
77 EXPECT_FALSE(manager_.HasUnackedPackets());
78 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
83 EXPECT_TRUE(manager_.HasUnackedPackets());
84 EXPECT_EQ(packets[0], manager_.GetLeastUnacked());
85 for (size_t i = 0; i < num_packets; ++i) {
86 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i];
90 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets,
92 EXPECT_EQ(num_packets,
93 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
95 for (size_t i = 0; i < num_packets; ++i) {
96 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i]))
97 << " packets[" << i << "]:" << packets[i];
101 void ExpectAck(QuicPacketSequenceNumber largest_observed) {
102 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
103 true, _, ElementsAre(Pair(largest_observed, _)), IsEmpty()));
104 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
107 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) {
108 EXPECT_CALL(*send_algorithm_,
109 OnCongestionEvent(true, _, IsEmpty(), IsEmpty()));
110 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
113 void ExpectAckAndLoss(bool rtt_updated,
114 QuicPacketSequenceNumber largest_observed,
115 QuicPacketSequenceNumber lost_packet) {
116 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
117 rtt_updated, _, ElementsAre(Pair(largest_observed, _)),
118 ElementsAre(Pair(lost_packet, _))));
119 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
122 // |packets_acked| and |packets_lost| should be in sequence number order.
123 void ExpectAcksAndLosses(bool rtt_updated,
124 QuicPacketSequenceNumber* packets_acked,
125 size_t num_packets_acked,
126 QuicPacketSequenceNumber* packets_lost,
127 size_t num_packets_lost) {
128 vector<QuicPacketSequenceNumber> ack_vector;
129 for (size_t i = 0; i < num_packets_acked; ++i) {
130 ack_vector.push_back(packets_acked[i]);
132 vector<QuicPacketSequenceNumber> lost_vector;
133 for (size_t i = 0; i < num_packets_lost; ++i) {
134 lost_vector.push_back(packets_lost[i]);
136 EXPECT_CALL(*send_algorithm_,
137 OnCongestionEvent(rtt_updated, _,
138 Pointwise(KeyEq(), ack_vector),
139 Pointwise(KeyEq(), lost_vector)));
140 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange()).
144 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number,
145 QuicPacketSequenceNumber new_sequence_number) {
146 QuicSentPacketManagerPeer::MarkForRetransmission(
147 &manager_, old_sequence_number, TLP_RETRANSMISSION);
148 EXPECT_TRUE(manager_.HasPendingRetransmissions());
149 QuicSentPacketManager::PendingRetransmission next_retransmission =
150 manager_.NextPendingRetransmission();
151 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number);
152 EXPECT_EQ(TLP_RETRANSMISSION,
153 next_retransmission.transmission_type);
155 EXPECT_CALL(*send_algorithm_,
156 OnPacketSent(_, BytesInFlight(), new_sequence_number,
157 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
158 .WillOnce(Return(true));
159 SerializedPacket packet(CreatePacket(new_sequence_number, false));
160 manager_.OnPacketSent(&packet,
165 HAS_RETRANSMITTABLE_DATA);
166 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(
167 &manager_, new_sequence_number));
170 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) {
171 return CreatePacket(sequence_number, true);
174 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number,
175 bool retransmittable) {
176 packets_.push_back(QuicPacket::NewDataPacket(
177 nullptr, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
178 PACKET_6BYTE_SEQUENCE_NUMBER));
179 return SerializedPacket(
180 sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, packets_.back(), 0u,
181 retransmittable ? new RetransmittableFrames() : nullptr);
184 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) {
185 packets_.push_back(QuicPacket::NewFecPacket(
186 nullptr, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
187 PACKET_6BYTE_SEQUENCE_NUMBER));
188 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
189 packets_.back(), 0u, nullptr);
192 void SendDataPacket(QuicPacketSequenceNumber sequence_number) {
193 EXPECT_CALL(*send_algorithm_,
194 OnPacketSent(_, BytesInFlight(), sequence_number, _, _))
195 .Times(1).WillOnce(Return(true));
196 SerializedPacket packet(CreateDataPacket(sequence_number));
197 manager_.OnPacketSent(&packet, 0, clock_.Now(),
198 packet.packet->length(), NOT_RETRANSMISSION,
199 HAS_RETRANSMITTABLE_DATA);
202 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) {
203 EXPECT_CALL(*send_algorithm_,
204 OnPacketSent(_, BytesInFlight(), sequence_number,
205 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
206 .Times(1).WillOnce(Return(true));
207 SerializedPacket packet(CreateDataPacket(sequence_number));
208 packet.retransmittable_frames->AddStreamFrame(
209 new QuicStreamFrame(1, false, 0, IOVector()));
210 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE);
211 manager_.OnPacketSent(&packet, 0, clock_.Now(),
212 packet.packet->length(), NOT_RETRANSMISSION,
213 HAS_RETRANSMITTABLE_DATA);
216 void SendFecPacket(QuicPacketSequenceNumber sequence_number) {
217 EXPECT_CALL(*send_algorithm_,
218 OnPacketSent(_, BytesInFlight(), sequence_number,
219 kDefaultLength, NO_RETRANSMITTABLE_DATA))
220 .Times(1).WillOnce(Return(true));
221 SerializedPacket packet(CreateFecPacket(sequence_number));
222 manager_.OnPacketSent(&packet, 0, clock_.Now(),
223 packet.packet->length(), NOT_RETRANSMISSION,
224 NO_RETRANSMITTABLE_DATA);
227 void SendAckPacket(QuicPacketSequenceNumber sequence_number) {
228 EXPECT_CALL(*send_algorithm_,
229 OnPacketSent(_, BytesInFlight(), sequence_number,
230 kDefaultLength, NO_RETRANSMITTABLE_DATA))
231 .Times(1).WillOnce(Return(false));
232 SerializedPacket packet(CreatePacket(sequence_number, false));
233 manager_.OnPacketSent(&packet, 0, clock_.Now(),
234 packet.packet->length(), NOT_RETRANSMISSION,
235 NO_RETRANSMITTABLE_DATA);
238 // Based on QuicConnection's WritePendingRetransmissions.
239 void RetransmitNextPacket(
240 QuicPacketSequenceNumber retransmission_sequence_number) {
241 EXPECT_TRUE(manager_.HasPendingRetransmissions());
242 EXPECT_CALL(*send_algorithm_,
243 OnPacketSent(_, _, retransmission_sequence_number,
244 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
245 .Times(1).WillOnce(Return(true));
246 const QuicSentPacketManager::PendingRetransmission pending =
247 manager_.NextPendingRetransmission();
248 SerializedPacket packet(
249 CreatePacket(retransmission_sequence_number, false));
250 manager_.OnPacketSent(&packet, pending.sequence_number, clock_.Now(),
251 kDefaultLength, pending.transmission_type,
252 HAS_RETRANSMITTABLE_DATA);
255 QuicSentPacketManager manager_;
256 vector<QuicPacket*> packets_;
258 QuicConnectionStats stats_;
259 MockSendAlgorithm* send_algorithm_;
260 scoped_ptr<MockNetworkChangeVisitor> network_change_visitor_;
263 TEST_F(QuicSentPacketManagerTest, IsUnacked) {
264 VerifyUnackedPackets(nullptr, 0);
267 QuicPacketSequenceNumber unacked[] = { 1 };
268 VerifyUnackedPackets(unacked, arraysize(unacked));
269 QuicPacketSequenceNumber retransmittable[] = { 1 };
270 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
273 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
275 RetransmitAndSendPacket(1, 2);
277 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
278 QuicPacketSequenceNumber unacked[] = { 1, 2 };
279 VerifyUnackedPackets(unacked, arraysize(unacked));
280 QuicPacketSequenceNumber retransmittable[] = { 2 };
281 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
284 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
286 RetransmitAndSendPacket(1, 2);
289 QuicAckFrame ack_frame;
290 ack_frame.largest_observed = 2;
291 ack_frame.missing_packets.insert(1);
293 manager_.OnIncomingAck(ack_frame, clock_.Now());
295 // Packet 1 is unacked, pending, but not retransmittable.
296 QuicPacketSequenceNumber unacked[] = { 1 };
297 VerifyUnackedPackets(unacked, arraysize(unacked));
298 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
299 VerifyRetransmittablePackets(nullptr, 0);
302 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
304 QuicSentPacketManagerPeer::MarkForRetransmission(
305 &manager_, 1, TLP_RETRANSMISSION);
306 EXPECT_TRUE(manager_.HasPendingRetransmissions());
309 QuicAckFrame ack_frame;
310 ack_frame.largest_observed = 1;
312 manager_.OnIncomingAck(ack_frame, clock_.Now());
314 // There should no longer be a pending retransmission.
315 EXPECT_FALSE(manager_.HasPendingRetransmissions());
317 // No unacked packets remain.
318 VerifyUnackedPackets(nullptr, 0);
319 VerifyRetransmittablePackets(nullptr, 0);
320 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
323 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
325 RetransmitAndSendPacket(1, 2);
326 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
327 clock_.AdvanceTime(rtt);
331 QuicAckFrame ack_frame;
332 ack_frame.largest_observed = 1;
333 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
335 // 2 remains unacked, but no packets have retransmittable data.
336 QuicPacketSequenceNumber unacked[] = { 2 };
337 VerifyUnackedPackets(unacked, arraysize(unacked));
338 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
339 VerifyRetransmittablePackets(nullptr, 0);
341 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
344 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
346 RetransmitAndSendPacket(1, 2);
347 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
348 clock_.AdvanceTime(rtt);
350 // First, ACK packet 1 which makes packet 2 non-retransmittable.
352 QuicAckFrame ack_frame;
353 ack_frame.largest_observed = 1;
354 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
359 clock_.AdvanceTime(rtt);
361 // Next, NACK packet 2 three times.
362 ack_frame.largest_observed = 3;
363 ack_frame.missing_packets.insert(2);
365 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
367 ack_frame.largest_observed = 4;
369 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
371 ack_frame.largest_observed = 5;
372 ExpectAckAndLoss(true, 5, 2);
373 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
375 // No packets remain unacked.
376 VerifyUnackedPackets(nullptr, 0);
377 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
378 VerifyRetransmittablePackets(nullptr, 0);
380 // Verify that the retransmission alarm would not fire,
381 // since there is no retransmittable data outstanding.
382 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
385 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) {
387 RetransmitAndSendPacket(1, 2);
389 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
390 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
391 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
392 manager_.OnRetransmissionTimeout();
393 EXPECT_TRUE(manager_.HasPendingRetransmissions());
395 // Ack 1 but not 2, before 2 is able to be sent.
396 // Since 1 has been retransmitted, it has already been lost, and so the
397 // send algorithm is not informed that it has been ACK'd.
398 QuicAckFrame ack_frame;
399 ack_frame.largest_observed = 1;
401 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
402 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
404 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
405 QuicPacketSequenceNumber unacked[] = { 2 };
406 VerifyUnackedPackets(unacked, arraysize(unacked));
407 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
408 VerifyRetransmittablePackets(nullptr, 0);
410 // Verify that the retransmission alarm would not fire,
411 // since there is no retransmittable data outstanding.
412 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
415 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
416 StrictMock<MockDebugDelegate> debug_delegate;
417 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmition(
418 TLP_RETRANSMISSION, kDefaultLength)).Times(2);
419 manager_.set_debug_delegate(&debug_delegate);
422 RetransmitAndSendPacket(1, 2);
423 RetransmitAndSendPacket(2, 3);
424 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
425 clock_.AdvanceTime(rtt);
427 // Ack 1 but not 2 or 3.
429 QuicAckFrame ack_frame;
430 ack_frame.largest_observed = 1;
431 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
433 // 2 and 3 remain unacked, but no packets have retransmittable data.
434 QuicPacketSequenceNumber unacked[] = { 2, 3 };
435 VerifyUnackedPackets(unacked, arraysize(unacked));
436 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
437 VerifyRetransmittablePackets(nullptr, 0);
439 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
441 ack_frame.largest_observed = 4;
442 ack_frame.missing_packets.insert(2);
443 QuicPacketSequenceNumber acked[] = { 3, 4 };
444 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
445 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
447 QuicPacketSequenceNumber unacked2[] = { 2 };
448 VerifyUnackedPackets(unacked2, arraysize(unacked2));
449 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
452 ack_frame.largest_observed = 5;
453 ExpectAckAndLoss(true, 5, 2);
454 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
456 VerifyUnackedPackets(nullptr, 0);
457 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
458 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted);
461 TEST_F(QuicSentPacketManagerTest, LoseButDontRetransmitRevivedPacket) {
467 // Ack 2 and 3, and mark 1 as revived.
468 QuicAckFrame ack_frame;
469 ack_frame.largest_observed = 3;
470 ack_frame.missing_packets.insert(1);
471 ack_frame.revived_packets.insert(1);
472 QuicPacketSequenceNumber acked[] = { 2, 3 };
473 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
474 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
476 EXPECT_FALSE(manager_.HasPendingRetransmissions());
477 QuicPacketSequenceNumber unacked[] = { 1, 4 };
478 VerifyUnackedPackets(unacked, arraysize(unacked));
479 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
480 QuicPacketSequenceNumber retransmittable[] = { 4 };
481 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
483 // Ack the 4th packet and expect the 1st to be considered lost.
484 ack_frame.largest_observed = 4;
485 ExpectAckAndLoss(true, 4, 1);
486 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
488 EXPECT_FALSE(manager_.HasPendingRetransmissions());
489 VerifyRetransmittablePackets(nullptr, 0);
492 TEST_F(QuicSentPacketManagerTest, MarkLostThenReviveAndDontRetransmitPacket) {
499 // Ack 2, 3, and 4, and expect the 1st to be considered lost.
500 QuicAckFrame ack_frame;
501 ack_frame.largest_observed = 4;
502 ack_frame.missing_packets.insert(1);
503 QuicPacketSequenceNumber acked[] = { 2, 3, 4 };
504 QuicPacketSequenceNumber lost[] = { 1 };
505 ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost));
506 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
508 EXPECT_TRUE(manager_.HasPendingRetransmissions());
509 QuicPacketSequenceNumber unacked[] = { 1, 5 };
510 VerifyUnackedPackets(unacked, arraysize(unacked));
511 QuicPacketSequenceNumber retransmittable[] = { 1 };
512 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
514 // Ack 5th packet (FEC) and revive 1st packet. 1st packet should now be
515 // removed from pending retransmissions map.
516 ack_frame.largest_observed = 5;
517 ack_frame.revived_packets.insert(1);
519 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
521 EXPECT_FALSE(manager_.HasPendingRetransmissions());
522 VerifyRetransmittablePackets(nullptr, 0);
525 TEST_F(QuicSentPacketManagerTest, TruncatedAck) {
527 RetransmitAndSendPacket(1, 2);
528 RetransmitAndSendPacket(2, 3);
529 RetransmitAndSendPacket(3, 4);
530 RetransmitAndSendPacket(4, 5);
532 // Truncated ack with 4 NACKs, so the first packet is lost.
533 QuicAckFrame ack_frame;
534 ack_frame.largest_observed = 4;
535 ack_frame.missing_packets.insert(1);
536 ack_frame.missing_packets.insert(2);
537 ack_frame.missing_packets.insert(3);
538 ack_frame.missing_packets.insert(4);
539 ack_frame.is_truncated = true;
541 QuicPacketSequenceNumber lost[] = { 1 };
542 ExpectAcksAndLosses(true, nullptr, 0, lost, arraysize(lost));
543 manager_.OnIncomingAck(ack_frame, clock_.Now());
545 // High water mark will be raised.
546 QuicPacketSequenceNumber unacked[] = { 2, 3, 4, 5 };
547 VerifyUnackedPackets(unacked, arraysize(unacked));
548 QuicPacketSequenceNumber retransmittable[] = { 5 };
549 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
552 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) {
554 RetransmitAndSendPacket(1, 2);
555 RetransmitAndSendPacket(2, 3);
556 RetransmitAndSendPacket(3, 4);
563 // Ack previous transmission
565 QuicAckFrame ack_frame;
566 ack_frame.largest_observed = 2;
567 ack_frame.missing_packets.insert(1);
569 manager_.OnIncomingAck(ack_frame, clock_.Now());
570 EXPECT_TRUE(manager_.IsUnacked(4));
573 // Truncated ack with 4 NACKs
575 QuicAckFrame ack_frame;
576 ack_frame.largest_observed = 6;
577 ack_frame.missing_packets.insert(3);
578 ack_frame.missing_packets.insert(4);
579 ack_frame.missing_packets.insert(5);
580 ack_frame.missing_packets.insert(6);
581 ack_frame.is_truncated = true;
582 ExpectAckAndLoss(true, 1, 3);
583 manager_.OnIncomingAck(ack_frame, clock_.Now());
586 // High water mark will be raised.
587 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 };
588 VerifyUnackedPackets(unacked, arraysize(unacked));
589 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 };
590 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
593 TEST_F(QuicSentPacketManagerTest, GetLeastUnacked) {
594 EXPECT_EQ(1u, manager_.GetLeastUnacked());
597 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnacked) {
599 EXPECT_EQ(1u, manager_.GetLeastUnacked());
602 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedUnackedFec) {
604 EXPECT_EQ(1u, manager_.GetLeastUnacked());
607 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedAndDiscard) {
608 VerifyUnackedPackets(nullptr, 0);
611 EXPECT_EQ(1u, manager_.GetLeastUnacked());
614 EXPECT_EQ(1u, manager_.GetLeastUnacked());
617 EXPECT_EQ(1u, manager_.GetLeastUnacked());
619 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 };
620 VerifyUnackedPackets(unacked, arraysize(unacked));
621 VerifyRetransmittablePackets(nullptr, 0);
623 // Ack 2, so there's an rtt update.
625 QuicAckFrame ack_frame;
626 ack_frame.largest_observed = 2;
627 ack_frame.missing_packets.insert(1);
628 manager_.OnIncomingAck(ack_frame, clock_.Now());
630 EXPECT_EQ(1u, manager_.GetLeastUnacked());
633 TEST_F(QuicSentPacketManagerTest, GetSentTime) {
634 VerifyUnackedPackets(nullptr, 0);
636 QuicTime sent_time = clock_.Now();
638 QuicTime sent_time2 = clock_.Now();
640 QuicPacketSequenceNumber unacked[] = { 1, 2 };
641 VerifyUnackedPackets(unacked, arraysize(unacked));
642 VerifyRetransmittablePackets(nullptr, 0);
644 EXPECT_TRUE(manager_.HasUnackedPackets());
645 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 1));
646 EXPECT_EQ(sent_time2, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2));
649 TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
653 // Now ack the ack and expect an RTT update.
654 QuicAckFrame ack_frame;
655 ack_frame.largest_observed = 2;
656 ack_frame.delta_time_largest_observed =
657 QuicTime::Delta::FromMilliseconds(5);
660 manager_.OnIncomingAck(ack_frame, clock_.Now());
664 // Now ack the ack and expect only an RTT update.
665 ack_frame.largest_observed = 3;
667 manager_.OnIncomingAck(ack_frame, clock_.Now());
670 TEST_F(QuicSentPacketManagerTest, Rtt) {
671 QuicPacketSequenceNumber sequence_number = 1;
672 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15);
673 SendDataPacket(sequence_number);
674 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
676 ExpectAck(sequence_number);
677 QuicAckFrame ack_frame;
678 ack_frame.largest_observed = sequence_number;
679 ack_frame.delta_time_largest_observed =
680 QuicTime::Delta::FromMilliseconds(5);
681 manager_.OnIncomingAck(ack_frame, clock_.Now());
682 EXPECT_EQ(expected_rtt,
683 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
686 TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
687 // Expect that the RTT is equal to the local time elapsed, since the
688 // delta_time_largest_observed is larger than the local time elapsed
689 // and is hence invalid.
690 QuicPacketSequenceNumber sequence_number = 1;
691 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
692 SendDataPacket(sequence_number);
693 clock_.AdvanceTime(expected_rtt);
695 ExpectAck(sequence_number);
696 QuicAckFrame ack_frame;
697 ack_frame.largest_observed = sequence_number;
698 ack_frame.delta_time_largest_observed =
699 QuicTime::Delta::FromMilliseconds(11);
700 manager_.OnIncomingAck(ack_frame, clock_.Now());
701 EXPECT_EQ(expected_rtt,
702 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
705 TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
706 // Expect that the RTT is equal to the local time elapsed, since the
707 // delta_time_largest_observed is infinite, and is hence invalid.
708 QuicPacketSequenceNumber sequence_number = 1;
709 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
710 SendDataPacket(sequence_number);
711 clock_.AdvanceTime(expected_rtt);
713 ExpectAck(sequence_number);
714 QuicAckFrame ack_frame;
715 ack_frame.largest_observed = sequence_number;
716 ack_frame.delta_time_largest_observed = QuicTime::Delta::Infinite();
717 manager_.OnIncomingAck(ack_frame, clock_.Now());
718 EXPECT_EQ(expected_rtt,
719 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
722 TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
723 // Expect that the RTT is the time between send and receive since the
724 // delta_time_largest_observed is zero.
725 QuicPacketSequenceNumber sequence_number = 1;
726 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
727 SendDataPacket(sequence_number);
728 clock_.AdvanceTime(expected_rtt);
730 ExpectAck(sequence_number);
731 QuicAckFrame ack_frame;
732 ack_frame.largest_observed = sequence_number;
733 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero();
734 manager_.OnIncomingAck(ack_frame, clock_.Now());
735 EXPECT_EQ(expected_rtt,
736 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
739 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
740 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
743 QuicPacketSequenceNumber sequence_number = 1;
744 SendDataPacket(sequence_number);
746 // The first tail loss probe retransmits 1 packet.
747 manager_.OnRetransmissionTimeout();
748 EXPECT_EQ(QuicTime::Delta::Zero(),
749 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
750 EXPECT_FALSE(manager_.HasPendingRetransmissions());
751 manager_.MaybeRetransmitTailLossProbe();
752 EXPECT_TRUE(manager_.HasPendingRetransmissions());
753 RetransmitNextPacket(2);
754 EXPECT_FALSE(manager_.HasPendingRetransmissions());
756 // The second tail loss probe retransmits 1 packet.
757 manager_.OnRetransmissionTimeout();
758 EXPECT_EQ(QuicTime::Delta::Zero(),
759 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
760 EXPECT_FALSE(manager_.HasPendingRetransmissions());
761 manager_.MaybeRetransmitTailLossProbe();
762 EXPECT_TRUE(manager_.HasPendingRetransmissions());
763 RetransmitNextPacket(3);
764 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
765 QuicTime::Delta::Infinite()));
766 EXPECT_EQ(QuicTime::Delta::Infinite(),
767 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
768 EXPECT_FALSE(manager_.HasPendingRetransmissions());
770 // Ack the third and ensure the first two are still pending.
772 QuicAckFrame ack_frame;
773 ack_frame.largest_observed = 3;
774 ack_frame.missing_packets.insert(1);
775 ack_frame.missing_packets.insert(2);
776 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
778 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
780 // Acking two more packets will lose both of them due to nacks.
781 ack_frame.largest_observed = 5;
782 QuicPacketSequenceNumber lost[] = { 1, 2 };
783 ExpectAcksAndLosses(false, nullptr, 0, lost, arraysize(lost));
784 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
786 EXPECT_FALSE(manager_.HasPendingRetransmissions());
787 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
788 EXPECT_EQ(2u, stats_.tlp_count);
789 EXPECT_EQ(0u, stats_.rto_count);
792 TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
793 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
796 const size_t kNumSentPackets = 100;
797 for (size_t i = 1; i <= kNumSentPackets; ++i) {
801 // The first tail loss probe retransmits 1 packet.
802 manager_.OnRetransmissionTimeout();
803 EXPECT_EQ(QuicTime::Delta::Zero(),
804 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
805 EXPECT_FALSE(manager_.HasPendingRetransmissions());
806 manager_.MaybeRetransmitTailLossProbe();
807 EXPECT_TRUE(manager_.HasPendingRetransmissions());
808 RetransmitNextPacket(101);
809 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
810 QuicTime::Delta::Infinite()));
811 EXPECT_EQ(QuicTime::Delta::Infinite(),
812 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
813 EXPECT_FALSE(manager_.HasPendingRetransmissions());
815 // The second tail loss probe retransmits 1 packet.
816 manager_.OnRetransmissionTimeout();
817 EXPECT_EQ(QuicTime::Delta::Zero(),
818 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
819 EXPECT_FALSE(manager_.HasPendingRetransmissions());
820 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
821 EXPECT_TRUE(manager_.HasPendingRetransmissions());
822 RetransmitNextPacket(102);
823 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
824 QuicTime::Delta::Infinite()));
825 EXPECT_EQ(QuicTime::Delta::Infinite(),
826 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
828 // Advance the time enough to ensure all packets are RTO'd.
829 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
831 // The final RTO abandons all of them.
832 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
833 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
834 manager_.OnRetransmissionTimeout();
835 EXPECT_TRUE(manager_.HasPendingRetransmissions());
836 EXPECT_EQ(2u, stats_.tlp_count);
837 EXPECT_EQ(1u, stats_.rto_count);
840 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
841 // Send 2 crypto packets and 3 data packets.
842 const size_t kNumSentCryptoPackets = 2;
843 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
846 const size_t kNumSentDataPackets = 3;
847 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
848 SendDataPacket(kNumSentCryptoPackets + i);
850 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
852 // The first retransmits 2 packets.
853 manager_.OnRetransmissionTimeout();
854 EXPECT_EQ(QuicTime::Delta::Zero(),
855 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
856 RetransmitNextPacket(6);
857 RetransmitNextPacket(7);
858 EXPECT_FALSE(manager_.HasPendingRetransmissions());
859 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
861 // The second retransmits 2 packets.
862 manager_.OnRetransmissionTimeout();
863 EXPECT_EQ(QuicTime::Delta::Zero(),
864 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
865 RetransmitNextPacket(8);
866 RetransmitNextPacket(9);
867 EXPECT_FALSE(manager_.HasPendingRetransmissions());
868 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
870 // Now ack the two crypto packets and the speculatively encrypted request,
871 // and ensure the first four crypto packets get abandoned, but not lost.
872 QuicPacketSequenceNumber acked[] = { 3, 4, 5, 8, 9 };
873 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0);
874 QuicAckFrame ack_frame;
875 ack_frame.largest_observed = 9;
876 ack_frame.missing_packets.insert(1);
877 ack_frame.missing_packets.insert(2);
878 ack_frame.missing_packets.insert(6);
879 ack_frame.missing_packets.insert(7);
880 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
882 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
885 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
886 // Send 2 crypto packets and 3 data packets.
887 const size_t kNumSentCryptoPackets = 2;
888 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
891 const size_t kNumSentDataPackets = 3;
892 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
893 SendDataPacket(kNumSentCryptoPackets + i);
895 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
897 // The first retransmission timeout retransmits 2 crypto packets.
898 manager_.OnRetransmissionTimeout();
899 RetransmitNextPacket(6);
900 RetransmitNextPacket(7);
901 EXPECT_FALSE(manager_.HasPendingRetransmissions());
902 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
904 // Now act like a version negotiation packet arrived, which would cause all
905 // unacked packets to be retransmitted.
906 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
908 // Ensure the first two pending packets are the crypto retransmits.
909 ASSERT_TRUE(manager_.HasPendingRetransmissions());
910 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number);
911 RetransmitNextPacket(8);
912 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number);
913 RetransmitNextPacket(9);
915 EXPECT_TRUE(manager_.HasPendingRetransmissions());
916 // Send 3 more data packets and ensure the least unacked is raised.
917 RetransmitNextPacket(10);
918 RetransmitNextPacket(11);
919 RetransmitNextPacket(12);
920 EXPECT_FALSE(manager_.HasPendingRetransmissions());
922 EXPECT_EQ(8u, manager_.GetLeastUnacked());
925 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
926 // Send 1 crypto packet.
928 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
930 // Retransmit the crypto packet as 2.
931 manager_.OnRetransmissionTimeout();
932 RetransmitNextPacket(2);
934 // Retransmit the crypto packet as 3.
935 manager_.OnRetransmissionTimeout();
936 RetransmitNextPacket(3);
938 // Now ack the second crypto packet, and ensure the first gets removed, but
939 // the third does not.
941 QuicAckFrame ack_frame;
942 ack_frame.largest_observed = 2;
943 ack_frame.missing_packets.insert(1);
944 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
946 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
947 QuicPacketSequenceNumber unacked[] = { 3 };
948 VerifyUnackedPackets(unacked, arraysize(unacked));
951 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
952 // Send 2 crypto packets and 1 data packet.
953 const size_t kNumSentCryptoPackets = 2;
954 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
958 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
960 // Retransmit 2 crypto packets, but not the serialized packet.
961 manager_.OnRetransmissionTimeout();
962 RetransmitNextPacket(4);
963 RetransmitNextPacket(5);
964 EXPECT_FALSE(manager_.HasPendingRetransmissions());
965 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
968 TEST_F(QuicSentPacketManagerTest,
969 CryptoHandshakeRetransmissionThenRetransmitAll) {
970 // Send 1 crypto packet.
972 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
974 // Retransmit the crypto packet as 2.
975 manager_.OnRetransmissionTimeout();
976 RetransmitNextPacket(2);
978 // Now retransmit all the unacked packets, which occurs when there is a
979 // version negotiation.
980 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
981 QuicPacketSequenceNumber unacked[] = { 1, 2 };
982 VerifyUnackedPackets(unacked, arraysize(unacked));
983 EXPECT_TRUE(manager_.HasPendingRetransmissions());
984 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
985 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
988 TEST_F(QuicSentPacketManagerTest,
989 CryptoHandshakeRetransmissionThenNeuterAndAck) {
990 // Send 1 crypto packet.
992 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
994 // Retransmit the crypto packet as 2.
995 manager_.OnRetransmissionTimeout();
996 RetransmitNextPacket(2);
998 // Retransmit the crypto packet as 3.
999 manager_.OnRetransmissionTimeout();
1000 RetransmitNextPacket(3);
1002 // Now neuter all unacked unencrypted packets, which occurs when the
1003 // connection goes forward secure.
1004 manager_.NeuterUnencryptedPackets();
1005 QuicPacketSequenceNumber unacked[] = { 1, 2, 3};
1006 VerifyUnackedPackets(unacked, arraysize(unacked));
1007 VerifyRetransmittablePackets(nullptr, 0);
1008 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1009 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1010 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1012 // Ensure both packets get discarded when packet 2 is acked.
1013 QuicAckFrame ack_frame;
1014 ack_frame.largest_observed = 3;
1015 ack_frame.missing_packets.insert(1);
1016 ack_frame.missing_packets.insert(2);
1017 ExpectUpdatedRtt(3);
1018 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
1019 VerifyUnackedPackets(nullptr, 0);
1020 VerifyRetransmittablePackets(nullptr, 0);
1023 TEST_F(QuicSentPacketManagerTest, ResetRecentMinRTTWithEmptyWindow) {
1024 QuicTime::Delta min_rtt = QuicTime::Delta::FromMilliseconds(50);
1025 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
1026 min_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
1028 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
1030 QuicSentPacketManagerPeer::GetRttStats(
1031 &manager_)->recent_min_rtt());
1033 // Send two packets with no prior bytes in flight.
1037 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100));
1038 // Ack two packets with 100ms RTT observations.
1039 QuicAckFrame ack_frame;
1040 ack_frame.delta_time_largest_observed = QuicTime::Delta::Zero();
1041 ack_frame.largest_observed = 1;
1043 manager_.OnIncomingAck(ack_frame, clock_.Now());
1045 // First ack does not change recent min rtt.
1047 QuicSentPacketManagerPeer::GetRttStats(
1048 &manager_)->recent_min_rtt());
1050 ack_frame.largest_observed = 2;
1052 manager_.OnIncomingAck(ack_frame, clock_.Now());
1055 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
1056 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100),
1057 QuicSentPacketManagerPeer::GetRttStats(
1058 &manager_)->recent_min_rtt());
1061 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
1062 // Send 100 packets and then ensure all are abandoned when the RTO fires.
1063 const size_t kNumSentPackets = 100;
1064 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1068 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1069 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1070 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1071 manager_.OnRetransmissionTimeout();
1074 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
1075 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1078 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
1079 SendCryptoPacket(1);
1082 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
1083 rtt_stats->set_initial_rtt_us(1 * base::Time::kMicrosecondsPerMillisecond);
1084 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1085 manager_.GetRetransmissionTime());
1087 // Test with a standard smoothed RTT.
1088 rtt_stats->set_initial_rtt_us(100 * base::Time::kMicrosecondsPerMillisecond);
1090 QuicTime::Delta srtt =
1091 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
1092 QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5));
1093 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1095 // Retransmit the packet by invoking the retransmission timeout.
1096 clock_.AdvanceTime(srtt.Multiply(1.5));
1097 manager_.OnRetransmissionTimeout();
1098 RetransmitNextPacket(2);
1100 // The retransmission time should now be twice as far in the future.
1101 expected_time = clock_.Now().Add(srtt.Multiply(2).Multiply(1.5));
1102 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1105 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
1106 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1111 RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
1112 rtt_stats->set_initial_rtt_us(1 * base::Time::kMicrosecondsPerMillisecond);
1113 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1114 manager_.GetRetransmissionTime());
1116 // Test with a standard smoothed RTT.
1117 rtt_stats->set_initial_rtt_us(100 * base::Time::kMicrosecondsPerMillisecond);
1118 QuicTime::Delta srtt =
1119 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
1120 QuicTime::Delta expected_tlp_delay = srtt.Multiply(2);
1121 QuicTime expected_time = clock_.Now().Add(expected_tlp_delay);
1122 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1124 // Retransmit the packet by invoking the retransmission timeout.
1125 clock_.AdvanceTime(expected_tlp_delay);
1126 manager_.OnRetransmissionTimeout();
1127 EXPECT_EQ(QuicTime::Delta::Zero(),
1128 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1129 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1130 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1131 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1132 RetransmitNextPacket(3);
1133 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
1134 QuicTime::Delta::Infinite()));
1135 EXPECT_EQ(QuicTime::Delta::Infinite(),
1136 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1137 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1139 expected_time = clock_.Now().Add(expected_tlp_delay);
1140 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1143 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeRTO) {
1144 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
1145 QuicTime::Delta::FromMilliseconds(100),
1146 QuicTime::Delta::Zero(),
1154 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500);
1155 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1156 .WillRepeatedly(Return(expected_rto_delay));
1157 QuicTime expected_time = clock_.Now().Add(expected_rto_delay);
1158 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1160 // Retransmit the packet by invoking the retransmission timeout.
1161 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1162 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1163 clock_.AdvanceTime(expected_rto_delay);
1164 manager_.OnRetransmissionTimeout();
1165 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
1166 RetransmitNextPacket(5);
1167 RetransmitNextPacket(6);
1168 EXPECT_EQ(2 * kDefaultLength,
1169 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
1170 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1172 // The delay should double the second time.
1173 expected_time = clock_.Now().Add(expected_rto_delay).Add(expected_rto_delay);
1174 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1176 // Ack a packet and ensure the RTO goes back to the original value.
1177 QuicAckFrame ack_frame;
1178 ack_frame.largest_observed = 2;
1179 ack_frame.missing_packets.insert(1);
1180 ExpectUpdatedRtt(2);
1181 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
1182 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow());
1183 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1184 EXPECT_EQ(4 * kDefaultLength,
1185 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_));
1187 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time
1188 // and the TLP time. In production, there would always be two TLP's first.
1189 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced
1190 // by the latest RTT sample of 500ms.
1191 expected_time = clock_.Now().Add(QuicTime::Delta::FromMilliseconds(1000));
1192 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1195 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
1197 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1198 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1)));
1199 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1201 // If the delay is smaller than the min, ensure it exponentially backs off
1203 for (int i = 0; i < 5; ++i) {
1205 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1206 delay = delay.Add(delay);
1207 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1208 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1209 manager_.OnRetransmissionTimeout();
1210 RetransmitNextPacket(i + 2);
1214 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
1215 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1216 .WillOnce(Return(QuicTime::Delta::FromSeconds(500)));
1218 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1219 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1222 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) {
1224 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1225 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1226 .WillRepeatedly(Return(delay));
1228 // Delay should back off exponentially.
1229 for (int i = 0; i < 5; ++i) {
1231 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1232 delay = delay.Add(delay);
1233 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1234 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1235 manager_.OnRetransmissionTimeout();
1236 RetransmitNextPacket(i + 2);
1240 TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
1241 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm();
1242 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm);
1244 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1245 .WillRepeatedly(Return(QuicTime::Zero()));
1249 // Handle an ack which causes the loss algorithm to be evaluated and
1250 // set the loss timeout.
1252 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1253 .WillOnce(Return(SequenceNumberSet()));
1254 QuicAckFrame ack_frame;
1255 ack_frame.largest_observed = 2;
1256 ack_frame.missing_packets.insert(1);
1257 manager_.OnIncomingAck(ack_frame, clock_.Now());
1259 QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)));
1260 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1261 .WillRepeatedly(Return(timeout));
1262 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1264 // Fire the retransmission timeout and ensure the loss detection algorithm
1266 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1267 .WillOnce(Return(SequenceNumberSet()));
1268 manager_.OnRetransmissionTimeout();
1271 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) {
1273 QuicSentPacketManagerPeer::GetLossAlgorithm(
1274 &manager_)->GetLossDetectionType());
1277 QuicTagVector options;
1278 options.push_back(kTIME);
1279 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1280 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1281 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1282 manager_.SetFromConfig(config);
1285 QuicSentPacketManagerPeer::GetLossAlgorithm(
1286 &manager_)->GetLossDetectionType());
1289 TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
1290 ValueRestore<bool> old_flag(&FLAGS_quic_allow_bbr, true);
1292 QuicTagVector options;
1294 options.push_back(kRENO);
1295 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1296 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1297 manager_.SetFromConfig(config);
1298 EXPECT_EQ(kReno, QuicSentPacketManagerPeer::GetSendAlgorithm(
1299 manager_)->GetCongestionControlType());
1301 // TODO(rtenneti): Enable the following code after BBR code is checked in.
1304 options.push_back(kTBBR);
1305 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1306 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1307 manager_.SetFromConfig(config);
1308 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm(
1309 manager_)->GetCongestionControlType());
1313 TEST_F(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) {
1315 QuicTagVector options;
1317 options.push_back(k1CON);
1318 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1319 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1320 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1));
1321 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1322 manager_.SetFromConfig(config);
1324 QuicSentPacketManagerPeer::SetIsServer(&manager_, false);
1325 QuicConfig client_config;
1326 client_config.SetConnectionOptionsToSend(options);
1327 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1328 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1));
1329 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1330 manager_.SetFromConfig(client_config);
1333 TEST_F(QuicSentPacketManagerTest, NegotiateNConnectionFromOptions) {
1334 // By default, changing the number of open streams does nothing.
1335 manager_.SetNumOpenStreams(5);
1338 QuicTagVector options;
1340 options.push_back(kNCON);
1341 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1342 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1343 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1344 manager_.SetFromConfig(config);
1346 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(5));
1347 manager_.SetNumOpenStreams(5);
1350 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) {
1352 QuicTagVector options;
1354 options.push_back(kNTLP);
1355 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1356 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1357 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1358 manager_.SetFromConfig(config);
1359 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
1362 TEST_F(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) {
1363 QuicConfig client_config;
1364 QuicTagVector options;
1366 options.push_back(kNTLP);
1367 QuicSentPacketManagerPeer::SetIsServer(&manager_, false);
1368 client_config.SetConnectionOptionsToSend(options);
1369 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1370 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1371 manager_.SetFromConfig(client_config);
1372 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_));
1375 TEST_F(QuicSentPacketManagerTest, NegotiatePacingFromOptions) {
1376 EXPECT_FALSE(manager_.using_pacing());
1379 QuicTagVector options;
1380 options.push_back(kPACE);
1381 QuicConfigPeer::SetReceivedConnectionOptions(&config, options);
1382 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1383 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1384 manager_.SetFromConfig(config);
1386 EXPECT_TRUE(manager_.using_pacing());
1389 TEST_F(QuicSentPacketManagerTest, NegotiateReceiveWindowFromOptions) {
1390 EXPECT_EQ(kDefaultSocketReceiveBuffer,
1391 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_));
1393 // Try to set a size below the minimum and ensure it gets set to the min.
1394 QuicConfig client_config;
1395 QuicConfigPeer::SetReceivedSocketReceiveBuffer(&client_config, 1024);
1396 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1397 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1398 manager_.SetFromConfig(client_config);
1400 EXPECT_EQ(kMinSocketReceiveBuffer,
1401 QuicSentPacketManagerPeer::GetReceiveWindow(&manager_));
1403 // Ensure the smaller send window only allows 16 packets to be sent.
1404 for (QuicPacketSequenceNumber i = 1; i <= 16; ++i) {
1405 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
1406 QuicTime::Delta::Zero()));
1407 EXPECT_EQ(QuicTime::Delta::Zero(),
1408 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1409 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), i,
1410 1024, HAS_RETRANSMITTABLE_DATA))
1411 .WillOnce(Return(true));
1412 SerializedPacket packet(CreatePacket(i, true));
1413 manager_.OnPacketSent(&packet, 0, clock_.Now(), 1024,
1414 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
1416 EXPECT_EQ(QuicTime::Delta::Infinite(),
1417 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1420 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
1421 uint32 initial_rtt_us = 325000;
1422 EXPECT_NE(initial_rtt_us,
1423 manager_.GetRttStats()->smoothed_rtt().ToMicroseconds());
1426 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us);
1427 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1428 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
1429 manager_.SetFromConfig(config);
1431 EXPECT_EQ(0, manager_.GetRttStats()->smoothed_rtt().ToMicroseconds());
1432 EXPECT_EQ(initial_rtt_us, manager_.GetRttStats()->initial_rtt_us());