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/quic_flags.h" | 8 #include "net/quic/quic_flags.h" |
9 #include "net/quic/test_tools/quic_config_peer.h" | 9 #include "net/quic/test_tools/quic_config_peer.h" |
10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | 10 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 EXPECT_CALL(*send_algorithm_, | 141 EXPECT_CALL(*send_algorithm_, |
142 OnCongestionEvent(rtt_updated, _, | 142 OnCongestionEvent(rtt_updated, _, |
143 Pointwise(KeyEq(), ack_vector), | 143 Pointwise(KeyEq(), ack_vector), |
144 Pointwise(KeyEq(), lost_vector))); | 144 Pointwise(KeyEq(), lost_vector))); |
145 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | 145 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) |
146 .WillRepeatedly(Return(100 * kDefaultTCPMSS)); | 146 .WillRepeatedly(Return(100 * kDefaultTCPMSS)); |
147 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)). | 147 EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange(_)). |
148 Times(AnyNumber()); | 148 Times(AnyNumber()); |
149 } | 149 } |
150 | 150 |
151 // Retransmits a packet as though it was a TLP retransmission, because TLP | 151 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, |
152 // leaves the |old_sequence_number| pending. | 152 QuicPacketSequenceNumber new_sequence_number) { |
153 // TODO(ianswett): Test with transmission types besides TLP. | |
154 void RetransmitPacket(QuicPacketSequenceNumber old_sequence_number, | |
155 QuicPacketSequenceNumber new_sequence_number) { | |
156 QuicSentPacketManagerPeer::MarkForRetransmission( | 153 QuicSentPacketManagerPeer::MarkForRetransmission( |
157 &manager_, old_sequence_number, TLP_RETRANSMISSION); | 154 &manager_, old_sequence_number, TLP_RETRANSMISSION); |
158 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 155 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
159 QuicSentPacketManager::PendingRetransmission next_retransmission = | 156 QuicSentPacketManager::PendingRetransmission next_retransmission = |
160 manager_.NextPendingRetransmission(); | 157 manager_.NextPendingRetransmission(); |
161 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); | 158 EXPECT_EQ(old_sequence_number, next_retransmission.sequence_number); |
162 EXPECT_EQ(TLP_RETRANSMISSION, | 159 EXPECT_EQ(TLP_RETRANSMISSION, |
163 next_retransmission.transmission_type); | 160 next_retransmission.transmission_type); |
164 manager_.OnRetransmittedPacket(old_sequence_number, | |
165 new_sequence_number); | |
166 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( | |
167 &manager_, new_sequence_number)); | |
168 } | |
169 | |
170 void RetransmitAndSendPacket(QuicPacketSequenceNumber old_sequence_number, | |
171 QuicPacketSequenceNumber new_sequence_number) { | |
172 RetransmitPacket(old_sequence_number, new_sequence_number); | |
173 | 161 |
174 EXPECT_CALL(*send_algorithm_, | 162 EXPECT_CALL(*send_algorithm_, |
175 OnPacketSent(_, BytesInFlight(), new_sequence_number, | 163 OnPacketSent(_, BytesInFlight(), new_sequence_number, |
176 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | 164 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) |
177 .WillOnce(Return(true)); | 165 .WillOnce(Return(true)); |
178 manager_.OnPacketSent(new_sequence_number, | 166 SerializedPacket packet(CreatePacket(new_sequence_number, false)); |
| 167 manager_.OnPacketSent(&packet, |
| 168 old_sequence_number, |
179 clock_.Now(), | 169 clock_.Now(), |
180 kDefaultLength, | 170 kDefaultLength, |
181 LOSS_RETRANSMISSION, | 171 LOSS_RETRANSMISSION, |
182 HAS_RETRANSMITTABLE_DATA); | 172 HAS_RETRANSMITTABLE_DATA); |
| 173 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( |
| 174 &manager_, new_sequence_number)); |
183 } | 175 } |
184 | 176 |
185 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) { | 177 SerializedPacket CreateDataPacket(QuicPacketSequenceNumber sequence_number) { |
186 return CreatePacket(sequence_number, true); | 178 return CreatePacket(sequence_number, true); |
187 } | 179 } |
188 | 180 |
189 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number, | 181 SerializedPacket CreatePacket(QuicPacketSequenceNumber sequence_number, |
190 bool retransmittable) { | 182 bool retransmittable) { |
191 packets_.push_back(QuicPacket::NewDataPacket( | 183 packets_.push_back(QuicPacket::NewDataPacket( |
192 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false, | 184 NULL, kDefaultLength, false, PACKET_8BYTE_CONNECTION_ID, false, |
(...skipping 10 matching lines...) Expand all Loading... |
203 PACKET_6BYTE_SEQUENCE_NUMBER)); | 195 PACKET_6BYTE_SEQUENCE_NUMBER)); |
204 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, | 196 return SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, |
205 packets_.back(), 0u, NULL); | 197 packets_.back(), 0u, NULL); |
206 } | 198 } |
207 | 199 |
208 void SendDataPacket(QuicPacketSequenceNumber sequence_number) { | 200 void SendDataPacket(QuicPacketSequenceNumber sequence_number) { |
209 EXPECT_CALL(*send_algorithm_, | 201 EXPECT_CALL(*send_algorithm_, |
210 OnPacketSent(_, BytesInFlight(), sequence_number, _, _)) | 202 OnPacketSent(_, BytesInFlight(), sequence_number, _, _)) |
211 .Times(1).WillOnce(Return(true)); | 203 .Times(1).WillOnce(Return(true)); |
212 SerializedPacket packet(CreateDataPacket(sequence_number)); | 204 SerializedPacket packet(CreateDataPacket(sequence_number)); |
213 manager_.OnSerializedPacket(packet); | 205 manager_.OnPacketSent(&packet, 0, clock_.Now(), |
214 manager_.OnPacketSent(sequence_number, clock_.Now(), | |
215 packet.packet->length(), NOT_RETRANSMISSION, | 206 packet.packet->length(), NOT_RETRANSMISSION, |
216 HAS_RETRANSMITTABLE_DATA); | 207 HAS_RETRANSMITTABLE_DATA); |
217 } | 208 } |
218 | 209 |
219 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { | 210 void SendCryptoPacket(QuicPacketSequenceNumber sequence_number) { |
220 EXPECT_CALL(*send_algorithm_, | 211 EXPECT_CALL(*send_algorithm_, |
221 OnPacketSent(_, BytesInFlight(), sequence_number, | 212 OnPacketSent(_, BytesInFlight(), sequence_number, |
222 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | 213 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) |
223 .Times(1).WillOnce(Return(true)); | 214 .Times(1).WillOnce(Return(true)); |
224 SerializedPacket packet(CreateDataPacket(sequence_number)); | 215 SerializedPacket packet(CreateDataPacket(sequence_number)); |
225 packet.retransmittable_frames->AddStreamFrame( | 216 packet.retransmittable_frames->AddStreamFrame( |
226 new QuicStreamFrame(1, false, 0, IOVector())); | 217 new QuicStreamFrame(1, false, 0, IOVector())); |
227 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE); | 218 packet.retransmittable_frames->set_encryption_level(ENCRYPTION_NONE); |
228 manager_.OnSerializedPacket(packet); | 219 manager_.OnPacketSent(&packet, 0, clock_.Now(), |
229 manager_.OnPacketSent(sequence_number, clock_.Now(), | |
230 packet.packet->length(), NOT_RETRANSMISSION, | 220 packet.packet->length(), NOT_RETRANSMISSION, |
231 HAS_RETRANSMITTABLE_DATA); | 221 HAS_RETRANSMITTABLE_DATA); |
232 } | 222 } |
233 | 223 |
234 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { | 224 void SendFecPacket(QuicPacketSequenceNumber sequence_number) { |
235 EXPECT_CALL(*send_algorithm_, | 225 EXPECT_CALL(*send_algorithm_, |
236 OnPacketSent(_, BytesInFlight(), sequence_number, | 226 OnPacketSent(_, BytesInFlight(), sequence_number, |
237 kDefaultLength, NO_RETRANSMITTABLE_DATA)) | 227 kDefaultLength, NO_RETRANSMITTABLE_DATA)) |
238 .Times(1).WillOnce(Return(true)); | 228 .Times(1).WillOnce(Return(true)); |
239 SerializedPacket packet(CreateFecPacket(sequence_number)); | 229 SerializedPacket packet(CreateFecPacket(sequence_number)); |
240 manager_.OnSerializedPacket(packet); | 230 manager_.OnPacketSent(&packet, 0, clock_.Now(), |
241 manager_.OnPacketSent(sequence_number, clock_.Now(), | |
242 packet.packet->length(), NOT_RETRANSMISSION, | 231 packet.packet->length(), NOT_RETRANSMISSION, |
243 NO_RETRANSMITTABLE_DATA); | 232 NO_RETRANSMITTABLE_DATA); |
244 } | 233 } |
245 | 234 |
246 void SendAckPacket(QuicPacketSequenceNumber sequence_number) { | 235 void SendAckPacket(QuicPacketSequenceNumber sequence_number) { |
247 EXPECT_CALL(*send_algorithm_, | 236 EXPECT_CALL(*send_algorithm_, |
248 OnPacketSent(_, BytesInFlight(), sequence_number, | 237 OnPacketSent(_, BytesInFlight(), sequence_number, |
249 kDefaultLength, NO_RETRANSMITTABLE_DATA)) | 238 kDefaultLength, NO_RETRANSMITTABLE_DATA)) |
250 .Times(1).WillOnce(Return(false)); | 239 .Times(1).WillOnce(Return(false)); |
251 SerializedPacket packet(CreatePacket(sequence_number, false)); | 240 SerializedPacket packet(CreatePacket(sequence_number, false)); |
252 manager_.OnSerializedPacket(packet); | 241 manager_.OnPacketSent(&packet, 0, clock_.Now(), |
253 manager_.OnPacketSent(sequence_number, clock_.Now(), | |
254 packet.packet->length(), NOT_RETRANSMISSION, | 242 packet.packet->length(), NOT_RETRANSMISSION, |
255 NO_RETRANSMITTABLE_DATA); | 243 NO_RETRANSMITTABLE_DATA); |
256 } | 244 } |
257 | 245 |
258 // Based on QuicConnection's WritePendingRetransmissions. | 246 // Based on QuicConnection's WritePendingRetransmissions. |
259 void RetransmitNextPacket( | 247 void RetransmitNextPacket( |
260 QuicPacketSequenceNumber retransmission_sequence_number) { | 248 QuicPacketSequenceNumber retransmission_sequence_number) { |
261 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | 249 EXPECT_TRUE(manager_.HasPendingRetransmissions()); |
262 EXPECT_CALL(*send_algorithm_, | 250 EXPECT_CALL(*send_algorithm_, |
263 OnPacketSent(_, _, retransmission_sequence_number, | 251 OnPacketSent(_, _, retransmission_sequence_number, |
264 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | 252 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) |
265 .Times(1).WillOnce(Return(true)); | 253 .Times(1).WillOnce(Return(true)); |
266 const QuicSentPacketManager::PendingRetransmission pending = | 254 const QuicSentPacketManager::PendingRetransmission pending = |
267 manager_.NextPendingRetransmission(); | 255 manager_.NextPendingRetransmission(); |
268 manager_.OnRetransmittedPacket(pending.sequence_number, | 256 SerializedPacket packet( |
269 retransmission_sequence_number); | 257 CreatePacket(retransmission_sequence_number, false)); |
270 manager_.OnPacketSent(retransmission_sequence_number, clock_.Now(), | 258 manager_.OnPacketSent(&packet, pending.sequence_number, clock_.Now(), |
271 kDefaultLength, pending.transmission_type, | 259 kDefaultLength, pending.transmission_type, |
272 HAS_RETRANSMITTABLE_DATA); | 260 HAS_RETRANSMITTABLE_DATA); |
273 } | 261 } |
274 | 262 |
275 QuicSentPacketManager manager_; | 263 QuicSentPacketManager manager_; |
276 vector<QuicPacket*> packets_; | 264 vector<QuicPacket*> packets_; |
277 MockClock clock_; | 265 MockClock clock_; |
278 QuicConnectionStats stats_; | 266 QuicConnectionStats stats_; |
279 MockSendAlgorithm* send_algorithm_; | 267 MockSendAlgorithm* send_algorithm_; |
280 scoped_ptr<MockNetworkChangeVisitor> network_change_visitor_; | 268 scoped_ptr<MockNetworkChangeVisitor> network_change_visitor_; |
281 }; | 269 }; |
282 | 270 |
283 TEST_F(QuicSentPacketManagerTest, IsUnacked) { | 271 TEST_F(QuicSentPacketManagerTest, IsUnacked) { |
284 VerifyUnackedPackets(NULL, 0); | 272 VerifyUnackedPackets(NULL, 0); |
285 SendDataPacket(1); | 273 SendDataPacket(1); |
286 | 274 |
287 QuicPacketSequenceNumber unacked[] = { 1 }; | 275 QuicPacketSequenceNumber unacked[] = { 1 }; |
288 VerifyUnackedPackets(unacked, arraysize(unacked)); | 276 VerifyUnackedPackets(unacked, arraysize(unacked)); |
289 QuicPacketSequenceNumber retransmittable[] = { 1 }; | 277 QuicPacketSequenceNumber retransmittable[] = { 1 }; |
290 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 278 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
291 } | 279 } |
292 | 280 |
293 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) { | 281 TEST_F(QuicSentPacketManagerTest, IsUnAckedRetransmit) { |
294 SendDataPacket(1); | 282 SendDataPacket(1); |
295 RetransmitPacket(1, 2); | 283 RetransmitAndSendPacket(1, 2); |
296 | 284 |
297 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2)); | 285 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, 2)); |
298 QuicPacketSequenceNumber unacked[] = { 1, 2 }; | 286 QuicPacketSequenceNumber unacked[] = { 1, 2 }; |
299 VerifyUnackedPackets(unacked, arraysize(unacked)); | 287 VerifyUnackedPackets(unacked, arraysize(unacked)); |
300 QuicPacketSequenceNumber retransmittable[] = { 2 }; | 288 QuicPacketSequenceNumber retransmittable[] = { 2 }; |
301 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | 289 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); |
302 } | 290 } |
303 | 291 |
304 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) { | 292 TEST_F(QuicSentPacketManagerTest, RetransmitThenAck) { |
305 SendDataPacket(1); | 293 SendDataPacket(1); |
(...skipping 29 matching lines...) Expand all Loading... |
335 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | 323 EXPECT_FALSE(manager_.HasPendingRetransmissions()); |
336 | 324 |
337 // No unacked packets remain. | 325 // No unacked packets remain. |
338 VerifyUnackedPackets(NULL, 0); | 326 VerifyUnackedPackets(NULL, 0); |
339 VerifyRetransmittablePackets(NULL, 0); | 327 VerifyRetransmittablePackets(NULL, 0); |
340 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted); | 328 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted); |
341 } | 329 } |
342 | 330 |
343 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) { | 331 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPrevious) { |
344 SendDataPacket(1); | 332 SendDataPacket(1); |
345 RetransmitPacket(1, 2); | |
346 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
347 clock_.AdvanceTime(rtt); | |
348 | |
349 // Ack 1 but not 2. | |
350 ExpectAck(1); | |
351 QuicAckFrame ack_frame; | |
352 ack_frame.largest_observed = 1; | |
353 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
354 | |
355 // 2 should be unacked, since it may provide an RTT measurement. | |
356 QuicPacketSequenceNumber unacked[] = { 2 }; | |
357 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
358 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
359 VerifyRetransmittablePackets(NULL, 0); | |
360 | |
361 // Verify that the retransmission alarm would not fire, | |
362 // since there is no retransmittable data outstanding. | |
363 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
364 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted); | |
365 } | |
366 | |
367 TEST_F(QuicSentPacketManagerTest, RetransmitAndSendThenAckPrevious) { | |
368 SendDataPacket(1); | |
369 RetransmitAndSendPacket(1, 2); | 333 RetransmitAndSendPacket(1, 2); |
370 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | 334 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); |
371 clock_.AdvanceTime(rtt); | 335 clock_.AdvanceTime(rtt); |
372 | 336 |
373 // Ack 1 but not 2. | 337 // Ack 1 but not 2. |
374 ExpectAck(1); | 338 ExpectAck(1); |
375 QuicAckFrame ack_frame; | 339 QuicAckFrame ack_frame; |
376 ack_frame.largest_observed = 1; | 340 ack_frame.largest_observed = 1; |
377 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | 341 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); |
378 | 342 |
379 // 2 remains unacked, but no packets have retransmittable data. | 343 // 2 remains unacked, but no packets have retransmittable data. |
380 QuicPacketSequenceNumber unacked[] = { 2 }; | 344 QuicPacketSequenceNumber unacked[] = { 2 }; |
381 VerifyUnackedPackets(unacked, arraysize(unacked)); | 345 VerifyUnackedPackets(unacked, arraysize(unacked)); |
382 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | 346 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); |
383 VerifyRetransmittablePackets(NULL, 0); | 347 VerifyRetransmittablePackets(NULL, 0); |
384 | 348 |
385 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted); | 349 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted); |
386 } | 350 } |
387 | 351 |
388 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) { | 352 TEST_F(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) { |
389 SendDataPacket(1); | 353 SendDataPacket(1); |
390 RetransmitPacket(1, 2); | 354 RetransmitAndSendPacket(1, 2); |
391 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2, _, _)) | |
392 .WillOnce(Return(true)); | |
393 manager_.OnPacketSent(2, clock_.ApproximateNow(), kDefaultLength, | |
394 LOSS_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
395 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | 355 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); |
396 clock_.AdvanceTime(rtt); | 356 clock_.AdvanceTime(rtt); |
397 | 357 |
398 // First, ACK packet 1 which makes packet 2 non-retransmittable. | 358 // First, ACK packet 1 which makes packet 2 non-retransmittable. |
399 ExpectAck(1); | 359 ExpectAck(1); |
400 QuicAckFrame ack_frame; | 360 QuicAckFrame ack_frame; |
401 ack_frame.largest_observed = 1; | 361 ack_frame.largest_observed = 1; |
402 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | 362 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); |
403 | 363 |
404 SendDataPacket(3); | 364 SendDataPacket(3); |
(...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 .WillOnce(Return(100 * kDefaultTCPMSS)); | 1376 .WillOnce(Return(100 * kDefaultTCPMSS)); |
1417 manager_.SetFromConfig(config); | 1377 manager_.SetFromConfig(config); |
1418 | 1378 |
1419 EXPECT_EQ(initial_rtt_us, | 1379 EXPECT_EQ(initial_rtt_us, |
1420 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); | 1380 manager_.GetRttStats()->SmoothedRtt().ToMicroseconds()); |
1421 } | 1381 } |
1422 | 1382 |
1423 } // namespace | 1383 } // namespace |
1424 } // namespace test | 1384 } // namespace test |
1425 } // namespace net | 1385 } // namespace net |
OLD | NEW |