1 // Copyright (c) 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.
5 #include "base/logging.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "base/stl_util.h"
8 #include "net/quic/congestion_control/inter_arrival_sender.h"
9 #include "net/quic/test_tools/mock_clock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
17 class InterArrivalSenderTest : public ::testing::Test {
19 InterArrivalSenderTest()
20 : rtt_(QuicTime::Delta::FromMilliseconds(60)),
21 one_ms_(QuicTime::Delta::FromMilliseconds(1)),
22 one_s_(QuicTime::Delta::FromMilliseconds(1000)),
23 nine_ms_(QuicTime::Delta::FromMilliseconds(9)),
24 send_start_time_(send_clock_.Now()),
25 sender_(&send_clock_),
27 acked_sequence_number_(1),
28 feedback_sequence_number_(1) {
29 send_clock_.AdvanceTime(one_ms_);
30 receive_clock_.AdvanceTime(one_ms_);
33 virtual ~InterArrivalSenderTest() {
34 STLDeleteValues(&sent_packets_);
37 void SendAvailableCongestionWindow() {
38 while (sender_.TimeUntilSend(send_clock_.Now(),
39 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero()) {
40 QuicByteCount bytes_in_packet = kDefaultMaxPacketSize;
41 sent_packets_[sequence_number_] =
42 new class SendAlgorithmInterface::SentPacket(
43 bytes_in_packet, send_clock_.Now());
45 sender_.OnPacketSent(send_clock_.Now(), sequence_number_, bytes_in_packet,
46 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA);
49 EXPECT_FALSE(sender_.TimeUntilSend(send_clock_.Now(),
50 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
53 void AckNPackets(int n) {
54 for (int i = 0; i < n; ++i) {
55 sender_.OnIncomingAck(
56 acked_sequence_number_++, kDefaultMaxPacketSize, rtt_);
60 void SendDelaySpikeFeedbackMessage(QuicTime::Delta spike_time) {
61 QuicCongestionFeedbackFrame feedback;
62 feedback.type = kInterArrival;
63 feedback.inter_arrival.accumulated_number_of_lost_packets = 0;
64 receive_clock_.AdvanceTime(spike_time);
65 QuicTime receive_time = receive_clock_.ApproximateNow();
66 feedback.inter_arrival.received_packet_times.insert(
67 pair<QuicPacketSequenceNumber, QuicTime>(
68 feedback_sequence_number_, receive_time));
69 feedback_sequence_number_++;
71 // We need to send feedback for 2 packets since they where sent at the
73 feedback.inter_arrival.received_packet_times.insert(
74 pair<QuicPacketSequenceNumber, QuicTime>(
75 feedback_sequence_number_, receive_time));
76 feedback_sequence_number_++;
78 sender_.OnIncomingQuicCongestionFeedbackFrame(feedback, send_clock_.Now(),
82 void SendFeedbackMessageNPackets(int n,
83 QuicTime::Delta delta_odd,
84 QuicTime::Delta delta_even) {
85 QuicCongestionFeedbackFrame feedback;
86 feedback.type = kInterArrival;
87 feedback.inter_arrival.accumulated_number_of_lost_packets = 0;
88 for (int i = 0; i < n; ++i) {
89 if (feedback_sequence_number_ % 2) {
90 receive_clock_.AdvanceTime(delta_even);
92 receive_clock_.AdvanceTime(delta_odd);
94 QuicTime receive_time = receive_clock_.ApproximateNow();
95 feedback.inter_arrival.received_packet_times.insert(
96 pair<QuicPacketSequenceNumber, QuicTime>(
97 feedback_sequence_number_, receive_time));
98 feedback_sequence_number_++;
100 sender_.OnIncomingQuicCongestionFeedbackFrame(feedback, send_clock_.Now(),
104 QuicTime::Delta SenderDeltaSinceStart() {
105 return send_clock_.ApproximateNow().Subtract(send_start_time_);
108 const QuicTime::Delta rtt_;
109 const QuicTime::Delta one_ms_;
110 const QuicTime::Delta one_s_;
111 const QuicTime::Delta nine_ms_;
112 MockClock send_clock_;
113 MockClock receive_clock_;
114 const QuicTime send_start_time_;
115 InterArrivalSender sender_;
116 QuicPacketSequenceNumber sequence_number_;
117 QuicPacketSequenceNumber acked_sequence_number_;
118 QuicPacketSequenceNumber feedback_sequence_number_;
119 SendAlgorithmInterface::SentPacketsMap sent_packets_;
122 TEST_F(InterArrivalSenderTest, ProbeFollowedByFullRampUpCycle) {
123 QuicCongestionFeedbackFrame feedback;
124 // At startup make sure we can send.
125 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
126 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
129 for (int i = 0; i < 4; ++i) {
130 SendAvailableCongestionWindow();
131 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
132 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
133 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
134 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
136 SendAvailableCongestionWindow();
138 // We have now sent our probe.
139 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(), NOT_RETRANSMISSION,
140 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsInfinite());
143 SendFeedbackMessageNPackets(10, one_ms_, nine_ms_);
144 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
145 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
146 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
147 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
149 // We should now have our probe rate.
150 QuicTime::Delta acc_arrival_time = QuicTime::Delta::FromMilliseconds(41);
151 int64 probe_rate = kDefaultMaxPacketSize * 9 * kNumMicrosPerSecond /
152 acc_arrival_time.ToMicroseconds();
153 EXPECT_NEAR(0.7f * probe_rate,
154 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
155 DLOG(INFO) << "After probe";
156 // Send 50 bursts, make sure that we move fast in the beginning.
157 for (int i = 0; i < 50; ++i) {
158 SendAvailableCongestionWindow();
159 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
160 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
161 send_clock_.AdvanceTime(time_until_send);
162 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
163 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
165 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
167 EXPECT_NEAR(0.875f * probe_rate,
168 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
169 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 600, 10);
171 // Send 50 bursts, make sure that we slow down towards the probe rate.
172 for (int i = 0; i < 50; ++i) {
173 SendAvailableCongestionWindow();
174 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
175 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
176 send_clock_.AdvanceTime(time_until_send);
177 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
178 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
180 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
182 EXPECT_NEAR(0.95f * probe_rate,
183 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
184 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 1100, 10);
186 // Send 50 bursts, make sure that we move very slow close to the probe rate.
187 for (int i = 0; i < 50; ++i) {
188 SendAvailableCongestionWindow();
189 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
190 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
191 send_clock_.AdvanceTime(time_until_send);
192 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
193 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
195 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
197 EXPECT_NEAR(0.99f * probe_rate,
198 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
199 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 1560, 10);
200 DLOG(INFO) << "Near available channel estimate";
202 // Send 50 bursts, make sure that we move very slow close to the probe rate.
203 for (int i = 0; i < 50; ++i) {
204 SendAvailableCongestionWindow();
205 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
206 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
207 send_clock_.AdvanceTime(time_until_send);
208 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
209 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
211 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
213 EXPECT_NEAR(1.00f * probe_rate,
214 sender_.BandwidthEstimate().ToBytesPerSecond(), 2000);
215 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 2000, 100);
216 DLOG(INFO) << "At available channel estimate";
218 // Send 50 bursts, make sure that we move very slow close to the probe rate.
219 for (int i = 0; i < 50; ++i) {
220 SendAvailableCongestionWindow();
221 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
222 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
223 send_clock_.AdvanceTime(time_until_send);
224 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
225 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
227 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
229 EXPECT_NEAR(1.01f * probe_rate,
230 sender_.BandwidthEstimate().ToBytesPerSecond(), 2000);
231 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 2500, 100);
233 // Send 50 bursts, make sure that we accelerate after the probe rate.
234 for (int i = 0; i < 50; ++i) {
235 SendAvailableCongestionWindow();
236 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
237 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
238 send_clock_.AdvanceTime(time_until_send);
239 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
240 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
242 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
244 EXPECT_NEAR(1.01f * probe_rate,
245 sender_.BandwidthEstimate().ToBytesPerSecond(), 2000);
246 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 2900, 100);
248 // Send 50 bursts, make sure that we accelerate after the probe rate.
249 for (int i = 0; i < 50; ++i) {
250 SendAvailableCongestionWindow();
251 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
252 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
253 send_clock_.AdvanceTime(time_until_send);
254 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
255 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
257 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
259 EXPECT_NEAR(1.03f * probe_rate,
260 sender_.BandwidthEstimate().ToBytesPerSecond(), 2000);
261 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 3400, 100);
263 int64 max_rate = kDefaultMaxPacketSize * kNumMicrosPerSecond /
264 one_ms_.ToMicroseconds();
266 int64 halfway_rate = probe_rate + (max_rate - probe_rate) / 2;
268 // Send until we reach halfway point.
269 for (int i = 0; i < 570; ++i) {
270 SendAvailableCongestionWindow();
271 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
272 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
273 send_clock_.AdvanceTime(time_until_send);
274 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
275 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
277 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
279 EXPECT_NEAR(halfway_rate,
280 sender_.BandwidthEstimate().ToBytesPerSecond(), 5000);
281 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 6600, 100);
282 DLOG(INFO) << "Near halfway point";
284 // Send until we reach max channel capacity.
285 for (int i = 0; i < 1500; ++i) {
286 SendAvailableCongestionWindow();
287 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
288 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
289 send_clock_.AdvanceTime(time_until_send);
290 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
291 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
293 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
295 EXPECT_NEAR(max_rate,
296 sender_.BandwidthEstimate().ToBytesPerSecond(), 5000);
297 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 10000, 200);
300 TEST_F(InterArrivalSenderTest, DelaySpikeFollowedBySlowDrain) {
301 QuicCongestionFeedbackFrame feedback;
302 // At startup make sure we can send.
303 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
304 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
307 for (int i = 0; i < 4; ++i) {
308 SendAvailableCongestionWindow();
309 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
310 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
311 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
312 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
314 SendAvailableCongestionWindow();
316 // We have now sent our probe.
317 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(), NOT_RETRANSMISSION,
318 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsInfinite());
321 SendFeedbackMessageNPackets(10, one_ms_, nine_ms_);
322 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
323 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
324 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
325 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
327 // We should now have our probe rate.
328 QuicTime::Delta acc_arrival_time = QuicTime::Delta::FromMilliseconds(41);
329 int64 probe_rate = kDefaultMaxPacketSize * 9 * kNumMicrosPerSecond /
330 acc_arrival_time.ToMicroseconds();
331 EXPECT_NEAR(0.7f * probe_rate,
332 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
334 // Send 50 bursts, make sure that we move fast in the beginning.
335 for (int i = 0; i < 50; ++i) {
336 SendAvailableCongestionWindow();
337 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
338 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
339 send_clock_.AdvanceTime(time_until_send);
340 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
341 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
343 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
345 EXPECT_NEAR(0.875f * probe_rate,
346 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
347 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 600, 10);
349 SendAvailableCongestionWindow();
350 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
351 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
352 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
353 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
356 int64 rate_at_introduced_delay_spike = 0.875f * probe_rate;
357 QuicTime::Delta spike_time = QuicTime::Delta::FromMilliseconds(100);
358 SendDelaySpikeFeedbackMessage(spike_time);
360 // Backing as much as we can, currently 90%.
361 EXPECT_NEAR(0.1f * rate_at_introduced_delay_spike,
362 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
363 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 610, 10);
365 // Run until we are catched up after our introduced delay spike.
366 while (send_clock_.Now() < receive_clock_.Now()) {
367 SendAvailableCongestionWindow();
368 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
369 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
370 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
371 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
373 SendFeedbackMessageNPackets(2, one_ms_, one_ms_);
375 // Expect that we go back to 67% of the rate before the spike.
376 EXPECT_NEAR(0.67f * rate_at_introduced_delay_spike,
377 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
378 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 820, 10);
380 // Send 100 bursts, make sure that we slow down towards the rate we had
382 for (int i = 0; i < 100; ++i) {
383 SendAvailableCongestionWindow();
384 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
385 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
386 send_clock_.AdvanceTime(time_until_send);
387 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
388 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
390 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
392 EXPECT_NEAR(0.97f * rate_at_introduced_delay_spike,
393 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
394 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 2100, 10);
397 TEST_F(InterArrivalSenderTest, DelaySpikeFollowedByImmediateDrain) {
398 QuicCongestionFeedbackFrame feedback;
399 // At startup make sure we can send.
400 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
401 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
404 for (int i = 0; i < 4; ++i) {
405 SendAvailableCongestionWindow();
406 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
407 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
408 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
409 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
411 SendAvailableCongestionWindow();
413 // We have now sent our probe.
414 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(), NOT_RETRANSMISSION,
415 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsInfinite());
418 SendFeedbackMessageNPackets(10, one_ms_, nine_ms_);
419 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
420 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
421 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
422 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
424 // We should now have our probe rate.
425 QuicTime::Delta acc_arrival_time = QuicTime::Delta::FromMilliseconds(41);
426 int64 probe_rate = kDefaultMaxPacketSize * 9 * kNumMicrosPerSecond /
427 acc_arrival_time.ToMicroseconds();
428 EXPECT_NEAR(0.7f * probe_rate,
429 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
431 // Send 50 bursts, make sure that we move fast in the beginning.
432 for (int i = 0; i < 50; ++i) {
433 SendAvailableCongestionWindow();
434 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
435 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
436 send_clock_.AdvanceTime(time_until_send);
437 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
438 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
440 SendFeedbackMessageNPackets(2, one_ms_, time_until_send.Subtract(one_ms_));
442 EXPECT_NEAR(0.875f * probe_rate,
443 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
444 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 600, 10);
446 SendAvailableCongestionWindow();
447 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
448 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
449 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
450 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
453 int64 rate_at_introduced_delay_spike = 0.875f * probe_rate;
454 QuicTime::Delta spike_time = QuicTime::Delta::FromMilliseconds(100);
455 SendDelaySpikeFeedbackMessage(spike_time);
457 // Backing as much as we can, currently 90%.
458 EXPECT_NEAR(0.1f * rate_at_introduced_delay_spike,
459 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
460 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 610, 10);
462 // Move send time forward.
463 send_clock_.AdvanceTime(spike_time);
464 // Make sure our clocks are aligned again.
465 receive_clock_.AdvanceTime(send_clock_.Now().Subtract(receive_clock_.Now()));
467 SendAvailableCongestionWindow();
469 SendFeedbackMessageNPackets(2, one_ms_, one_ms_);
470 // We should now be back where we introduced the delay spike.
471 EXPECT_NEAR(rate_at_introduced_delay_spike,
472 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
473 EXPECT_NEAR(SenderDeltaSinceStart().ToMilliseconds(), 710, 10);
476 TEST_F(InterArrivalSenderTest, MinBitrateDueToDelay) {
477 QuicBandwidth expected_min_bitrate = QuicBandwidth::FromKBitsPerSecond(10);
478 QuicCongestionFeedbackFrame feedback;
479 // At startup make sure we can send.
480 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
481 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
484 for (int i = 0; i < 4; ++i) {
485 SendAvailableCongestionWindow();
486 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
487 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
488 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
489 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
491 SendAvailableCongestionWindow();
495 // One second spread per packet is expected to result in an estimate at
496 // our minimum bitrate.
497 SendFeedbackMessageNPackets(10, one_s_, one_s_);
498 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
499 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
500 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
501 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
502 EXPECT_EQ(expected_min_bitrate, sender_.BandwidthEstimate());
505 TEST_F(InterArrivalSenderTest, MinBitrateDueToLoss) {
506 QuicBandwidth expected_min_bitrate = QuicBandwidth::FromKBitsPerSecond(10);
507 QuicCongestionFeedbackFrame feedback;
508 // At startup make sure we can send.
509 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
510 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
513 for (int i = 0; i < 4; ++i) {
514 SendAvailableCongestionWindow();
515 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
516 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
517 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
518 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
520 SendAvailableCongestionWindow();
523 SendFeedbackMessageNPackets(10, nine_ms_, nine_ms_);
524 send_clock_.AdvanceTime(sender_.TimeUntilSend(send_clock_.Now(),
525 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE));
526 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
527 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
529 QuicTime::Delta acc_arrival_time = QuicTime::Delta::FromMilliseconds(81);
530 int64 probe_rate = kDefaultMaxPacketSize * 9 * kNumMicrosPerSecond /
531 acc_arrival_time.ToMicroseconds();
532 EXPECT_NEAR(0.7f * probe_rate,
533 sender_.BandwidthEstimate().ToBytesPerSecond(), 1000);
535 for (int i = 0; i < 15; ++i) {
536 SendAvailableCongestionWindow();
537 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
538 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
539 send_clock_.AdvanceTime(time_until_send);
540 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
541 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
542 sender_.OnIncomingLoss(send_clock_.Now());
543 sender_.OnIncomingAck(acked_sequence_number_, kDefaultMaxPacketSize, rtt_);
544 acked_sequence_number_ += 2; // Create a loss by not acking both packets.
545 SendFeedbackMessageNPackets(2, nine_ms_, nine_ms_);
547 // Test that our exponentail back off stop at expected_min_bitrate.
548 EXPECT_EQ(expected_min_bitrate, sender_.BandwidthEstimate());
550 for (int i = 0; i < 50; ++i) {
551 SendAvailableCongestionWindow();
552 QuicTime::Delta time_until_send = sender_.TimeUntilSend(send_clock_.Now(),
553 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
554 send_clock_.AdvanceTime(time_until_send);
555 EXPECT_TRUE(sender_.TimeUntilSend(send_clock_.Now(),
556 NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE).IsZero());
557 sender_.OnIncomingLoss(send_clock_.Now());
558 sender_.OnIncomingAck(acked_sequence_number_, kDefaultMaxPacketSize, rtt_);
559 acked_sequence_number_ += 2; // Create a loss by not acking both packets.
560 SendFeedbackMessageNPackets(2, nine_ms_, nine_ms_);
562 // Make sure our bitrate is fixed at the expected_min_bitrate.
563 EXPECT_EQ(expected_min_bitrate, sender_.BandwidthEstimate());