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

Side by Side Diff: webrtc/modules/remote_bitrate_estimator/overuse_detector_unittest.cc

Issue 1151603008: Make the BWE threshold adaptive. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fix string length issue. Created 5 years, 5 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <math.h> 11 #include <math.h>
12 #include <cmath> 12 #include <cmath>
13 #include <cstdlib> 13 #include <cstdlib>
14 14
15 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
16 16
17 #include "webrtc/base/scoped_ptr.h" 17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/common_types.h" 18 #include "webrtc/common_types.h"
19 #include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h" 19 #include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
20 #include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h" 20 #include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
21 #include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h" 21 #include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
22 #include "webrtc/modules/remote_bitrate_estimator/rate_statistics.h"
23 #include "webrtc/modules/remote_bitrate_estimator/test/random.h"
24 #include "webrtc/test/field_trial.h"
22 #include "webrtc/test/testsupport/gtest_disable.h" 25 #include "webrtc/test/testsupport/gtest_disable.h"
23 26
24 namespace webrtc { 27 namespace webrtc {
25 namespace testing { 28 namespace testing {
26 29
27 const double kRtpTimestampToMs = 1.0 / 90.0; 30 const double kRtpTimestampToMs = 1.0 / 90.0;
28 31
29 class OveruseDetectorTest : public ::testing::Test { 32 class OveruseDetectorTest : public ::testing::Test {
33 public:
34 OveruseDetectorTest()
35 : now_ms_(0),
36 receive_time_ms_(0),
37 rtp_timestamp_(10 * 90),
38 overuse_detector_(),
39 overuse_estimator_(new OveruseEstimator(options_)),
40 inter_arrival_(new InterArrival(5 * 90, kRtpTimestampToMs, true)),
41 random_(1234) {}
42
30 protected: 43 protected:
31 void SetUp() { 44 void SetUp() override {
32 srand(1234);
33 now_ms_ = 0;
34 receive_time_ms_ = 0;
35 rtp_timestamp_ = 10 * 90;
36 overuse_detector_.reset(new OveruseDetector(options_)); 45 overuse_detector_.reset(new OveruseDetector(options_));
37 overuse_estimator_.reset(new OveruseEstimator(options_));
38 inter_arrival_.reset(new InterArrival(5 * 90, kRtpTimestampToMs, true));
39 }
40 // Normal Distribution.
41 #define PI 3.14159265
42 int GaussianRandom(int mean_ms, int standard_deviation_ms) {
43 // Creating a Normal distribution variable from two independent uniform
44 // variables based on the Box-Muller transform.
45 double uniform1 = (std::rand() + 1.0) / (RAND_MAX + 1.0);
46 double uniform2 = (std::rand() + 1.0) / (RAND_MAX + 1.0);
47 return static_cast<int>(mean_ms + standard_deviation_ms *
48 sqrt(-2 * log(uniform1)) * cos(2 * PI * uniform2));
49 } 46 }
50 47
51 int Run100000Samples(int packets_per_frame, size_t packet_size, int mean_ms, 48 int Run100000Samples(int packets_per_frame, size_t packet_size, int mean_ms,
52 int standard_deviation_ms) { 49 int standard_deviation_ms) {
53 int unique_overuse = 0; 50 int unique_overuse = 0;
54 int last_overuse = -1; 51 int last_overuse = -1;
55 for (int i = 0; i < 100000; ++i) { 52 for (int i = 0; i < 100000; ++i) {
56 for (int j = 0; j < packets_per_frame; ++j) { 53 for (int j = 0; j < packets_per_frame; ++j) {
57 UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size); 54 UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size);
58 } 55 }
59 rtp_timestamp_ += mean_ms * 90; 56 rtp_timestamp_ += mean_ms * 90;
60 now_ms_ += mean_ms; 57 now_ms_ += mean_ms;
61 receive_time_ms_ = std::max(receive_time_ms_, 58 receive_time_ms_ =
62 now_ms_ + GaussianRandom(0, standard_deviation_ms)); 59 std::max(receive_time_ms_,
60 now_ms_ + random_.Gaussian(0, standard_deviation_ms));
63 if (kBwOverusing == overuse_detector_->State()) { 61 if (kBwOverusing == overuse_detector_->State()) {
64 if (last_overuse + 1 != i) { 62 if (last_overuse + 1 != i) {
65 unique_overuse++; 63 unique_overuse++;
66 } 64 }
67 last_overuse = i; 65 last_overuse = i;
68 } 66 }
69 } 67 }
70 return unique_overuse; 68 return unique_overuse;
71 } 69 }
72 70
73 int RunUntilOveruse(int packets_per_frame, size_t packet_size, int mean_ms, 71 int RunUntilOveruse(int packets_per_frame, size_t packet_size, int mean_ms,
74 int standard_deviation_ms, int drift_per_frame_ms) { 72 int standard_deviation_ms, int drift_per_frame_ms) {
75 // Simulate a higher send pace, that is too high. 73 // Simulate a higher send pace, that is too high.
76 for (int i = 0; i < 1000; ++i) { 74 for (int i = 0; i < 1000; ++i) {
77 for (int j = 0; j < packets_per_frame; ++j) { 75 for (int j = 0; j < packets_per_frame; ++j) {
78 UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size); 76 UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size);
79 } 77 }
80 rtp_timestamp_ += mean_ms * 90; 78 rtp_timestamp_ += mean_ms * 90;
81 now_ms_ += mean_ms + drift_per_frame_ms; 79 now_ms_ += mean_ms + drift_per_frame_ms;
82 receive_time_ms_ = std::max(receive_time_ms_, 80 receive_time_ms_ =
83 now_ms_ + GaussianRandom(0, standard_deviation_ms)); 81 std::max(receive_time_ms_,
82 now_ms_ + random_.Gaussian(0, standard_deviation_ms));
84 if (kBwOverusing == overuse_detector_->State()) { 83 if (kBwOverusing == overuse_detector_->State()) {
85 return i + 1; 84 return i + 1;
86 } 85 }
87 } 86 }
88 return -1; 87 return -1;
89 } 88 }
90 89
91 void UpdateDetector(uint32_t rtp_timestamp, int64_t receive_time_ms, 90 void UpdateDetector(uint32_t rtp_timestamp, int64_t receive_time_ms,
92 size_t packet_size) { 91 size_t packet_size) {
93 uint32_t timestamp_delta; 92 uint32_t timestamp_delta;
94 int64_t time_delta; 93 int64_t time_delta;
95 int size_delta; 94 int size_delta;
96 if (inter_arrival_->ComputeDeltas(rtp_timestamp, 95 if (inter_arrival_->ComputeDeltas(rtp_timestamp,
97 receive_time_ms, 96 receive_time_ms,
98 packet_size, 97 packet_size,
99 &timestamp_delta, 98 &timestamp_delta,
100 &time_delta, 99 &time_delta,
101 &size_delta)) { 100 &size_delta)) {
102 double timestamp_delta_ms = timestamp_delta / 90.0; 101 double timestamp_delta_ms = timestamp_delta / 90.0;
103 overuse_estimator_->Update(time_delta, timestamp_delta_ms, size_delta, 102 overuse_estimator_->Update(time_delta, timestamp_delta_ms, size_delta,
104 overuse_detector_->State()); 103 overuse_detector_->State());
105 overuse_detector_->Detect(overuse_estimator_->offset(), 104 overuse_detector_->Detect(
106 timestamp_delta_ms, 105 overuse_estimator_->offset(), timestamp_delta_ms,
107 overuse_estimator_->num_of_deltas(), 0); 106 overuse_estimator_->num_of_deltas(), receive_time_ms);
108 } 107 }
109 } 108 }
110 109
111 int64_t now_ms_; 110 int64_t now_ms_;
112 int64_t receive_time_ms_; 111 int64_t receive_time_ms_;
113 uint32_t rtp_timestamp_; 112 uint32_t rtp_timestamp_;
114 OverUseDetectorOptions options_; 113 OverUseDetectorOptions options_;
115 rtc::scoped_ptr<OveruseDetector> overuse_detector_; 114 rtc::scoped_ptr<OveruseDetector> overuse_detector_;
116 rtc::scoped_ptr<OveruseEstimator> overuse_estimator_; 115 rtc::scoped_ptr<OveruseEstimator> overuse_estimator_;
117 rtc::scoped_ptr<InterArrival> inter_arrival_; 116 rtc::scoped_ptr<InterArrival> inter_arrival_;
117 Random random_;
118 }; 118 };
119 119
120 TEST_F(OveruseDetectorTest, GaussianRandom) { 120 TEST_F(OveruseDetectorTest, GaussianRandom) {
121 int buckets[100]; 121 int buckets[100];
122 memset(buckets, 0, sizeof(buckets)); 122 memset(buckets, 0, sizeof(buckets));
123 for (int i = 0; i < 100000; ++i) { 123 for (int i = 0; i < 100000; ++i) {
124 int index = GaussianRandom(49, 10); 124 int index = random_.Gaussian(49, 10);
125 if (index >= 0 && index < 100) 125 if (index >= 0 && index < 100)
126 buckets[index]++; 126 buckets[index]++;
127 } 127 }
128 for (int n = 0; n < 100; ++n) { 128 for (int n = 0; n < 100; ++n) {
129 printf("Bucket n:%d, %d\n", n, buckets[n]); 129 printf("Bucket n:%d, %d\n", n, buckets[n]);
130 } 130 }
131 } 131 }
132 132
133 TEST_F(OveruseDetectorTest, SimpleNonOveruse30fps) { 133 TEST_F(OveruseDetectorTest, SimpleNonOveruse30fps) {
134 size_t packet_size = 1200; 134 size_t packet_size = 1200;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 int packets_per_frame = 6; 185 int packets_per_frame = 6;
186 int frame_duration_ms = 33; 186 int frame_duration_ms = 33;
187 int drift_per_frame_ms = 1; 187 int drift_per_frame_ms = 1;
188 int sigma_ms = 0; // No variance. 188 int sigma_ms = 0; // No variance.
189 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 189 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
190 frame_duration_ms, sigma_ms); 190 frame_duration_ms, sigma_ms);
191 191
192 EXPECT_EQ(0, unique_overuse); 192 EXPECT_EQ(0, unique_overuse);
193 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 193 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
194 frame_duration_ms, sigma_ms, drift_per_frame_ms); 194 frame_duration_ms, sigma_ms, drift_per_frame_ms);
195 EXPECT_EQ(6, frames_until_overuse); 195 EXPECT_EQ(13, frames_until_overuse);
196 } 196 }
197 197
198 TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) { 198 TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) {
199 size_t packet_size = 1200; 199 size_t packet_size = 1200;
200 int packets_per_frame = 1; 200 int packets_per_frame = 1;
201 int frame_duration_ms = 100; 201 int frame_duration_ms = 100;
202 int drift_per_frame_ms = 1; 202 int drift_per_frame_ms = 1;
203 int sigma_ms = 0; // No variance. 203 int sigma_ms = 0; // No variance.
204 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 204 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
205 frame_duration_ms, sigma_ms); 205 frame_duration_ms, sigma_ms);
206 206
207 EXPECT_EQ(0, unique_overuse); 207 EXPECT_EQ(0, unique_overuse);
208 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 208 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
209 frame_duration_ms, sigma_ms, drift_per_frame_ms); 209 frame_duration_ms, sigma_ms, drift_per_frame_ms);
210 EXPECT_EQ(4, frames_until_overuse); 210 EXPECT_EQ(11, frames_until_overuse);
211 } 211 }
212 212
213 TEST_F(OveruseDetectorTest, DISABLED_OveruseWithHighVariance100Kbit10fps) { 213 TEST_F(OveruseDetectorTest, DISABLED_OveruseWithHighVariance100Kbit10fps) {
214 uint32_t frame_duration_ms = 100; 214 uint32_t frame_duration_ms = 100;
215 uint32_t drift_per_frame_ms = 10; 215 uint32_t drift_per_frame_ms = 10;
216 uint32_t rtp_timestamp = frame_duration_ms * 90; 216 uint32_t rtp_timestamp = frame_duration_ms * 90;
217 size_t packet_size = 1200; 217 size_t packet_size = 1200;
218 int offset = 10; 218 int offset = 10;
219 219
220 // Run 1000 samples to reach steady state. 220 // Run 1000 samples to reach steady state.
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 if (i % 2) { 292 if (i % 2) {
293 offset = rand() % 2; 293 offset = rand() % 2;
294 now_ms_ += frame_duration_ms - offset; 294 now_ms_ += frame_duration_ms - offset;
295 } else { 295 } else {
296 now_ms_ += frame_duration_ms + offset; 296 now_ms_ += frame_duration_ms + offset;
297 } 297 }
298 EXPECT_EQ(kBwNormal, overuse_detector_->State()); 298 EXPECT_EQ(kBwNormal, overuse_detector_->State());
299 } 299 }
300 // Simulate a higher send pace, that is too high. 300 // Simulate a higher send pace, that is too high.
301 // Total build up of 30 ms. 301 // Total build up of 30 ms.
302 for (int j = 0; j < 5; ++j) { 302 for (int j = 0; j < 6; ++j) {
303 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 303 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
304 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 304 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
305 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 305 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
306 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 306 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
307 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 307 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
308 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 308 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
309 now_ms_ += frame_duration_ms + drift_per_frame_ms * 6; 309 now_ms_ += frame_duration_ms + drift_per_frame_ms * 6;
310 rtp_timestamp += frame_duration_ms * 90; 310 rtp_timestamp += frame_duration_ms * 90;
311 EXPECT_EQ(kBwNormal, overuse_detector_->State()); 311 EXPECT_EQ(kBwNormal, overuse_detector_->State());
312 } 312 }
313 UpdateDetector(rtp_timestamp, now_ms_, packet_size); 313 UpdateDetector(rtp_timestamp, now_ms_, packet_size);
314 EXPECT_EQ(kBwOverusing, overuse_detector_->State()); 314 EXPECT_EQ(kBwOverusing, overuse_detector_->State());
315 } 315 }
316 316
317 TEST_F(OveruseDetectorTest, 317 TEST_F(OveruseDetectorTest,
318 DISABLED_ON_ANDROID(LowGaussianVariance30Kbit3fps)) { 318 DISABLED_ON_ANDROID(LowGaussianVariance30Kbit3fps)) {
319 size_t packet_size = 1200; 319 size_t packet_size = 1200;
320 int packets_per_frame = 1; 320 int packets_per_frame = 1;
321 int frame_duration_ms = 333; 321 int frame_duration_ms = 333;
322 int drift_per_frame_ms = 1; 322 int drift_per_frame_ms = 1;
323 int sigma_ms = 3; 323 int sigma_ms = 3;
324 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 324 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
325 frame_duration_ms, sigma_ms); 325 frame_duration_ms, sigma_ms);
326 EXPECT_EQ(0, unique_overuse); 326 EXPECT_EQ(0, unique_overuse);
327 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 327 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
328 frame_duration_ms, sigma_ms, drift_per_frame_ms); 328 frame_duration_ms, sigma_ms, drift_per_frame_ms);
329 EXPECT_NEAR(29, frames_until_overuse, 5); 329 EXPECT_EQ(36, frames_until_overuse);
330 } 330 }
331 331
332 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) { 332 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) {
333 size_t packet_size = 1200; 333 size_t packet_size = 1200;
334 int packets_per_frame = 1; 334 int packets_per_frame = 1;
335 int frame_duration_ms = 333; 335 int frame_duration_ms = 333;
336 int drift_per_frame_ms = 100; 336 int drift_per_frame_ms = 100;
337 int sigma_ms = 3; 337 int sigma_ms = 3;
338 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 338 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
339 frame_duration_ms, sigma_ms); 339 frame_duration_ms, sigma_ms);
340 EXPECT_EQ(0, unique_overuse); 340 EXPECT_EQ(0, unique_overuse);
341 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 341 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
342 frame_duration_ms, sigma_ms, drift_per_frame_ms); 342 frame_duration_ms, sigma_ms, drift_per_frame_ms);
343 EXPECT_NEAR(4, frames_until_overuse, 1); 343 EXPECT_EQ(4, frames_until_overuse);
344 } 344 }
345 345
346 TEST_F(OveruseDetectorTest, HighGaussianVariance30Kbit3fps) { 346 TEST_F(OveruseDetectorTest, HighGaussianVariance30Kbit3fps) {
347 size_t packet_size = 1200; 347 size_t packet_size = 1200;
348 int packets_per_frame = 1; 348 int packets_per_frame = 1;
349 int frame_duration_ms = 333; 349 int frame_duration_ms = 333;
350 int drift_per_frame_ms = 1; 350 int drift_per_frame_ms = 1;
351 int sigma_ms = 10; 351 int sigma_ms = 10;
352 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 352 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
353 frame_duration_ms, sigma_ms); 353 frame_duration_ms, sigma_ms);
354 EXPECT_EQ(0, unique_overuse); 354 EXPECT_EQ(0, unique_overuse);
355 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 355 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
356 frame_duration_ms, sigma_ms, drift_per_frame_ms); 356 frame_duration_ms, sigma_ms, drift_per_frame_ms);
357 EXPECT_NEAR(79, frames_until_overuse, 30); 357 EXPECT_EQ(119, frames_until_overuse);
358 } 358 }
359 359
360 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) { 360 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) {
361 size_t packet_size = 1200; 361 size_t packet_size = 1200;
362 int packets_per_frame = 1; 362 int packets_per_frame = 1;
363 int frame_duration_ms = 333; 363 int frame_duration_ms = 333;
364 int drift_per_frame_ms = 100; 364 int drift_per_frame_ms = 100;
365 int sigma_ms = 10; 365 int sigma_ms = 10;
366 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 366 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
367 frame_duration_ms, sigma_ms); 367 frame_duration_ms, sigma_ms);
368 EXPECT_EQ(0, unique_overuse); 368 EXPECT_EQ(0, unique_overuse);
369 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 369 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
370 frame_duration_ms, sigma_ms, drift_per_frame_ms); 370 frame_duration_ms, sigma_ms, drift_per_frame_ms);
371 EXPECT_NEAR(4, frames_until_overuse, 1); 371 EXPECT_EQ(5, frames_until_overuse);
372 } 372 }
373 373
374 TEST_F(OveruseDetectorTest, 374 TEST_F(OveruseDetectorTest,
375 DISABLED_ON_ANDROID(LowGaussianVariance100Kbit5fps)) { 375 DISABLED_ON_ANDROID(LowGaussianVariance100Kbit5fps)) {
376 size_t packet_size = 1200; 376 size_t packet_size = 1200;
377 int packets_per_frame = 2; 377 int packets_per_frame = 2;
378 int frame_duration_ms = 200; 378 int frame_duration_ms = 200;
379 int drift_per_frame_ms = 1; 379 int drift_per_frame_ms = 1;
380 int sigma_ms = 3; 380 int sigma_ms = 3;
381 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 381 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
382 frame_duration_ms, sigma_ms); 382 frame_duration_ms, sigma_ms);
383 EXPECT_EQ(0, unique_overuse); 383 EXPECT_EQ(0, unique_overuse);
384 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 384 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
385 frame_duration_ms, sigma_ms, drift_per_frame_ms); 385 frame_duration_ms, sigma_ms, drift_per_frame_ms);
386 EXPECT_NEAR(29, frames_until_overuse, 5); 386 EXPECT_EQ(35, frames_until_overuse);
387 } 387 }
388 388
389 TEST_F(OveruseDetectorTest, 389 TEST_F(OveruseDetectorTest,
390 DISABLED_ON_ANDROID(HighGaussianVariance100Kbit5fps)) { 390 DISABLED_ON_ANDROID(HighGaussianVariance100Kbit5fps)) {
391 size_t packet_size = 1200; 391 size_t packet_size = 1200;
392 int packets_per_frame = 2; 392 int packets_per_frame = 2;
393 int frame_duration_ms = 200; 393 int frame_duration_ms = 200;
394 int drift_per_frame_ms = 1; 394 int drift_per_frame_ms = 1;
395 int sigma_ms = 10; 395 int sigma_ms = 10;
396 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 396 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
397 frame_duration_ms, sigma_ms); 397 frame_duration_ms, sigma_ms);
398 EXPECT_EQ(0, unique_overuse); 398 EXPECT_EQ(0, unique_overuse);
399 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 399 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
400 frame_duration_ms, sigma_ms, drift_per_frame_ms); 400 frame_duration_ms, sigma_ms, drift_per_frame_ms);
401 EXPECT_NEAR(79, frames_until_overuse, 15); 401 EXPECT_EQ(115, frames_until_overuse);
402 } 402 }
403 403
404 TEST_F(OveruseDetectorTest, 404 TEST_F(OveruseDetectorTest,
405 DISABLED_ON_ANDROID(LowGaussianVariance100Kbit10fps)) { 405 DISABLED_ON_ANDROID(LowGaussianVariance100Kbit10fps)) {
406 size_t packet_size = 1200; 406 size_t packet_size = 1200;
407 int packets_per_frame = 1; 407 int packets_per_frame = 1;
408 int frame_duration_ms = 100; 408 int frame_duration_ms = 100;
409 int drift_per_frame_ms = 1; 409 int drift_per_frame_ms = 1;
410 int sigma_ms = 3; 410 int sigma_ms = 3;
411 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 411 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
412 frame_duration_ms, sigma_ms); 412 frame_duration_ms, sigma_ms);
413 EXPECT_EQ(0, unique_overuse); 413 EXPECT_EQ(0, unique_overuse);
414 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 414 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
415 frame_duration_ms, sigma_ms, drift_per_frame_ms); 415 frame_duration_ms, sigma_ms, drift_per_frame_ms);
416 EXPECT_NEAR(29, frames_until_overuse, 5); 416 EXPECT_EQ(30, frames_until_overuse);
417 } 417 }
418 418
419 TEST_F(OveruseDetectorTest, 419 TEST_F(OveruseDetectorTest,
420 DISABLED_ON_ANDROID(HighGaussianVariance100Kbit10fps)) { 420 DISABLED_ON_ANDROID(HighGaussianVariance100Kbit10fps)) {
421 size_t packet_size = 1200; 421 size_t packet_size = 1200;
422 int packets_per_frame = 1; 422 int packets_per_frame = 1;
423 int frame_duration_ms = 100; 423 int frame_duration_ms = 100;
424 int drift_per_frame_ms = 1; 424 int drift_per_frame_ms = 1;
425 int sigma_ms = 10; 425 int sigma_ms = 10;
426 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 426 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
427 frame_duration_ms, sigma_ms); 427 frame_duration_ms, sigma_ms);
428 EXPECT_EQ(0, unique_overuse); 428 EXPECT_EQ(0, unique_overuse);
429 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 429 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
430 frame_duration_ms, sigma_ms, drift_per_frame_ms); 430 frame_duration_ms, sigma_ms, drift_per_frame_ms);
431 EXPECT_NEAR(79, frames_until_overuse, 15); 431 EXPECT_EQ(98, frames_until_overuse);
432 } 432 }
433 433
434 TEST_F(OveruseDetectorTest, 434 TEST_F(OveruseDetectorTest,
435 DISABLED_ON_ANDROID(LowGaussianVariance300Kbit30fps)) { 435 DISABLED_ON_ANDROID(LowGaussianVariance300Kbit30fps)) {
436 size_t packet_size = 1200; 436 size_t packet_size = 1200;
437 int packets_per_frame = 1; 437 int packets_per_frame = 1;
438 int frame_duration_ms = 33; 438 int frame_duration_ms = 33;
439 int drift_per_frame_ms = 1; 439 int drift_per_frame_ms = 1;
440 int sigma_ms = 3; 440 int sigma_ms = 3;
441 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 441 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
442 frame_duration_ms, sigma_ms); 442 frame_duration_ms, sigma_ms);
443 EXPECT_EQ(0, unique_overuse); 443 EXPECT_EQ(0, unique_overuse);
444 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 444 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
445 frame_duration_ms, sigma_ms, drift_per_frame_ms); 445 frame_duration_ms, sigma_ms, drift_per_frame_ms);
446 EXPECT_NEAR(30, frames_until_overuse, 5); 446 EXPECT_EQ(36, frames_until_overuse);
447 } 447 }
448 448
449 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) { 449 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) {
450 size_t packet_size = 1200; 450 size_t packet_size = 1200;
451 int packets_per_frame = 1; 451 int packets_per_frame = 1;
452 int frame_duration_ms = 33; 452 int frame_duration_ms = 33;
453 int drift_per_frame_ms = 10; 453 int drift_per_frame_ms = 10;
454 int sigma_ms = 3; 454 int sigma_ms = 3;
455 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 455 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
456 frame_duration_ms, sigma_ms); 456 frame_duration_ms, sigma_ms);
457 EXPECT_EQ(0, unique_overuse); 457 EXPECT_EQ(0, unique_overuse);
458 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 458 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
459 frame_duration_ms, sigma_ms, drift_per_frame_ms); 459 frame_duration_ms, sigma_ms, drift_per_frame_ms);
460 EXPECT_NEAR(7, frames_until_overuse, 1); 460 EXPECT_EQ(8, frames_until_overuse);
461 } 461 }
462 462
463 TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) { 463 TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) {
464 size_t packet_size = 1200; 464 size_t packet_size = 1200;
465 int packets_per_frame = 1; 465 int packets_per_frame = 1;
466 int frame_duration_ms = 33; 466 int frame_duration_ms = 33;
467 int drift_per_frame_ms = 1; 467 int drift_per_frame_ms = 1;
468 int sigma_ms = 10; 468 int sigma_ms = 10;
469 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 469 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
470 frame_duration_ms, sigma_ms); 470 frame_duration_ms, sigma_ms);
471 EXPECT_EQ(0, unique_overuse); 471 EXPECT_EQ(0, unique_overuse);
472 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 472 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
473 frame_duration_ms, sigma_ms, drift_per_frame_ms); 473 frame_duration_ms, sigma_ms, drift_per_frame_ms);
474 EXPECT_NEAR(98, frames_until_overuse, 22); 474 EXPECT_EQ(108, frames_until_overuse);
475 } 475 }
476 476
477 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) { 477 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) {
478 size_t packet_size = 1200; 478 size_t packet_size = 1200;
479 int packets_per_frame = 1; 479 int packets_per_frame = 1;
480 int frame_duration_ms = 33; 480 int frame_duration_ms = 33;
481 int drift_per_frame_ms = 10; 481 int drift_per_frame_ms = 10;
482 int sigma_ms = 10; 482 int sigma_ms = 10;
483 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 483 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
484 frame_duration_ms, sigma_ms); 484 frame_duration_ms, sigma_ms);
485 EXPECT_EQ(0, unique_overuse); 485 EXPECT_EQ(0, unique_overuse);
486 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 486 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
487 frame_duration_ms, sigma_ms, drift_per_frame_ms); 487 frame_duration_ms, sigma_ms, drift_per_frame_ms);
488 EXPECT_NEAR(12, frames_until_overuse, 2); 488 EXPECT_EQ(14, frames_until_overuse);
489 } 489 }
490 490
491 TEST_F(OveruseDetectorTest, 491 TEST_F(OveruseDetectorTest,
492 DISABLED_ON_ANDROID(LowGaussianVariance1000Kbit30fps)) { 492 DISABLED_ON_ANDROID(LowGaussianVariance1000Kbit30fps)) {
493 size_t packet_size = 1200; 493 size_t packet_size = 1200;
494 int packets_per_frame = 3; 494 int packets_per_frame = 3;
495 int frame_duration_ms = 33; 495 int frame_duration_ms = 33;
496 int drift_per_frame_ms = 1; 496 int drift_per_frame_ms = 1;
497 int sigma_ms = 3; 497 int sigma_ms = 3;
498 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 498 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
499 frame_duration_ms, sigma_ms); 499 frame_duration_ms, sigma_ms);
500 EXPECT_EQ(0, unique_overuse); 500 EXPECT_EQ(0, unique_overuse);
501 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 501 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
502 frame_duration_ms, sigma_ms, drift_per_frame_ms); 502 frame_duration_ms, sigma_ms, drift_per_frame_ms);
503 EXPECT_NEAR(30, frames_until_overuse, 5); 503 EXPECT_EQ(36, frames_until_overuse);
504 } 504 }
505 505
506 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) { 506 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) {
507 size_t packet_size = 1200; 507 size_t packet_size = 1200;
508 int packets_per_frame = 3; 508 int packets_per_frame = 3;
509 int frame_duration_ms = 33; 509 int frame_duration_ms = 33;
510 int drift_per_frame_ms = 10; 510 int drift_per_frame_ms = 10;
511 int sigma_ms = 3; 511 int sigma_ms = 3;
512 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 512 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
513 frame_duration_ms, sigma_ms); 513 frame_duration_ms, sigma_ms);
514 EXPECT_EQ(0, unique_overuse); 514 EXPECT_EQ(0, unique_overuse);
515 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 515 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
516 frame_duration_ms, sigma_ms, drift_per_frame_ms); 516 frame_duration_ms, sigma_ms, drift_per_frame_ms);
517 EXPECT_NEAR(7, frames_until_overuse, 1); 517 EXPECT_EQ(8, frames_until_overuse);
518 } 518 }
519 519
520 TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) { 520 TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) {
521 size_t packet_size = 1200; 521 size_t packet_size = 1200;
522 int packets_per_frame = 3; 522 int packets_per_frame = 3;
523 int frame_duration_ms = 33; 523 int frame_duration_ms = 33;
524 int drift_per_frame_ms = 1; 524 int drift_per_frame_ms = 1;
525 int sigma_ms = 10; 525 int sigma_ms = 10;
526 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 526 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
527 frame_duration_ms, sigma_ms); 527 frame_duration_ms, sigma_ms);
528 EXPECT_EQ(0, unique_overuse); 528 EXPECT_EQ(0, unique_overuse);
529 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 529 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
530 frame_duration_ms, sigma_ms, drift_per_frame_ms); 530 frame_duration_ms, sigma_ms, drift_per_frame_ms);
531 EXPECT_NEAR(98, frames_until_overuse, 22); 531 EXPECT_EQ(108, frames_until_overuse);
532 } 532 }
533 533
534 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) { 534 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) {
535 size_t packet_size = 1200; 535 size_t packet_size = 1200;
536 int packets_per_frame = 3; 536 int packets_per_frame = 3;
537 int frame_duration_ms = 33; 537 int frame_duration_ms = 33;
538 int drift_per_frame_ms = 10; 538 int drift_per_frame_ms = 10;
539 int sigma_ms = 10; 539 int sigma_ms = 10;
540 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 540 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
541 frame_duration_ms, sigma_ms); 541 frame_duration_ms, sigma_ms);
542 EXPECT_EQ(0, unique_overuse); 542 EXPECT_EQ(0, unique_overuse);
543 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 543 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
544 frame_duration_ms, sigma_ms, drift_per_frame_ms); 544 frame_duration_ms, sigma_ms, drift_per_frame_ms);
545 EXPECT_NEAR(12, frames_until_overuse, 2); 545 EXPECT_EQ(14, frames_until_overuse);
546 } 546 }
547 547
548 TEST_F(OveruseDetectorTest, 548 TEST_F(OveruseDetectorTest,
549 DISABLED_ON_ANDROID(LowGaussianVariance2000Kbit30fps)) { 549 DISABLED_ON_ANDROID(LowGaussianVariance2000Kbit30fps)) {
550 size_t packet_size = 1200; 550 size_t packet_size = 1200;
551 int packets_per_frame = 6; 551 int packets_per_frame = 6;
552 int frame_duration_ms = 33; 552 int frame_duration_ms = 33;
553 int drift_per_frame_ms = 1; 553 int drift_per_frame_ms = 1;
554 int sigma_ms = 3; 554 int sigma_ms = 3;
555 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 555 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
556 frame_duration_ms, sigma_ms); 556 frame_duration_ms, sigma_ms);
557 EXPECT_EQ(0, unique_overuse); 557 EXPECT_EQ(0, unique_overuse);
558 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 558 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
559 frame_duration_ms, sigma_ms, drift_per_frame_ms); 559 frame_duration_ms, sigma_ms, drift_per_frame_ms);
560 EXPECT_NEAR(30, frames_until_overuse, 5); 560 EXPECT_EQ(36, frames_until_overuse);
561 } 561 }
562 562
563 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) { 563 TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) {
564 size_t packet_size = 1200; 564 size_t packet_size = 1200;
565 int packets_per_frame = 6; 565 int packets_per_frame = 6;
566 int frame_duration_ms = 33; 566 int frame_duration_ms = 33;
567 int drift_per_frame_ms = 10; 567 int drift_per_frame_ms = 10;
568 int sigma_ms = 3; 568 int sigma_ms = 3;
569 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 569 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
570 frame_duration_ms, sigma_ms); 570 frame_duration_ms, sigma_ms);
571 EXPECT_EQ(0, unique_overuse); 571 EXPECT_EQ(0, unique_overuse);
572 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 572 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
573 frame_duration_ms, sigma_ms, drift_per_frame_ms); 573 frame_duration_ms, sigma_ms, drift_per_frame_ms);
574 EXPECT_NEAR(7, frames_until_overuse, 1); 574 EXPECT_EQ(8, frames_until_overuse);
575 } 575 }
576 576
577 TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) { 577 TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) {
578 size_t packet_size = 1200; 578 size_t packet_size = 1200;
579 int packets_per_frame = 6; 579 int packets_per_frame = 6;
580 int frame_duration_ms = 33; 580 int frame_duration_ms = 33;
581 int drift_per_frame_ms = 1; 581 int drift_per_frame_ms = 1;
582 int sigma_ms = 10; 582 int sigma_ms = 10;
583 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 583 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
584 frame_duration_ms, sigma_ms); 584 frame_duration_ms, sigma_ms);
585 EXPECT_EQ(0, unique_overuse); 585 EXPECT_EQ(0, unique_overuse);
586 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 586 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
587 frame_duration_ms, sigma_ms, drift_per_frame_ms); 587 frame_duration_ms, sigma_ms, drift_per_frame_ms);
588 EXPECT_NEAR(98, frames_until_overuse, 22); 588 EXPECT_EQ(108, frames_until_overuse);
589 } 589 }
590 590
591 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) { 591 TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) {
592 size_t packet_size = 1200; 592 size_t packet_size = 1200;
593 int packets_per_frame = 6; 593 int packets_per_frame = 6;
594 int frame_duration_ms = 33; 594 int frame_duration_ms = 33;
595 int drift_per_frame_ms = 10; 595 int drift_per_frame_ms = 10;
596 int sigma_ms = 10; 596 int sigma_ms = 10;
597 int unique_overuse = Run100000Samples(packets_per_frame, packet_size, 597 int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
598 frame_duration_ms, sigma_ms); 598 frame_duration_ms, sigma_ms);
599 EXPECT_EQ(0, unique_overuse); 599 EXPECT_EQ(0, unique_overuse);
600 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size, 600 int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
601 frame_duration_ms, sigma_ms, drift_per_frame_ms); 601 frame_duration_ms, sigma_ms, drift_per_frame_ms);
602 EXPECT_NEAR(12, frames_until_overuse, 2); 602 EXPECT_EQ(14, frames_until_overuse);
603 }
604
605 class OveruseDetectorExperimentTest : public OveruseDetectorTest {
606 protected:
607 void SetUp() override {
608 test::InitFieldTrialsFromString(
609 "WebRTC-AdaptiveBweThreshold/Enabled-0.01,0.00018/");
610 overuse_detector_.reset(new OveruseDetector(options_));
611 }
612
613 void TearDown() override { test::InitFieldTrialsFromString(""); }
614 };
615
616 TEST_F(OveruseDetectorExperimentTest, ThresholdAdapts) {
617 const double kOffset = 0.21;
618 double kTsDelta = 3000.0;
619 int64_t now_ms = 0;
620 int num_deltas = 60;
621 const int kBatchLength = 10;
622
623 // Pass in a positive offset and verify it triggers overuse.
624 bool overuse_detected = false;
625 for (int i = 0; i < kBatchLength; ++i) {
626 BandwidthUsage overuse_state =
627 overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
628 if (overuse_state == kBwOverusing) {
629 overuse_detected = true;
630 }
631 ++num_deltas;
632 now_ms += 5;
633 }
634 EXPECT_TRUE(overuse_detected);
635
636 // Force the threshold to increase by passing in a higher offset.
637 overuse_detected = false;
638 for (int i = 0; i < kBatchLength; ++i) {
639 BandwidthUsage overuse_state =
640 overuse_detector_->Detect(1.1 * kOffset, kTsDelta, num_deltas, now_ms);
641 if (overuse_state == kBwOverusing) {
642 overuse_detected = true;
643 }
644 ++num_deltas;
645 now_ms += 5;
646 }
647 EXPECT_TRUE(overuse_detected);
648
649 // Verify that the same offset as before no longer triggers overuse.
650 overuse_detected = false;
651 for (int i = 0; i < kBatchLength; ++i) {
652 BandwidthUsage overuse_state =
653 overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
654 if (overuse_state == kBwOverusing) {
655 overuse_detected = true;
656 }
657 ++num_deltas;
658 now_ms += 5;
659 }
660 EXPECT_FALSE(overuse_detected);
661
662 // Pass in a low offset to make the threshold adapt down.
663 for (int i = 0; i < 15 * kBatchLength; ++i) {
664 BandwidthUsage overuse_state =
665 overuse_detector_->Detect(0.7 * kOffset, kTsDelta, num_deltas, now_ms);
666 if (overuse_state == kBwOverusing) {
667 overuse_detected = true;
668 }
669 ++num_deltas;
670 now_ms += 5;
671 }
672 EXPECT_FALSE(overuse_detected);
673
674 // Make sure the original offset now again triggers overuse.
675 for (int i = 0; i < kBatchLength; ++i) {
676 BandwidthUsage overuse_state =
677 overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
678 if (overuse_state == kBwOverusing) {
679 overuse_detected = true;
680 }
681 ++num_deltas;
682 now_ms += 5;
683 }
684 EXPECT_TRUE(overuse_detected);
685 }
686
687 TEST_F(OveruseDetectorExperimentTest, DoesntAdaptToSpikes) {
688 const double kOffset = 1.0;
689 const double kLargeOffset = 20.0;
690 double kTsDelta = 3000.0;
691 int64_t now_ms = 0;
692 int num_deltas = 60;
693 const int kBatchLength = 10;
694 const int kShortBatchLength = 3;
695
696 // Pass in a positive offset and verify it triggers overuse.
697 bool overuse_detected = false;
698 for (int i = 0; i < kBatchLength; ++i) {
699 BandwidthUsage overuse_state =
700 overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
701 if (overuse_state == kBwOverusing) {
702 overuse_detected = true;
703 }
704 ++num_deltas;
705 now_ms += 5;
706 }
707
708 // Pass in a large offset. This shouldn't have a too big impact on the
709 // threshold, but still trigger an overuse.
710 now_ms += 100;
711 overuse_detected = false;
712 for (int i = 0; i < kShortBatchLength; ++i) {
713 BandwidthUsage overuse_state =
714 overuse_detector_->Detect(kLargeOffset, kTsDelta, num_deltas, now_ms);
715 if (overuse_state == kBwOverusing) {
716 overuse_detected = true;
717 }
718 ++num_deltas;
719 now_ms += 5;
720 }
721 EXPECT_TRUE(overuse_detected);
722
723 // Pass in a positive normal offset and verify it still triggers.
724 overuse_detected = false;
725 for (int i = 0; i < kBatchLength; ++i) {
726 BandwidthUsage overuse_state =
727 overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
728 if (overuse_state == kBwOverusing) {
729 overuse_detected = true;
730 }
731 ++num_deltas;
732 now_ms += 5;
733 }
734 EXPECT_TRUE(overuse_detected);
603 } 735 }
604 } // namespace testing 736 } // namespace testing
605 } // namespace webrtc 737 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698