blob: 811e76d25f14c28c8574601b772cd8c5dcf1fef0 [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
kwiberg77eab702016-09-28 17:42:01 -070015#include "webrtc/test/gmock.h"
16#include "webrtc/test/gtest.h"
mflodman0e7e2592015-11-12 21:02:42 -080017#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000018#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
19
perkj71ee44c2016-06-15 00:47:53 -070020using testing::NiceMock;
21
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000022namespace webrtc {
23
perkj71ee44c2016-06-15 00:47:53 -070024class MockLimitObserver : public BitrateAllocator::LimitObserver {
25 public:
26 MOCK_METHOD2(OnAllocationLimitsChanged,
27 void(uint32_t min_send_bitrate_bps,
28 uint32_t max_padding_bitrate_bps));
29};
30
mflodman86aabb22016-03-11 15:44:32 +010031class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000032 public:
33 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020034 : last_bitrate_bps_(0),
35 last_fraction_loss_(0),
36 last_rtt_ms_(0),
37 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000038
mflodman48a4beb2016-07-01 13:03:59 +020039 void SetBitrateProtectionRatio(double protection_ratio) {
40 protection_ratio_ = protection_ratio;
41 }
42
43 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
44 uint8_t fraction_loss,
45 int64_t rtt) override {
mflodman101f2502016-06-09 17:21:19 +020046 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000047 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020048 last_rtt_ms_ = rtt;
mflodman48a4beb2016-07-01 13:03:59 +020049 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050 }
mflodman101f2502016-06-09 17:21:19 +020051 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000052 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020053 int64_t last_rtt_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020054 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000055};
56
57class BitrateAllocatorTest : public ::testing::Test {
58 protected:
perkj71ee44c2016-06-15 00:47:53 -070059 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +010060 allocator_->OnNetworkChanged(300000u, 0, 0);
61 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000062 ~BitrateAllocatorTest() {}
63
perkj71ee44c2016-06-15 00:47:53 -070064 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080065 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000066};
67
68TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
69 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070070 const uint32_t kMinSendBitrateBps = 100000;
71 const uint32_t kPadUpToBitrateBps = 50000;
72
73 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
74 kPadUpToBitrateBps));
perkj57c21f92016-06-17 07:27:16 -070075 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
76 kPadUpToBitrateBps, true);
77 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000078 allocator_->OnNetworkChanged(200000, 0, 0);
perkj57c21f92016-06-17 07:27:16 -070079 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000080
Peter Boström8e4e8b02015-09-15 15:08:03 +020081 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080082 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020083 allocator_->OnNetworkChanged(4000000, 0, 0);
perkj57c21f92016-06-17 07:27:16 -070084 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -070085
86 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
87 EXPECT_CALL(limit_observer_,
88 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -070089 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
90 true);
91 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000092
perkj71ee44c2016-06-15 00:47:53 -070093 EXPECT_CALL(limit_observer_,
94 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -070095 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
96 true);
97 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +020098 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000099 allocator_->OnNetworkChanged(1500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200100 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000101}
102
103TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
104 TestBitrateObserver bitrate_observer_1;
105 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700106 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200107 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true);
108 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
109 EXPECT_CALL(limit_observer_,
110 OnAllocationLimitsChanged(100000 + 200000, 0));
111 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true);
112 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000113
mflodman48a4beb2016-07-01 13:03:59 +0200114 // Test too low start bitrate, hence lower than sum of min. Min bitrates
115 // will
116 // be allocated to all observers.
117 allocator_->OnNetworkChanged(200000, 0, 50);
118 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
119 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
120 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
121 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
122 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
123 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000124
mflodman48a4beb2016-07-01 13:03:59 +0200125 // Test a bitrate which should be distributed equally.
126 allocator_->OnNetworkChanged(500000, 0, 50);
127 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
128 EXPECT_EQ(100000u + kBitrateToShare / 2,
129 bitrate_observer_1.last_bitrate_bps_);
130 EXPECT_EQ(200000u + kBitrateToShare / 2,
131 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000132
mflodman48a4beb2016-07-01 13:03:59 +0200133 // Limited by 2x max bitrates since we leave room for FEC and
134 // retransmissions.
135 allocator_->OnNetworkChanged(1500000, 0, 50);
136 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
137 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700138
mflodman48a4beb2016-07-01 13:03:59 +0200139 // Verify that if the bandwidth estimate is set to zero, the allocated
140 // rate is
141 // zero.
142 allocator_->OnNetworkChanged(0, 0, 50);
143 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
144 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000145}
146
perkj71ee44c2016-06-15 00:47:53 -0700147TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
148 TestBitrateObserver bitrate_observer;
149 const uint32_t kMinSendBitrateBps = 100000;
150 const uint32_t kPadUpToBitrateBps = 50000;
151
152 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
153 kPadUpToBitrateBps));
154 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
155 kPadUpToBitrateBps, true);
156 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
157 allocator_->RemoveObserver(&bitrate_observer);
158}
159
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000160class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
161 protected:
perkj71ee44c2016-06-15 00:47:53 -0700162 BitrateAllocatorTestNoEnforceMin()
163 : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +0100164 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000165 }
166 ~BitrateAllocatorTestNoEnforceMin() {}
167
perkj71ee44c2016-06-15 00:47:53 -0700168 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800169 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000170};
171
mflodman101f2502016-06-09 17:21:19 +0200172// The following three tests verify enforcing a minimum bitrate works as
173// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000174TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
175 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700176 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
177 // AddObserver is called with |enforce_min_bitrate| = false.
178 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200179 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
180 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000181
mflodman48a4beb2016-07-01 13:03:59 +0200182 // High BWE.
183 allocator_->OnNetworkChanged(150000, 0, 0);
184 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000185
mflodman48a4beb2016-07-01 13:03:59 +0200186 // Low BWE.
187 allocator_->OnNetworkChanged(10000, 0, 0);
188 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000189
mflodman48a4beb2016-07-01 13:03:59 +0200190 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
191 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000192}
193
194TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
195 TestBitrateObserver bitrate_observer_1;
196 TestBitrateObserver bitrate_observer_2;
197 TestBitrateObserver bitrate_observer_3;
198 // Set up the observers with min bitrates at 100000, 200000, and 300000.
perkj57c21f92016-06-17 07:27:16 -0700199 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
200 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100201
perkj57c21f92016-06-17 07:27:16 -0700202 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
203 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200204 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100205
perkj57c21f92016-06-17 07:27:16 -0700206 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false);
207 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200208 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
209 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000210
mflodman101f2502016-06-09 17:21:19 +0200211 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
212 // what is left after each controller gets its min rate).
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000213 allocator_->OnNetworkChanged(690000, 0, 0);
214 // Verify that each observer gets its min rate (sum of min rates is 600000),
215 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100216 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200217 EXPECT_EQ(100000u + bitrate_to_share / 3,
218 bitrate_observer_1.last_bitrate_bps_);
219 EXPECT_EQ(200000u + bitrate_to_share / 3,
220 bitrate_observer_2.last_bitrate_bps_);
221 EXPECT_EQ(300000u + bitrate_to_share / 3,
222 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000223
mflodman101f2502016-06-09 17:21:19 +0200224 // BWE below the sum of observer's min bitrate.
225 allocator_->OnNetworkChanged(300000, 0, 0);
226 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
227 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
228 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
229
230 // Increased BWE, but still below the sum of configured min bitrates for all
231 // observers and too little for observer 3. 1 and 2 will share the rest.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000232 allocator_->OnNetworkChanged(500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200233 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
234 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
235 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000236
mflodman101f2502016-06-09 17:21:19 +0200237 // Below min for all.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000238 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200239 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
240 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
241 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000242
perkjec81bcd2016-05-11 06:01:13 -0700243 // Verify that zero estimated bandwidth, means that that all gets zero,
244 // regardless of set min bitrate.
mflodman101f2502016-06-09 17:21:19 +0200245 allocator_->OnNetworkChanged(0, 0, 0);
246 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
247 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
248 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700249
mflodman86aabb22016-03-11 15:44:32 +0100250 allocator_->RemoveObserver(&bitrate_observer_1);
251 allocator_->RemoveObserver(&bitrate_observer_2);
252 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000253}
254
mflodman48a4beb2016-07-01 13:03:59 +0200255TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
256 TestBitrateObserver bitrate_observer;
257 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
258 // AddObserver is called with |enforce_min_bitrate| = false.
259 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
260 allocator_->AddObserver(
261 &bitrate_observer, 100000, 400000, 0, false);
262 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
263
264 // High BWE.
265 allocator_->OnNetworkChanged(150000, 0, 0);
266 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
267
268 // Add loss and use a part of the bitrate for protection.
269 double protection_ratio = 0.4;
270 uint8_t fraction_loss = protection_ratio * 256;
271 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
272 allocator_->OnNetworkChanged(200000, 0, fraction_loss);
273 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
274
275 // Above the min threshold, but not enough given the protection used.
276 allocator_->OnNetworkChanged(139000, 0, fraction_loss);
277 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
278
279 // Verify the hysteresis is added for the protection.
280 allocator_->OnNetworkChanged(150000, 0, fraction_loss);
281 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
282
283 // Just enough to enable video again.
284 allocator_->OnNetworkChanged(168000, 0, fraction_loss);
285 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
286
287 // Remove all protection and make sure video is not paused as earlier.
288 bitrate_observer.SetBitrateProtectionRatio(0.0);
289 allocator_->OnNetworkChanged(140000, 0, 0);
290 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
291
292 allocator_->OnNetworkChanged(139000, 0, 0);
293 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
294
295 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
296 allocator_->RemoveObserver(&bitrate_observer);
297}
298
299TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
300 TestBitrateObserver bitrate_observer_1;
301 TestBitrateObserver bitrate_observer_2;
302
303 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
304 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
305 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
306 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
307 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
308
309 // Enough bitrate for both.
310 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
311 allocator_->OnNetworkChanged(300000, 0, 0);
312 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
313 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
314
315 // Above min for observer 2, but too little given the protection used.
316 allocator_->OnNetworkChanged(330000, 0, 0);
317 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
318 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
319
320 allocator_->OnNetworkChanged(100000, 0, 0);
321 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
322 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
323
324 allocator_->OnNetworkChanged(99999, 0, 0);
325 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
326 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
327
328 allocator_->OnNetworkChanged(119000, 0, 0);
329 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
330 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
331
332 allocator_->OnNetworkChanged(120000, 0, 0);
333 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
334 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
335
336 // Verify the protection is accounted for before resuming observer 2.
337 allocator_->OnNetworkChanged(429000, 0, 0);
338 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
339 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
340
341 allocator_->OnNetworkChanged(430000, 0, 0);
342 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
343 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
344
345 allocator_->RemoveObserver(&bitrate_observer_1);
346 allocator_->RemoveObserver(&bitrate_observer_2);
347}
348
mflodman101f2502016-06-09 17:21:19 +0200349TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000350 TestBitrateObserver bitrate_observer_1;
351 TestBitrateObserver bitrate_observer_2;
352 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100353
perkj57c21f92016-06-17 07:27:16 -0700354 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true);
355 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
356
357 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true);
358 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200359 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100360
mflodman48a4beb2016-07-01 13:03:59 +0200361 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true);
362 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
363 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
364 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000365
mflodman48a4beb2016-07-01 13:03:59 +0200366 // Low BWE. Verify that all observers still get their respective min
367 // bitrate.
368 allocator_->OnNetworkChanged(1000, 0, 0);
369 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
370 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
371 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000372
mflodman48a4beb2016-07-01 13:03:59 +0200373 allocator_->RemoveObserver(&bitrate_observer_1);
374 allocator_->RemoveObserver(&bitrate_observer_2);
375 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000376}
perkjfea93092016-05-14 00:58:48 -0700377
378TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
379 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700380 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700381
382 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true);
383 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700384
385 // Set network down, ie, no available bitrate.
386 allocator_->OnNetworkChanged(0, 0, 0);
387
mflodman101f2502016-06-09 17:21:19 +0200388 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700389
390 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700391 // Adding an observer while the network is down should not affect the limits.
392 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700393 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true);
perkjfea93092016-05-14 00:58:48 -0700394
395 // Expect the start_bitrate to be set as if the network was still up but that
396 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700397 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200398 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
399 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700400
401 // Set network back up.
402 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200403 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
404 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
405}
406
407TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
408 TestBitrateObserver enforced_observer;
mflodman48a4beb2016-07-01 13:03:59 +0200409 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true);
410 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200411
mflodman48a4beb2016-07-01 13:03:59 +0200412 TestBitrateObserver not_enforced_observer;
413 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false);
414 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
415 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200416
mflodman48a4beb2016-07-01 13:03:59 +0200417 allocator_->OnNetworkChanged(36000, 0, 50);
418 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
419 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200420
mflodman48a4beb2016-07-01 13:03:59 +0200421 allocator_->OnNetworkChanged(35000, 0, 50);
422 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
423 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200424
mflodman48a4beb2016-07-01 13:03:59 +0200425 allocator_->OnNetworkChanged(5000, 0, 50);
426 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
427 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200428
mflodman48a4beb2016-07-01 13:03:59 +0200429 allocator_->OnNetworkChanged(36000, 0, 50);
430 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
431 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200432
mflodman48a4beb2016-07-01 13:03:59 +0200433 allocator_->OnNetworkChanged(55000, 0, 50);
434 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
435 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200436
mflodman48a4beb2016-07-01 13:03:59 +0200437 allocator_->OnNetworkChanged(56000, 0, 50);
438 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
439 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200440
mflodman48a4beb2016-07-01 13:03:59 +0200441 allocator_->OnNetworkChanged(56000, 0, 50);
442 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
443 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200444
mflodman48a4beb2016-07-01 13:03:59 +0200445 allocator_->RemoveObserver(&enforced_observer);
446 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200447}
448
449TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
450 TestBitrateObserver observer;
mflodman48a4beb2016-07-01 13:03:59 +0200451 allocator_->AddObserver(&observer, 30000, 300000, 0, false);
452 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200453
mflodman48a4beb2016-07-01 13:03:59 +0200454 allocator_->OnNetworkChanged(30000, 0, 50);
455 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200456
mflodman48a4beb2016-07-01 13:03:59 +0200457 allocator_->OnNetworkChanged(20000, 0, 50);
458 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200459
mflodman48a4beb2016-07-01 13:03:59 +0200460 allocator_->OnNetworkChanged(30000, 0, 50);
461 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200462
mflodman48a4beb2016-07-01 13:03:59 +0200463 allocator_->OnNetworkChanged(49000, 0, 50);
464 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200465
mflodman48a4beb2016-07-01 13:03:59 +0200466 allocator_->OnNetworkChanged(50000, 0, 50);
467 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200468
mflodman48a4beb2016-07-01 13:03:59 +0200469 allocator_->OnNetworkChanged(30000, 0, 50);
470 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200471
mflodman48a4beb2016-07-01 13:03:59 +0200472 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200473}
474
475TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
476 TestBitrateObserver observer;
mflodman48a4beb2016-07-01 13:03:59 +0200477 allocator_->AddObserver(&observer, 300000, 600000, 0, false);
478 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200479
mflodman48a4beb2016-07-01 13:03:59 +0200480 allocator_->OnNetworkChanged(300000, 0, 50);
481 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200482
mflodman48a4beb2016-07-01 13:03:59 +0200483 allocator_->OnNetworkChanged(200000, 0, 50);
484 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200485
mflodman48a4beb2016-07-01 13:03:59 +0200486 allocator_->OnNetworkChanged(300000, 0, 50);
487 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200488
mflodman48a4beb2016-07-01 13:03:59 +0200489 allocator_->OnNetworkChanged(329000, 0, 50);
490 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200491
mflodman48a4beb2016-07-01 13:03:59 +0200492 allocator_->OnNetworkChanged(330000, 0, 50);
493 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200494
mflodman48a4beb2016-07-01 13:03:59 +0200495 allocator_->OnNetworkChanged(300000, 0, 50);
496 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200497
mflodman48a4beb2016-07-01 13:03:59 +0200498 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700499}
500
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000501} // namespace webrtc