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/test_tools/quic_config_peer.h"
9 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
10 #include "net/quic/test_tools/quic_test_utils.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
15 using testing::ElementsAre;
17 using testing::Pointwise;
18 using testing::Return;
19 using testing::StrictMock;
26 // Default packet length.
27 const uint32 kDefaultLength = 1000;
29 // Matcher to check the key of the key-value pair it receives as first argument
30 // equals its second argument.
32 return std::tr1::get<0>(arg).first == std::tr1::get<1>(arg);
35 class MockDebugDelegate : public QuicSentPacketManager::DebugDelegate {
37 MOCK_METHOD2(OnSpuriousPacketRetransmition,
38 void(TransmissionType transmission_type,
39 QuicByteCount byte_size));
42 class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> {
44 QuicSentPacketManagerTest()
45 : manager_(true, &clock_, &stats_, kFixRate, kNack),
46 send_algorithm_(new StrictMock<MockSendAlgorithm>) {
47 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
48 // Disable tail loss probes for most tests.
49 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
50 // Advance the time 1s so the send times are never QuicTime::Zero.
51 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
54 virtual ~QuicSentPacketManagerTest() OVERRIDE {
55 STLDeleteElements(&packets_);
58 QuicByteCount BytesInFlight() {
59 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_);
61 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets,
63 if (num_packets == 0) {
64 EXPECT_FALSE(manager_.HasUnackedPackets());
65 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
70 EXPECT_TRUE(manager_.HasUnackedPackets());
71 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket());
72 for (size_t i = 0; i < num_packets; ++i) {
73 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i];
77 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets,
79 EXPECT_EQ(num_packets,
80 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
82 for (size_t i = 0; i < num_packets; ++i) {
83 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i]))
84 << " packets[" << i << "]:" << packets[i];
88 void ExpectAck(QuicPacketSequenceNumber largest_observed) {
89 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
90 true, _, ElementsAre(Pair(largest_observed, _)), _));
93 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) {
94 EXPECT_CALL(*send_algorithm_,
95 OnCongestionEvent(true, _, _, _));
98 void ExpectAckAndLoss(bool rtt_updated,
99 QuicPacketSequenceNumber largest_observed,
100 QuicPacketSequenceNumber lost_packet) {
101 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
102 rtt_updated, _, ElementsAre(Pair(largest_observed, _)),
103 ElementsAre(Pair(lost_packet, _))));
106 // |packets_acked| and |packets_lost| should be in sequence number order.
107 void ExpectAcksAndLosses(bool rtt_updated,
108 QuicPacketSequenceNumber* packets_acked,
109 size_t num_packets_acked,
110 QuicPacketSequenceNumber* packets_lost,
111 size_t num_packets_lost) {
112 vector<QuicPacketSequenceNumber> ack_vector;
113 for (size_t i = 0; i < num_packets_acked; ++i) {
114 ack_vector.push_back(packets_acked[i]);
116 vector<QuicPacketSequenceNumber> lost_vector;
117 for (size_t i = 0; i < num_packets_lost; ++i) {
118 lost_vector.push_back(packets_lost[i]);
120 EXPECT_CALL(*send_algorithm_,
121 OnCongestionEvent(rtt_updated, _,
122 Pointwise(KeyEq(), ack_vector),
123 Pointwise(KeyEq(), lost_vector)));
126 // Retransmits a packet as though it was a TLP retransmission, because TLP
127 // leaves the |old_sequence_number| pending.
128 // TODO(ianswett): Test with transmission types besides TLP.
129 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number,
130 QuicPacketSequenceNumber new_sequence_number) {
131 QuicSentPacketManagerPeer::MarkForRetransmission(
132 &manager_, old_sequence_number, TLP_RETRANSMISSION);
133 EXPECT_TRUE(manager_.HasPendingRetransmissions());
134 QuicSentPacketManager::PendingRetransmission next_retransmission =
135 manager_.NextPendingRetransmission();
136 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number);
137 EXPECT_EQ(TLP_RETRANSMISSION,
138 next_retransmission.transmission_type);
139 manager_.OnRetransmittedPacket(old_sequence_number,
140 new_sequence_number);
141 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(
142 &manager_, new_sequence_number));
145 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number,
146 QuicPacketSequenceNumber new_sequence_number) {
147 RetransmitPacket(old_sequence_number, new_sequence_number);
149 EXPECT_CALL(*send_algorithm_,
150 OnPacketSent(_, BytesInFlight(), new_sequence_number,
151 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
152 .WillOnce(Return(true));
153 manager_.OnPacketSent(new_sequence_number,
157 HAS_RETRANSMITTABLE_DATA);
160 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) {
161 return CreatePacket(sequence_number, true);
164 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number,
165 bool retransmittable) {
166 packets_.push_back(QuicPacket::NewDataPacket(
167 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
168 PACKET_6BYTE_SEQUENCE_NUMBER));
169 return SerializedPacket(
170 sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
172 retransmittable ? new RetransmittableFrames() : NULL);
175 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) {
176 packets_.push_back(QuicPacket::NewFecPacket(
177 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
178 PACKET_6BYTE_SEQUENCE_NUMBER));
179 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
180 packets_.back(), 0u, NULL);
183 void SendDataPacket(QuicPacketSequenceNumber sequence_number) {
184 EXPECT_CALL(*send_algorithm_,
185 OnPacketSent(_, BytesInFlight(), sequence_number, _, _))
186 .Times(1).WillOnce(Return(true));
187 SerializedPacket packet(CreateDataPacket(sequence_number));
188 manager_.OnSerializedPacket(packet);
189 manager_.OnPacketSent(sequence_number, clock_.Now(),
190 packet.packet->length(), NOT_RETRANSMISSION,
191 HAS_RETRANSMITTABLE_DATA);
194 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) {
195 EXPECT_CALL(*send_algorithm_,
196 OnPacketSent(_, BytesInFlight(), sequence_number,
197 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
198 .Times(1).WillOnce(Return(true));
199 SerializedPacket packet(CreateDataPacket(sequence_number));
200 packet.retransmittable_frames->AddStreamFrame(
201 new QuicStreamFrame(1, false, 0, IOVector()));
202 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE);
203 manager_.OnSerializedPacket(packet);
204 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(),
205 packet.packet->length(), NOT_RETRANSMISSION,
206 HAS_RETRANSMITTABLE_DATA);
209 void SendFecPacket(QuicPacketSequenceNumber sequence_number) {
210 EXPECT_CALL(*send_algorithm_,
211 OnPacketSent(_, BytesInFlight(), sequence_number,
212 kDefaultLength, NO_RETRANSMITTABLE_DATA))
213 .Times(1).WillOnce(Return(true));
214 SerializedPacket packet(CreateFecPacket(sequence_number));
215 manager_.OnSerializedPacket(packet);
216 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(),
217 packet.packet->length(), NOT_RETRANSMISSION,
218 NO_RETRANSMITTABLE_DATA);
221 void SendAckPacket(QuicPacketSequenceNumber sequence_number) {
222 EXPECT_CALL(*send_algorithm_,
223 OnPacketSent(_, BytesInFlight(), sequence_number,
224 kDefaultLength, NO_RETRANSMITTABLE_DATA))
225 .Times(1).WillOnce(Return(false));
226 SerializedPacket packet(CreatePacket(sequence_number, false));
227 manager_.OnSerializedPacket(packet);
228 manager_.OnPacketSent(sequence_number, clock_.Now(),
229 packet.packet->length(), NOT_RETRANSMISSION,
230 NO_RETRANSMITTABLE_DATA);
233 // Based on QuicConnection's WritePendingRetransmissions.
234 void RetransmitNextPacket(
235 QuicPacketSequenceNumber retransmission_sequence_number) {
236 EXPECT_TRUE(manager_.HasPendingRetransmissions());
237 EXPECT_CALL(*send_algorithm_,
238 OnPacketSent(_, _, retransmission_sequence_number,
239 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
240 .Times(1).WillOnce(Return(true));
241 const QuicSentPacketManager::PendingRetransmission pending =
242 manager_.NextPendingRetransmission();
243 manager_.OnRetransmittedPacket(pending.sequence_number,
244 retransmission_sequence_number);
245 manager_.OnPacketSent(retransmission_sequence_number, clock_.Now(),
246 kDefaultLength, pending.transmission_type,
247 HAS_RETRANSMITTABLE_DATA);
250 QuicSentPacketManager manager_;
251 vector<QuicPacket*> packets_;
253 QuicConnectionStats stats_;
254 MockSendAlgorithm* send_algorithm_;
257 TEST_F(QuicSentPacketManagerTest, IsUnacked) {
258 VerifyUnackedPackets(NULL, 0);
260 SerializedPacket serialized_packet(CreateDataPacket(1));
262 manager_.OnSerializedPacket(serialized_packet);
264 QuicPacketSequenceNumber unacked[] = { 1 };
265 VerifyUnackedPackets(unacked, arraysize(unacked));
266 QuicPacketSequenceNumber retransmittable[] = { 1 };
267 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
270 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
272 RetransmitPacket(1, 2);
274 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
275 QuicPacketSequenceNumber unacked[] = { 1, 2 };
276 VerifyUnackedPackets(unacked, arraysize(unacked));
277 QuicPacketSequenceNumber retransmittable[] = { 2 };
278 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
281 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
283 RetransmitAndSendPacket(1, 2);
286 ReceivedPacketInfo received_info;
287 received_info.largest_observed = 2;
288 received_info.missing_packets.insert(1);
290 manager_.OnIncomingAck(received_info, clock_.Now());
292 // Packet 1 is unacked, pending, but not retransmittable.
293 QuicPacketSequenceNumber unacked[] = { 1 };
294 VerifyUnackedPackets(unacked, arraysize(unacked));
295 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
296 VerifyRetransmittablePackets(NULL, 0);
299 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
301 QuicSentPacketManagerPeer::MarkForRetransmission(
302 &manager_, 1, TLP_RETRANSMISSION);
303 EXPECT_TRUE(manager_.HasPendingRetransmissions());
306 ReceivedPacketInfo received_info;
307 received_info.largest_observed = 1;
309 manager_.OnIncomingAck(received_info, clock_.Now());
311 // There should no longer be a pending retransmission.
312 EXPECT_FALSE(manager_.HasPendingRetransmissions());
314 // No unacked packets remain.
315 VerifyUnackedPackets(NULL, 0);
316 VerifyRetransmittablePackets(NULL, 0);
317 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
320 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
322 RetransmitPacket(1, 2);
323 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
324 clock_.AdvanceTime(rtt);
328 ReceivedPacketInfo received_info;
329 received_info.largest_observed = 1;
330 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
332 // 2 should be unacked, since it may provide an RTT measurement.
333 QuicPacketSequenceNumber unacked[] = { 2 };
334 VerifyUnackedPackets(unacked, arraysize(unacked));
335 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
336 VerifyRetransmittablePackets(NULL, 0);
338 // Verify that the retransmission alarm would not fire,
339 // since there is no retransmittable data outstanding.
340 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
341 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
344 TEST_F(QuicSentPacketManagerTest, RetransmitAndSendThenAckPrevious) {
346 RetransmitAndSendPacket(1, 2);
347 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
348 clock_.AdvanceTime(rtt);
352 ReceivedPacketInfo received_info;
353 received_info.largest_observed = 1;
354 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
356 // 2 remains unacked, but no packets have retransmittable data.
357 QuicPacketSequenceNumber unacked[] = { 2 };
358 VerifyUnackedPackets(unacked, arraysize(unacked));
359 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
360 VerifyRetransmittablePackets(NULL, 0);
362 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
365 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
367 RetransmitPacket(1, 2);
368 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2, _, _))
369 .WillOnce(Return(true));
370 manager_.OnPacketSent(2, clock_.ApproximateNow(), kDefaultLength,
371 LOSS_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
372 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
373 clock_.AdvanceTime(rtt);
375 // First, ACK packet 1 which makes packet 2 non-retransmittable.
377 ReceivedPacketInfo received_info;
378 received_info.largest_observed = 1;
379 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
384 clock_.AdvanceTime(rtt);
386 // Next, NACK packet 2 three times.
387 received_info.largest_observed = 3;
388 received_info.missing_packets.insert(2);
390 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
392 received_info.largest_observed = 4;
394 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
396 received_info.largest_observed = 5;
397 ExpectAckAndLoss(true, 5, 2);
398 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
400 // No packets remain unacked.
401 VerifyUnackedPackets(NULL, 0);
402 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
403 VerifyRetransmittablePackets(NULL, 0);
405 // Verify that the retransmission alarm would not fire,
406 // since there is no retransmittable data outstanding.
407 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
410 TEST_F(QuicSentPacketManagerTest, 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 manager_.OnRetransmissionTimeout();
417 EXPECT_TRUE(manager_.HasPendingRetransmissions());
419 // Ack 1 but not 2, before 2 is able to be sent.
420 // Since 1 has been retransmitted, it has already been lost, and so the
421 // send algorithm is not informed that it has been ACK'd.
422 ReceivedPacketInfo received_info;
423 received_info.largest_observed = 1;
425 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
427 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT.
428 QuicPacketSequenceNumber unacked[] = { 2 };
429 VerifyUnackedPackets(unacked, arraysize(unacked));
430 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
431 VerifyRetransmittablePackets(NULL, 0);
433 // Verify that the retransmission alarm would not fire,
434 // since there is no retransmittable data outstanding.
435 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
438 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
439 StrictMock<MockDebugDelegate> debug_delegate;
440 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmition(
441 TLP_RETRANSMISSION, kDefaultLength)).Times(2);
442 manager_.set_debug_delegate(&debug_delegate);
445 RetransmitAndSendPacket(1, 2);
446 RetransmitAndSendPacket(2, 3);
447 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
448 clock_.AdvanceTime(rtt);
450 // Ack 1 but not 2 or 3.
452 ReceivedPacketInfo received_info;
453 received_info.largest_observed = 1;
454 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
456 // 2 and 3 remain unacked, but no packets have retransmittable data.
457 QuicPacketSequenceNumber unacked[] = { 2, 3 };
458 VerifyUnackedPackets(unacked, arraysize(unacked));
459 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
460 VerifyRetransmittablePackets(NULL, 0);
462 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked.
464 received_info.largest_observed = 4;
465 received_info.missing_packets.insert(2);
466 QuicPacketSequenceNumber acked[] = { 3, 4 };
467 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
468 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
470 QuicPacketSequenceNumber unacked2[] = { 2 };
471 VerifyUnackedPackets(unacked2, arraysize(unacked2));
472 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
475 received_info.largest_observed = 5;
476 ExpectAckAndLoss(true, 5, 2);
477 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
479 VerifyUnackedPackets(NULL, 0);
480 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
481 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted);
484 TEST_F(QuicSentPacketManagerTest, LoseButDontRetransmitRevivedPacket) {
490 // Ack 2 and 3, and mark 1 as revived.
491 ReceivedPacketInfo received_info;
492 received_info.largest_observed = 3;
493 received_info.missing_packets.insert(1);
494 received_info.revived_packets.insert(1);
495 QuicPacketSequenceNumber acked[] = { 2, 3 };
496 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
497 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
499 EXPECT_FALSE(manager_.HasPendingRetransmissions());
500 QuicPacketSequenceNumber unacked[] = { 1, 4 };
501 VerifyUnackedPackets(unacked, arraysize(unacked));
502 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
503 QuicPacketSequenceNumber retransmittable[] = { 4 };
504 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
506 // Ack the 4th packet and expect the 1st to be considered lost.
507 received_info.largest_observed = 4;
508 ExpectAckAndLoss(true, 4, 1);
509 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
511 EXPECT_FALSE(manager_.HasPendingRetransmissions());
512 VerifyRetransmittablePackets(NULL, 0);
515 TEST_F(QuicSentPacketManagerTest, MarkLostThenReviveAndDontRetransmitPacket) {
522 // Ack 2, 3, and 4, and expect the 1st to be considered lost.
523 ReceivedPacketInfo received_info;
524 received_info.largest_observed = 4;
525 received_info.missing_packets.insert(1);
526 QuicPacketSequenceNumber acked[] = { 2, 3, 4 };
527 QuicPacketSequenceNumber lost[] = { 1 };
528 ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost));
529 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
531 EXPECT_TRUE(manager_.HasPendingRetransmissions());
532 QuicPacketSequenceNumber unacked[] = { 1, 5 };
533 VerifyUnackedPackets(unacked, arraysize(unacked));
534 QuicPacketSequenceNumber retransmittable[] = { 1 };
535 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
537 // Ack 5th packet (FEC) and revive 1st packet. 1st packet should now be
538 // removed from pending retransmissions map.
539 received_info.largest_observed = 5;
540 received_info.revived_packets.insert(1);
542 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
544 EXPECT_FALSE(manager_.HasPendingRetransmissions());
545 VerifyRetransmittablePackets(NULL, 0);
548 TEST_F(QuicSentPacketManagerTest, TruncatedAck) {
550 RetransmitAndSendPacket(1, 2);
551 RetransmitAndSendPacket(2, 3);
552 RetransmitAndSendPacket(3, 4);
553 RetransmitAndSendPacket(4, 5);
555 // Truncated ack with 4 NACKs, so the first packet is lost.
556 ReceivedPacketInfo received_info;
557 received_info.largest_observed = 4;
558 received_info.missing_packets.insert(1);
559 received_info.missing_packets.insert(2);
560 received_info.missing_packets.insert(3);
561 received_info.missing_packets.insert(4);
562 received_info.is_truncated = true;
564 QuicPacketSequenceNumber lost[] = { 1 };
565 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost));
566 manager_.OnIncomingAck(received_info, clock_.Now());
568 // High water mark will be raised.
569 QuicPacketSequenceNumber unacked[] = { 2, 3, 4, 5 };
570 VerifyUnackedPackets(unacked, arraysize(unacked));
571 QuicPacketSequenceNumber retransmittable[] = { 5 };
572 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
575 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) {
577 RetransmitAndSendPacket(1, 2);
578 RetransmitAndSendPacket(2, 3);
579 RetransmitAndSendPacket(3, 4);
580 manager_.OnSerializedPacket(CreateDataPacket(5));
581 manager_.OnSerializedPacket(CreateDataPacket(6));
582 manager_.OnSerializedPacket(CreateDataPacket(7));
583 manager_.OnSerializedPacket(CreateDataPacket(8));
584 manager_.OnSerializedPacket(CreateDataPacket(9));
586 // Ack previous transmission
588 ReceivedPacketInfo received_info;
589 received_info.largest_observed = 2;
590 received_info.missing_packets.insert(1);
592 manager_.OnIncomingAck(received_info, clock_.Now());
593 EXPECT_TRUE(manager_.IsUnacked(4));
596 // Truncated ack with 4 NACKs
598 ReceivedPacketInfo received_info;
599 received_info.largest_observed = 6;
600 received_info.missing_packets.insert(3);
601 received_info.missing_packets.insert(4);
602 received_info.missing_packets.insert(5);
603 received_info.missing_packets.insert(6);
604 received_info.is_truncated = true;
605 ExpectAckAndLoss(false, 1, 3);
606 manager_.OnIncomingAck(received_info, clock_.Now());
609 // High water mark will be raised.
610 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 };
611 VerifyUnackedPackets(unacked, arraysize(unacked));
612 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 };
613 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
616 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacket) {
617 EXPECT_EQ(0u, manager_.GetLeastUnackedSentPacket());
620 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacketUnacked) {
621 SerializedPacket serialized_packet(CreateDataPacket(1));
623 manager_.OnSerializedPacket(serialized_packet);
624 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
627 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacketUnackedFec) {
628 SerializedPacket serialized_packet(CreateFecPacket(1));
630 manager_.OnSerializedPacket(serialized_packet);
631 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
634 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedPacketAndDiscard) {
635 VerifyUnackedPackets(NULL, 0);
637 SerializedPacket serialized_packet(CreateFecPacket(1));
638 manager_.OnSerializedPacket(serialized_packet);
639 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
641 SerializedPacket serialized_packet2(CreateFecPacket(2));
642 manager_.OnSerializedPacket(serialized_packet2);
643 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
645 SerializedPacket serialized_packet3(CreateFecPacket(3));
646 manager_.OnSerializedPacket(serialized_packet3);
647 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
649 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 };
650 VerifyUnackedPackets(unacked, arraysize(unacked));
651 VerifyRetransmittablePackets(NULL, 0);
653 // Ack 2, which has never been sent, so there's no rtt update.
654 ReceivedPacketInfo received_info;
655 received_info.largest_observed = 2;
656 manager_.OnIncomingAck(received_info, clock_.Now());
658 EXPECT_EQ(3u, manager_.GetLeastUnackedSentPacket());
661 TEST_F(QuicSentPacketManagerTest, GetSentTime) {
662 VerifyUnackedPackets(NULL, 0);
664 SerializedPacket serialized_packet(CreateFecPacket(1));
665 manager_.OnSerializedPacket(serialized_packet);
666 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _))
667 .Times(1).WillOnce(Return(true));
668 manager_.OnPacketSent(1, QuicTime::Zero(), kDefaultLength, NOT_RETRANSMISSION,
669 NO_RETRANSMITTABLE_DATA);
671 SerializedPacket serialized_packet2(CreateFecPacket(2));
672 QuicTime sent_time = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(1));
673 manager_.OnSerializedPacket(serialized_packet2);
674 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2, _, _))
675 .Times(1).WillOnce(Return(true));
676 manager_.OnPacketSent(2, sent_time, kDefaultLength, NOT_RETRANSMISSION,
677 NO_RETRANSMITTABLE_DATA);
679 QuicPacketSequenceNumber unacked[] = { 1, 2 };
680 VerifyUnackedPackets(unacked, arraysize(unacked));
681 VerifyRetransmittablePackets(NULL, 0);
683 EXPECT_TRUE(manager_.HasUnackedPackets());
684 EXPECT_EQ(QuicTime::Zero(),
685 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1));
686 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2));
689 TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
693 // Now ack the ack and expect an RTT update.
694 ReceivedPacketInfo received_info;
695 received_info.largest_observed = 2;
696 received_info.delta_time_largest_observed =
697 QuicTime::Delta::FromMilliseconds(5);
700 manager_.OnIncomingAck(received_info, clock_.Now());
704 // Now ack the ack and expect only an RTT update.
705 received_info.largest_observed = 3;
707 manager_.OnIncomingAck(received_info, clock_.Now());
710 TEST_F(QuicSentPacketManagerTest, Rtt) {
711 QuicPacketSequenceNumber sequence_number = 1;
712 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15);
713 SendDataPacket(sequence_number);
714 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
716 ExpectAck(sequence_number);
717 ReceivedPacketInfo received_info;
718 received_info.largest_observed = sequence_number;
719 received_info.delta_time_largest_observed =
720 QuicTime::Delta::FromMilliseconds(5);
721 manager_.OnIncomingAck(received_info, clock_.Now());
722 EXPECT_EQ(expected_rtt,
723 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
726 TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
727 // Expect that the RTT is equal to the local time elapsed, since the
728 // delta_time_largest_observed is larger than the local time elapsed
729 // and is hence invalid.
730 QuicPacketSequenceNumber sequence_number = 1;
731 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
732 SendDataPacket(sequence_number);
733 clock_.AdvanceTime(expected_rtt);
735 ExpectAck(sequence_number);
736 ReceivedPacketInfo received_info;
737 received_info.largest_observed = sequence_number;
738 received_info.delta_time_largest_observed =
739 QuicTime::Delta::FromMilliseconds(11);
740 manager_.OnIncomingAck(received_info, clock_.Now());
741 EXPECT_EQ(expected_rtt,
742 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
745 TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
746 // Expect that the RTT is equal to the local time elapsed, since the
747 // delta_time_largest_observed is infinite, and is hence invalid.
748 QuicPacketSequenceNumber sequence_number = 1;
749 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
750 SendDataPacket(sequence_number);
751 clock_.AdvanceTime(expected_rtt);
753 ExpectAck(sequence_number);
754 ReceivedPacketInfo received_info;
755 received_info.largest_observed = sequence_number;
756 received_info.delta_time_largest_observed = QuicTime::Delta::Infinite();
757 manager_.OnIncomingAck(received_info, clock_.Now());
758 EXPECT_EQ(expected_rtt,
759 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
762 TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
763 // Expect that the RTT is the time between send and receive since the
764 // delta_time_largest_observed is zero.
765 QuicPacketSequenceNumber sequence_number = 1;
766 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
767 SendDataPacket(sequence_number);
768 clock_.AdvanceTime(expected_rtt);
770 ExpectAck(sequence_number);
771 ReceivedPacketInfo received_info;
772 received_info.largest_observed = sequence_number;
773 received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
774 manager_.OnIncomingAck(received_info, clock_.Now());
775 EXPECT_EQ(expected_rtt,
776 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
779 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
780 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
783 QuicPacketSequenceNumber sequence_number = 1;
784 SendDataPacket(sequence_number);
786 // The first tail loss probe retransmits 1 packet.
787 manager_.OnRetransmissionTimeout();
788 EXPECT_EQ(QuicTime::Delta::Zero(),
789 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
790 EXPECT_FALSE(manager_.HasPendingRetransmissions());
791 manager_.MaybeRetransmitTailLossProbe();
792 EXPECT_TRUE(manager_.HasPendingRetransmissions());
793 RetransmitNextPacket(2);
794 EXPECT_FALSE(manager_.HasPendingRetransmissions());
796 // The second tail loss probe retransmits 1 packet.
797 manager_.OnRetransmissionTimeout();
798 EXPECT_EQ(QuicTime::Delta::Zero(),
799 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
800 EXPECT_FALSE(manager_.HasPendingRetransmissions());
801 manager_.MaybeRetransmitTailLossProbe();
802 EXPECT_TRUE(manager_.HasPendingRetransmissions());
803 RetransmitNextPacket(3);
804 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
805 QuicTime::Delta::Infinite()));
806 EXPECT_EQ(QuicTime::Delta::Infinite(),
807 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
808 EXPECT_FALSE(manager_.HasPendingRetransmissions());
810 // Ack the third and ensure the first two are still pending.
812 ReceivedPacketInfo received_info;
813 received_info.largest_observed = 3;
814 received_info.missing_packets.insert(1);
815 received_info.missing_packets.insert(2);
816 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
818 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
820 // Acking two more packets will lose both of them due to nacks.
821 received_info.largest_observed = 5;
822 QuicPacketSequenceNumber lost[] = { 1, 2 };
823 ExpectAcksAndLosses(false, NULL, 0, lost, arraysize(lost));
824 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
826 EXPECT_FALSE(manager_.HasPendingRetransmissions());
827 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
828 EXPECT_EQ(2u, stats_.tlp_count);
829 EXPECT_EQ(0u, stats_.rto_count);
832 TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
833 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
836 const size_t kNumSentPackets = 100;
837 for (size_t i = 1; i <= kNumSentPackets; ++i) {
841 // The first tail loss probe retransmits 1 packet.
842 manager_.OnRetransmissionTimeout();
843 EXPECT_EQ(QuicTime::Delta::Zero(),
844 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
845 EXPECT_FALSE(manager_.HasPendingRetransmissions());
846 manager_.MaybeRetransmitTailLossProbe();
847 EXPECT_TRUE(manager_.HasPendingRetransmissions());
848 RetransmitNextPacket(101);
849 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
850 QuicTime::Delta::Infinite()));
851 EXPECT_EQ(QuicTime::Delta::Infinite(),
852 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
853 EXPECT_FALSE(manager_.HasPendingRetransmissions());
855 // The second tail loss probe retransmits 1 packet.
856 manager_.OnRetransmissionTimeout();
857 EXPECT_EQ(QuicTime::Delta::Zero(),
858 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
859 EXPECT_FALSE(manager_.HasPendingRetransmissions());
860 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
861 EXPECT_TRUE(manager_.HasPendingRetransmissions());
862 RetransmitNextPacket(102);
863 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
864 QuicTime::Delta::Infinite()));
865 EXPECT_EQ(QuicTime::Delta::Infinite(),
866 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
868 // Advance the time enough to ensure all packets are RTO'd.
869 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
871 // The final RTO abandons all of them.
872 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
873 manager_.OnRetransmissionTimeout();
874 EXPECT_TRUE(manager_.HasPendingRetransmissions());
875 EXPECT_EQ(2u, stats_.tlp_count);
876 EXPECT_EQ(1u, stats_.rto_count);
879 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
880 // Send 2 crypto packets and 3 data packets.
881 const size_t kNumSentCryptoPackets = 2;
882 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
885 const size_t kNumSentDataPackets = 3;
886 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
887 SendDataPacket(kNumSentCryptoPackets + i);
889 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
891 // The first retransmits 2 packets.
892 manager_.OnRetransmissionTimeout();
893 RetransmitNextPacket(6);
894 RetransmitNextPacket(7);
895 EXPECT_FALSE(manager_.HasPendingRetransmissions());
896 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
898 // The second retransmits 2 packets.
899 manager_.OnRetransmissionTimeout();
900 RetransmitNextPacket(8);
901 RetransmitNextPacket(9);
902 EXPECT_FALSE(manager_.HasPendingRetransmissions());
903 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
905 // Now ack the two crypto packets and the speculatively encrypted request,
906 // and ensure the first four crypto packets get abandoned, but not lost.
907 QuicPacketSequenceNumber acked[] = { 3, 4, 5, 8, 9 };
908 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
909 ReceivedPacketInfo received_info;
910 received_info.largest_observed = 9;
911 received_info.missing_packets.insert(1);
912 received_info.missing_packets.insert(2);
913 received_info.missing_packets.insert(6);
914 received_info.missing_packets.insert(7);
915 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
917 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
920 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
921 // Send 2 crypto packets and 3 data packets.
922 const size_t kNumSentCryptoPackets = 2;
923 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
926 const size_t kNumSentDataPackets = 3;
927 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
928 SendDataPacket(kNumSentCryptoPackets + i);
930 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
932 // The first retransmission timeout retransmits 2 crypto packets.
933 manager_.OnRetransmissionTimeout();
934 RetransmitNextPacket(6);
935 RetransmitNextPacket(7);
936 EXPECT_FALSE(manager_.HasPendingRetransmissions());
937 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
939 // Now act like a version negotiation packet arrived, which would cause all
940 // unacked packets to be retransmitted.
941 manager_.RetransmitUnackedPackets(ALL_PACKETS);
943 // Ensure the first two pending packets are the crypto retransmits.
944 ASSERT_TRUE(manager_.HasPendingRetransmissions());
945 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number);
946 RetransmitNextPacket(8);
947 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number);
948 RetransmitNextPacket(9);
950 EXPECT_TRUE(manager_.HasPendingRetransmissions());
953 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
954 // Send 1 crypto packet.
956 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
958 // Retransmit the crypto packet as 2.
959 manager_.OnRetransmissionTimeout();
960 RetransmitNextPacket(2);
962 // Retransmit the crypto packet as 3.
963 manager_.OnRetransmissionTimeout();
964 RetransmitNextPacket(3);
966 // Now ack the second crypto packet, and ensure the first gets removed, but
967 // the third does not.
969 ReceivedPacketInfo received_info;
970 received_info.largest_observed = 2;
971 received_info.missing_packets.insert(1);
972 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
974 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
975 QuicPacketSequenceNumber unacked[] = { 3 };
976 VerifyUnackedPackets(unacked, arraysize(unacked));
979 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
980 // Send 2 crypto packets and serialize 1 data packet.
981 const size_t kNumSentCryptoPackets = 2;
982 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
985 SerializedPacket packet(CreateDataPacket(3));
986 manager_.OnSerializedPacket(packet);
987 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
989 // Retransmit 2 crypto packets, but not the serialized packet.
990 manager_.OnRetransmissionTimeout();
991 RetransmitNextPacket(6);
992 RetransmitNextPacket(7);
993 EXPECT_FALSE(manager_.HasPendingRetransmissions());
994 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
997 TEST_F(QuicSentPacketManagerTest,
998 CryptoHandshakeRetransmissionThenRetransmitAll) {
999 // Send 1 crypto packet.
1000 SendCryptoPacket(1);
1001 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1003 // Retransmit the crypto packet as 2.
1004 manager_.OnRetransmissionTimeout();
1005 RetransmitNextPacket(2);
1007 // Now retransmit all the unacked packets, which occurs when there is a
1008 // version negotiation.
1009 manager_.RetransmitUnackedPackets(ALL_PACKETS);
1010 QuicPacketSequenceNumber unacked[] = { 1, 2 };
1011 VerifyUnackedPackets(unacked, arraysize(unacked));
1012 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1013 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1014 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1017 TEST_F(QuicSentPacketManagerTest,
1018 CryptoHandshakeRetransmissionThenNeuterAndAck) {
1019 // Send 1 crypto packet.
1020 SendCryptoPacket(1);
1021 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1023 // Retransmit the crypto packet as 2.
1024 manager_.OnRetransmissionTimeout();
1025 RetransmitNextPacket(2);
1027 // Retransmit the crypto packet as 3.
1028 manager_.OnRetransmissionTimeout();
1029 RetransmitNextPacket(3);
1031 // Now neuter all unacked unencrypted packets, which occurs when the
1032 // connection goes forward secure.
1033 manager_.NeuterUnencryptedPackets();
1034 QuicPacketSequenceNumber unacked[] = { 1, 2, 3};
1035 VerifyUnackedPackets(unacked, arraysize(unacked));
1036 VerifyRetransmittablePackets(NULL, 0);
1037 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1038 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1039 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1041 // Ensure both packets get discarded when packet 2 is acked.
1042 ReceivedPacketInfo received_info;
1043 received_info.largest_observed = 3;
1044 received_info.missing_packets.insert(1);
1045 received_info.missing_packets.insert(2);
1046 ExpectUpdatedRtt(3);
1047 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
1048 VerifyUnackedPackets(NULL, 0);
1049 VerifyRetransmittablePackets(NULL, 0);
1052 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) {
1053 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1054 // Serialize two data packets and send the latter.
1055 SerializedPacket packet(CreateDataPacket(1));
1056 manager_.OnSerializedPacket(packet);
1058 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1059 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1061 // Retransmit 1 unacked packets, but not the first serialized packet.
1062 manager_.OnRetransmissionTimeout();
1063 EXPECT_EQ(QuicTime::Delta::Zero(),
1064 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1065 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1066 manager_.MaybeRetransmitTailLossProbe();
1067 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1068 RetransmitNextPacket(3);
1069 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
1070 QuicTime::Delta::Infinite()));
1071 EXPECT_EQ(QuicTime::Delta::Infinite(),
1072 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1073 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1074 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1075 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1078 TEST_F(QuicSentPacketManagerTest, ResetRecentMinRTTWithEmptyWindow) {
1079 QuicTime::Delta min_rtt = QuicTime::Delta::FromMilliseconds(50);
1080 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
1081 min_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
1083 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
1085 QuicSentPacketManagerPeer::GetRttStats(
1086 &manager_)->recent_min_rtt());
1088 // Send two packets with no prior bytes in flight.
1092 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(100));
1093 // Ack two packets with 100ms RTT observations.
1094 ReceivedPacketInfo received_info;
1095 received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
1096 received_info.largest_observed = 1;
1098 manager_.OnIncomingAck(received_info, clock_.Now());
1100 // First ack does not change recent min rtt.
1102 QuicSentPacketManagerPeer::GetRttStats(
1103 &manager_)->recent_min_rtt());
1105 received_info.largest_observed = 2;
1107 manager_.OnIncomingAck(received_info, clock_.Now());
1110 QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
1111 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100),
1112 QuicSentPacketManagerPeer::GetRttStats(
1113 &manager_)->recent_min_rtt());
1116 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
1117 // Send 100 packets and then ensure all are abandoned when the RTO fires.
1118 const size_t kNumSentPackets = 100;
1119 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1123 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1124 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe());
1125 manager_.OnRetransmissionTimeout();
1128 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
1129 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1132 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
1133 SendCryptoPacket(1);
1136 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1137 1 * base::Time::kMicrosecondsPerMillisecond);
1138 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1139 manager_.GetRetransmissionTime());
1141 // Test with a standard smoothed RTT.
1142 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1143 100 * base::Time::kMicrosecondsPerMillisecond);
1145 QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
1146 QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5));
1147 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1149 // Retransmit the packet by invoking the retransmission timeout.
1150 clock_.AdvanceTime(srtt.Multiply(1.5));
1151 manager_.OnRetransmissionTimeout();
1152 RetransmitNextPacket(2);
1154 // The retransmission time should now be twice as far in the future.
1155 expected_time = clock_.Now().Add(srtt.Multiply(2).Multiply(1.5));
1156 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1159 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
1160 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1165 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1166 1 * base::Time::kMicrosecondsPerMillisecond);
1167 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1168 manager_.GetRetransmissionTime());
1170 // Test with a standard smoothed RTT.
1171 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1172 100 * base::Time::kMicrosecondsPerMillisecond);
1173 QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
1174 QuicTime::Delta expected_tlp_delay = srtt.Multiply(2);
1175 QuicTime expected_time = clock_.Now().Add(expected_tlp_delay);
1176 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1178 // Retransmit the packet by invoking the retransmission timeout.
1179 clock_.AdvanceTime(expected_tlp_delay);
1180 manager_.OnRetransmissionTimeout();
1181 EXPECT_EQ(QuicTime::Delta::Zero(),
1182 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1183 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1184 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe());
1185 EXPECT_TRUE(manager_.HasPendingRetransmissions());
1186 RetransmitNextPacket(3);
1187 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillOnce(Return(
1188 QuicTime::Delta::Infinite()));
1189 EXPECT_EQ(QuicTime::Delta::Infinite(),
1190 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA));
1191 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1193 expected_time = clock_.Now().Add(expected_tlp_delay);
1194 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1197 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeRTO) {
1198 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
1199 QuicTime::Delta::FromMilliseconds(100),
1200 QuicTime::Delta::Zero(),
1206 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500);
1207 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1208 .WillRepeatedly(Return(expected_rto_delay));
1209 QuicTime expected_time = clock_.Now().Add(expected_rto_delay);
1210 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1212 // Retransmit the packet by invoking the retransmission timeout.
1213 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1214 clock_.AdvanceTime(expected_rto_delay);
1215 manager_.OnRetransmissionTimeout();
1216 RetransmitNextPacket(3);
1217 RetransmitNextPacket(4);
1218 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1220 // The delay should double the second time.
1221 expected_time = clock_.Now().Add(expected_rto_delay).Add(expected_rto_delay);
1222 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1224 // Ack a packet and ensure the RTO goes back to the original value.
1225 ReceivedPacketInfo received_info;
1226 received_info.largest_observed = 2;
1227 received_info.missing_packets.insert(1);
1228 ExpectUpdatedRtt(2);
1229 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
1231 expected_time = clock_.Now().Add(expected_rto_delay);
1232 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1235 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
1237 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1238 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1)));
1239 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1241 // If the delay is smaller than the min, ensure it exponentially backs off
1243 for (int i = 0; i < 5; ++i) {
1245 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1246 delay = delay.Add(delay);
1247 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1248 manager_.OnRetransmissionTimeout();
1249 RetransmitNextPacket(i + 2);
1253 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
1254 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1255 .WillOnce(Return(QuicTime::Delta::FromSeconds(500)));
1257 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1258 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1261 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) {
1263 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1264 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1265 .WillRepeatedly(Return(delay));
1267 // Delay should back off exponentially.
1268 for (int i = 0; i < 5; ++i) {
1270 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1271 delay = delay.Add(delay);
1272 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1273 manager_.OnRetransmissionTimeout();
1274 RetransmitNextPacket(i + 2);
1278 TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
1279 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm();
1280 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm);
1282 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1283 .WillRepeatedly(Return(QuicTime::Zero()));
1287 // Handle an ack which causes the loss algorithm to be evaluated and
1288 // set the loss timeout.
1290 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1291 .WillOnce(Return(SequenceNumberSet()));
1292 ReceivedPacketInfo received_info;
1293 received_info.largest_observed = 2;
1294 received_info.missing_packets.insert(1);
1295 manager_.OnIncomingAck(received_info, clock_.Now());
1297 QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)));
1298 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1299 .WillRepeatedly(Return(timeout));
1300 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1302 // Fire the retransmission timeout and ensure the loss detection algorithm
1304 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1305 .WillOnce(Return(SequenceNumberSet()));
1306 manager_.OnRetransmissionTimeout();
1309 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetection) {
1311 QuicSentPacketManagerPeer::GetLossAlgorithm(
1312 &manager_)->GetLossDetectionType());
1315 QuicConfigPeer::SetReceivedLossDetection(&config, kTIME);
1316 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1317 manager_.SetFromConfig(config);
1320 QuicSentPacketManagerPeer::GetLossAlgorithm(
1321 &manager_)->GetLossDetectionType());