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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_sent_packet_manager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_sent_packet_manager.h" 5 #include "net/quic/quic_sent_packet_manager.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" 8 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
9 #include "net/quic/test_tools/quic_test_utils.h" 9 #include "net/quic/test_tools/quic_test_utils.h"
10 #include "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gmock/include/gmock/gmock.h"
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 EXPECT_TRUE(manager_.HasPendingRetransmissions()); 106 EXPECT_TRUE(manager_.HasPendingRetransmissions());
107 QuicSentPacketManager::PendingRetransmission next_retransmission = 107 QuicSentPacketManager::PendingRetransmission next_retransmission =
108 manager_.NextPendingRetransmission(); 108 manager_.NextPendingRetransmission();
109 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); 109 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number);
110 EXPECT_EQ(NACK_RETRANSMISSION, next_retransmission.transmission_type); 110 EXPECT_EQ(NACK_RETRANSMISSION, next_retransmission.transmission_type);
111 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number); 111 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number);
112 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( 112 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(
113 &manager_, new_sequence_number)); 113 &manager_, new_sequence_number));
114 } 114 }
115 115
116 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number,
117 QuicPacketSequenceNumber new_sequence_number) {
118 RetransmitPacket(old_sequence_number, new_sequence_number);
119 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, new_sequence_number, _, _, _))
120 .WillOnce(Return(true));
121 manager_.OnPacketSent(new_sequence_number, clock_.Now(),
122 1000, NACK_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
123 }
124
116 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) { 125 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) {
117 return CreatePacket(sequence_number, true); 126 return CreatePacket(sequence_number, true);
118 } 127 }
119 128
120 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number, 129 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number,
121 bool retransmittable) { 130 bool retransmittable) {
122 packets_.push_back(QuicPacket::NewDataPacket( 131 packets_.push_back(QuicPacket::NewDataPacket(
123 NULL, 1000, false, PACKET_8BYTE_GUID, false, 132 NULL, 1000, false, PACKET_8BYTE_GUID, false,
124 PACKET_6BYTE_SEQUENCE_NUMBER)); 133 PACKET_6BYTE_SEQUENCE_NUMBER));
125 return SerializedPacket( 134 return SerializedPacket(
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 QuicPacketSequenceNumber unacked[] = { 2 }; 268 QuicPacketSequenceNumber unacked[] = { 2 };
260 VerifyUnackedPackets(unacked, arraysize(unacked)); 269 VerifyUnackedPackets(unacked, arraysize(unacked));
261 VerifyPendingPackets(NULL, 0); 270 VerifyPendingPackets(NULL, 0);
262 VerifyRetransmittablePackets(NULL, 0); 271 VerifyRetransmittablePackets(NULL, 0);
263 272
264 // Verify that the retransmission alarm would not fire, 273 // Verify that the retransmission alarm would not fire,
265 // since there is no retransmittable data outstanding. 274 // since there is no retransmittable data outstanding.
266 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); 275 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
267 } 276 }
268 277
278 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) {
279 SendDataPacket(1);
280 RetransmitPacket(1, 2);
281 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2, _, _, _))
282 .WillOnce(Return(true));
283 manager_.OnPacketSent(2, clock_.ApproximateNow(), 1000,
284 NACK_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
285
286 // First, ACK packet 1 which makes packet 2 non-retransmittable.
287 EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _, _));
288 ReceivedPacketInfo received_info;
289 received_info.largest_observed = 1;
290 EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero()));
291
292 SendDataPacket(3);
293 SendDataPacket(4);
294 SendDataPacket(5);
295 // Next, NACK packet 2 three times.
296 received_info.largest_observed = 3;
297 received_info.missing_packets.insert(2);
298 EXPECT_CALL(*send_algorithm_, OnPacketAcked(3, _, _));
299 EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero()));
300
301 received_info.largest_observed = 4;
302 EXPECT_CALL(*send_algorithm_, OnPacketAcked(4, _, _));
303 EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero()));
304
305 received_info.largest_observed = 5;
306 EXPECT_CALL(*send_algorithm_, OnPacketAcked(5, _, _));
307 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
308 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
309 EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero()));
310
311 // No packets remain unacked.
312 VerifyUnackedPackets(NULL, 0);
313 VerifyPendingPackets(NULL, 0);
314 VerifyRetransmittablePackets(NULL, 0);
315
316 // Verify that the retransmission alarm would not fire,
317 // since there is no retransmittable data outstanding.
318 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
319 }
320
321 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckPreviousBeforeSend) {
322 SendDataPacket(1);
323 RetransmitAndSendPacket(1, 2);
324
325 // Fire the RTO, which will mark 2 for retransmission (but will not send it).
326 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
327 manager_.OnRetransmissionTimeout();
328 EXPECT_TRUE(manager_.HasPendingRetransmissions());
329
330 // Ack 1 but not 2, before 2 is able to be sent.
331 // Since 1 has been retransmitted, it has already been lost, and so the
332 // send algorithm is not informed that it has been ACK'd.
333 ReceivedPacketInfo received_info;
334 received_info.largest_observed = 1;
335 EXPECT_TRUE(manager_.OnIncomingAck(received_info, QuicTime::Zero()));
336
337 // Since 2 was marked for retransmit, when 1 is acked, 2 is discarded.
338 VerifyUnackedPackets(NULL, 0);
339 VerifyPendingPackets(NULL, 0);
340 VerifyRetransmittablePackets(NULL, 0);
341
342 // Verify that the retransmission alarm would not fire,
343 // since there is no retransmittable data outstanding.
344 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime());
345 }
346
269 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { 347 TEST_F(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) {
270 SendDataPacket(1); 348 SendDataPacket(1);
271 RetransmitPacket(1, 2); 349 RetransmitPacket(1, 2);
272 RetransmitPacket(2, 3); 350 RetransmitPacket(2, 3);
273 351
274 // Ack 1 but not 2 or 3. 352 // Ack 1 but not 2 or 3.
275 EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _, _)); 353 EXPECT_CALL(*send_algorithm_, OnPacketAcked(1, _, _));
276 ReceivedPacketInfo received_info; 354 ReceivedPacketInfo received_info;
277 received_info.largest_observed = 1; 355 received_info.largest_observed = 1;
278 manager_.OnIncomingAck(received_info, QuicTime::Zero()); 356 manager_.OnIncomingAck(received_info, QuicTime::Zero());
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 delay = delay.Add(delay); 1124 delay = delay.Add(delay);
1047 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1125 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1048 manager_.OnRetransmissionTimeout(); 1126 manager_.OnRetransmissionTimeout();
1049 RetransmitNextPacket(i + 2); 1127 RetransmitNextPacket(i + 2);
1050 } 1128 }
1051 } 1129 }
1052 1130
1053 } // namespace 1131 } // namespace
1054 } // namespace test 1132 } // namespace test
1055 } // namespace net 1133 } // namespace net
OLDNEW
« 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