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

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

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

Powered by Google App Engine
This is Rietveld 408576698