OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/quic_sent_packet_manager.h" | |
6 | |
7 #include <memory> | |
8 | |
9 #include "base/stl_util.h" | |
10 #include "net/quic/quic_flags.h" | |
11 #include "net/quic/test_tools/quic_config_peer.h" | |
12 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" | |
13 #include "net/quic/test_tools/quic_test_utils.h" | |
14 #include "testing/gmock/include/gmock/gmock.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 | |
17 using std::vector; | |
18 using testing::AnyNumber; | |
19 using testing::ElementsAre; | |
20 using testing::IsEmpty; | |
21 using testing::Not; | |
22 using testing::Pair; | |
23 using testing::Pointwise; | |
24 using testing::Return; | |
25 using testing::SetArgPointee; | |
26 using testing::StrictMock; | |
27 using testing::_; | |
28 | |
29 namespace net { | |
30 namespace test { | |
31 namespace { | |
32 | |
33 // Default packet length. | |
34 const uint32_t kDefaultLength = 1000; | |
35 | |
36 // Stream ID for data sent in CreatePacket(). | |
37 const QuicStreamId kStreamId = 7; | |
38 | |
39 // Minimum number of consecutive RTOs before path is considered to be degrading. | |
40 const size_t kMinTimeoutsBeforePathDegrading = 2; | |
41 | |
42 // Matcher to check the key of the key-value pair it receives as first argument | |
43 // equals its second argument. | |
44 MATCHER(KeyEq, "") { | |
45 return std::tr1::get<0>(arg).first == std::tr1::get<1>(arg); | |
46 } | |
47 | |
48 class MockDebugDelegate : public QuicSentPacketManagerInterface::DebugDelegate { | |
49 public: | |
50 MOCK_METHOD2(OnSpuriousPacketRetransmission, | |
51 void(TransmissionType transmission_type, | |
52 QuicByteCount byte_size)); | |
53 MOCK_METHOD3(OnPacketLoss, | |
54 void(QuicPacketNumber lost_packet_number, | |
55 TransmissionType transmission_type, | |
56 QuicTime detection_time)); | |
57 }; | |
58 | |
59 // Run tests with different ack frame packets set mode. | |
60 struct TestParams { | |
61 explicit TestParams(bool missing) : missing(missing) {} | |
62 | |
63 friend std::ostream& operator<<(std::ostream& os, const TestParams& p) { | |
64 os << "{ ack frame packets set mode: " << p.missing << " }"; | |
65 return os; | |
66 } | |
67 | |
68 bool missing; | |
69 }; | |
70 | |
71 vector<TestParams> GetTestParams() { | |
72 vector<TestParams> params; | |
73 for (bool missing : {true, false}) { | |
74 params.push_back(TestParams(missing)); | |
75 } | |
76 return params; | |
77 } | |
78 | |
79 class QuicSentPacketManagerTest : public ::testing::TestWithParam<TestParams> { | |
80 protected: | |
81 QuicSentPacketManagerTest() | |
82 : manager_(Perspective::IS_SERVER, | |
83 kDefaultPathId, | |
84 &clock_, | |
85 &stats_, | |
86 kCubic, | |
87 kNack, | |
88 /*delegate=*/nullptr), | |
89 send_algorithm_(new StrictMock<MockSendAlgorithm>), | |
90 network_change_visitor_(new StrictMock<MockNetworkChangeVisitor>) { | |
91 QuicSentPacketManagerPeer::SetSendAlgorithm(&manager_, send_algorithm_); | |
92 // Disable tail loss probes for most tests. | |
93 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 0); | |
94 // Advance the time 1s so the send times are never QuicTime::Zero. | |
95 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | |
96 manager_.SetNetworkChangeVisitor(network_change_visitor_.get()); | |
97 | |
98 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate()) | |
99 .Times(AnyNumber()); | |
100 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()) | |
101 .Times(AnyNumber()) | |
102 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
103 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber()); | |
104 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber()); | |
105 EXPECT_CALL(*network_change_visitor_, OnPathMtuIncreased(1000)) | |
106 .Times(AnyNumber()); | |
107 } | |
108 | |
109 ~QuicSentPacketManagerTest() override { | |
110 STLDeleteElements(&packets_); | |
111 } | |
112 | |
113 QuicByteCount BytesInFlight() { | |
114 return QuicSentPacketManagerPeer::GetBytesInFlight(&manager_); | |
115 } | |
116 void VerifyUnackedPackets(QuicPacketNumber* packets, size_t num_packets) { | |
117 if (num_packets == 0) { | |
118 EXPECT_FALSE(manager_.HasUnackedPackets()); | |
119 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetNumRetransmittablePackets( | |
120 &manager_)); | |
121 return; | |
122 } | |
123 | |
124 EXPECT_TRUE(manager_.HasUnackedPackets()); | |
125 EXPECT_EQ(packets[0], manager_.GetLeastUnacked(kDefaultPathId)); | |
126 for (size_t i = 0; i < num_packets; ++i) { | |
127 EXPECT_TRUE(QuicSentPacketManagerPeer::IsUnacked(&manager_, packets[i])) | |
128 << packets[i]; | |
129 } | |
130 } | |
131 | |
132 void VerifyRetransmittablePackets(QuicPacketNumber* packets, | |
133 size_t num_packets) { | |
134 EXPECT_EQ( | |
135 num_packets, | |
136 QuicSentPacketManagerPeer::GetNumRetransmittablePackets(&manager_)); | |
137 for (size_t i = 0; i < num_packets; ++i) { | |
138 EXPECT_TRUE(QuicSentPacketManagerPeer::HasRetransmittableFrames( | |
139 &manager_, packets[i])) | |
140 << " packets[" << i << "]:" << packets[i]; | |
141 } | |
142 } | |
143 | |
144 void ExpectAck(QuicPacketNumber largest_observed) { | |
145 EXPECT_CALL( | |
146 *send_algorithm_, | |
147 OnCongestionEvent(true, _, ElementsAre(Pair(largest_observed, _)), | |
148 IsEmpty())); | |
149 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
150 } | |
151 | |
152 void ExpectUpdatedRtt(QuicPacketNumber largest_observed) { | |
153 EXPECT_CALL(*send_algorithm_, | |
154 OnCongestionEvent(true, _, IsEmpty(), IsEmpty())); | |
155 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
156 } | |
157 | |
158 void ExpectAckAndLoss(bool rtt_updated, | |
159 QuicPacketNumber largest_observed, | |
160 QuicPacketNumber lost_packet) { | |
161 EXPECT_CALL(*send_algorithm_, | |
162 OnCongestionEvent(rtt_updated, _, | |
163 ElementsAre(Pair(largest_observed, _)), | |
164 ElementsAre(Pair(lost_packet, _)))); | |
165 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
166 } | |
167 | |
168 // |packets_acked| and |packets_lost| should be in packet number order. | |
169 void ExpectAcksAndLosses(bool rtt_updated, | |
170 QuicPacketNumber* packets_acked, | |
171 size_t num_packets_acked, | |
172 QuicPacketNumber* packets_lost, | |
173 size_t num_packets_lost) { | |
174 vector<QuicPacketNumber> ack_vector; | |
175 for (size_t i = 0; i < num_packets_acked; ++i) { | |
176 ack_vector.push_back(packets_acked[i]); | |
177 } | |
178 vector<QuicPacketNumber> lost_vector; | |
179 for (size_t i = 0; i < num_packets_lost; ++i) { | |
180 lost_vector.push_back(packets_lost[i]); | |
181 } | |
182 EXPECT_CALL( | |
183 *send_algorithm_, | |
184 OnCongestionEvent(rtt_updated, _, Pointwise(KeyEq(), ack_vector), | |
185 Pointwise(KeyEq(), lost_vector))); | |
186 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()) | |
187 .Times(AnyNumber()); | |
188 } | |
189 | |
190 void RetransmitAndSendPacket(QuicPacketNumber old_packet_number, | |
191 QuicPacketNumber new_packet_number) { | |
192 RetransmitAndSendPacket(old_packet_number, new_packet_number, | |
193 TLP_RETRANSMISSION); | |
194 } | |
195 | |
196 void RetransmitAndSendPacket(QuicPacketNumber old_packet_number, | |
197 QuicPacketNumber new_packet_number, | |
198 TransmissionType transmission_type) { | |
199 QuicSentPacketManagerPeer::MarkForRetransmission( | |
200 &manager_, kDefaultPathId, old_packet_number, transmission_type); | |
201 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
202 PendingRetransmission next_retransmission = | |
203 manager_.NextPendingRetransmission(); | |
204 EXPECT_EQ(old_packet_number, next_retransmission.packet_number); | |
205 EXPECT_EQ(transmission_type, next_retransmission.transmission_type); | |
206 | |
207 EXPECT_CALL(*send_algorithm_, | |
208 OnPacketSent(_, BytesInFlight(), new_packet_number, | |
209 kDefaultLength, HAS_RETRANSMITTABLE_DATA)) | |
210 .WillOnce(Return(true)); | |
211 SerializedPacket packet(CreatePacket(new_packet_number, false)); | |
212 manager_.OnPacketSent(&packet, packet.path_id, old_packet_number, | |
213 clock_.Now(), transmission_type, | |
214 HAS_RETRANSMITTABLE_DATA); | |
215 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission( | |
216 &manager_, packet.path_id, new_packet_number)); | |
217 } | |
218 | |
219 SerializedPacket CreateDataPacket(QuicPacketNumber packet_number) { | |
220 return CreatePacket(packet_number, true); | |
221 } | |
222 | |
223 SerializedPacket CreatePacket(QuicPacketNumber packet_number, | |
224 bool retransmittable) { | |
225 SerializedPacket packet(kDefaultPathId, packet_number, | |
226 PACKET_6BYTE_PACKET_NUMBER, nullptr, kDefaultLength, | |
227 0u, false, false); | |
228 if (retransmittable) { | |
229 packet.retransmittable_frames.push_back( | |
230 QuicFrame(new QuicStreamFrame(kStreamId, false, 0, StringPiece()))); | |
231 } | |
232 return packet; | |
233 } | |
234 | |
235 void SendDataPacket(QuicPacketNumber packet_number) { | |
236 EXPECT_CALL(*send_algorithm_, | |
237 OnPacketSent(_, BytesInFlight(), packet_number, _, _)) | |
238 .Times(1) | |
239 .WillOnce(Return(true)); | |
240 SerializedPacket packet(CreateDataPacket(packet_number)); | |
241 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
242 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
243 } | |
244 | |
245 void SendCryptoPacket(QuicPacketNumber packet_number) { | |
246 EXPECT_CALL(*send_algorithm_, | |
247 OnPacketSent(_, BytesInFlight(), packet_number, kDefaultLength, | |
248 HAS_RETRANSMITTABLE_DATA)) | |
249 .Times(1) | |
250 .WillOnce(Return(true)); | |
251 SerializedPacket packet(CreateDataPacket(packet_number)); | |
252 packet.retransmittable_frames.push_back( | |
253 QuicFrame(new QuicStreamFrame(1, false, 0, StringPiece()))); | |
254 packet.has_crypto_handshake = IS_HANDSHAKE; | |
255 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
256 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
257 } | |
258 | |
259 void SendAckPacket(QuicPacketNumber packet_number) { | |
260 EXPECT_CALL(*send_algorithm_, | |
261 OnPacketSent(_, BytesInFlight(), packet_number, kDefaultLength, | |
262 NO_RETRANSMITTABLE_DATA)) | |
263 .Times(1) | |
264 .WillOnce(Return(false)); | |
265 SerializedPacket packet(CreatePacket(packet_number, false)); | |
266 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
267 NOT_RETRANSMISSION, NO_RETRANSMITTABLE_DATA); | |
268 } | |
269 | |
270 // Based on QuicConnection's WritePendingRetransmissions. | |
271 void RetransmitNextPacket(QuicPacketNumber retransmission_packet_number) { | |
272 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
273 EXPECT_CALL(*send_algorithm_, | |
274 OnPacketSent(_, _, retransmission_packet_number, kDefaultLength, | |
275 HAS_RETRANSMITTABLE_DATA)) | |
276 .Times(1) | |
277 .WillOnce(Return(true)); | |
278 const PendingRetransmission pending = manager_.NextPendingRetransmission(); | |
279 SerializedPacket packet(CreatePacket(retransmission_packet_number, false)); | |
280 manager_.OnPacketSent(&packet, pending.path_id, pending.packet_number, | |
281 clock_.Now(), pending.transmission_type, | |
282 HAS_RETRANSMITTABLE_DATA); | |
283 } | |
284 | |
285 // Initialize a frame acknowledging all packets up to largest_observed. | |
286 const QuicAckFrame InitAckFrame(QuicPacketNumber largest_observed) { | |
287 QuicAckFrame frame(MakeAckFrame(largest_observed)); | |
288 frame.missing = GetParam().missing; | |
289 if (!GetParam().missing) { | |
290 if (largest_observed > 0) { | |
291 frame.packets.Add(1, largest_observed + 1); | |
292 } | |
293 } | |
294 return frame; | |
295 } | |
296 | |
297 // Explicitly nack packet [lower, higher). | |
298 void NackPackets(QuicPacketNumber lower, | |
299 QuicPacketNumber higher, | |
300 QuicAckFrame* frame) { | |
301 if (frame->missing) { | |
302 frame->packets.Add(lower, higher); | |
303 } else { | |
304 frame->packets.Remove(lower, higher); | |
305 } | |
306 } | |
307 | |
308 QuicSentPacketManager manager_; | |
309 vector<QuicEncryptedPacket*> packets_; | |
310 MockClock clock_; | |
311 QuicConnectionStats stats_; | |
312 MockSendAlgorithm* send_algorithm_; | |
313 std::unique_ptr<MockNetworkChangeVisitor> network_change_visitor_; | |
314 }; | |
315 | |
316 INSTANTIATE_TEST_CASE_P(QuicSentPacketManagerTest, | |
317 QuicSentPacketManagerTest, | |
318 ::testing::ValuesIn(GetTestParams())); | |
319 | |
320 TEST_P(QuicSentPacketManagerTest, IsUnacked) { | |
321 VerifyUnackedPackets(nullptr, 0); | |
322 SendDataPacket(1); | |
323 | |
324 QuicPacketNumber unacked[] = {1}; | |
325 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
326 QuicPacketNumber retransmittable[] = {1}; | |
327 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
328 } | |
329 | |
330 TEST_P(QuicSentPacketManagerTest, IsUnAckedRetransmit) { | |
331 SendDataPacket(1); | |
332 RetransmitAndSendPacket(1, 2); | |
333 | |
334 EXPECT_TRUE(QuicSentPacketManagerPeer::IsRetransmission(&manager_, | |
335 kDefaultPathId, 2)); | |
336 QuicPacketNumber unacked[] = {1, 2}; | |
337 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
338 QuicPacketNumber retransmittable[] = {2}; | |
339 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
340 } | |
341 | |
342 TEST_P(QuicSentPacketManagerTest, RetransmitThenAck) { | |
343 SendDataPacket(1); | |
344 RetransmitAndSendPacket(1, 2); | |
345 | |
346 // Ack 2 but not 1. | |
347 QuicAckFrame ack_frame = InitAckFrame(2); | |
348 NackPackets(1, 2, &ack_frame); | |
349 ExpectAck(2); | |
350 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
351 | |
352 // Packet 1 is unacked, pending, but not retransmittable. | |
353 QuicPacketNumber unacked[] = {1}; | |
354 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
355 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
356 VerifyRetransmittablePackets(nullptr, 0); | |
357 } | |
358 | |
359 TEST_P(QuicSentPacketManagerTest, RetransmitThenAckBeforeSend) { | |
360 SendDataPacket(1); | |
361 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, kDefaultPathId, 1, | |
362 TLP_RETRANSMISSION); | |
363 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
364 | |
365 // Ack 1. | |
366 QuicAckFrame ack_frame = InitAckFrame(1); | |
367 ExpectAck(1); | |
368 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
369 | |
370 // There should no longer be a pending retransmission. | |
371 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
372 | |
373 // No unacked packets remain. | |
374 VerifyUnackedPackets(nullptr, 0); | |
375 VerifyRetransmittablePackets(nullptr, 0); | |
376 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted); | |
377 } | |
378 | |
379 TEST_P(QuicSentPacketManagerTest, RetransmitThenStopRetransmittingBeforeSend) { | |
380 SendDataPacket(1); | |
381 QuicSentPacketManagerPeer::MarkForRetransmission(&manager_, kDefaultPathId, 1, | |
382 TLP_RETRANSMISSION); | |
383 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
384 | |
385 manager_.CancelRetransmissionsForStream(kStreamId); | |
386 | |
387 // There should no longer be a pending retransmission. | |
388 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
389 | |
390 QuicPacketNumber unacked[] = {1}; | |
391 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
392 VerifyRetransmittablePackets(nullptr, 0); | |
393 EXPECT_EQ(0u, stats_.packets_spuriously_retransmitted); | |
394 } | |
395 | |
396 TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPrevious) { | |
397 SendDataPacket(1); | |
398 RetransmitAndSendPacket(1, 2); | |
399 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
400 clock_.AdvanceTime(rtt); | |
401 | |
402 // Ack 1 but not 2. | |
403 ExpectAck(1); | |
404 QuicAckFrame ack_frame = InitAckFrame(1); | |
405 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
406 | |
407 // 2 remains unacked, but no packets have retransmittable data. | |
408 QuicPacketNumber unacked[] = {2}; | |
409 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
410 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
411 VerifyRetransmittablePackets(nullptr, 0); | |
412 | |
413 EXPECT_EQ(1u, stats_.packets_spuriously_retransmitted); | |
414 } | |
415 | |
416 TEST_P(QuicSentPacketManagerTest, RetransmitThenAckPreviousThenNackRetransmit) { | |
417 SendDataPacket(1); | |
418 RetransmitAndSendPacket(1, 2); | |
419 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
420 clock_.AdvanceTime(rtt); | |
421 | |
422 // First, ACK packet 1 which makes packet 2 non-retransmittable. | |
423 ExpectAck(1); | |
424 QuicAckFrame ack_frame = InitAckFrame(1); | |
425 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
426 | |
427 SendDataPacket(3); | |
428 SendDataPacket(4); | |
429 SendDataPacket(5); | |
430 clock_.AdvanceTime(rtt); | |
431 | |
432 // Next, NACK packet 2 three times. | |
433 ack_frame = InitAckFrame(3); | |
434 NackPackets(2, 3, &ack_frame); | |
435 ExpectAck(3); | |
436 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
437 | |
438 ack_frame = InitAckFrame(4); | |
439 NackPackets(2, 3, &ack_frame); | |
440 ExpectAck(4); | |
441 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
442 | |
443 ack_frame = InitAckFrame(5); | |
444 NackPackets(2, 3, &ack_frame); | |
445 ExpectAckAndLoss(true, 5, 2); | |
446 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
447 | |
448 // No packets remain unacked. | |
449 VerifyUnackedPackets(nullptr, 0); | |
450 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
451 VerifyRetransmittablePackets(nullptr, 0); | |
452 | |
453 // Verify that the retransmission alarm would not fire, | |
454 // since there is no retransmittable data outstanding. | |
455 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
456 } | |
457 | |
458 TEST_P(QuicSentPacketManagerTest, | |
459 DISABLED_RetransmitTwiceThenAckPreviousBeforeSend) { | |
460 SendDataPacket(1); | |
461 RetransmitAndSendPacket(1, 2); | |
462 | |
463 // Fire the RTO, which will mark 2 for retransmission (but will not send it). | |
464 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
465 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
466 manager_.OnRetransmissionTimeout(); | |
467 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
468 | |
469 // Ack 1 but not 2, before 2 is able to be sent. | |
470 // Since 1 has been retransmitted, it has already been lost, and so the | |
471 // send algorithm is not informed that it has been ACK'd. | |
472 QuicAckFrame ack_frame = InitAckFrame(1); | |
473 ExpectUpdatedRtt(1); | |
474 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout()); | |
475 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
476 | |
477 // Since 2 was marked for retransmit, when 1 is acked, 2 is kept for RTT. | |
478 QuicPacketNumber unacked[] = {2}; | |
479 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
480 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
481 VerifyRetransmittablePackets(nullptr, 0); | |
482 | |
483 // Verify that the retransmission alarm would not fire, | |
484 // since there is no retransmittable data outstanding. | |
485 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
486 } | |
487 | |
488 TEST_P(QuicSentPacketManagerTest, RetransmitTwiceThenAckFirst) { | |
489 StrictMock<MockDebugDelegate> debug_delegate; | |
490 EXPECT_CALL(debug_delegate, OnSpuriousPacketRetransmission(TLP_RETRANSMISSION, | |
491 kDefaultLength)) | |
492 .Times(2); | |
493 manager_.SetDebugDelegate(&debug_delegate); | |
494 | |
495 SendDataPacket(1); | |
496 RetransmitAndSendPacket(1, 2); | |
497 RetransmitAndSendPacket(2, 3); | |
498 QuicTime::Delta rtt = QuicTime::Delta::FromMilliseconds(15); | |
499 clock_.AdvanceTime(rtt); | |
500 | |
501 // Ack 1 but not 2 or 3. | |
502 ExpectAck(1); | |
503 QuicAckFrame ack_frame = InitAckFrame(1); | |
504 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
505 | |
506 // 2 and 3 remain unacked, but no packets have retransmittable data. | |
507 QuicPacketNumber unacked[] = {2, 3}; | |
508 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
509 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
510 VerifyRetransmittablePackets(nullptr, 0); | |
511 | |
512 // Ensure packet 2 is lost when 4 is sent and 3 and 4 are acked. | |
513 SendDataPacket(4); | |
514 ack_frame = InitAckFrame(4); | |
515 NackPackets(2, 3, &ack_frame); | |
516 QuicPacketNumber acked[] = {3, 4}; | |
517 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
518 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
519 | |
520 QuicPacketNumber unacked2[] = {2}; | |
521 VerifyUnackedPackets(unacked2, arraysize(unacked2)); | |
522 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
523 | |
524 SendDataPacket(5); | |
525 ack_frame = InitAckFrame(5); | |
526 NackPackets(2, 3, &ack_frame); | |
527 ExpectAckAndLoss(true, 5, 2); | |
528 EXPECT_CALL(debug_delegate, OnPacketLoss(2, LOSS_RETRANSMISSION, _)); | |
529 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
530 | |
531 VerifyUnackedPackets(nullptr, 0); | |
532 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
533 EXPECT_EQ(2u, stats_.packets_spuriously_retransmitted); | |
534 } | |
535 | |
536 TEST_P(QuicSentPacketManagerTest, AckOriginalTransmission) { | |
537 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | |
538 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | |
539 | |
540 SendDataPacket(1); | |
541 RetransmitAndSendPacket(1, 2); | |
542 | |
543 // Ack original transmission, but that wasn't lost via fast retransmit, | |
544 // so no call on OnSpuriousRetransmission is expected. | |
545 { | |
546 QuicAckFrame ack_frame = InitAckFrame(1); | |
547 ExpectAck(1); | |
548 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
549 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
550 } | |
551 | |
552 SendDataPacket(3); | |
553 SendDataPacket(4); | |
554 // Ack 4, which causes 3 to be retransmitted. | |
555 { | |
556 QuicAckFrame ack_frame = InitAckFrame(4); | |
557 NackPackets(2, 4, &ack_frame); | |
558 ExpectAck(4); | |
559 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
560 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
561 RetransmitAndSendPacket(3, 5, LOSS_RETRANSMISSION); | |
562 } | |
563 | |
564 // Ack 3, which causes SpuriousRetransmitDetected to be called. | |
565 { | |
566 QuicAckFrame ack_frame = InitAckFrame(4); | |
567 NackPackets(2, 3, &ack_frame); | |
568 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
569 EXPECT_CALL(*loss_algorithm, SpuriousRetransmitDetected(_, _, _, 5)); | |
570 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
571 } | |
572 } | |
573 | |
574 TEST_P(QuicSentPacketManagerTest, AckPreviousTransmissionThenTruncatedAck) { | |
575 FLAGS_quic_loss_recovery_use_largest_acked = false; | |
576 if (!GetParam().missing) { | |
577 return; | |
578 } | |
579 SendDataPacket(1); | |
580 RetransmitAndSendPacket(1, 2); | |
581 RetransmitAndSendPacket(2, 3); | |
582 RetransmitAndSendPacket(3, 4); | |
583 SendDataPacket(5); | |
584 SendDataPacket(6); | |
585 SendDataPacket(7); | |
586 SendDataPacket(8); | |
587 SendDataPacket(9); | |
588 | |
589 // Ack previous transmission | |
590 { | |
591 QuicAckFrame ack_frame = InitAckFrame(2); | |
592 NackPackets(1, 2, &ack_frame); | |
593 ExpectAck(2); | |
594 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
595 EXPECT_TRUE(QuicSentPacketManagerPeer::IsUnacked(&manager_, 4)); | |
596 } | |
597 | |
598 // Truncated ack with 4 NACKs | |
599 { | |
600 QuicAckFrame ack_frame = InitAckFrame(6); | |
601 NackPackets(3, 7, &ack_frame); | |
602 ack_frame.is_truncated = true; | |
603 ExpectAckAndLoss(true, 1, 3); | |
604 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
605 } | |
606 | |
607 // High water mark will be raised. | |
608 QuicPacketNumber unacked[] = {4, 5, 6, 7, 8, 9}; | |
609 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
610 QuicPacketNumber retransmittable[] = {5, 6, 7, 8, 9}; | |
611 VerifyRetransmittablePackets(retransmittable, arraysize(retransmittable)); | |
612 } | |
613 | |
614 TEST_P(QuicSentPacketManagerTest, GetLeastUnacked) { | |
615 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); | |
616 } | |
617 | |
618 TEST_P(QuicSentPacketManagerTest, GetLeastUnackedUnacked) { | |
619 SendDataPacket(1); | |
620 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); | |
621 } | |
622 | |
623 TEST_P(QuicSentPacketManagerTest, AckAckAndUpdateRtt) { | |
624 SendDataPacket(1); | |
625 SendAckPacket(2); | |
626 | |
627 // Now ack the ack and expect an RTT update. | |
628 QuicAckFrame ack_frame = InitAckFrame(2); | |
629 ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(5); | |
630 | |
631 ExpectAck(1); | |
632 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
633 | |
634 SendAckPacket(3); | |
635 | |
636 // Now ack the ack and expect only an RTT update. | |
637 ack_frame = InitAckFrame(3); | |
638 ExpectUpdatedRtt(3); | |
639 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
640 } | |
641 | |
642 TEST_P(QuicSentPacketManagerTest, Rtt) { | |
643 QuicPacketNumber packet_number = 1; | |
644 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(15); | |
645 SendDataPacket(packet_number); | |
646 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20)); | |
647 | |
648 ExpectAck(packet_number); | |
649 QuicAckFrame ack_frame = InitAckFrame(packet_number); | |
650 ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(5); | |
651 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
652 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt()); | |
653 } | |
654 | |
655 TEST_P(QuicSentPacketManagerTest, RttWithInvalidDelta) { | |
656 // Expect that the RTT is equal to the local time elapsed, since the | |
657 // ack_delay_time is larger than the local time elapsed | |
658 // and is hence invalid. | |
659 QuicPacketNumber packet_number = 1; | |
660 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
661 SendDataPacket(packet_number); | |
662 clock_.AdvanceTime(expected_rtt); | |
663 | |
664 ExpectAck(packet_number); | |
665 QuicAckFrame ack_frame = InitAckFrame(packet_number); | |
666 ack_frame.ack_delay_time = QuicTime::Delta::FromMilliseconds(11); | |
667 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
668 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt()); | |
669 } | |
670 | |
671 TEST_P(QuicSentPacketManagerTest, RttWithInfiniteDelta) { | |
672 // Expect that the RTT is equal to the local time elapsed, since the | |
673 // ack_delay_time is infinite, and is hence invalid. | |
674 QuicPacketNumber packet_number = 1; | |
675 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
676 SendDataPacket(packet_number); | |
677 clock_.AdvanceTime(expected_rtt); | |
678 | |
679 ExpectAck(packet_number); | |
680 QuicAckFrame ack_frame = InitAckFrame(packet_number); | |
681 ack_frame.ack_delay_time = QuicTime::Delta::Infinite(); | |
682 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
683 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt()); | |
684 } | |
685 | |
686 TEST_P(QuicSentPacketManagerTest, RttZeroDelta) { | |
687 // Expect that the RTT is the time between send and receive since the | |
688 // ack_delay_time is zero. | |
689 QuicPacketNumber packet_number = 1; | |
690 QuicTime::Delta expected_rtt = QuicTime::Delta::FromMilliseconds(10); | |
691 SendDataPacket(packet_number); | |
692 clock_.AdvanceTime(expected_rtt); | |
693 | |
694 ExpectAck(packet_number); | |
695 QuicAckFrame ack_frame = InitAckFrame(packet_number); | |
696 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
697 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
698 EXPECT_EQ(expected_rtt, manager_.GetRttStats()->latest_rtt()); | |
699 } | |
700 | |
701 TEST_P(QuicSentPacketManagerTest, TailLossProbeTimeout) { | |
702 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
703 | |
704 // Send 1 packet. | |
705 QuicPacketNumber packet_number = 1; | |
706 SendDataPacket(packet_number); | |
707 | |
708 QuicPathId path_id = kInvalidPathId; | |
709 // The first tail loss probe retransmits 1 packet. | |
710 manager_.OnRetransmissionTimeout(); | |
711 EXPECT_EQ( | |
712 QuicTime::Delta::Zero(), | |
713 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
714 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
715 manager_.MaybeRetransmitTailLossProbe(); | |
716 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
717 RetransmitNextPacket(2); | |
718 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
719 | |
720 // The second tail loss probe retransmits 1 packet. | |
721 manager_.OnRetransmissionTimeout(); | |
722 EXPECT_EQ( | |
723 QuicTime::Delta::Zero(), | |
724 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
725 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
726 manager_.MaybeRetransmitTailLossProbe(); | |
727 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
728 RetransmitNextPacket(3); | |
729 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
730 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
731 EXPECT_EQ( | |
732 QuicTime::Delta::Infinite(), | |
733 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
734 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
735 | |
736 // Ack the third and ensure the first two are still pending. | |
737 ExpectAck(3); | |
738 | |
739 QuicAckFrame ack_frame = InitAckFrame(3); | |
740 NackPackets(1, 3, &ack_frame); | |
741 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
742 | |
743 EXPECT_TRUE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
744 | |
745 // Acking two more packets will lose both of them due to nacks. | |
746 SendDataPacket(4); | |
747 SendDataPacket(5); | |
748 ack_frame = InitAckFrame(5); | |
749 NackPackets(1, 3, &ack_frame); | |
750 QuicPacketNumber acked[] = {4, 5}; | |
751 QuicPacketNumber lost[] = {1, 2}; | |
752 ExpectAcksAndLosses(true, acked, arraysize(acked), lost, arraysize(lost)); | |
753 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
754 | |
755 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
756 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
757 EXPECT_EQ(2u, stats_.tlp_count); | |
758 EXPECT_EQ(0u, stats_.rto_count); | |
759 } | |
760 | |
761 TEST_P(QuicSentPacketManagerTest, TailLossProbeThenRTO) { | |
762 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
763 | |
764 // Send 100 packets. | |
765 const size_t kNumSentPackets = 100; | |
766 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
767 SendDataPacket(i); | |
768 } | |
769 QuicTime rto_packet_time = clock_.Now(); | |
770 // Advance the time. | |
771 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); | |
772 | |
773 // The first tail loss probe retransmits 1 packet. | |
774 manager_.OnRetransmissionTimeout(); | |
775 QuicPathId path_id = kInvalidPathId; | |
776 EXPECT_EQ( | |
777 QuicTime::Delta::Zero(), | |
778 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
779 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
780 manager_.MaybeRetransmitTailLossProbe(); | |
781 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
782 RetransmitNextPacket(101); | |
783 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
784 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
785 EXPECT_EQ( | |
786 QuicTime::Delta::Infinite(), | |
787 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
788 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
789 clock_.AdvanceTime(manager_.GetRetransmissionTime() - clock_.Now()); | |
790 | |
791 // The second tail loss probe retransmits 1 packet. | |
792 manager_.OnRetransmissionTimeout(); | |
793 EXPECT_EQ( | |
794 QuicTime::Delta::Zero(), | |
795 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
796 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
797 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | |
798 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
799 RetransmitNextPacket(102); | |
800 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
801 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
802 EXPECT_EQ( | |
803 QuicTime::Delta::Infinite(), | |
804 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
805 | |
806 // Ensure the RTO is set based on the correct packet. | |
807 rto_packet_time = clock_.Now(); | |
808 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
809 .WillOnce(Return(QuicTime::Delta::FromSeconds(1))); | |
810 EXPECT_EQ(rto_packet_time + QuicTime::Delta::FromSeconds(1), | |
811 manager_.GetRetransmissionTime()); | |
812 | |
813 // Advance the time enough to ensure all packets are RTO'd. | |
814 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1000)); | |
815 | |
816 manager_.OnRetransmissionTimeout(); | |
817 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
818 EXPECT_EQ(2u, stats_.tlp_count); | |
819 EXPECT_EQ(1u, stats_.rto_count); | |
820 | |
821 // Send and Ack the RTO and ensure OnRetransmissionTimeout is called. | |
822 EXPECT_EQ(102 * kDefaultLength, | |
823 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
824 | |
825 RetransmitNextPacket(103); | |
826 QuicAckFrame ack_frame = InitAckFrame(103); | |
827 NackPackets(0, 103, &ack_frame); | |
828 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
829 EXPECT_CALL(*send_algorithm_, | |
830 OnCongestionEvent(true, _, ElementsAre(Pair(103, _)), _)); | |
831 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
832 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
833 // All packets before 103 should be lost. | |
834 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
835 } | |
836 | |
837 TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeout) { | |
838 // Send 2 crypto packets and 3 data packets. | |
839 const size_t kNumSentCryptoPackets = 2; | |
840 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
841 SendCryptoPacket(i); | |
842 } | |
843 const size_t kNumSentDataPackets = 3; | |
844 for (size_t i = 1; i <= kNumSentDataPackets; ++i) { | |
845 SendDataPacket(kNumSentCryptoPackets + i); | |
846 } | |
847 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
848 | |
849 // The first retransmits 2 packets. | |
850 QuicPathId path_id = kInvalidPathId; | |
851 manager_.OnRetransmissionTimeout(); | |
852 EXPECT_EQ( | |
853 QuicTime::Delta::Zero(), | |
854 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
855 RetransmitNextPacket(6); | |
856 RetransmitNextPacket(7); | |
857 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
858 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
859 | |
860 // The second retransmits 2 packets. | |
861 manager_.OnRetransmissionTimeout(); | |
862 EXPECT_EQ( | |
863 QuicTime::Delta::Zero(), | |
864 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
865 RetransmitNextPacket(8); | |
866 RetransmitNextPacket(9); | |
867 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
868 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
869 | |
870 // Now ack the two crypto packets and the speculatively encrypted request, | |
871 // and ensure the first four crypto packets get abandoned, but not lost. | |
872 QuicPacketNumber acked[] = {3, 4, 5, 8, 9}; | |
873 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
874 QuicAckFrame ack_frame = InitAckFrame(9); | |
875 NackPackets(1, 3, &ack_frame); | |
876 NackPackets(6, 8, &ack_frame); | |
877 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
878 | |
879 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
880 } | |
881 | |
882 TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutVersionNegotiation) { | |
883 // Send 2 crypto packets and 3 data packets. | |
884 const size_t kNumSentCryptoPackets = 2; | |
885 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
886 SendCryptoPacket(i); | |
887 } | |
888 const size_t kNumSentDataPackets = 3; | |
889 for (size_t i = 1; i <= kNumSentDataPackets; ++i) { | |
890 SendDataPacket(kNumSentCryptoPackets + i); | |
891 } | |
892 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
893 | |
894 // The first retransmission timeout retransmits 2 crypto packets. | |
895 manager_.OnRetransmissionTimeout(); | |
896 RetransmitNextPacket(6); | |
897 RetransmitNextPacket(7); | |
898 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
899 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
900 | |
901 // Now act like a version negotiation packet arrived, which would cause all | |
902 // unacked packets to be retransmitted. | |
903 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); | |
904 | |
905 // Ensure the first two pending packets are the crypto retransmits. | |
906 ASSERT_TRUE(manager_.HasPendingRetransmissions()); | |
907 EXPECT_EQ(6u, manager_.NextPendingRetransmission().packet_number); | |
908 RetransmitNextPacket(8); | |
909 EXPECT_EQ(7u, manager_.NextPendingRetransmission().packet_number); | |
910 RetransmitNextPacket(9); | |
911 | |
912 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
913 // Send 3 more data packets and ensure the least unacked is raised. | |
914 RetransmitNextPacket(10); | |
915 RetransmitNextPacket(11); | |
916 RetransmitNextPacket(12); | |
917 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
918 | |
919 EXPECT_EQ(1u, manager_.GetLeastUnacked(kDefaultPathId)); | |
920 // Least unacked isn't raised until an ack is received, so ack the | |
921 // crypto packets. | |
922 QuicPacketNumber acked[] = {8, 9}; | |
923 ExpectAcksAndLosses(true, acked, arraysize(acked), nullptr, 0); | |
924 QuicAckFrame ack_frame = InitAckFrame(9); | |
925 for (QuicPacketNumber i = 1; i < 8; ++i) { | |
926 NackPackets(i, i + 1, &ack_frame); | |
927 } | |
928 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
929 EXPECT_EQ(10u, manager_.GetLeastUnacked(kDefaultPathId)); | |
930 } | |
931 | |
932 TEST_P(QuicSentPacketManagerTest, CryptoHandshakeSpuriousRetransmission) { | |
933 // Send 1 crypto packet. | |
934 SendCryptoPacket(1); | |
935 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
936 | |
937 // Retransmit the crypto packet as 2. | |
938 manager_.OnRetransmissionTimeout(); | |
939 RetransmitNextPacket(2); | |
940 | |
941 // Retransmit the crypto packet as 3. | |
942 manager_.OnRetransmissionTimeout(); | |
943 RetransmitNextPacket(3); | |
944 | |
945 // Now ack the second crypto packet, and ensure the first gets removed, but | |
946 // the third does not. | |
947 ExpectUpdatedRtt(2); | |
948 QuicAckFrame ack_frame = InitAckFrame(2); | |
949 NackPackets(1, 2, &ack_frame); | |
950 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
951 | |
952 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
953 QuicPacketNumber unacked[] = {3}; | |
954 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
955 } | |
956 | |
957 TEST_P(QuicSentPacketManagerTest, CryptoHandshakeTimeoutUnsentDataPacket) { | |
958 // Send 2 crypto packets and 1 data packet. | |
959 const size_t kNumSentCryptoPackets = 2; | |
960 for (size_t i = 1; i <= kNumSentCryptoPackets; ++i) { | |
961 SendCryptoPacket(i); | |
962 } | |
963 SendDataPacket(3); | |
964 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
965 | |
966 // Retransmit 2 crypto packets, but not the serialized packet. | |
967 manager_.OnRetransmissionTimeout(); | |
968 RetransmitNextPacket(4); | |
969 RetransmitNextPacket(5); | |
970 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
971 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
972 } | |
973 | |
974 TEST_P(QuicSentPacketManagerTest, | |
975 CryptoHandshakeRetransmissionThenRetransmitAll) { | |
976 // Send 1 crypto packet. | |
977 SendCryptoPacket(1); | |
978 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
979 | |
980 // Retransmit the crypto packet as 2. | |
981 manager_.OnRetransmissionTimeout(); | |
982 RetransmitNextPacket(2); | |
983 | |
984 // Now retransmit all the unacked packets, which occurs when there is a | |
985 // version negotiation. | |
986 manager_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); | |
987 QuicPacketNumber unacked[] = {1, 2}; | |
988 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
989 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
990 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
991 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
992 } | |
993 | |
994 TEST_P(QuicSentPacketManagerTest, | |
995 CryptoHandshakeRetransmissionThenNeuterAndAck) { | |
996 // Send 1 crypto packet. | |
997 SendCryptoPacket(1); | |
998 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
999 | |
1000 // Retransmit the crypto packet as 2. | |
1001 manager_.OnRetransmissionTimeout(); | |
1002 RetransmitNextPacket(2); | |
1003 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
1004 | |
1005 // Retransmit the crypto packet as 3. | |
1006 manager_.OnRetransmissionTimeout(); | |
1007 RetransmitNextPacket(3); | |
1008 EXPECT_TRUE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
1009 | |
1010 // Now neuter all unacked unencrypted packets, which occurs when the | |
1011 // connection goes forward secure. | |
1012 manager_.NeuterUnencryptedPackets(); | |
1013 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
1014 QuicPacketNumber unacked[] = {1, 2, 3}; | |
1015 VerifyUnackedPackets(unacked, arraysize(unacked)); | |
1016 VerifyRetransmittablePackets(nullptr, 0); | |
1017 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1018 EXPECT_FALSE(QuicSentPacketManagerPeer::HasUnackedCryptoPackets(&manager_)); | |
1019 EXPECT_FALSE(QuicSentPacketManagerPeer::HasPendingPackets(&manager_)); | |
1020 | |
1021 // Ensure both packets get discarded when packet 2 is acked. | |
1022 QuicAckFrame ack_frame = InitAckFrame(3); | |
1023 NackPackets(1, 3, &ack_frame); | |
1024 ExpectUpdatedRtt(3); | |
1025 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
1026 VerifyUnackedPackets(nullptr, 0); | |
1027 VerifyRetransmittablePackets(nullptr, 0); | |
1028 } | |
1029 | |
1030 TEST_P(QuicSentPacketManagerTest, RetransmissionTimeout) { | |
1031 StrictMock<MockDebugDelegate> debug_delegate; | |
1032 manager_.SetDebugDelegate(&debug_delegate); | |
1033 | |
1034 // Send 100 packets. | |
1035 const size_t kNumSentPackets = 100; | |
1036 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
1037 SendDataPacket(i); | |
1038 } | |
1039 | |
1040 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); | |
1041 manager_.OnRetransmissionTimeout(); | |
1042 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1043 EXPECT_EQ(100 * kDefaultLength, | |
1044 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1045 RetransmitNextPacket(101); | |
1046 RetransmitNextPacket(102); | |
1047 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1048 | |
1049 // Ack a retransmission. | |
1050 QuicAckFrame ack_frame = InitAckFrame(102); | |
1051 NackPackets(0, 102, &ack_frame); | |
1052 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
1053 // Ensure no packets are lost. | |
1054 EXPECT_CALL(*send_algorithm_, | |
1055 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), | |
1056 /*lost_packets=*/IsEmpty())); | |
1057 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1058 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
1059 // RTO's use loss detection instead of immediately declaring retransmitted | |
1060 // packets lost. | |
1061 for (int i = 1; i <= 99; ++i) { | |
1062 EXPECT_CALL(debug_delegate, OnPacketLoss(i, LOSS_RETRANSMISSION, _)); | |
1063 } | |
1064 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1065 } | |
1066 | |
1067 TEST_P(QuicSentPacketManagerTest, NewRetransmissionTimeout) { | |
1068 QuicConfig client_config; | |
1069 QuicTagVector options; | |
1070 options.push_back(kNRTO); | |
1071 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1072 client_config.SetConnectionOptionsToSend(options); | |
1073 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1074 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1075 EXPECT_CALL(*send_algorithm_, PacingRate(_)) | |
1076 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
1077 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | |
1078 .WillOnce(Return(10 * kDefaultTCPMSS)); | |
1079 manager_.SetFromConfig(client_config); | |
1080 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
1081 | |
1082 // Send 100 packets. | |
1083 const size_t kNumSentPackets = 100; | |
1084 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
1085 SendDataPacket(i); | |
1086 } | |
1087 | |
1088 EXPECT_FALSE(manager_.MaybeRetransmitTailLossProbe()); | |
1089 manager_.OnRetransmissionTimeout(); | |
1090 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1091 EXPECT_EQ(100 * kDefaultLength, | |
1092 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1093 RetransmitNextPacket(101); | |
1094 RetransmitNextPacket(102); | |
1095 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1096 | |
1097 // Ack a retransmission and expect no call to OnRetransmissionTimeout. | |
1098 QuicAckFrame ack_frame = InitAckFrame(102); | |
1099 NackPackets(0, 102, &ack_frame); | |
1100 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
1101 // This will include packets in the lost packet map. | |
1102 EXPECT_CALL(*send_algorithm_, | |
1103 OnCongestionEvent(true, _, ElementsAre(Pair(102, _)), | |
1104 /*lost_packets=*/Not(IsEmpty()))); | |
1105 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1106 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1107 } | |
1108 | |
1109 TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckSecond) { | |
1110 // Send 1 packet. | |
1111 SendDataPacket(1); | |
1112 | |
1113 manager_.OnRetransmissionTimeout(); | |
1114 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1115 EXPECT_EQ(kDefaultLength, | |
1116 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1117 RetransmitNextPacket(2); | |
1118 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1119 | |
1120 // Rto a second time. | |
1121 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | |
1122 manager_.OnRetransmissionTimeout(); | |
1123 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1124 EXPECT_EQ(2 * kDefaultLength, | |
1125 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1126 RetransmitNextPacket(3); | |
1127 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1128 | |
1129 // Ack a retransmission and ensure OnRetransmissionTimeout is called. | |
1130 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
1131 QuicAckFrame ack_frame = InitAckFrame(2); | |
1132 NackPackets(1, 2, &ack_frame); | |
1133 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
1134 ExpectAck(2); | |
1135 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1136 | |
1137 // The original packet and newest should be outstanding. | |
1138 EXPECT_EQ(2 * kDefaultLength, | |
1139 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1140 } | |
1141 | |
1142 TEST_P(QuicSentPacketManagerTest, TwoRetransmissionTimeoutsAckFirst) { | |
1143 // Send 1 packet. | |
1144 SendDataPacket(1); | |
1145 | |
1146 manager_.OnRetransmissionTimeout(); | |
1147 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1148 EXPECT_EQ(kDefaultLength, | |
1149 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1150 RetransmitNextPacket(2); | |
1151 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1152 | |
1153 // Rto a second time. | |
1154 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | |
1155 manager_.OnRetransmissionTimeout(); | |
1156 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1157 EXPECT_EQ(2 * kDefaultLength, | |
1158 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1159 RetransmitNextPacket(3); | |
1160 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1161 | |
1162 // Ack a retransmission and ensure OnRetransmissionTimeout is called. | |
1163 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | |
1164 QuicAckFrame ack_frame = InitAckFrame(3); | |
1165 NackPackets(1, 3, &ack_frame); | |
1166 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | |
1167 ExpectAck(3); | |
1168 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1169 | |
1170 // The first two packets should still be outstanding. | |
1171 EXPECT_EQ(2 * kDefaultLength, | |
1172 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1173 } | |
1174 | |
1175 TEST_P(QuicSentPacketManagerTest, OnPathDegrading) { | |
1176 SendDataPacket(1); | |
1177 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | |
1178 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
1179 .WillRepeatedly(Return(delay)); | |
1180 for (size_t i = 1; i < kMinTimeoutsBeforePathDegrading; ++i) { | |
1181 manager_.OnRetransmissionTimeout(); | |
1182 RetransmitNextPacket(i + 2); | |
1183 } | |
1184 // Next RTO should cause network_change_visitor_'s OnPathDegrading method | |
1185 // to be called. | |
1186 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | |
1187 manager_.OnRetransmissionTimeout(); | |
1188 } | |
1189 | |
1190 TEST_P(QuicSentPacketManagerTest, GetTransmissionTime) { | |
1191 EXPECT_EQ(QuicTime::Zero(), manager_.GetRetransmissionTime()); | |
1192 } | |
1193 | |
1194 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeCryptoHandshake) { | |
1195 SendCryptoPacket(1); | |
1196 | |
1197 // Check the min. | |
1198 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | |
1199 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | |
1200 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10), | |
1201 manager_.GetRetransmissionTime()); | |
1202 | |
1203 // Test with a standard smoothed RTT. | |
1204 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | |
1205 | |
1206 QuicTime::Delta srtt = | |
1207 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | |
1208 QuicTime expected_time = clock_.Now() + 1.5 * srtt; | |
1209 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1210 | |
1211 // Retransmit the packet by invoking the retransmission timeout. | |
1212 clock_.AdvanceTime(1.5 * srtt); | |
1213 manager_.OnRetransmissionTimeout(); | |
1214 RetransmitNextPacket(2); | |
1215 | |
1216 // The retransmission time should now be twice as far in the future. | |
1217 expected_time = clock_.Now() + srtt * 2 * 1.5; | |
1218 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1219 } | |
1220 | |
1221 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeTailLossProbe) { | |
1222 QuicSentPacketManagerPeer::SetMaxTailLossProbes(&manager_, 2); | |
1223 SendDataPacket(1); | |
1224 SendDataPacket(2); | |
1225 | |
1226 // Check the min. | |
1227 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | |
1228 rtt_stats->set_initial_rtt_us(1 * kNumMicrosPerMilli); | |
1229 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(10), | |
1230 manager_.GetRetransmissionTime()); | |
1231 | |
1232 // Test with a standard smoothed RTT. | |
1233 rtt_stats->set_initial_rtt_us(100 * kNumMicrosPerMilli); | |
1234 QuicTime::Delta srtt = | |
1235 QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()); | |
1236 QuicTime::Delta expected_tlp_delay = 2 * srtt; | |
1237 QuicTime expected_time = clock_.Now() + expected_tlp_delay; | |
1238 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1239 | |
1240 // Retransmit the packet by invoking the retransmission timeout. | |
1241 clock_.AdvanceTime(expected_tlp_delay); | |
1242 manager_.OnRetransmissionTimeout(); | |
1243 QuicPathId path_id = kInvalidPathId; | |
1244 EXPECT_EQ( | |
1245 QuicTime::Delta::Zero(), | |
1246 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
1247 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1248 EXPECT_TRUE(manager_.MaybeRetransmitTailLossProbe()); | |
1249 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1250 RetransmitNextPacket(3); | |
1251 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
1252 .WillOnce(Return(QuicTime::Delta::Infinite())); | |
1253 EXPECT_EQ( | |
1254 QuicTime::Delta::Infinite(), | |
1255 manager_.TimeUntilSend(clock_.Now(), HAS_RETRANSMITTABLE_DATA, &path_id)); | |
1256 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1257 | |
1258 expected_time = clock_.Now() + expected_tlp_delay; | |
1259 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1260 } | |
1261 | |
1262 TEST_P(QuicSentPacketManagerTest, GetTransmissionTimeSpuriousRTO) { | |
1263 const_cast<RttStats*>(manager_.GetRttStats()) | |
1264 ->UpdateRtt(QuicTime::Delta::FromMilliseconds(100), | |
1265 QuicTime::Delta::Zero(), QuicTime::Zero()); | |
1266 SendDataPacket(1); | |
1267 SendDataPacket(2); | |
1268 SendDataPacket(3); | |
1269 SendDataPacket(4); | |
1270 | |
1271 QuicTime::Delta expected_rto_delay = QuicTime::Delta::FromMilliseconds(500); | |
1272 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
1273 .WillRepeatedly(Return(expected_rto_delay)); | |
1274 QuicTime expected_time = clock_.Now() + expected_rto_delay; | |
1275 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1276 | |
1277 // Retransmit the packet by invoking the retransmission timeout. | |
1278 clock_.AdvanceTime(expected_rto_delay); | |
1279 manager_.OnRetransmissionTimeout(); | |
1280 // All packets are still considered inflight. | |
1281 EXPECT_EQ(4 * kDefaultLength, | |
1282 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1283 RetransmitNextPacket(5); | |
1284 RetransmitNextPacket(6); | |
1285 // All previous packets are inflight, plus two rto retransmissions. | |
1286 EXPECT_EQ(6 * kDefaultLength, | |
1287 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1288 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1289 | |
1290 // The delay should double the second time. | |
1291 expected_time = clock_.Now() + expected_rto_delay + expected_rto_delay; | |
1292 // Once we always base the timer on the right edge, leaving the older packets | |
1293 // in flight doesn't change the timeout. | |
1294 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1295 | |
1296 // Ack a packet before the first RTO and ensure the RTO timeout returns to the | |
1297 // original value and OnRetransmissionTimeout is not called or reverted. | |
1298 QuicAckFrame ack_frame = InitAckFrame(2); | |
1299 NackPackets(1, 2, &ack_frame); | |
1300 ExpectAck(2); | |
1301 manager_.OnIncomingAck(ack_frame, clock_.ApproximateNow()); | |
1302 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1303 EXPECT_EQ(5 * kDefaultLength, | |
1304 QuicSentPacketManagerPeer::GetBytesInFlight(&manager_)); | |
1305 | |
1306 // Wait 2RTTs from now for the RTO, since it's the max of the RTO time | |
1307 // and the TLP time. In production, there would always be two TLP's first. | |
1308 // Since retransmission was spurious, smoothed_rtt_ is expired, and replaced | |
1309 // by the latest RTT sample of 500ms. | |
1310 expected_time = clock_.Now() + QuicTime::Delta::FromMilliseconds(1000); | |
1311 // Once we always base the timer on the right edge, leaving the older packets | |
1312 // in flight doesn't change the timeout. | |
1313 EXPECT_EQ(expected_time, manager_.GetRetransmissionTime()); | |
1314 } | |
1315 | |
1316 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMin) { | |
1317 SendDataPacket(1); | |
1318 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
1319 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | |
1320 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(200); | |
1321 | |
1322 // If the delay is smaller than the min, ensure it exponentially backs off | |
1323 // from the min. | |
1324 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | |
1325 for (int i = 0; i < 5; ++i) { | |
1326 EXPECT_EQ(delay, | |
1327 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
1328 delay = delay + delay; | |
1329 manager_.OnRetransmissionTimeout(); | |
1330 RetransmitNextPacket(i + 2); | |
1331 } | |
1332 } | |
1333 | |
1334 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelayMax) { | |
1335 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
1336 .WillOnce(Return(QuicTime::Delta::FromSeconds(500))); | |
1337 | |
1338 EXPECT_EQ(QuicTime::Delta::FromSeconds(60), | |
1339 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
1340 } | |
1341 | |
1342 TEST_P(QuicSentPacketManagerTest, GetTransmissionDelay) { | |
1343 SendDataPacket(1); | |
1344 QuicTime::Delta delay = QuicTime::Delta::FromMilliseconds(500); | |
1345 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | |
1346 .WillRepeatedly(Return(delay)); | |
1347 | |
1348 // Delay should back off exponentially. | |
1349 EXPECT_CALL(*network_change_visitor_, OnPathDegrading()); | |
1350 for (int i = 0; i < 5; ++i) { | |
1351 EXPECT_EQ(delay, | |
1352 QuicSentPacketManagerPeer::GetRetransmissionDelay(&manager_)); | |
1353 delay = delay + delay; | |
1354 manager_.OnRetransmissionTimeout(); | |
1355 RetransmitNextPacket(i + 2); | |
1356 } | |
1357 } | |
1358 | |
1359 TEST_P(QuicSentPacketManagerTest, GetLossDelay) { | |
1360 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | |
1361 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | |
1362 | |
1363 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | |
1364 .WillRepeatedly(Return(QuicTime::Zero())); | |
1365 SendDataPacket(1); | |
1366 SendDataPacket(2); | |
1367 | |
1368 // Handle an ack which causes the loss algorithm to be evaluated and | |
1369 // set the loss timeout. | |
1370 ExpectAck(2); | |
1371 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
1372 QuicAckFrame ack_frame = InitAckFrame(2); | |
1373 NackPackets(1, 2, &ack_frame); | |
1374 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1375 | |
1376 QuicTime timeout(clock_.Now() + QuicTime::Delta::FromMilliseconds(10)); | |
1377 EXPECT_CALL(*loss_algorithm, GetLossTimeout()) | |
1378 .WillRepeatedly(Return(timeout)); | |
1379 EXPECT_EQ(timeout, manager_.GetRetransmissionTime()); | |
1380 | |
1381 // Fire the retransmission timeout and ensure the loss detection algorithm | |
1382 // is invoked. | |
1383 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
1384 manager_.OnRetransmissionTimeout(); | |
1385 } | |
1386 | |
1387 TEST_P(QuicSentPacketManagerTest, NegotiateTimeLossDetectionFromOptions) { | |
1388 EXPECT_EQ(kNack, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_) | |
1389 ->GetLossDetectionType()); | |
1390 | |
1391 QuicConfig config; | |
1392 QuicTagVector options; | |
1393 options.push_back(kTIME); | |
1394 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1395 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1396 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1397 manager_.SetFromConfig(config); | |
1398 | |
1399 EXPECT_EQ(kTime, QuicSentPacketManagerPeer::GetLossAlgorithm(&manager_) | |
1400 ->GetLossDetectionType()); | |
1401 } | |
1402 | |
1403 TEST_P(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) { | |
1404 FLAGS_quic_allow_bbr = true; | |
1405 QuicConfig config; | |
1406 QuicTagVector options; | |
1407 | |
1408 options.push_back(kRENO); | |
1409 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1410 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1411 manager_.SetFromConfig(config); | |
1412 EXPECT_EQ(kReno, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_) | |
1413 ->GetCongestionControlType()); | |
1414 | |
1415 // TODO(rtenneti): Enable the following code after BBR code is checked in. | |
1416 #if 0 | |
1417 options.clear(); | |
1418 options.push_back(kTBBR); | |
1419 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1420 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1421 manager_.SetFromConfig(config); | |
1422 EXPECT_EQ(kBBR, QuicSentPacketManagerPeer::GetSendAlgorithm( | |
1423 manager_)->GetCongestionControlType()); | |
1424 #endif | |
1425 | |
1426 options.clear(); | |
1427 options.push_back(kBYTE); | |
1428 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1429 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1430 manager_.SetFromConfig(config); | |
1431 EXPECT_EQ(kCubicBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_) | |
1432 ->GetCongestionControlType()); | |
1433 | |
1434 options.clear(); | |
1435 options.push_back(kRENO); | |
1436 options.push_back(kBYTE); | |
1437 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1438 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1439 manager_.SetFromConfig(config); | |
1440 EXPECT_EQ(kRenoBytes, QuicSentPacketManagerPeer::GetSendAlgorithm(manager_) | |
1441 ->GetCongestionControlType()); | |
1442 } | |
1443 | |
1444 TEST_P(QuicSentPacketManagerTest, NegotiateNumConnectionsFromOptions) { | |
1445 QuicConfig config; | |
1446 QuicTagVector options; | |
1447 | |
1448 options.push_back(k1CON); | |
1449 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1450 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1451 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | |
1452 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1453 manager_.SetFromConfig(config); | |
1454 | |
1455 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1456 QuicConfig client_config; | |
1457 client_config.SetConnectionOptionsToSend(options); | |
1458 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1459 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(1)); | |
1460 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1461 manager_.SetFromConfig(client_config); | |
1462 } | |
1463 | |
1464 TEST_P(QuicSentPacketManagerTest, NegotiateNConnectionFromOptions) { | |
1465 // By default, changing the number of open streams does nothing. | |
1466 manager_.SetNumOpenStreams(5); | |
1467 | |
1468 QuicConfig config; | |
1469 QuicTagVector options; | |
1470 | |
1471 options.push_back(kNCON); | |
1472 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1473 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1474 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1475 manager_.SetFromConfig(config); | |
1476 | |
1477 EXPECT_CALL(*send_algorithm_, SetNumEmulatedConnections(5)); | |
1478 manager_.SetNumOpenStreams(5); | |
1479 } | |
1480 | |
1481 TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtServer) { | |
1482 QuicConfig config; | |
1483 QuicTagVector options; | |
1484 | |
1485 options.push_back(kNTLP); | |
1486 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1487 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1488 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1489 manager_.SetFromConfig(config); | |
1490 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); | |
1491 } | |
1492 | |
1493 TEST_P(QuicSentPacketManagerTest, NegotiateNoTLPFromOptionsAtClient) { | |
1494 QuicConfig client_config; | |
1495 QuicTagVector options; | |
1496 | |
1497 options.push_back(kNTLP); | |
1498 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1499 client_config.SetConnectionOptionsToSend(options); | |
1500 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1501 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1502 manager_.SetFromConfig(client_config); | |
1503 EXPECT_EQ(0u, QuicSentPacketManagerPeer::GetMaxTailLossProbes(&manager_)); | |
1504 } | |
1505 | |
1506 TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtServer) { | |
1507 QuicConfig config; | |
1508 QuicTagVector options; | |
1509 | |
1510 options.push_back(kTLPR); | |
1511 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1512 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1513 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1514 manager_.SetFromConfig(config); | |
1515 EXPECT_TRUE( | |
1516 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_)); | |
1517 } | |
1518 | |
1519 TEST_P(QuicSentPacketManagerTest, NegotiateTLPRttFromOptionsAtClient) { | |
1520 QuicConfig client_config; | |
1521 QuicTagVector options; | |
1522 | |
1523 options.push_back(kTLPR); | |
1524 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1525 client_config.SetConnectionOptionsToSend(options); | |
1526 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1527 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1528 manager_.SetFromConfig(client_config); | |
1529 EXPECT_TRUE( | |
1530 QuicSentPacketManagerPeer::GetEnableHalfRttTailLossProbe(&manager_)); | |
1531 } | |
1532 | |
1533 TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtServer) { | |
1534 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
1535 QuicConfig config; | |
1536 QuicTagVector options; | |
1537 | |
1538 options.push_back(kNRTO); | |
1539 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1540 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1541 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1542 manager_.SetFromConfig(config); | |
1543 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
1544 } | |
1545 | |
1546 TEST_P(QuicSentPacketManagerTest, NegotiateNewRTOFromOptionsAtClient) { | |
1547 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
1548 QuicConfig client_config; | |
1549 QuicTagVector options; | |
1550 | |
1551 options.push_back(kNRTO); | |
1552 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1553 client_config.SetConnectionOptionsToSend(options); | |
1554 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1555 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1556 manager_.SetFromConfig(client_config); | |
1557 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUseNewRto(&manager_)); | |
1558 } | |
1559 | |
1560 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtServer) { | |
1561 FLAGS_quic_loss_recovery_use_largest_acked = true; | |
1562 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | |
1563 QuicConfig config; | |
1564 QuicTagVector options; | |
1565 | |
1566 options.push_back(kUNDO); | |
1567 QuicConfigPeer::SetReceivedConnectionOptions(&config, options); | |
1568 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1569 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1570 manager_.SetFromConfig(config); | |
1571 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | |
1572 | |
1573 // Ensure undo works as intended. | |
1574 // Send 5 packets, mark the first 4 for retransmission, and then cancel | |
1575 // them when 1 is acked. | |
1576 EXPECT_CALL(*send_algorithm_, PacingRate(_)) | |
1577 .WillRepeatedly(Return(QuicBandwidth::Zero())); | |
1578 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()) | |
1579 .WillOnce(Return(10 * kDefaultTCPMSS)); | |
1580 const size_t kNumSentPackets = 5; | |
1581 for (size_t i = 1; i <= kNumSentPackets; ++i) { | |
1582 SendDataPacket(i); | |
1583 } | |
1584 MockLossAlgorithm* loss_algorithm = new MockLossAlgorithm(); | |
1585 QuicSentPacketManagerPeer::SetLossAlgorithm(&manager_, loss_algorithm); | |
1586 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | |
1587 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1588 SendAlgorithmInterface::CongestionVector lost_packets; | |
1589 for (size_t i = 1; i < kNumSentPackets; ++i) { | |
1590 lost_packets.push_back(std::make_pair(i, kMaxPacketSize)); | |
1591 } | |
1592 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)) | |
1593 .WillOnce(SetArgPointee<4>(lost_packets)); | |
1594 QuicAckFrame ack_frame = InitAckFrame(kNumSentPackets); | |
1595 NackPackets(1, kNumSentPackets, &ack_frame); | |
1596 // Congestion block the sending right before losing the packets. | |
1597 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | |
1598 .WillRepeatedly(Return(QuicTime::Delta::Infinite())); | |
1599 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1600 EXPECT_TRUE(manager_.HasPendingRetransmissions()); | |
1601 EXPECT_EQ(0u, BytesInFlight()); | |
1602 | |
1603 // Ack 1 and ensure the retransmissions are cancelled and put back in flight. | |
1604 EXPECT_CALL(*loss_algorithm, DetectLosses(_, _, _, _, _)); | |
1605 ack_frame = InitAckFrame(5); | |
1606 NackPackets(2, kNumSentPackets, &ack_frame); | |
1607 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1608 EXPECT_FALSE(manager_.HasPendingRetransmissions()); | |
1609 EXPECT_EQ(3u * kDefaultLength, BytesInFlight()); | |
1610 } | |
1611 | |
1612 TEST_P(QuicSentPacketManagerTest, NegotiateUndoFromOptionsAtClient) { | |
1613 FLAGS_quic_loss_recovery_use_largest_acked = true; | |
1614 EXPECT_FALSE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | |
1615 QuicConfig client_config; | |
1616 QuicTagVector options; | |
1617 | |
1618 options.push_back(kUNDO); | |
1619 QuicSentPacketManagerPeer::SetPerspective(&manager_, Perspective::IS_CLIENT); | |
1620 client_config.SetConnectionOptionsToSend(options); | |
1621 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1622 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1623 manager_.SetFromConfig(client_config); | |
1624 EXPECT_TRUE(QuicSentPacketManagerPeer::GetUndoRetransmits(&manager_)); | |
1625 } | |
1626 | |
1627 TEST_P(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) { | |
1628 uint32_t initial_rtt_us = 325000; | |
1629 EXPECT_NE(initial_rtt_us, | |
1630 manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); | |
1631 | |
1632 QuicConfig config; | |
1633 config.SetInitialRoundTripTimeUsToSend(initial_rtt_us); | |
1634 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | |
1635 EXPECT_CALL(*network_change_visitor_, OnCongestionChange()); | |
1636 manager_.SetFromConfig(config); | |
1637 | |
1638 EXPECT_EQ(0, manager_.GetRttStats()->smoothed_rtt().ToMicroseconds()); | |
1639 EXPECT_EQ(initial_rtt_us, manager_.GetRttStats()->initial_rtt_us()); | |
1640 } | |
1641 | |
1642 TEST_P(QuicSentPacketManagerTest, ResumeConnectionState) { | |
1643 // The sent packet manager should use the RTT from CachedNetworkParameters if | |
1644 // it is provided. | |
1645 const int kRttMs = 1234; | |
1646 CachedNetworkParameters cached_network_params; | |
1647 cached_network_params.set_min_rtt_ms(kRttMs); | |
1648 | |
1649 EXPECT_CALL(*send_algorithm_, ResumeConnectionState(_, false)); | |
1650 manager_.ResumeConnectionState(cached_network_params, false); | |
1651 EXPECT_EQ(kRttMs * kNumMicrosPerMilli, | |
1652 static_cast<uint64_t>(manager_.GetRttStats()->initial_rtt_us())); | |
1653 } | |
1654 | |
1655 TEST_P(QuicSentPacketManagerTest, ConnectionMigrationUnspecifiedChange) { | |
1656 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | |
1657 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); | |
1658 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); | |
1659 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | |
1660 | |
1661 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); | |
1662 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | |
1663 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); | |
1664 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | |
1665 | |
1666 EXPECT_CALL(*send_algorithm_, OnConnectionMigration()); | |
1667 manager_.OnConnectionMigration(kDefaultPathId, UNSPECIFIED_CHANGE); | |
1668 | |
1669 EXPECT_EQ(default_init_rtt, rtt_stats->initial_rtt_us()); | |
1670 EXPECT_EQ(0u, manager_.GetConsecutiveRtoCount()); | |
1671 EXPECT_EQ(0u, manager_.GetConsecutiveTlpCount()); | |
1672 } | |
1673 | |
1674 TEST_P(QuicSentPacketManagerTest, ConnectionMigrationIPSubnetChange) { | |
1675 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | |
1676 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); | |
1677 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); | |
1678 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | |
1679 | |
1680 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); | |
1681 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | |
1682 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); | |
1683 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | |
1684 | |
1685 manager_.OnConnectionMigration(kDefaultPathId, IPV4_SUBNET_CHANGE); | |
1686 | |
1687 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | |
1688 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | |
1689 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | |
1690 } | |
1691 | |
1692 TEST_P(QuicSentPacketManagerTest, ConnectionMigrationPortChange) { | |
1693 RttStats* rtt_stats = const_cast<RttStats*>(manager_.GetRttStats()); | |
1694 int64_t default_init_rtt = rtt_stats->initial_rtt_us(); | |
1695 rtt_stats->set_initial_rtt_us(default_init_rtt * 2); | |
1696 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | |
1697 | |
1698 QuicSentPacketManagerPeer::SetConsecutiveRtoCount(&manager_, 1); | |
1699 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | |
1700 QuicSentPacketManagerPeer::SetConsecutiveTlpCount(&manager_, 2); | |
1701 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | |
1702 | |
1703 manager_.OnConnectionMigration(kDefaultPathId, PORT_CHANGE); | |
1704 | |
1705 EXPECT_EQ(2 * default_init_rtt, rtt_stats->initial_rtt_us()); | |
1706 EXPECT_EQ(1u, manager_.GetConsecutiveRtoCount()); | |
1707 EXPECT_EQ(2u, manager_.GetConsecutiveTlpCount()); | |
1708 } | |
1709 | |
1710 TEST_P(QuicSentPacketManagerTest, PathMtuIncreased) { | |
1711 FLAGS_quic_no_mtu_discovery_ack_listener = true; | |
1712 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, BytesInFlight(), 1, _, _)) | |
1713 .Times(1) | |
1714 .WillOnce(Return(true)); | |
1715 SerializedPacket packet(kDefaultPathId, 1, PACKET_6BYTE_PACKET_NUMBER, | |
1716 nullptr, kDefaultLength + 100, 0u, false, false); | |
1717 manager_.OnPacketSent(&packet, kInvalidPathId, 0, clock_.Now(), | |
1718 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA); | |
1719 | |
1720 // Ack the large packet and expect the path MTU to increase. | |
1721 ExpectAck(1); | |
1722 EXPECT_CALL(*network_change_visitor_, | |
1723 OnPathMtuIncreased(kDefaultLength + 100)); | |
1724 QuicAckFrame ack_frame = InitAckFrame(1); | |
1725 manager_.OnIncomingAck(ack_frame, clock_.Now()); | |
1726 } | |
1727 | |
1728 } // namespace | |
1729 } // namespace test | |
1730 } // namespace net | |
OLD | NEW |