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

Unified Diff: net/quic/quic_sent_packet_manager_test.cc

Issue 126513003: Land Recent QUIC Changes. (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') | net/quic/quic_stream_sequencer.h » ('j') | 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 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
« no previous file with comments | « net/quic/quic_sent_packet_manager.cc ('k') | net/quic/quic_stream_sequencer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698