| 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 2f1bef2d511082d134248dbeea1f218fec2a9313..8cd4f88fd611d40daa8f759526583d9394344ae9 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);
|
|
|