Index: net/quic/quic_sent_packet_manager_test.cc |
diff --git a/net/quic/quic_sent_packet_manager_test.cc b/net/quic/quic_sent_packet_manager_test.cc |
index 685279bea30aa59bdee7991cbbe96b7d41892c66..4b576c615dafdf74c4e8b3870bb73ad5afa07918 100644 |
--- a/net/quic/quic_sent_packet_manager_test.cc |
+++ b/net/quic/quic_sent_packet_manager_test.cc |
@@ -113,6 +113,15 @@ class QuicSentPacketManagerTest : public ::testing::TestWithParam<bool> { |
&manager_, new_sequence_number)); |
} |
+ void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, |
+ QuicPacketSequenceNumber new_sequence_number) { |
+ RetransmitPacket(old_sequence_number, new_sequence_number); |
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, new_sequence_number, _, _, _)) |
+ .WillOnce(Return(true)); |
+ manager_.OnPacketSent(new_sequence_number, clock_.Now(), |
+ 1000, NACK_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
+ } |
+ |
SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) { |
return CreatePacket(sequence_number, true); |
} |
@@ -266,6 +275,75 @@ TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) { |
EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
} |
+TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) { |
+ SendDataPacket(1); |
+ RetransmitPacket(1, 2); |
+ EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2, _, _, _)) |
+ .WillOnce(Return(true)); |
+ manager_.OnPacketSent(2, clock_.ApproximateNow(), 1000, |
+ NACK_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); |
+ |
+ // First, ACK packet 1 which makes packet 2 non-retransmittable. |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _, _)); |
+ ReceivedPacketInfo received_info; |
+ received_info.largest_observed = 1; |
+ EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero())); |
+ |
+ SendDataPacket(3); |
+ SendDataPacket(4); |
+ SendDataPacket(5); |
+ // Next, NACK packet 2 three times. |
+ received_info.largest_observed = 3; |
+ received_info.missing_packets.insert(2); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _, _)); |
+ EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero())); |
+ |
+ received_info.largest_observed = 4; |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _, _)); |
+ EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero())); |
+ |
+ received_info.largest_observed = 5; |
+ EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); |
+ EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); |
+ EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero())); |
+ |
+ // No packets remain unacked. |
+ VerifyUnackedPackets(NULL, 0); |
+ VerifyPendingPackets(NULL, 0); |
+ VerifyRetransmittablePackets(NULL, 0); |
+ |
+ // Verify that the retransmission alarm would not fire, |
+ // since there is no retransmittable data outstanding. |
+ EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
+} |
+ |
+TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) { |
+ SendDataPacket(1); |
+ RetransmitAndSendPacket(1, 2); |
+ |
+ // Fire the RTO, which will mark 2 for retransmission (but will not send it). |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
+ manager_.OnRetransmissionTimeout(); |
+ EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
+ |
+ // Ack 1 but not 2, before 2 is able to be sent. |
+ // Since 1 has been retransmitted, it has already been lost, and so the |
+ // send algorithm is not informed that it has been ACK'd. |
+ ReceivedPacketInfo received_info; |
+ received_info.largest_observed = 1; |
+ EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero())); |
+ |
+ // Since 2 was marked for retransmit, when 1 is acked, 2 is discarded. |
+ VerifyUnackedPackets(NULL, 0); |
+ VerifyPendingPackets(NULL, 0); |
+ VerifyRetransmittablePackets(NULL, 0); |
+ |
+ // Verify that the retransmission alarm would not fire, |
+ // since there is no retransmittable data outstanding. |
+ EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); |
+} |
+ |
TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { |
SendDataPacket(1); |
RetransmitPacket(1, 2); |
@@ -310,6 +388,47 @@ TEST_F(QuicSentPacketManagerTest, TruncatedAck) { |
VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
} |
+TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { |
+ SerializedPacket serialized_packet(CreateDataPacket(1)); |
+ |
+ manager_.OnSerializedPacket(serialized_packet); |
+ RetransmitPacket(1, 2); |
+ RetransmitPacket(2, 3); |
+ RetransmitPacket(3, 4); |
+ manager_.OnSerializedPacket(CreateDataPacket(5)); |
+ manager_.OnSerializedPacket(CreateDataPacket(6)); |
+ manager_.OnSerializedPacket(CreateDataPacket(7)); |
+ manager_.OnSerializedPacket(CreateDataPacket(8)); |
+ manager_.OnSerializedPacket(CreateDataPacket(9)); |
+ |
+ // Ack previous transmission |
+ { |
+ ReceivedPacketInfo received_info; |
+ received_info.largest_observed = 2; |
+ received_info.missing_packets.insert(1); |
+ manager_.OnIncomingAck(received_info, QuicTime::Zero()); |
+ EXPECT_TRUE(manager_.IsUnacked(4)); |
+ } |
+ |
+ // Truncated ack with 4 NACKs |
+ { |
+ ReceivedPacketInfo received_info; |
+ received_info.largest_observed = 6; |
+ received_info.missing_packets.insert(3); |
+ received_info.missing_packets.insert(4); |
+ received_info.missing_packets.insert(5); |
+ received_info.missing_packets.insert(6); |
+ received_info.is_truncated = true; |
+ manager_.OnIncomingAck(received_info, QuicTime::Zero()); |
+ } |
+ |
+ // High water mark will be raised. |
+ QuicPacketSequenceNumber unacked[] = { 5, 6, 7, 8, 9 }; |
+ VerifyUnackedPackets(unacked, arraysize(unacked)); |
+ QuicPacketSequenceNumber retransmittable[] = { 5, 6, 7, 8, 9 }; |
+ VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
+} |
+ |
TEST_F(QuicSentPacketManagerTest, SendDropAckRetransmitManyPackets) { |
manager_.OnSerializedPacket(CreateDataPacket(1)); |
manager_.OnSerializedPacket(CreateDataPacket(2)); |
@@ -868,11 +987,7 @@ TEST_F(QuicSentPacketManagerTest, TailLossProbeThenRTO) { |
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); |
// The final RTO abandons all of them. |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
- .WillOnce(Return(QuicTime::Delta::FromMilliseconds(100))); |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)) |
- .Times(kNumSentPackets + 2); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
manager_.OnRetransmissionTimeout(); |
EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
} |
@@ -926,11 +1041,7 @@ TEST_F(QuicSentPacketManagerTest, RetransmissionTimeout) { |
SendDataPacket(i); |
} |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(kNumSentPackets); |
- |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
- .WillOnce(Return(QuicTime::Delta::FromMilliseconds(1))); |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
manager_.OnRetransmissionTimeout(); |
} |
@@ -1013,8 +1124,7 @@ TEST_F(QuicSentPacketManagerTest, GetTransmissionTimeRTO) { |
EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); |
// Retransmit the packet by invoking the retransmission timeout. |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2); |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
clock_.AdvanceTime(expected_rto_delay); |
manager_.OnRetransmissionTimeout(); |
RetransmitNextPacket(3); |
@@ -1053,34 +1163,10 @@ TEST_F(QuicSentPacketManagerTest, GetTransmissionDelay) { |
EXPECT_EQ(delay, |
QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
delay = delay.Add(delay); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(i + 1, _)); |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
- manager_.OnRetransmissionTimeout(); |
- RetransmitNextPacket(i + 2); |
- } |
-} |
- |
-TEST_F(QuicSentPacketManagerTest, GetTestTransmissionDelayTailDrop) { |
- FLAGS_limit_rto_increase_for_tests = true; |
- |
- SendDataPacket(1); |
- QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
- .WillRepeatedly(Return(delay)); |
- |
- // No backoff for the first 5 retransmissions. |
- for (int i = 0; i < 5; ++i) { |
- EXPECT_EQ(delay, |
- QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(i + 1, _)); |
- EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout()); |
+ EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
manager_.OnRetransmissionTimeout(); |
RetransmitNextPacket(i + 2); |
} |
- |
- // Then backoff starts |
- EXPECT_EQ(delay.Add(delay), |
- QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); |
} |
} // namespace |