Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Unified Diff: net/quic/quic_sent_packet_manager_test.cc

Issue 125183003: Correctly handle NACK-based "retransmission" of packets which no longer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/quic_sent_packet_manager.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « net/quic/quic_sent_packet_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698