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.
9 #include "base/logging.h"
10 #include "base/rand_util.h"
11 #include "net/quic/congestion_control/inter_arrival_overuse_detector.h"
12 #include "net/quic/test_tools/mock_clock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 static const double kPi = 3.14159265;
20 class InterArrivalOveruseDetectorTest : public ::testing::Test {
22 InterArrivalOveruseDetectorTest();
24 QuicTime::Delta GaussianRandom(QuicTime::Delta mean,
25 QuicTime::Delta standard_deviation);
27 int Run100000Samples(int packets_per_burst,
29 QuicTime::Delta standard_deviation);
31 int RunUntilOveruse(int packets_per_burst,
33 QuicTime::Delta standard_deviation,
34 QuicTime::Delta drift_per_burst,
35 QuicTime::Delta *estimated_buffer_delay);
37 int RunUntilSteady(int packets_per_burst,
39 QuicTime::Delta standard_deviation,
40 QuicTime::Delta drift_per_burst);
42 int RunUntilNotDraining(int packets_per_burst,
44 QuicTime::Delta standard_deviation,
45 QuicTime::Delta drift_per_burst);
47 int RunUntilUnderusing(int packets_per_burst,
49 QuicTime::Delta standard_deviation,
50 QuicTime::Delta drift_per_burst);
52 void RunXBursts(int bursts,
53 int packets_per_burst,
55 QuicTime::Delta standard_deviation,
56 QuicTime::Delta drift_per_burst);
58 QuicPacketSequenceNumber sequence_number_;
59 MockClock send_clock_;
60 MockClock receive_clock_;
61 QuicTime::Delta drift_from_mean_;
62 InterArrivalOveruseDetector overuse_detector_;
66 InterArrivalOveruseDetectorTest::InterArrivalOveruseDetectorTest()
67 : sequence_number_(1),
68 drift_from_mean_(QuicTime::Delta::Zero()),
72 QuicTime::Delta InterArrivalOveruseDetectorTest::GaussianRandom(
74 QuicTime::Delta standard_deviation) {
75 // Creating a Normal distribution variable from two independent uniform
76 // variables based on the Box-Muller transform.
77 double uniform1 = base::RandDouble();
78 double uniform2 = base::RandDouble();
80 QuicTime::Delta random = QuicTime::Delta::FromMicroseconds(
81 static_cast<int>(standard_deviation.ToMicroseconds() *
82 sqrt(-2 * log(uniform1)) * cos(2 * kPi * uniform2))).
83 Add(mean).Subtract(drift_from_mean_);
84 if (random < QuicTime::Delta::Zero()) {
85 // Don't do negative deltas.
86 drift_from_mean_ = drift_from_mean_.Subtract(mean);
87 return QuicTime::Delta::Zero();
89 drift_from_mean_ = drift_from_mean_.Add(random).Subtract(mean);
93 int InterArrivalOveruseDetectorTest::Run100000Samples(
94 int packets_per_burst,
96 QuicTime::Delta standard_deviation) {
97 int unique_overuse = 0;
98 int last_overuse = -1;
99 for (int i = 0; i < 100000; ++i) {
100 // Assume that we send out the packets with perfect pacing.
101 send_clock_.AdvanceTime(mean);
102 QuicTime send_time = send_clock_.ApproximateNow();
103 // Do only one random delta for all packets in a burst.
104 receive_clock_.AdvanceTime(GaussianRandom(mean, standard_deviation));
105 QuicTime receive_time = receive_clock_.ApproximateNow();
106 for (int j = 0; j <= packets_per_burst; ++j) {
107 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
109 (j == packets_per_burst),
112 // We expect to randomly hit a few false detects, count the unique
113 // overuse events, hence not multiple signals in a row.
114 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
115 if (kBandwidthOverUsing == overuse_detector_.GetState(
116 &estimated_buffer_delay)) {
117 if (last_overuse + 1 != i) {
123 return unique_overuse;
126 int InterArrivalOveruseDetectorTest::RunUntilOveruse(
127 int packets_per_burst,
128 QuicTime::Delta mean,
129 QuicTime::Delta standard_deviation,
130 QuicTime::Delta drift_per_burst,
131 QuicTime::Delta *estimated_buffer_delay) {
132 // Simulate a higher send pace, that is too high.
133 for (int i = 0; i < 1000; ++i) {
134 send_clock_.AdvanceTime(mean);
135 QuicTime send_time = send_clock_.ApproximateNow();
136 // Do only one random delta for all packets in a burst.
137 receive_clock_.AdvanceTime(GaussianRandom(mean.Add(drift_per_burst),
138 standard_deviation));
139 QuicTime receive_time = receive_clock_.ApproximateNow();
140 for (int j = 0; j <= packets_per_burst; ++j) {
141 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
143 (j == packets_per_burst),
146 if (kBandwidthOverUsing == overuse_detector_.GetState(
147 estimated_buffer_delay)) {
154 int InterArrivalOveruseDetectorTest::RunUntilSteady(
155 int packets_per_burst,
156 QuicTime::Delta mean,
157 QuicTime::Delta standard_deviation,
158 QuicTime::Delta drift_per_burst) {
159 // Simulate a lower send pace, that is lower than the capacity.
160 for (int i = 0; i < 1000; ++i) {
161 send_clock_.AdvanceTime(mean);
162 QuicTime send_time = send_clock_.ApproximateNow();
163 // Do only one random delta for all packets in a burst.
164 receive_clock_.AdvanceTime(GaussianRandom(mean.Subtract(drift_per_burst),
165 standard_deviation));
166 QuicTime receive_time = receive_clock_.ApproximateNow();
167 for (int j = 0; j <= packets_per_burst; ++j) {
168 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
170 (j == packets_per_burst),
173 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
174 if (kBandwidthSteady ==
175 overuse_detector_.GetState(&estimated_buffer_delay)) {
182 int InterArrivalOveruseDetectorTest::RunUntilNotDraining(
183 int packets_per_burst,
184 QuicTime::Delta mean,
185 QuicTime::Delta standard_deviation,
186 QuicTime::Delta drift_per_burst) {
187 // Simulate a lower send pace, that is lower than the capacity.
188 for (int i = 0; i < 1000; ++i) {
189 send_clock_.AdvanceTime(mean);
190 QuicTime send_time = send_clock_.ApproximateNow();
191 // Do only one random delta for all packets in a burst.
192 receive_clock_.AdvanceTime(GaussianRandom(mean.Subtract(drift_per_burst),
193 standard_deviation));
194 QuicTime receive_time = receive_clock_.ApproximateNow();
195 for (int j = 0; j <= packets_per_burst; ++j) {
196 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
198 (j == packets_per_burst),
201 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
202 if (kBandwidthDraining >
203 overuse_detector_.GetState(&estimated_buffer_delay)) {
210 int InterArrivalOveruseDetectorTest::RunUntilUnderusing(
211 int packets_per_burst,
212 QuicTime::Delta mean,
213 QuicTime::Delta standard_deviation,
214 QuicTime::Delta drift_per_burst) {
215 // Simulate a lower send pace, that is lower than the capacity.
216 for (int i = 0; i < 1000; ++i) {
217 send_clock_.AdvanceTime(mean);
218 QuicTime send_time = send_clock_.ApproximateNow();
219 // Do only one random delta for all packets in a burst.
220 receive_clock_.AdvanceTime(GaussianRandom(mean.Subtract(drift_per_burst),
221 standard_deviation));
222 QuicTime receive_time = receive_clock_.ApproximateNow();
223 for (int j = 0; j <= packets_per_burst; ++j) {
224 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
226 (j == packets_per_burst),
229 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
230 if (kBandwidthUnderUsing == overuse_detector_.GetState(
231 &estimated_buffer_delay)) {
238 void InterArrivalOveruseDetectorTest::RunXBursts(
240 int packets_per_burst,
241 QuicTime::Delta mean,
242 QuicTime::Delta standard_deviation,
243 QuicTime::Delta drift_per_burst) {
244 for (int i = 0; i < bursts; ++i) {
245 send_clock_.AdvanceTime(mean);
246 QuicTime send_time = send_clock_.ApproximateNow();
247 // Do only one random delta for all packets in a burst.
248 receive_clock_.AdvanceTime(GaussianRandom(mean.Add(drift_per_burst),
249 standard_deviation));
250 QuicTime receive_time = receive_clock_.ApproximateNow();
251 for (int j = 0; j <= packets_per_burst; ++j) {
252 overuse_detector_.OnAcknowledgedPacket(sequence_number_++,
254 (j == packets_per_burst),
260 // TODO(pwestin): test packet loss impact on accuracy.
261 // TODO(pwestin): test colored noise by dropping late frames.
263 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_TestNoise) {
265 memset(count, 0, sizeof(count));
266 for (int i = 0; i < 10000; ++i) {
267 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(30);
268 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(10);
269 count[GaussianRandom(mean, standard_deviation).ToMilliseconds()]++;
271 for (int j = 0; j < 100; ++j) {
272 DLOG(INFO) << j << ":" << count[j];
276 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_SimpleNonOveruse) {
277 QuicPacketSequenceNumber sequence_number = 1;
278 QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(10);
280 for (int i = 0; i < 1000; ++i) {
281 QuicTime send_time = send_clock_.ApproximateNow();
282 QuicTime receive_time = receive_clock_.ApproximateNow();
283 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
287 send_clock_.AdvanceTime(delta);
288 receive_clock_.AdvanceTime(delta);
289 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
290 EXPECT_EQ(kBandwidthSteady,
291 overuse_detector_.GetState(&estimated_buffer_delay));
295 TEST_F(InterArrivalOveruseDetectorTest,
296 DISABLED_SimpleNonOveruseSendClockAhead) {
297 QuicPacketSequenceNumber sequence_number = 1;
298 QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(10);
299 send_clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1234));
301 for (int i = 0; i < 1000; ++i) {
302 QuicTime send_time = send_clock_.ApproximateNow();
303 QuicTime receive_time = receive_clock_.ApproximateNow();
304 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
308 send_clock_.AdvanceTime(delta);
309 receive_clock_.AdvanceTime(delta);
310 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
311 EXPECT_EQ(kBandwidthSteady,
312 overuse_detector_.GetState(&estimated_buffer_delay));
316 TEST_F(InterArrivalOveruseDetectorTest,
317 DISABLED_SimpleNonOveruseSendClockBehind) {
318 QuicPacketSequenceNumber sequence_number = 1;
319 QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(10);
320 receive_clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1234));
322 for (int i = 0; i < 1000; ++i) {
323 QuicTime send_time = send_clock_.ApproximateNow();
324 QuicTime receive_time = receive_clock_.ApproximateNow();
325 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
329 send_clock_.AdvanceTime(delta);
330 receive_clock_.AdvanceTime(delta);
331 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
332 EXPECT_EQ(kBandwidthSteady,
333 overuse_detector_.GetState(&estimated_buffer_delay));
337 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_SimpleNonOveruseWithVariance) {
338 QuicPacketSequenceNumber sequence_number = 1;
339 for (int i = 0; i < 1000; ++i) {
341 receive_clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
343 receive_clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(15));
345 QuicTime send_time = send_clock_.ApproximateNow();
346 QuicTime receive_time = receive_clock_.ApproximateNow();
347 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
351 send_clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(10));
352 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
353 EXPECT_EQ(kBandwidthSteady,
354 overuse_detector_.GetState(&estimated_buffer_delay));
358 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_SimpleOveruse) {
359 QuicPacketSequenceNumber sequence_number = 1;
360 QuicTime::Delta send_delta = QuicTime::Delta::FromMilliseconds(10);
361 QuicTime::Delta received_delta = QuicTime::Delta::FromMilliseconds(5);
362 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
364 for (int i = 0; i < 100000; ++i) {
365 send_clock_.AdvanceTime(send_delta);
366 receive_clock_.AdvanceTime(received_delta);
367 QuicTime send_time = send_clock_.ApproximateNow();
368 QuicTime receive_time = receive_clock_.ApproximateNow();
369 // Sending 2 packets the same time as that is what we expect to do.
370 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
374 receive_clock_.AdvanceTime(received_delta);
375 receive_time = receive_clock_.ApproximateNow();
376 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
381 EXPECT_EQ(kBandwidthSteady,
382 overuse_detector_.GetState(&estimated_buffer_delay));
384 // Simulate a higher send pace, that is too high by receiving 1 millisecond
386 received_delta = QuicTime::Delta::FromMilliseconds(6);
387 send_clock_.AdvanceTime(send_delta);
388 receive_clock_.AdvanceTime(received_delta);
389 QuicTime send_time = send_clock_.ApproximateNow();
390 QuicTime receive_time = receive_clock_.ApproximateNow();
391 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
395 receive_clock_.AdvanceTime(received_delta);
396 receive_time = receive_clock_.ApproximateNow();
397 overuse_detector_.OnAcknowledgedPacket(sequence_number++,
401 EXPECT_EQ(kBandwidthOverUsing,
402 overuse_detector_.GetState(&estimated_buffer_delay));
405 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance10Kbit) {
406 int packets_per_burst = 1;
407 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1000);
408 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
409 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(5);
411 int overuse_signals = Run100000Samples(packets_per_burst,
414 EXPECT_GE(1, overuse_signals);
416 // Simulate a higher send pace, that is too high.
417 // With current tuning we require 6 updates with 5 milliseconds before
419 // Resulting in a minimal buffer build up of 30 milliseconds.
420 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
421 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
425 &estimated_buffer_delay);
426 EXPECT_GE(6, bursts_until_overuse);
427 EXPECT_NEAR(40, estimated_buffer_delay.ToMilliseconds(), 15);
429 // After draining the buffers we are back in a normal state.
430 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
434 EXPECT_GE(6, bursts_until_not_draining);
436 // After draining the buffer additionally we detect an underuse.
437 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
441 EXPECT_GE(7, bursts_until_underusing);
444 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance10Kbit) {
445 int packets_per_burst = 1;
446 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1000);
447 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(50);
448 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(50);
450 int overuse_signals = Run100000Samples(packets_per_burst,
453 EXPECT_GE(1, overuse_signals);
455 // Simulate a higher send pace, that is too high.
456 // With current tuning we require 6 updates with 50 milliseconds before
458 // Resulting in a minimal buffer build up of 300 milliseconds.
459 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
460 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
464 &estimated_buffer_delay);
465 EXPECT_GE(6, bursts_until_overuse);
466 EXPECT_NEAR(400, estimated_buffer_delay.ToMilliseconds(), 150);
468 // After draining the buffers we are back in a normal state.
469 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
473 EXPECT_GE(6, bursts_until_not_draining);
475 // After draining the buffer additionally we detect an underuse.
476 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
480 EXPECT_GE(7, bursts_until_underusing);
483 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance100Kbit) {
484 int packets_per_burst = 1;
485 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(100);
486 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
487 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(5);
489 int overuse_signals = Run100000Samples(packets_per_burst,
492 EXPECT_GE(1, overuse_signals);
494 // Simulate a higher send pace, that is too high.
495 // With current tuning we require 6 updates with 5 milliseconds
497 // Resulting in a minimal buffer build up of 30 ms.
498 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
499 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
503 &estimated_buffer_delay);
504 EXPECT_GE(6, bursts_until_overuse);
505 EXPECT_NEAR(40, estimated_buffer_delay.ToMilliseconds(), 15);
507 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
515 // After draining the buffers we are back in a normal state.
516 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
520 EXPECT_GE(7, bursts_until_not_draining);
522 // After draining the buffer additionally we detect an underuse.
523 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
527 EXPECT_GE(5, bursts_until_underusing);
530 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance100Kbit) {
531 int packets_per_burst = 1;
532 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(100);
533 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(50);
534 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(50);
536 int overuse_signals = Run100000Samples(packets_per_burst,
539 EXPECT_GE(1, overuse_signals);
541 // Simulate a higher send pace, that is too high.
542 // With current tuning we require 4 updates with 50 milliseconds
544 // Resulting in a minimal buffer build up of 200 ms.
545 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
546 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
550 &estimated_buffer_delay);
551 EXPECT_GE(4, bursts_until_overuse);
552 EXPECT_NEAR(300, estimated_buffer_delay.ToMilliseconds(), 150);
554 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
562 // After draining the buffers we are back in a normal state.
563 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
567 EXPECT_GE(5, bursts_until_not_draining);
569 // After draining the buffer additionally we detect an underuse.
570 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
574 EXPECT_GE(5, bursts_until_underusing);
577 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance1Mbit) {
578 int packets_per_burst = 1;
579 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
580 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
581 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(5);
583 int overuse_signals = Run100000Samples(packets_per_burst,
586 EXPECT_GE(1, overuse_signals);
588 // Simulate a higher send pace, that is too high.
589 // With current tuning we require 4 updates with 5 millisecond
591 // Resulting in a minimal buffer build up of 20 ms.
592 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
593 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
597 &estimated_buffer_delay);
598 EXPECT_GE(4, bursts_until_overuse);
599 EXPECT_NEAR(30, estimated_buffer_delay.ToMilliseconds(), 15);
601 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
609 // After draining the buffers we are back in a normal state.
610 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
614 EXPECT_GE(14, bursts_until_not_draining);
616 // After draining the buffer additionally we detect an underuse.
617 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
621 EXPECT_GE(4, bursts_until_underusing);
624 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance1Mbit) {
625 int packets_per_burst = 1;
626 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
627 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(1);
628 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(1);
630 int overuse_signals = Run100000Samples(packets_per_burst,
633 EXPECT_GE(1, overuse_signals);
635 // Simulate a higher send pace, that is too high.
636 // With current tuning we require 6 updates with 1 millisecond
638 // Resulting in a minimal buffer build up of 6 ms.
639 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
640 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
644 &estimated_buffer_delay);
645 EXPECT_GE(6, bursts_until_overuse);
646 EXPECT_NEAR(8, estimated_buffer_delay.ToMilliseconds(), 3);
648 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
656 // After draining the buffers we are back in a normal state.
657 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
661 EXPECT_GE(16, bursts_until_not_draining);
663 // After draining the buffer additionally we detect an underuse.
664 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
668 EXPECT_GE(4, bursts_until_underusing);
671 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance20Mbit) {
672 int packets_per_burst = 2;
673 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1);
674 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMicroseconds(500);
675 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMicroseconds(500);
677 int overuse_signals = Run100000Samples(packets_per_burst,
680 EXPECT_GE(1, overuse_signals);
682 // Simulate a higher send pace, that is too high.
683 // With current tuning we require 4 updates with 500 microsecond
685 // Resulting in a minimal buffer build up of 2 ms.
686 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
687 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
691 &estimated_buffer_delay);
692 EXPECT_GE(4, bursts_until_overuse);
693 EXPECT_NEAR(3, estimated_buffer_delay.ToMilliseconds(), 2);
695 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
703 // After draining the buffers we are back in a normal state.
704 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
708 EXPECT_NEAR(100, bursts_until_not_draining, 10);
710 // After draining the buffer additionally we detect an underuse.
711 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
715 EXPECT_GE(1, bursts_until_underusing);
718 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance100Mbit) {
719 int packets_per_burst = 10;
720 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1);
721 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMicroseconds(500);
722 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMicroseconds(500);
724 int overuse_signals = Run100000Samples(packets_per_burst,
727 EXPECT_GE(1, overuse_signals);
729 // Simulate a higher send pace, that is too high.
730 // With current tuning we require 4 updates with 500 microsecond
732 // Resulting in a minimal buffer build up of 2 ms.
733 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
734 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
738 &estimated_buffer_delay);
739 EXPECT_GE(4, bursts_until_overuse);
740 EXPECT_NEAR(3, estimated_buffer_delay.ToMilliseconds(), 2);
742 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
750 // After draining the buffers we are back in a normal state.
751 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
755 EXPECT_NEAR(100, bursts_until_not_draining, 10);
757 // After draining the buffer additionally we detect an underuse.
758 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
762 EXPECT_GE(1, bursts_until_underusing);
765 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_VeryHighVariance100Mbit) {
766 int packets_per_burst = 10;
767 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1);
768 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
769 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMicroseconds(500);
771 // We get false overuse in this scenario due to that the standard deviation is
772 // higher than our mean and the fact that a delta time can't be negative. This
773 // results in an under estimated standard deviation in the estimator causing
775 int overuse_signals = Run100000Samples(packets_per_burst,
778 EXPECT_GE(2000, overuse_signals);
780 // Simulate a higher send pace, that is too high.
781 // With current tuning we require 25 updates with 500 microsecond
783 // Resulting in a minimal buffer build up of 12.5 ms.
784 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
785 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
789 &estimated_buffer_delay);
790 EXPECT_GE(17, bursts_until_overuse);
791 EXPECT_NEAR(22, estimated_buffer_delay.ToMilliseconds(), 15);
793 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
801 // After draining the buffers we are back in a normal state.
802 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
806 EXPECT_GE(117, bursts_until_not_draining);
808 // After draining the buffer additionally we detect an underuse.
809 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
813 EXPECT_GE(1, bursts_until_underusing);
817 // Tests simulating big drop in bitrate.
820 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance1MbitTo100Kbit) {
821 int packets_per_burst = 1;
822 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
823 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(1);
824 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(100);
826 int overuse_signals = Run100000Samples(packets_per_burst,
829 EXPECT_GE(1, overuse_signals);
831 // Simulate a higher send pace, that is too high.
832 // With current tuning we require 1 update with 100 millisecond
834 // Resulting in a minimal buffer build up of 100 ms.
835 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
836 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
840 &estimated_buffer_delay);
841 EXPECT_GE(1, bursts_until_overuse);
842 EXPECT_NEAR(104, estimated_buffer_delay.ToMilliseconds(), 3);
844 // Back off 20% lower than estimate to drain.
845 mean = QuicTime::Delta::FromMilliseconds(100);
846 drift_per_burst = QuicTime::Delta::FromMilliseconds(20);
848 // After draining the buffers we are back in a normal state.
849 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
853 EXPECT_GE(5, bursts_until_not_draining);
855 // After draining the buffer additionally we detect an underuse.
856 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
860 EXPECT_GE(3, bursts_until_underusing);
863 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_HighVariance20MbitTo1Mbit) {
864 int packets_per_burst = 2;
865 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(1);
866 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMicroseconds(500);
867 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(10);
869 int overuse_signals = Run100000Samples(packets_per_burst,
872 EXPECT_GE(1, overuse_signals);
874 // Simulate a higher send pace, that is too high.
875 // With current tuning we require 1 update with 10 milliseconds
877 // Resulting in a minimal buffer build up of 10 ms.
878 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
879 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
883 &estimated_buffer_delay);
884 EXPECT_GE(1, bursts_until_overuse);
885 EXPECT_NEAR(12, estimated_buffer_delay.ToMilliseconds(), 2);
887 // Back off 20% lower than estimate to drain.
888 mean = QuicTime::Delta::FromMilliseconds(10);
889 drift_per_burst = QuicTime::Delta::FromMilliseconds(2);
891 // After draining the buffers we are back in a normal state.
892 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
896 EXPECT_GE(5, bursts_until_not_draining);
898 // After draining the buffer additionally we detect an underuse.
899 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
903 EXPECT_GE(3, bursts_until_underusing);
907 // Tests that we can detect slow drifts.
910 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance1MbitSmallSteps) {
911 int packets_per_burst = 1;
912 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
913 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(1);
914 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMicroseconds(100);
916 int overuse_signals = Run100000Samples(packets_per_burst,
919 EXPECT_GE(1, overuse_signals);
921 // Simulate a higher send pace, that is too high.
922 // With current tuning we require 41 updates with 100 microseconds before
924 // Resulting in a minimal buffer build up of 4.1 ms.
925 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
926 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
930 &estimated_buffer_delay);
931 EXPECT_GE(41, bursts_until_overuse);
932 EXPECT_NEAR(7, estimated_buffer_delay.ToMilliseconds(), 3);
934 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
942 // After draining the buffers we are back in a normal state.
943 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
947 EXPECT_GE(29, bursts_until_not_draining);
949 // After draining the buffer additionally we detect an underuse.
950 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
954 EXPECT_GE(71, bursts_until_underusing);
957 TEST_F(InterArrivalOveruseDetectorTest, DISABLED_LowVariance1MbitTinySteps) {
958 int packets_per_burst = 1;
959 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
960 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(1);
961 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMicroseconds(10);
963 int overuse_signals = Run100000Samples(packets_per_burst,
966 EXPECT_GE(1, overuse_signals);
968 // Simulate a higher send pace, that is too high.
969 // With current tuning we require 345 updates with 10 microseconds before
971 // Resulting in a minimal buffer build up of 3.45 ms.
972 QuicTime::Delta estimated_buffer_delay(QuicTime::Delta::Zero());
973 int bursts_until_overuse = RunUntilOveruse(packets_per_burst,
977 &estimated_buffer_delay);
978 EXPECT_GE(345, bursts_until_overuse);
979 EXPECT_NEAR(7, estimated_buffer_delay.ToMilliseconds(), 3);
981 // Simulate an RTT of 100 ms. Hence overusing for additional 100 ms before
989 // After draining the buffers we are back in a normal state.
990 int bursts_until_not_draining = RunUntilNotDraining(packets_per_burst,
994 EXPECT_GE(18, bursts_until_not_draining);
996 // After draining the buffer additionally we detect an underuse.
997 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
1001 EXPECT_GE(683, bursts_until_underusing);
1005 // Tests simulating starting with full buffers.
1008 TEST_F(InterArrivalOveruseDetectorTest,
1009 DISABLED_StartedWithFullBuffersHighVariance1Mbit) {
1010 int packets_per_burst = 1;
1011 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
1012 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
1013 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(5);
1015 int overuse_signals = Run100000Samples(packets_per_burst,
1017 standard_deviation);
1018 EXPECT_GE(1, overuse_signals);
1020 // Simulate a lower send pace.
1021 // Draining the buffer until we detect an underuse.
1022 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
1026 EXPECT_GE(6, bursts_until_underusing);
1028 // After draining the buffers we are back in a normal state.
1029 drift_per_burst = QuicTime::Delta::FromMilliseconds(0);
1030 int bursts_until_steady = RunUntilSteady(packets_per_burst,
1034 EXPECT_GE(6, bursts_until_steady);
1037 TEST_F(InterArrivalOveruseDetectorTest,
1038 DISABLED_StartedWithFullBuffersHighVariance1MbitSlowDrift) {
1039 int packets_per_burst = 1;
1040 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
1041 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(5);
1042 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(1);
1044 int overuse_signals = Run100000Samples(packets_per_burst,
1046 standard_deviation);
1047 EXPECT_GE(1, overuse_signals);
1049 // Simulate a faster receive pace.
1050 // Draining the buffer until we detect an underuse.
1051 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
1055 EXPECT_GE(21, bursts_until_underusing);
1057 // Simulate an RTT of 100 ms. Hence underusing for additional 100 ms before
1059 drift_per_burst = QuicTime::Delta::FromMilliseconds(-1);
1066 // After draining the buffers we are back in a normal state.
1067 drift_per_burst = QuicTime::Delta::FromMilliseconds(0);
1068 int bursts_until_steady = RunUntilSteady(packets_per_burst,
1072 EXPECT_GE(4, bursts_until_steady);
1075 TEST_F(InterArrivalOveruseDetectorTest,
1076 DISABLED_StartedWithFullBuffersLowVariance1Mbit) {
1077 int packets_per_burst = 1;
1078 QuicTime::Delta mean = QuicTime::Delta::FromMilliseconds(10);
1079 QuicTime::Delta standard_deviation = QuicTime::Delta::FromMilliseconds(1);
1080 QuicTime::Delta drift_per_burst = QuicTime::Delta::FromMilliseconds(1);
1082 int overuse_signals = Run100000Samples(packets_per_burst,
1084 standard_deviation);
1085 EXPECT_GE(1, overuse_signals);
1087 // Simulate a lower send pace.
1088 // Draining the buffer until we detect an underuse.
1089 int bursts_until_underusing = RunUntilUnderusing(packets_per_burst,
1093 EXPECT_GE(5, bursts_until_underusing);
1095 // Simulate an RTT of 100 ms. Hence underusing for additional 100 ms before
1097 drift_per_burst = QuicTime::Delta::FromMilliseconds(-1);
1104 // After draining the buffers we are back in a normal state.
1105 drift_per_burst = QuicTime::Delta::FromMilliseconds(0);
1106 int bursts_until_steady = RunUntilSteady(packets_per_burst,
1110 EXPECT_GE(41, bursts_until_steady);