OLD | NEW |
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_config_peer.h" | 8 #include "net/quic/test_tools/quic_config_peer.h" |
9 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 9 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
10 #include "net/quic/test_tools/quic_test_utils.h" | 10 #include "net/quic/test_tools/quic_test_utils.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 | 62 |
63 EXPECT_TRUE(manager_.HasUnackedPackets()); | 63 EXPECT_TRUE(manager_.HasUnackedPackets()); |
64 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket()); | 64 EXPECT_EQ(packets[0], manager_.GetLeastUnackedSentPacket()); |
65 for (size_t i = 0; i < num_packets; ++i) { | 65 for (size_t i = 0; i < num_packets; ++i) { |
66 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i]; | 66 EXPECT_TRUE(manager_.IsUnacked(packets[i])) << packets[i]; |
67 } | 67 } |
68 } | 68 } |
69 | 69 |
70 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, | 70 void VerifyRetransmittablePackets(QuicPacketSequenceNumber* packets, |
71 size_t num_packets) { | 71 size_t num_packets) { |
72 SequenceNumberSet unacked = | |
73 QuicSentPacketManagerPeer::GetUnackedPackets(&manager_); | |
74 for (size_t i = 0; i < num_packets; ++i) { | |
75 EXPECT_TRUE(ContainsKey(unacked, packets[i])) << packets[i]; | |
76 } | |
77 size_t num_retransmittable = 0; | |
78 for (SequenceNumberSet::const_iterator it = unacked.begin(); | |
79 it != unacked.end(); ++it) { | |
80 if (manager_.HasRetransmittableFrames(*it)) { | |
81 ++num_retransmittable; | |
82 } | |
83 } | |
84 EXPECT_EQ(num_packets, | 72 EXPECT_EQ(num_packets, |
85 QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | 73 QuicSentPacketManagerPeer::GetNumRetransmittablePackets( |
86 &manager_)); | 74 &manager_)); |
87 EXPECT_EQ(num_packets, num_retransmittable); | 75 for (size_t i = 0; i < num_packets; ++i) { |
| 76 EXPECT_TRUE(manager_.HasRetransmittableFrames(packets[i])) |
| 77 << " packets[" << i << "]:" << packets[i]; |
| 78 } |
88 } | 79 } |
89 | 80 |
90 void ExpectAck(QuicPacketSequenceNumber largest_observed) { | 81 void ExpectAck(QuicPacketSequenceNumber largest_observed) { |
91 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( | 82 EXPECT_CALL(*send_algorithm_, OnCongestionEvent( |
92 true, _, ElementsAre(Pair(largest_observed, _)), _)); | 83 true, _, ElementsAre(Pair(largest_observed, _)), _)); |
93 } | 84 } |
94 | 85 |
95 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { | 86 void ExpectUpdatedRtt(QuicPacketSequenceNumber largest_observed) { |
96 EXPECT_CALL(*send_algorithm_, | 87 EXPECT_CALL(*send_algorithm_, |
97 OnCongestionEvent(true, _, _, _)); | 88 OnCongestionEvent(true, _, _, _)); |
(...skipping 20 matching lines...) Expand all Loading... |
118 vector<QuicPacketSequenceNumber> lost_vector; | 109 vector<QuicPacketSequenceNumber> lost_vector; |
119 for (size_t i = 0; i < num_packets_lost; ++i) { | 110 for (size_t i = 0; i < num_packets_lost; ++i) { |
120 lost_vector.push_back(packets_lost[i]); | 111 lost_vector.push_back(packets_lost[i]); |
121 } | 112 } |
122 EXPECT_CALL(*send_algorithm_, | 113 EXPECT_CALL(*send_algorithm_, |
123 OnCongestionEvent(rtt_updated, _, | 114 OnCongestionEvent(rtt_updated, _, |
124 Pointwise(KeyEq(), ack_vector), | 115 Pointwise(KeyEq(), ack_vector), |
125 Pointwise(KeyEq(), lost_vector))); | 116 Pointwise(KeyEq(), lost_vector))); |
126 } | 117 } |
127 | 118 |
| 119 // Retransmits a packet as though it was a TLP retransmission, because TLP |
| 120 // leaves the |old_sequence_number| pending. |
| 121 // TODO(ianswett): Test with transmission types besides TLP. |
128 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, | 122 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, |
129 QuicPacketSequenceNumber new_sequence_number) { | 123 QuicPacketSequenceNumber new_sequence_number) { |
130 QuicSentPacketManagerPeer::MarkForRetransmission( | 124 QuicSentPacketManagerPeer::MarkForRetransmission( |
131 &manager_, old_sequence_number, LOSS_RETRANSMISSION); | 125 &manager_, old_sequence_number, TLP_RETRANSMISSION); |
132 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 126 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
133 QuicSentPacketManager::PendingRetransmission next_retransmission = | 127 QuicSentPacketManager::PendingRetransmission next_retransmission = |
134 manager_.NextPendingRetransmission(); | 128 manager_.NextPendingRetransmission(); |
135 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); | 129 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); |
136 EXPECT_EQ(LOSS_RETRANSMISSION, | 130 EXPECT_EQ(TLP_RETRANSMISSION, |
137 next_retransmission.transmission_type); | 131 next_retransmission.transmission_type); |
138 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number); | 132 manager_.OnRetransmittedPacket(old_sequence_number, new_sequence_number); |
139 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( | 133 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( |
140 &manager_, new_sequence_number)); | 134 &manager_, new_sequence_number)); |
141 } | 135 } |
142 | 136 |
143 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, | 137 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, |
144 QuicPacketSequenceNumber new_sequence_number) { | 138 QuicPacketSequenceNumber new_sequence_number) { |
145 RetransmitPacket(old_sequence_number, new_sequence_number); | 139 RetransmitPacket(old_sequence_number, new_sequence_number); |
146 | 140 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 } | 184 } |
191 | 185 |
192 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { | 186 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { |
193 EXPECT_CALL(*send_algorithm_, | 187 EXPECT_CALL(*send_algorithm_, |
194 OnPacketSent(_, BytesInFlight(), sequence_number, | 188 OnPacketSent(_, BytesInFlight(), sequence_number, |
195 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | 189 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) |
196 .Times(1).WillOnce(Return(true)); | 190 .Times(1).WillOnce(Return(true)); |
197 SerializedPacket packet(CreateDataPacket(sequence_number)); | 191 SerializedPacket packet(CreateDataPacket(sequence_number)); |
198 packet.retransmittable_frames->AddStreamFrame( | 192 packet.retransmittable_frames->AddStreamFrame( |
199 new QuicStreamFrame(1, false, 0, IOVector())); | 193 new QuicStreamFrame(1, false, 0, IOVector())); |
200 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE); | |
201 manager_.OnSerializedPacket(packet); | 194 manager_.OnSerializedPacket(packet); |
202 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(), | 195 manager_.OnPacketSent(sequence_number, clock_.ApproximateNow(), |
203 packet.packet->length(), NOT_RETRANSMISSION, | 196 packet.packet->length(), NOT_RETRANSMISSION, |
204 HAS_RETRANSMITTABLE_DATA); | 197 HAS_RETRANSMITTABLE_DATA); |
205 } | 198 } |
206 | 199 |
207 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { | 200 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { |
208 EXPECT_CALL(*send_algorithm_, | 201 EXPECT_CALL(*send_algorithm_, |
209 OnPacketSent(_, BytesInFlight(), sequence_number, | 202 OnPacketSent(_, BytesInFlight(), sequence_number, |
210 kDefaultLength, NO_RETRANSMITTABLE_DATA)) | 203 kDefaultLength, NO_RETRANSMITTABLE_DATA)) |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 // Packet 1 is unacked, pending, but not retransmittable. | 283 // Packet 1 is unacked, pending, but not retransmittable. |
291 QuicPacketSequenceNumber unacked[] = { 1 }; | 284 QuicPacketSequenceNumber unacked[] = { 1 }; |
292 VerifyUnackedPackets(unacked, arraysize(unacked)); | 285 VerifyUnackedPackets(unacked, arraysize(unacked)); |
293 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 286 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
294 VerifyRetransmittablePackets(NULL, 0); | 287 VerifyRetransmittablePackets(NULL, 0); |
295 } | 288 } |
296 | 289 |
297 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { | 290 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { |
298 SendDataPacket(1); | 291 SendDataPacket(1); |
299 QuicSentPacketManagerPeer::MarkForRetransmission( | 292 QuicSentPacketManagerPeer::MarkForRetransmission( |
300 &manager_, 1, LOSS_RETRANSMISSION); | 293 &manager_, 1, TLP_RETRANSMISSION); |
301 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 294 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
302 | 295 |
303 // Ack 1. | 296 // Ack 1. |
304 ReceivedPacketInfo received_info; | 297 ReceivedPacketInfo received_info; |
305 received_info.largest_observed = 1; | 298 received_info.largest_observed = 1; |
306 ExpectAck(1); | 299 ExpectAck(1); |
307 manager_.OnIncomingAck(received_info, clock_.Now()); | 300 manager_.OnIncomingAck(received_info, clock_.Now()); |
308 | 301 |
309 // There should no longer be a pending retransmission. | 302 // There should no longer be a pending retransmission. |
310 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 303 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 received_info.missing_packets.insert(2); | 543 received_info.missing_packets.insert(2); |
551 received_info.missing_packets.insert(3); | 544 received_info.missing_packets.insert(3); |
552 received_info.missing_packets.insert(4); | 545 received_info.missing_packets.insert(4); |
553 received_info.is_truncated = true; | 546 received_info.is_truncated = true; |
554 | 547 |
555 QuicPacketSequenceNumber lost[] = { 1 }; | 548 QuicPacketSequenceNumber lost[] = { 1 }; |
556 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost)); | 549 ExpectAcksAndLosses(true, NULL, 0, lost, arraysize(lost)); |
557 manager_.OnIncomingAck(received_info, clock_.Now()); | 550 manager_.OnIncomingAck(received_info, clock_.Now()); |
558 | 551 |
559 // High water mark will be raised. | 552 // High water mark will be raised. |
560 QuicPacketSequenceNumber unacked[] = { 2, 3, 4 }; | 553 QuicPacketSequenceNumber unacked[] = { 2, 3, 4, 5 }; |
561 VerifyUnackedPackets(unacked, arraysize(unacked)); | 554 VerifyUnackedPackets(unacked, arraysize(unacked)); |
562 QuicPacketSequenceNumber retransmittable[] = { 4 }; | 555 QuicPacketSequenceNumber retransmittable[] = { 5 }; |
563 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 556 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
564 } | 557 } |
565 | 558 |
566 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | 559 TEST_F(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { |
567 SendDataPacket(1); | 560 SendDataPacket(1); |
568 RetransmitAndSendPacket(1, 2); | 561 RetransmitAndSendPacket(1, 2); |
569 RetransmitAndSendPacket(2, 3); | 562 RetransmitAndSendPacket(2, 3); |
570 RetransmitAndSendPacket(3, 4); | 563 RetransmitAndSendPacket(3, 4); |
571 manager_.OnSerializedPacket(CreateDataPacket(5)); | 564 manager_.OnSerializedPacket(CreateDataPacket(5)); |
572 manager_.OnSerializedPacket(CreateDataPacket(6)); | 565 manager_.OnSerializedPacket(CreateDataPacket(6)); |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 // Now retransmit all the unacked packets, which occurs when there is a | 974 // Now retransmit all the unacked packets, which occurs when there is a |
982 // version negotiation. | 975 // version negotiation. |
983 manager_.RetransmitUnackedPackets(ALL_PACKETS); | 976 manager_.RetransmitUnackedPackets(ALL_PACKETS); |
984 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 977 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
985 VerifyUnackedPackets(unacked, arraysize(unacked)); | 978 VerifyUnackedPackets(unacked, arraysize(unacked)); |
986 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 979 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
987 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 980 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
988 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 981 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
989 } | 982 } |
990 | 983 |
991 TEST_F(QuicSentPacketManagerTest, | |
992 CryptoHandshakeRetransmissionThenAbandonAll) { | |
993 // Send 1 crypto packet. | |
994 SendCryptoPacket(1); | |
995 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
996 | |
997 // Retransmit the crypto packet as 2. | |
998 manager_.OnRetransmissionTimeout(); | |
999 RetransmitNextPacket(2); | |
1000 | |
1001 // Now discard all unacked unencrypted packets, which occurs when the | |
1002 // connection goes forward secure. | |
1003 manager_.DiscardUnencryptedPackets(); | |
1004 VerifyUnackedPackets(NULL, 0); | |
1005 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1006 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
1007 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
1008 } | |
1009 | |
1010 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) { | 984 TEST_F(QuicSentPacketManagerTest, TailLossProbeTimeoutUnsentDataPacket) { |
1011 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | 985 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); |
1012 // Serialize two data packets and send the latter. | 986 // Serialize two data packets and send the latter. |
1013 SerializedPacket packet(CreateDataPacket(1)); | 987 SerializedPacket packet(CreateDataPacket(1)); |
1014 manager_.OnSerializedPacket(packet); | 988 manager_.OnSerializedPacket(packet); |
1015 SendDataPacket(2); | 989 SendDataPacket(2); |
1016 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | 990 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); |
1017 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 991 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
1018 | 992 |
1019 // Retransmit 1 unacked packets, but not the first serialized packet. | 993 // Retransmit 1 unacked packets, but not the first serialized packet. |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 | 1193 |
1220 EXPECT_EQ(kTime, | 1194 EXPECT_EQ(kTime, |
1221 QuicSentPacketManagerPeer::GetLossAlgorithm( | 1195 QuicSentPacketManagerPeer::GetLossAlgorithm( |
1222 &manager_)->GetLossDetectionType()); | 1196 &manager_)->GetLossDetectionType()); |
1223 } | 1197 } |
1224 | 1198 |
1225 | 1199 |
1226 } // namespace | 1200 } // namespace |
1227 } // namespace test | 1201 } // namespace test |
1228 } // namespace net | 1202 } // namespace net |
OLD | NEW |