blob: 9cb5f6cf99d8cb3dbb807d7a46fe8f11c343db24 [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080012#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <vector>
14
15#include "testing/gtest/include/gtest/gtest.h"
mflodman0e7e2592015-11-12 21:02:42 -080016#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000017#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
18
19namespace webrtc {
20
mflodman86aabb22016-03-11 15:44:32 +010021class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000022 public:
23 TestBitrateObserver()
mflodman101f2502016-06-09 17:21:19 +020024 : last_bitrate_bps_(0), last_fraction_loss_(0), last_rtt_ms_(0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000025
mflodman101f2502016-06-09 17:21:19 +020026 void OnBitrateUpdated(uint32_t bitrate_bps,
27 uint8_t fraction_loss,
28 int64_t rtt) override {
29 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000030 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020031 last_rtt_ms_ = rtt;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000032 }
mflodman101f2502016-06-09 17:21:19 +020033 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000034 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020035 int64_t last_rtt_ms_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000036};
37
38class BitrateAllocatorTest : public ::testing::Test {
39 protected:
Stefan Holmere5904162015-03-26 11:11:06 +010040 BitrateAllocatorTest() : allocator_(new BitrateAllocator()) {
41 allocator_->OnNetworkChanged(300000u, 0, 0);
42 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 ~BitrateAllocatorTest() {}
44
kwibergb25345e2016-03-12 06:10:44 -080045 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000046};
47
48TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
49 TestBitrateObserver bitrate_observer;
Peter Boström8e4e8b02015-09-15 15:08:03 +020050 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -070051 allocator_->AddObserver(&bitrate_observer, 100000, 1500000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010052 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 allocator_->OnNetworkChanged(200000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020054 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000055
Peter Boström8e4e8b02015-09-15 15:08:03 +020056 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080057 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020058 allocator_->OnNetworkChanged(4000000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020059 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
mflodman2ebe5b12016-05-13 01:43:51 -070060 start_bitrate =
61 allocator_->AddObserver(&bitrate_observer, 100000, 4000000, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020062 EXPECT_EQ(4000000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000063
mflodman2ebe5b12016-05-13 01:43:51 -070064 start_bitrate =
65 allocator_->AddObserver(&bitrate_observer, 100000, 1500000, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020066 EXPECT_EQ(3000000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +020067 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068 allocator_->OnNetworkChanged(1500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020069 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000070}
71
72TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
73 TestBitrateObserver bitrate_observer_1;
74 TestBitrateObserver bitrate_observer_2;
Peter Boström8e4e8b02015-09-15 15:08:03 +020075 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -070076 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010077 EXPECT_EQ(300000, start_bitrate);
mflodman2ebe5b12016-05-13 01:43:51 -070078 start_bitrate =
79 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, true);
Stefan Holmere5904162015-03-26 11:11:06 +010080 EXPECT_EQ(200000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000081
82 // Test too low start bitrate, hence lower than sum of min. Min bitrates will
83 // be allocated to all observers.
84 allocator_->OnNetworkChanged(200000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +020085 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000086 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
mflodman101f2502016-06-09 17:21:19 +020087 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
88 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000089 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
mflodman101f2502016-06-09 17:21:19 +020090 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000091
92 // Test a bitrate which should be distributed equally.
93 allocator_->OnNetworkChanged(500000, 0, 50);
94 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
mflodman101f2502016-06-09 17:21:19 +020095 EXPECT_EQ(100000u + kBitrateToShare / 2,
96 bitrate_observer_1.last_bitrate_bps_);
97 EXPECT_EQ(200000u + kBitrateToShare / 2,
98 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000099
Stefan Holmere5904162015-03-26 11:11:06 +0100100 // Limited by 2x max bitrates since we leave room for FEC and retransmissions.
101 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200102 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
103 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700104
105 // Verify that if the bandwidth estimate is set to zero, the allocated rate is
106 // zero.
107 allocator_->OnNetworkChanged(0, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200108 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
109 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000110}
111
112class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
113 protected:
114 BitrateAllocatorTestNoEnforceMin() : allocator_(new BitrateAllocator()) {
Stefan Holmere5904162015-03-26 11:11:06 +0100115 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000116 }
117 ~BitrateAllocatorTestNoEnforceMin() {}
118
kwibergb25345e2016-03-12 06:10:44 -0800119 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000120};
121
mflodman101f2502016-06-09 17:21:19 +0200122// The following three tests verify enforcing a minimum bitrate works as
123// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000124TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
125 TestBitrateObserver bitrate_observer_1;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200126 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700127 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100128 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000129
mflodman101f2502016-06-09 17:21:19 +0200130 // High BWE.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000131 allocator_->OnNetworkChanged(150000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200132 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000133
mflodman101f2502016-06-09 17:21:19 +0200134 // Low BWE.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000135 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200136 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000137
mflodman86aabb22016-03-11 15:44:32 +0100138 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000139}
140
141TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
142 TestBitrateObserver bitrate_observer_1;
143 TestBitrateObserver bitrate_observer_2;
144 TestBitrateObserver bitrate_observer_3;
145 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Peter Boström8e4e8b02015-09-15 15:08:03 +0200146 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700147 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100148 EXPECT_EQ(300000, start_bitrate);
149
mflodman2ebe5b12016-05-13 01:43:51 -0700150 start_bitrate =
151 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100152 EXPECT_EQ(200000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200153 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100154
mflodman2ebe5b12016-05-13 01:43:51 -0700155 start_bitrate =
156 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100157 EXPECT_EQ(0, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200158 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
159 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000160
mflodman101f2502016-06-09 17:21:19 +0200161 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
162 // what is left after each controller gets its min rate).
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000163 allocator_->OnNetworkChanged(690000, 0, 0);
164 // Verify that each observer gets its min rate (sum of min rates is 600000),
165 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100166 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200167 EXPECT_EQ(100000u + bitrate_to_share / 3,
168 bitrate_observer_1.last_bitrate_bps_);
169 EXPECT_EQ(200000u + bitrate_to_share / 3,
170 bitrate_observer_2.last_bitrate_bps_);
171 EXPECT_EQ(300000u + bitrate_to_share / 3,
172 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000173
mflodman101f2502016-06-09 17:21:19 +0200174 // BWE below the sum of observer's min bitrate.
175 allocator_->OnNetworkChanged(300000, 0, 0);
176 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
177 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
178 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
179
180 // Increased BWE, but still below the sum of configured min bitrates for all
181 // observers and too little for observer 3. 1 and 2 will share the rest.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000182 allocator_->OnNetworkChanged(500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200183 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
184 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
185 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000186
mflodman101f2502016-06-09 17:21:19 +0200187 // Below min for all.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000188 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200189 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
190 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
191 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000192
perkjec81bcd2016-05-11 06:01:13 -0700193 // Verify that zero estimated bandwidth, means that that all gets zero,
194 // regardless of set min bitrate.
mflodman101f2502016-06-09 17:21:19 +0200195 allocator_->OnNetworkChanged(0, 0, 0);
196 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
197 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
198 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700199
mflodman86aabb22016-03-11 15:44:32 +0100200 allocator_->RemoveObserver(&bitrate_observer_1);
201 allocator_->RemoveObserver(&bitrate_observer_2);
202 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000203}
204
mflodman101f2502016-06-09 17:21:19 +0200205TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000206 TestBitrateObserver bitrate_observer_1;
207 TestBitrateObserver bitrate_observer_2;
208 TestBitrateObserver bitrate_observer_3;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200209 int start_bitrate =
mflodman2ebe5b12016-05-13 01:43:51 -0700210 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100211 EXPECT_EQ(300000, start_bitrate);
212
mflodman2ebe5b12016-05-13 01:43:51 -0700213 start_bitrate =
214 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100215 EXPECT_EQ(200000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200216 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100217
mflodman2ebe5b12016-05-13 01:43:51 -0700218 start_bitrate =
219 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100220 EXPECT_EQ(300000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200221 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
222 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000223
mflodman101f2502016-06-09 17:21:19 +0200224 // Low BWE. Verify that all observers still get their respective min bitrate.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000225 allocator_->OnNetworkChanged(1000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200226 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
227 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
228 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000229
mflodman86aabb22016-03-11 15:44:32 +0100230 allocator_->RemoveObserver(&bitrate_observer_1);
231 allocator_->RemoveObserver(&bitrate_observer_2);
232 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000233}
perkjfea93092016-05-14 00:58:48 -0700234
235TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
236 TestBitrateObserver bitrate_observer_1;
237 int start_bitrate =
238 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, true);
239 EXPECT_EQ(300000, start_bitrate);
240
241 // Set network down, ie, no available bitrate.
242 allocator_->OnNetworkChanged(0, 0, 0);
243
mflodman101f2502016-06-09 17:21:19 +0200244 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700245
246 TestBitrateObserver bitrate_observer_2;
247 start_bitrate =
248 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, true);
249
250 // Expect the start_bitrate to be set as if the network was still up but that
251 // the new observer have been notified that the network is down.
252 EXPECT_EQ(300000 / 2, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200253 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
254 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700255
256 // Set network back up.
257 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200258 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
259 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
260}
261
262TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
263 TestBitrateObserver enforced_observer;
264 int start_bitrate =
265 allocator_->AddObserver(&enforced_observer, 6000, 30000, true);
266 EXPECT_EQ(60000, start_bitrate);
267
268 TestBitrateObserver not_enforced_observer;
269 start_bitrate =
270 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, false);
271 EXPECT_EQ(270000, start_bitrate);
272 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
273
274 allocator_->OnNetworkChanged(36000, 0, 50);
275 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
276 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
277
278 allocator_->OnNetworkChanged(35000, 0, 50);
279 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
280 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
281
282 allocator_->OnNetworkChanged(5000, 0, 50);
283 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
284 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
285
286 allocator_->OnNetworkChanged(36000, 0, 50);
287 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
288 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
289
290 allocator_->OnNetworkChanged(55000, 0, 50);
291 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
292 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
293
294 allocator_->OnNetworkChanged(56000, 0, 50);
295 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
296 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
297
298 allocator_->OnNetworkChanged(56000, 0, 50);
299 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
300 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
301
302 allocator_->RemoveObserver(&enforced_observer);
303 allocator_->RemoveObserver(&not_enforced_observer);
304}
305
306TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
307 TestBitrateObserver observer;
308 int start_bitrate =
309 allocator_->AddObserver(&observer, 30000, 300000, false);
310 EXPECT_EQ(300000, start_bitrate);
311
312 allocator_->OnNetworkChanged(30000, 0, 50);
313 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
314
315 allocator_->OnNetworkChanged(20000, 0, 50);
316 EXPECT_EQ(0u, observer.last_bitrate_bps_);
317
318 allocator_->OnNetworkChanged(30000, 0, 50);
319 EXPECT_EQ(0u, observer.last_bitrate_bps_);
320
321 allocator_->OnNetworkChanged(49000, 0, 50);
322 EXPECT_EQ(0u, observer.last_bitrate_bps_);
323
324 allocator_->OnNetworkChanged(50000, 0, 50);
325 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
326
327 allocator_->OnNetworkChanged(30000, 0, 50);
328 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
329
330 allocator_->RemoveObserver(&observer);
331}
332
333TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
334 TestBitrateObserver observer;
335 int start_bitrate =
336 allocator_->AddObserver(&observer, 300000, 600000, false);
337 EXPECT_EQ(300000, start_bitrate);
338
339 allocator_->OnNetworkChanged(300000, 0, 50);
340 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
341
342 allocator_->OnNetworkChanged(200000, 0, 50);
343 EXPECT_EQ(0u, observer.last_bitrate_bps_);
344
345 allocator_->OnNetworkChanged(300000, 0, 50);
346 EXPECT_EQ(0u, observer.last_bitrate_bps_);
347
348 allocator_->OnNetworkChanged(329000, 0, 50);
349 EXPECT_EQ(0u, observer.last_bitrate_bps_);
350
351 allocator_->OnNetworkChanged(330000, 0, 50);
352 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
353
354 allocator_->OnNetworkChanged(300000, 0, 50);
355 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
356
357 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700358}
359
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000360} // namespace webrtc