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"
16 using testing::ElementsAre;
18 using testing::Pointwise;
19 using testing::Return;
20 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 QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> {
37 QuicSentPacketManagerTest()
38 : manager_(true, &clock_, &stats_, kFixRate, kNack),
39 send_algorithm_(new StrictMock<MockSendAlgorithm>) {
40 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_);
41 // Disable tail loss probes for most tests.
42 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0);
43 // Advance the time 1s so the send times are never QuicTime::Zero.
44 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
47 virtual ~QuicSentPacketManagerTest() {
48 STLDeleteElements(&packets_);
51 QuicByteCount BytesInFlight() {
52 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_);
54 void VerifyUnackedPackets(QuicPacketSequenceNumber* packets,
56 if (num_packets == 0) {
57 EXPECT_FALSE(manager_.HasUnackedPackets());
58 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
63 EXPECT_TRUE(manager_.HasUnackedPackets());
64 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket());
65 for (size_t i = 0; i < num_packets; ++i) {
66 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i];
70 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets,
72 SequenceNumberSet unacked =
73 QuicSentPacketManagerPeer::GetUnackedPackets(&manager_);
74 for (size_t i = 0; i < num_packets; ++i) {
75 EXPECT_TRUE(ContainsKey(unacked, packets[i])) << packets[i];
77 size_t num_retransmittable = 0;
78 for (SequenceNumberSet::const_iterator it = unacked.begin();
79 it != unacked.end(); ++it) {
80 if (manager_.HasRetransmittableFrames(*it)) {
81 ++num_retransmittable;
84 EXPECT_EQ(num_packets,
85 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(
87 EXPECT_EQ(num_packets, num_retransmittable);
90 void ExpectAck(QuicPacketSequenceNumber largest_observed) {
91 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
92 true, _, ElementsAre(Pair(largest_observed, _)), _));
95 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) {
96 EXPECT_CALL(*send_algorithm_,
97 OnCongestionEvent(true, _, _, _));
100 void ExpectAckAndLoss(bool rtt_updated,
101 QuicPacketSequenceNumber largest_observed,
102 QuicPacketSequenceNumber lost_packet) {
103 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(
104 rtt_updated, _, ElementsAre(Pair(largest_observed, _)),
105 ElementsAre(Pair(lost_packet, _))));
108 // |packets_acked| and |packets_lost| should be in sequence number order.
109 void ExpectAcksAndLosses(bool rtt_updated,
110 QuicPacketSequenceNumber* packets_acked,
111 size_t num_packets_acked,
112 QuicPacketSequenceNumber* packets_lost,
113 size_t num_packets_lost) {
114 vector<QuicPacketSequenceNumber> ack_vector;
115 for (size_t i = 0; i < num_packets_acked; ++i) {
116 ack_vector.push_back(packets_acked[i]);
118 vector<QuicPacketSequenceNumber> lost_vector;
119 for (size_t i = 0; i < num_packets_lost; ++i) {
120 lost_vector.push_back(packets_lost[i]);
122 EXPECT_CALL(*send_algorithm_,
123 OnCongestionEvent(rtt_updated, _,
124 Pointwise(KeyEq(), ack_vector),
125 Pointwise(KeyEq(), lost_vector)));
128 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number,
129 QuicPacketSequenceNumber new_sequence_number) {
130 QuicSentPacketManagerPeer::MarkForRetransmission(
131 &manager_, old_sequence_number, LOSS_RETRANSMISSION);
132 EXPECT_TRUE(manager_.HasPendingRetransmissions());
133 QuicSentPacketManager::PendingRetransmission next_retransmission =
134 manager_.NextPendingRetransmission();
135 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number);
136 EXPECT_EQ(LOSS_RETRANSMISSION,
137 next_retransmission.transmission_type);
138 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number);
139 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(
140 &manager_, new_sequence_number));
143 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number,
144 QuicPacketSequenceNumber new_sequence_number) {
145 RetransmitPacket(old_sequence_number, new_sequence_number);
147 EXPECT_CALL(*send_algorithm_,
148 OnPacketSent(_, BytesInFlight(), new_sequence_number,
149 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
150 .WillOnce(Return(true));
151 manager_.OnPacketSent(new_sequence_number,
155 HAS_RETRANSMITTABLE_DATA);
158 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) {
159 return CreatePacket(sequence_number, true);
162 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number,
163 bool retransmittable) {
164 packets_.push_back(QuicPacket::NewDataPacket(
165 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
166 PACKET_6BYTE_SEQUENCE_NUMBER));
167 return SerializedPacket(
168 sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
170 retransmittable ? new RetransmittableFrames() : NULL);
173 SerializedPacket CreateFecPacket(QuicPacketSequenceNumber sequence_number) {
174 packets_.push_back(QuicPacket::NewFecPacket(
175 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false,
176 PACKET_6BYTE_SEQUENCE_NUMBER));
177 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
178 packets_.back(), 0u, NULL);
181 void SendDataPacket(QuicPacketSequenceNumber sequence_number) {
182 EXPECT_CALL(*send_algorithm_,
183 OnPacketSent(_, BytesInFlight(), sequence_number, _, _))
184 .Times(1).WillOnce(Return(true));
185 SerializedPacket packet(CreateDataPacket(sequence_number));
186 manager_.OnSerializedPacket(packet);
187 manager_.OnPacketSent(sequence_number, clock_.Now(),
188 packet.packet->length(), NOT_RETRANSMISSION,
189 HAS_RETRANSMITTABLE_DATA);
192 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) {
193 EXPECT_CALL(*send_algorithm_,
194 OnPacketSent(_, BytesInFlight(), sequence_number,
195 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
196 .Times(1).WillOnce(Return(true));
197 SerializedPacket packet(CreateDataPacket(sequence_number));
198 packet.retransmittable_frames->AddStreamFrame(
199 new QuicStreamFrame(1, false, 0, IOVector()));
200 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE);
201 manager_.OnSerializedPacket(packet);
202 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(),
203 packet.packet->length(), NOT_RETRANSMISSION,
204 HAS_RETRANSMITTABLE_DATA);
207 void SendFecPacket(QuicPacketSequenceNumber sequence_number) {
208 EXPECT_CALL(*send_algorithm_,
209 OnPacketSent(_, BytesInFlight(), sequence_number,
210 kDefaultLength, NO_RETRANSMITTABLE_DATA))
211 .Times(1).WillOnce(Return(true));
212 SerializedPacket packet(CreateFecPacket(sequence_number));
213 manager_.OnSerializedPacket(packet);
214 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(),
215 packet.packet->length(), NOT_RETRANSMISSION,
216 NO_RETRANSMITTABLE_DATA);
219 void SendAckPacket(QuicPacketSequenceNumber sequence_number) {
220 EXPECT_CALL(*send_algorithm_,
221 OnPacketSent(_, BytesInFlight(), sequence_number,
222 kDefaultLength, NO_RETRANSMITTABLE_DATA))
223 .Times(1).WillOnce(Return(false));
224 SerializedPacket packet(CreatePacket(sequence_number, false));
225 manager_.OnSerializedPacket(packet);
226 manager_.OnPacketSent(sequence_number, clock_.Now(),
227 packet.packet->length(), NOT_RETRANSMISSION,
228 NO_RETRANSMITTABLE_DATA);
231 // Based on QuicConnection's WritePendingRetransmissions.
232 void RetransmitNextPacket(
233 QuicPacketSequenceNumber retransmission_sequence_number) {
234 EXPECT_TRUE(manager_.HasPendingRetransmissions());
235 EXPECT_CALL(*send_algorithm_,
236 OnPacketSent(_, _, retransmission_sequence_number,
237 kDefaultLength, HAS_RETRANSMITTABLE_DATA))
238 .Times(1).WillOnce(Return(true));
239 const QuicSentPacketManager::PendingRetransmission pending =
240 manager_.NextPendingRetransmission();
241 manager_.OnRetransmittedPacket(
242 pending.sequence_number, retransmission_sequence_number);
243 manager_.OnPacketSent(retransmission_sequence_number, clock_.Now(),
244 kDefaultLength, pending.transmission_type,
245 HAS_RETRANSMITTABLE_DATA);
248 QuicSentPacketManager manager_;
249 vector<QuicPacket*> packets_;
251 QuicConnectionStats stats_;
252 MockSendAlgorithm* send_algorithm_;
255 TEST_F(QuicSentPacketManagerTest, IsUnacked) {
256 VerifyUnackedPackets(NULL, 0);
258 SerializedPacket serialized_packet(CreateDataPacket(1));
260 manager_.OnSerializedPacket(serialized_packet);
262 QuicPacketSequenceNumber unacked[] = { 1 };
263 VerifyUnackedPackets(unacked, arraysize(unacked));
264 QuicPacketSequenceNumber retransmittable[] = { 1 };
265 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
268 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) {
270 RetransmitPacket(1, 2);
272 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2));
273 QuicPacketSequenceNumber unacked[] = { 1, 2 };
274 VerifyUnackedPackets(unacked, arraysize(unacked));
275 QuicPacketSequenceNumber retransmittable[] = { 2 };
276 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
279 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) {
281 RetransmitAndSendPacket(1, 2);
284 ReceivedPacketInfo received_info;
285 received_info.largest_observed = 2;
286 received_info.missing_packets.insert(1);
288 manager_.OnIncomingAck(received_info, clock_.Now());
290 // Packet 1 is unacked, pending, but not retransmittable.
291 QuicPacketSequenceNumber unacked[] = { 1 };
292 VerifyUnackedPackets(unacked, arraysize(unacked));
293 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
294 VerifyRetransmittablePackets(NULL, 0);
297 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) {
299 QuicSentPacketManagerPeer::MarkForRetransmission(
300 &manager_, 1, LOSS_RETRANSMISSION);
301 EXPECT_TRUE(manager_.HasPendingRetransmissions());
304 ReceivedPacketInfo received_info;
305 received_info.largest_observed = 1;
307 manager_.OnIncomingAck(received_info, clock_.Now());
309 // There should no longer be a pending retransmission.
310 EXPECT_FALSE(manager_.HasPendingRetransmissions());
312 // No unacked packets remain.
313 VerifyUnackedPackets(NULL, 0);
314 VerifyRetransmittablePackets(NULL, 0);
315 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted);
318 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) {
320 RetransmitPacket(1, 2);
321 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
322 clock_.AdvanceTime(rtt);
326 ReceivedPacketInfo received_info;
327 received_info.largest_observed = 1;
328 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
330 // No packets should be unacked.
331 VerifyUnackedPackets(NULL, 0);
332 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
333 VerifyRetransmittablePackets(NULL, 0);
335 // Verify that the retransmission alarm would not fire,
336 // since there is no retransmittable data outstanding.
337 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
338 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
341 TEST_F(QuicSentPacketManagerTest, RetransmitAndSendThenAckPrevious) {
343 RetransmitAndSendPacket(1, 2);
344 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
345 clock_.AdvanceTime(rtt);
349 ReceivedPacketInfo received_info;
350 received_info.largest_observed = 1;
351 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
353 // 2 remains unacked, but no packets have retransmittable data.
354 QuicPacketSequenceNumber unacked[] = { 2 };
355 VerifyUnackedPackets(unacked, arraysize(unacked));
356 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
357 VerifyRetransmittablePackets(NULL, 0);
359 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
362 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
364 RetransmitPacket(1, 2);
365 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2, _, _))
366 .WillOnce(Return(true));
367 manager_.OnPacketSent(2, clock_.ApproximateNow(), kDefaultLength,
368 LOSS_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
369 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
370 clock_.AdvanceTime(rtt);
372 // First, ACK packet 1 which makes packet 2 non-retransmittable.
374 ReceivedPacketInfo received_info;
375 received_info.largest_observed = 1;
376 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
381 clock_.AdvanceTime(rtt);
383 // Next, NACK packet 2 three times.
384 received_info.largest_observed = 3;
385 received_info.missing_packets.insert(2);
387 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
389 received_info.largest_observed = 4;
391 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
393 received_info.largest_observed = 5;
394 ExpectAckAndLoss(true, 5, 2);
395 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
397 // No packets remain unacked.
398 VerifyUnackedPackets(NULL, 0);
399 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
400 VerifyRetransmittablePackets(NULL, 0);
402 // Verify that the retransmission alarm would not fire,
403 // since there is no retransmittable data outstanding.
404 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
407 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) {
409 RetransmitAndSendPacket(1, 2);
411 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
412 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
413 manager_.OnRetransmissionTimeout();
414 EXPECT_TRUE(manager_.HasPendingRetransmissions());
416 // Ack 1 but not 2, before 2 is able to be sent.
417 // Since 1 has been retransmitted, it has already been lost, and so the
418 // send algorithm is not informed that it has been ACK'd.
419 ReceivedPacketInfo received_info;
420 received_info.largest_observed = 1;
422 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
424 // Since 2 was marked for retransmit, when 1 is acked, 2 is discarded.
425 VerifyUnackedPackets(NULL, 0);
426 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
427 VerifyRetransmittablePackets(NULL, 0);
429 // Verify that the retransmission alarm would not fire,
430 // since there is no retransmittable data outstanding.
431 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
434 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
436 RetransmitAndSendPacket(1, 2);
437 RetransmitAndSendPacket(2, 3);
438 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15);
439 clock_.AdvanceTime(rtt);
441 // Ack 1 but not 2 or 3.
443 ReceivedPacketInfo received_info;
444 received_info.largest_observed = 1;
445 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
447 // 2 and 3 remain unacked, but no packets have retransmittable data.
448 QuicPacketSequenceNumber unacked[] = { 2, 3 };
449 VerifyUnackedPackets(unacked, arraysize(unacked));
450 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
451 VerifyRetransmittablePackets(NULL, 0);
453 // Ensure packet 2 is lost when 4 and 5 are sent and acked.
455 received_info.largest_observed = 4;
456 received_info.missing_packets.insert(2);
457 QuicPacketSequenceNumber acked[] = { 3, 4 };
458 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
459 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
461 QuicPacketSequenceNumber unacked2[] = { 2 };
462 VerifyUnackedPackets(unacked2, arraysize(unacked2));
463 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
466 received_info.largest_observed = 5;
467 ExpectAckAndLoss(true, 5, 2);
468 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
470 VerifyUnackedPackets(NULL, 0);
471 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
472 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted);
475 TEST_F(QuicSentPacketManagerTest, LoseButDontRetransmitRevivedPacket) {
481 // Ack 2 and 3, and mark 1 as revived.
482 ReceivedPacketInfo received_info;
483 received_info.largest_observed = 3;
484 received_info.missing_packets.insert(1);
485 received_info.revived_packets.insert(1);
486 QuicPacketSequenceNumber acked[] = { 2, 3 };
487 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
488 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
490 EXPECT_FALSE(manager_.HasPendingRetransmissions());
491 QuicPacketSequenceNumber unacked[] = { 1, 4 };
492 VerifyUnackedPackets(unacked, arraysize(unacked));
493 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
494 QuicPacketSequenceNumber retransmittable[] = { 4 };
495 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
497 // Ack the 4th packet and expect the 1st to be considered lost.
498 received_info.largest_observed = 4;
499 ExpectAckAndLoss(true, 4, 1);
500 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
502 EXPECT_FALSE(manager_.HasPendingRetransmissions());
503 VerifyRetransmittablePackets(NULL, 0);
506 TEST_F(QuicSentPacketManagerTest, MarkLostThenReviveAndDontRetransmitPacket) {
513 // Ack 2, 3, and 4, and expect the 1st to be considered lost.
514 ReceivedPacketInfo received_info;
515 received_info.largest_observed = 4;
516 received_info.missing_packets.insert(1);
517 QuicPacketSequenceNumber acked[] = { 2, 3, 4 };
518 QuicPacketSequenceNumber lost[] = { 1 };
519 ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost));
520 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
522 EXPECT_TRUE(manager_.HasPendingRetransmissions());
523 QuicPacketSequenceNumber unacked[] = { 1, 5 };
524 VerifyUnackedPackets(unacked, arraysize(unacked));
525 QuicPacketSequenceNumber retransmittable[] = { 1 };
526 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
528 // Ack 5th packet (FEC) and revive 1st packet. 1st packet should now be
529 // removed from pending retransmissions map.
530 received_info.largest_observed = 5;
531 received_info.revived_packets.insert(1);
533 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
535 EXPECT_FALSE(manager_.HasPendingRetransmissions());
536 VerifyRetransmittablePackets(NULL, 0);
539 TEST_F(QuicSentPacketManagerTest, TruncatedAck) {
541 RetransmitAndSendPacket(1, 2);
542 RetransmitAndSendPacket(2, 3);
543 RetransmitAndSendPacket(3, 4);
544 RetransmitAndSendPacket(4, 5);
546 // Truncated ack with 4 NACKs, so the first packet is lost.
547 ReceivedPacketInfo received_info;
548 received_info.largest_observed = 4;
549 received_info.missing_packets.insert(1);
550 received_info.missing_packets.insert(2);
551 received_info.missing_packets.insert(3);
552 received_info.missing_packets.insert(4);
553 received_info.is_truncated = true;
555 QuicPacketSequenceNumber lost[] = { 1 };
556 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost));
557 manager_.OnIncomingAck(received_info, clock_.Now());
559 // High water mark will be raised.
560 QuicPacketSequenceNumber unacked[] = { 2, 3, 4 };
561 VerifyUnackedPackets(unacked, arraysize(unacked));
562 QuicPacketSequenceNumber retransmittable[] = { 4 };
563 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
566 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) {
568 RetransmitAndSendPacket(1, 2);
569 RetransmitAndSendPacket(2, 3);
570 RetransmitAndSendPacket(3, 4);
571 manager_.OnSerializedPacket(CreateDataPacket(5));
572 manager_.OnSerializedPacket(CreateDataPacket(6));
573 manager_.OnSerializedPacket(CreateDataPacket(7));
574 manager_.OnSerializedPacket(CreateDataPacket(8));
575 manager_.OnSerializedPacket(CreateDataPacket(9));
577 // Ack previous transmission
579 ReceivedPacketInfo received_info;
580 received_info.largest_observed = 2;
581 received_info.missing_packets.insert(1);
583 manager_.OnIncomingAck(received_info, clock_.Now());
584 EXPECT_TRUE(manager_.IsUnacked(4));
587 // Truncated ack with 4 NACKs
589 ReceivedPacketInfo received_info;
590 received_info.largest_observed = 6;
591 received_info.missing_packets.insert(3);
592 received_info.missing_packets.insert(4);
593 received_info.missing_packets.insert(5);
594 received_info.missing_packets.insert(6);
595 received_info.is_truncated = true;
596 ExpectAckAndLoss(false, 1, 3);
597 manager_.OnIncomingAck(received_info, clock_.Now());
600 // High water mark will be raised.
601 QuicPacketSequenceNumber unacked[] = { 4, 5, 6, 7, 8, 9 };
602 VerifyUnackedPackets(unacked, arraysize(unacked));
603 QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 };
604 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable));
607 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacket) {
608 EXPECT_EQ(0u, manager_.GetLeastUnackedSentPacket());
611 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacketUnacked) {
612 SerializedPacket serialized_packet(CreateDataPacket(1));
614 manager_.OnSerializedPacket(serialized_packet);
615 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
618 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacketUnackedFec) {
619 SerializedPacket serialized_packet(CreateFecPacket(1));
621 manager_.OnSerializedPacket(serialized_packet);
622 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
625 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedSentPacketDiscardUnacked) {
626 SerializedPacket serialized_packet(CreateDataPacket(1));
628 manager_.OnSerializedPacket(serialized_packet);
629 manager_.DiscardUnackedPacket(1u);
630 EXPECT_EQ(0u, manager_.GetLeastUnackedSentPacket());
633 TEST_F(QuicSentPacketManagerTest, GetLeastUnackedPacketAndDiscard) {
634 VerifyUnackedPackets(NULL, 0);
636 SerializedPacket serialized_packet(CreateFecPacket(1));
637 manager_.OnSerializedPacket(serialized_packet);
638 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
640 SerializedPacket serialized_packet2(CreateFecPacket(2));
641 manager_.OnSerializedPacket(serialized_packet2);
642 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
644 SerializedPacket serialized_packet3(CreateFecPacket(3));
645 manager_.OnSerializedPacket(serialized_packet3);
646 EXPECT_EQ(1u, manager_.GetLeastUnackedSentPacket());
648 QuicPacketSequenceNumber unacked[] = { 1, 2, 3 };
649 VerifyUnackedPackets(unacked, arraysize(unacked));
650 VerifyRetransmittablePackets(NULL, 0);
652 manager_.DiscardUnackedPacket(1);
653 EXPECT_EQ(2u, manager_.GetLeastUnackedSentPacket());
655 // Ack 2, which has never been sent, so there's no rtt update.
656 ReceivedPacketInfo received_info;
657 received_info.largest_observed = 2;
658 manager_.OnIncomingAck(received_info, clock_.Now());
660 EXPECT_EQ(3u, manager_.GetLeastUnackedSentPacket());
662 // Discard the 3rd packet and ensure there are no FEC packets.
663 manager_.DiscardUnackedPacket(3);
664 EXPECT_FALSE(manager_.HasUnackedPackets());
667 TEST_F(QuicSentPacketManagerTest, GetSentTime) {
668 VerifyUnackedPackets(NULL, 0);
670 SerializedPacket serialized_packet(CreateFecPacket(1));
671 manager_.OnSerializedPacket(serialized_packet);
672 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _))
673 .Times(1).WillOnce(Return(true));
674 manager_.OnPacketSent(1, QuicTime::Zero(), kDefaultLength, NOT_RETRANSMISSION,
675 NO_RETRANSMITTABLE_DATA);
677 SerializedPacket serialized_packet2(CreateFecPacket(2));
678 QuicTime sent_time = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(1));
679 manager_.OnSerializedPacket(serialized_packet2);
680 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2, _, _))
681 .Times(1).WillOnce(Return(true));
682 manager_.OnPacketSent(2, sent_time, kDefaultLength, NOT_RETRANSMISSION,
683 NO_RETRANSMITTABLE_DATA);
685 QuicPacketSequenceNumber unacked[] = { 1, 2 };
686 VerifyUnackedPackets(unacked, arraysize(unacked));
687 VerifyRetransmittablePackets(NULL, 0);
689 EXPECT_TRUE(manager_.HasUnackedPackets());
690 EXPECT_EQ(QuicTime::Zero(),
691 QuicSentPacketManagerPeer::GetSentTime(&manager_, 1));
692 EXPECT_EQ(sent_time, QuicSentPacketManagerPeer::GetSentTime(&manager_, 2));
695 TEST_F(QuicSentPacketManagerTest, AckAckAndUpdateRtt) {
699 // Now ack the ack and expect an RTT update.
700 ReceivedPacketInfo received_info;
701 received_info.largest_observed = 2;
702 received_info.delta_time_largest_observed =
703 QuicTime::Delta::FromMilliseconds(5);
706 manager_.OnIncomingAck(received_info, clock_.Now());
710 // Now ack the ack and expect only an RTT update.
711 received_info.largest_observed = 3;
713 manager_.OnIncomingAck(received_info, clock_.Now());
716 TEST_F(QuicSentPacketManagerTest, Rtt) {
717 QuicPacketSequenceNumber sequence_number = 1;
718 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15);
719 SendDataPacket(sequence_number);
720 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
722 ExpectAck(sequence_number);
723 ReceivedPacketInfo received_info;
724 received_info.largest_observed = sequence_number;
725 received_info.delta_time_largest_observed =
726 QuicTime::Delta::FromMilliseconds(5);
727 manager_.OnIncomingAck(received_info, clock_.Now());
728 EXPECT_EQ(expected_rtt,
729 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
732 TEST_F(QuicSentPacketManagerTest, RttWithInvalidDelta) {
733 // Expect that the RTT is equal to the local time elapsed, since the
734 // delta_time_largest_observed is larger than the local time elapsed
735 // and is hence invalid.
736 QuicPacketSequenceNumber sequence_number = 1;
737 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
738 SendDataPacket(sequence_number);
739 clock_.AdvanceTime(expected_rtt);
741 ExpectAck(sequence_number);
742 ReceivedPacketInfo received_info;
743 received_info.largest_observed = sequence_number;
744 received_info.delta_time_largest_observed =
745 QuicTime::Delta::FromMilliseconds(11);
746 manager_.OnIncomingAck(received_info, clock_.Now());
747 EXPECT_EQ(expected_rtt,
748 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
751 TEST_F(QuicSentPacketManagerTest, RttWithInfiniteDelta) {
752 // Expect that the RTT is equal to the local time elapsed, since the
753 // delta_time_largest_observed is infinite, and is hence invalid.
754 QuicPacketSequenceNumber sequence_number = 1;
755 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
756 SendDataPacket(sequence_number);
757 clock_.AdvanceTime(expected_rtt);
759 ExpectAck(sequence_number);
760 ReceivedPacketInfo received_info;
761 received_info.largest_observed = sequence_number;
762 received_info.delta_time_largest_observed = QuicTime::Delta::Infinite();
763 manager_.OnIncomingAck(received_info, clock_.Now());
764 EXPECT_EQ(expected_rtt,
765 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
768 TEST_F(QuicSentPacketManagerTest, RttZeroDelta) {
769 // Expect that the RTT is the time between send and receive since the
770 // delta_time_largest_observed is zero.
771 QuicPacketSequenceNumber sequence_number = 1;
772 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10);
773 SendDataPacket(sequence_number);
774 clock_.AdvanceTime(expected_rtt);
776 ExpectAck(sequence_number);
777 ReceivedPacketInfo received_info;
778 received_info.largest_observed = sequence_number;
779 received_info.delta_time_largest_observed = QuicTime::Delta::Zero();
780 manager_.OnIncomingAck(received_info, clock_.Now());
781 EXPECT_EQ(expected_rtt,
782 QuicSentPacketManagerPeer::GetRttStats(&manager_)->latest_rtt());
785 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeout) {
786 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
789 QuicPacketSequenceNumber sequence_number = 1;
790 SendDataPacket(sequence_number);
792 // The first tail loss probe retransmits 1 packet.
793 manager_.OnRetransmissionTimeout();
794 RetransmitNextPacket(2);
795 EXPECT_FALSE(manager_.HasPendingRetransmissions());
797 // The second tail loss probe retransmits 1 packet.
798 manager_.OnRetransmissionTimeout();
799 RetransmitNextPacket(3);
800 EXPECT_FALSE(manager_.HasPendingRetransmissions());
802 // Ack the third and ensure the first two are still pending.
804 ReceivedPacketInfo received_info;
805 received_info.largest_observed = 3;
806 received_info.missing_packets.insert(1);
807 received_info.missing_packets.insert(2);
808 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
810 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
812 // Acking two more packets will lose both of them due to nacks.
813 received_info.largest_observed = 5;
814 QuicPacketSequenceNumber lost[] = { 1, 2 };
815 ExpectAcksAndLosses(false, NULL, 0, lost, arraysize(lost));
816 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
818 EXPECT_FALSE(manager_.HasPendingRetransmissions());
819 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
820 EXPECT_EQ(2u, stats_.tlp_count);
821 EXPECT_EQ(0u, stats_.rto_count);
824 TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) {
825 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
828 const size_t kNumSentPackets = 100;
829 for (size_t i = 1; i <= kNumSentPackets; ++i) {
833 // The first tail loss probe retransmits 1 packet.
834 manager_.OnRetransmissionTimeout();
835 RetransmitNextPacket(101);
836 EXPECT_FALSE(manager_.HasPendingRetransmissions());
838 // The second tail loss probe retransmits 1 packet.
839 manager_.OnRetransmissionTimeout();
840 RetransmitNextPacket(102);
841 EXPECT_FALSE(manager_.HasPendingRetransmissions());
843 // Advance the time enough to ensure all packets are RTO'd.
844 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000));
846 // The final RTO abandons all of them.
847 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
848 manager_.OnRetransmissionTimeout();
849 EXPECT_TRUE(manager_.HasPendingRetransmissions());
850 EXPECT_EQ(2u, stats_.tlp_count);
851 EXPECT_EQ(1u, stats_.rto_count);
854 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeout) {
855 // Send 2 crypto packets and 3 data packets.
856 const size_t kNumSentCryptoPackets = 2;
857 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
860 const size_t kNumSentDataPackets = 3;
861 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
862 SendDataPacket(kNumSentCryptoPackets + i);
864 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
866 // The first retransmits 2 packets.
867 manager_.OnRetransmissionTimeout();
868 RetransmitNextPacket(6);
869 RetransmitNextPacket(7);
870 EXPECT_FALSE(manager_.HasPendingRetransmissions());
871 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
873 // The second retransmits 2 packets.
874 manager_.OnRetransmissionTimeout();
875 RetransmitNextPacket(8);
876 RetransmitNextPacket(9);
877 EXPECT_FALSE(manager_.HasPendingRetransmissions());
878 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
880 // Now ack the two crypto packets and the speculatively encrypted request,
881 // and ensure the first four crypto packets get abandoned, but not lost.
882 QuicPacketSequenceNumber acked[] = { 3, 4, 5, 8, 9 };
883 ExpectAcksAndLosses(true, acked, arraysize(acked), NULL, 0);
884 ReceivedPacketInfo received_info;
885 received_info.largest_observed = 9;
886 received_info.missing_packets.insert(1);
887 received_info.missing_packets.insert(2);
888 received_info.missing_packets.insert(6);
889 received_info.missing_packets.insert(7);
890 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
892 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
895 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) {
896 // Send 2 crypto packets and 3 data packets.
897 const size_t kNumSentCryptoPackets = 2;
898 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
901 const size_t kNumSentDataPackets = 3;
902 for (size_t i = 1; i <= kNumSentDataPackets; ++i) {
903 SendDataPacket(kNumSentCryptoPackets + i);
905 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
907 // The first retransmission timeout retransmits 2 crypto packets.
908 manager_.OnRetransmissionTimeout();
909 RetransmitNextPacket(6);
910 RetransmitNextPacket(7);
911 EXPECT_FALSE(manager_.HasPendingRetransmissions());
912 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
914 // Now act like a version negotiation packet arrived, which would cause all
915 // unacked packets to be retransmitted.
916 manager_.RetransmitUnackedPackets(ALL_PACKETS);
918 // Ensure the first two pending packets are the crypto retransmits.
919 ASSERT_TRUE(manager_.HasPendingRetransmissions());
920 EXPECT_EQ(6u, manager_.NextPendingRetransmission().sequence_number);
921 RetransmitNextPacket(8);
922 EXPECT_EQ(7u, manager_.NextPendingRetransmission().sequence_number);
923 RetransmitNextPacket(9);
925 EXPECT_TRUE(manager_.HasPendingRetransmissions());
928 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) {
929 // Send 1 crypto packet.
931 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
933 // Retransmit the crypto packet as 2.
934 manager_.OnRetransmissionTimeout();
935 RetransmitNextPacket(2);
937 // Retransmit the crypto packet as 3.
938 manager_.OnRetransmissionTimeout();
939 RetransmitNextPacket(3);
941 // Now ack the first crypto packet, and ensure the second gets abandoned and
942 // removed from unacked_packets.
944 ReceivedPacketInfo received_info;
945 received_info.largest_observed = 2;
946 received_info.missing_packets.insert(1);
947 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
949 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
950 VerifyUnackedPackets(NULL, 0);
953 TEST_F(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) {
954 // Send 2 crypto packets and serialize 1 data packet.
955 const size_t kNumSentCryptoPackets = 2;
956 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) {
959 SerializedPacket packet(CreateDataPacket(3));
960 manager_.OnSerializedPacket(packet);
961 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
963 // Retransmit 2 crypto packets, but not the serialized packet.
964 manager_.OnRetransmissionTimeout();
965 RetransmitNextPacket(6);
966 RetransmitNextPacket(7);
967 EXPECT_FALSE(manager_.HasPendingRetransmissions());
968 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
971 TEST_F(QuicSentPacketManagerTest,
972 CryptoHandshakeRetransmissionThenRetransmitAll) {
973 // Send 1 crypto packet.
975 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
977 // Retransmit the crypto packet as 2.
978 manager_.OnRetransmissionTimeout();
979 RetransmitNextPacket(2);
981 // Now retransmit all the unacked packets, which occurs when there is a
982 // version negotiation.
983 manager_.RetransmitUnackedPackets(ALL_PACKETS);
984 QuicPacketSequenceNumber unacked[] = { 1, 2 };
985 VerifyUnackedPackets(unacked, arraysize(unacked));
986 EXPECT_TRUE(manager_.HasPendingRetransmissions());
987 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
988 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
991 TEST_F(QuicSentPacketManagerTest,
992 CryptoHandshakeRetransmissionThenAbandonAll) {
993 // Send 1 crypto packet.
995 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
997 // Retransmit the crypto packet as 2.
998 manager_.OnRetransmissionTimeout();
999 RetransmitNextPacket(2);
1001 // Now discard all unacked unencrypted packets, which occurs when the
1002 // connection goes forward secure.
1003 manager_.DiscardUnencryptedPackets();
1004 VerifyUnackedPackets(NULL, 0);
1005 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1006 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1007 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1010 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) {
1011 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1012 // Serialize two data packets and send the latter.
1013 SerializedPacket packet(CreateDataPacket(1));
1014 manager_.OnSerializedPacket(packet);
1016 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1017 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1019 // Retransmit 1 unacked packets, but not the first serialized packet.
1020 manager_.OnRetransmissionTimeout();
1021 RetransmitNextPacket(3);
1022 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1023 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_));
1024 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_));
1027 TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) {
1028 // Send 100 packets and then ensure all are abandoned when the RTO fires.
1029 const size_t kNumSentPackets = 100;
1030 for (size_t i = 1; i <= kNumSentPackets; ++i) {
1034 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1035 manager_.OnRetransmissionTimeout();
1038 TEST_F(QuicSentPacketManagerTest, GetTransmissionTime) {
1039 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
1042 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) {
1043 SendCryptoPacket(1);
1046 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1047 1 * base::Time::kMicrosecondsPerMillisecond);
1048 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1049 manager_.GetRetransmissionTime());
1051 // Test with a standard smoothed RTT.
1052 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1053 100 * base::Time::kMicrosecondsPerMillisecond);
1055 QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
1056 QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5));
1057 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1059 // Retransmit the packet by invoking the retransmission timeout.
1060 clock_.AdvanceTime(srtt.Multiply(1.5));
1061 manager_.OnRetransmissionTimeout();
1062 RetransmitNextPacket(2);
1064 // The retransmission time should now be twice as far in the future.
1065 expected_time = clock_.Now().Add(srtt.Multiply(2).Multiply(1.5));
1066 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1069 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) {
1070 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2);
1075 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1076 1 * base::Time::kMicrosecondsPerMillisecond);
1077 EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
1078 manager_.GetRetransmissionTime());
1080 // Test with a standard smoothed RTT.
1081 QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
1082 100 * base::Time::kMicrosecondsPerMillisecond);
1083 QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
1084 QuicTime::Delta expected_tlp_delay = srtt.Multiply(2);
1085 QuicTime expected_time = clock_.Now().Add(expected_tlp_delay);
1086 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1088 // Retransmit the packet by invoking the retransmission timeout.
1089 clock_.AdvanceTime(expected_tlp_delay);
1090 manager_.OnRetransmissionTimeout();
1091 RetransmitNextPacket(3);
1092 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1094 expected_time = clock_.Now().Add(expected_tlp_delay);
1095 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1098 TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeRTO) {
1099 QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
1100 QuicTime::Delta::FromMilliseconds(100),
1101 QuicTime::Delta::Zero(),
1107 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500);
1108 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1109 .WillRepeatedly(Return(expected_rto_delay));
1110 QuicTime expected_time = clock_.Now().Add(expected_rto_delay);
1111 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1113 // Retransmit the packet by invoking the retransmission timeout.
1114 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1115 clock_.AdvanceTime(expected_rto_delay);
1116 manager_.OnRetransmissionTimeout();
1117 RetransmitNextPacket(3);
1118 RetransmitNextPacket(4);
1119 EXPECT_FALSE(manager_.HasPendingRetransmissions());
1121 // The delay should double the second time.
1122 expected_time = clock_.Now().Add(expected_rto_delay).Add(expected_rto_delay);
1123 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1125 // Ack a packet and ensure the RTO goes back to the original value.
1126 ReceivedPacketInfo received_info;
1127 received_info.largest_observed = 2;
1128 received_info.missing_packets.insert(1);
1129 ExpectUpdatedRtt(2);
1130 manager_.OnIncomingAck(received_info, clock_.ApproximateNow());
1132 expected_time = clock_.Now().Add(expected_rto_delay);
1133 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
1136 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMin) {
1138 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1139 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1)));
1140 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200);
1142 // If the delay is smaller than the min, ensure it exponentially backs off
1144 for (int i = 0; i < 5; ++i) {
1146 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1147 delay = delay.Add(delay);
1148 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1149 manager_.OnRetransmissionTimeout();
1150 RetransmitNextPacket(i + 2);
1154 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelayMax) {
1155 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1156 .WillOnce(Return(QuicTime::Delta::FromSeconds(500)));
1158 EXPECT_EQ(QuicTime::Delta::FromSeconds(60),
1159 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1162 TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) {
1164 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500);
1165 EXPECT_CALL(*send_algorithm_, RetransmissionDelay())
1166 .WillRepeatedly(Return(delay));
1168 // Delay should back off exponentially.
1169 for (int i = 0; i < 5; ++i) {
1171 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_));
1172 delay = delay.Add(delay);
1173 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1174 manager_.OnRetransmissionTimeout();
1175 RetransmitNextPacket(i + 2);
1179 TEST_F(QuicSentPacketManagerTest, GetLossDelay) {
1180 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm();
1181 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm);
1183 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1184 .WillRepeatedly(Return(QuicTime::Zero()));
1188 // Handle an ack which causes the loss algorithm to be evaluated and
1189 // set the loss timeout.
1191 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1192 .WillOnce(Return(SequenceNumberSet()));
1193 ReceivedPacketInfo received_info;
1194 received_info.largest_observed = 2;
1195 received_info.missing_packets.insert(1);
1196 manager_.OnIncomingAck(received_info, clock_.Now());
1198 QuicTime timeout(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)));
1199 EXPECT_CALL(*loss_algorithm, GetLossTimeout())
1200 .WillRepeatedly(Return(timeout));
1201 EXPECT_EQ(timeout, manager_.GetRetransmissionTime());
1203 // Fire the retransmission timeout and ensure the loss detection algorithm
1205 EXPECT_CALL(*loss_algorithm, DetectLostPackets(_, _, _, _))
1206 .WillOnce(Return(SequenceNumberSet()));
1207 manager_.OnRetransmissionTimeout();
1210 TEST_F(QuicSentPacketManagerTest, NegotiateTimeLossDetection) {
1212 QuicSentPacketManagerPeer::GetLossAlgorithm(
1213 &manager_)->GetLossDetectionType());
1216 QuicConfigPeer::SetReceivedLossDetection(&config, kTIME);
1217 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _));
1218 manager_.SetFromConfig(config);
1221 QuicSentPacketManagerPeer::GetLossAlgorithm(
1222 &manager_)->GetLossDetectionType());