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

Side by Side Diff: net/quic/quic_sent_packet_manager_test.cc

Issue 2193073003: Move shared files in net/quic/ into net/quic/core/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: io_thread_unittest.cc Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_sent_packet_manager_interface.h ('k') | net/quic/quic_server_id.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager_interface.h ('k') | net/quic/quic_server_id.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698