blob: 5b1410f61dd227ed86e740c26fb0f8b5985aed03 [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
perkj71ee44c2016-06-15 00:47:53 -070015#include "testing/gmock/include/gmock/gmock.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000016#include "testing/gtest/include/gtest/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()
mflodman101f2502016-06-09 17:21:19 +020034 : last_bitrate_bps_(0), last_fraction_loss_(0), last_rtt_ms_(0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000035
mflodman101f2502016-06-09 17:21:19 +020036 void OnBitrateUpdated(uint32_t bitrate_bps,
37 uint8_t fraction_loss,
38 int64_t rtt) override {
39 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000040 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020041 last_rtt_ms_ = rtt;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000042 }
mflodman101f2502016-06-09 17:21:19 +020043 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000044 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020045 int64_t last_rtt_ms_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000046};
47
48class BitrateAllocatorTest : public ::testing::Test {
49 protected:
perkj71ee44c2016-06-15 00:47:53 -070050 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +010051 allocator_->OnNetworkChanged(300000u, 0, 0);
52 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 ~BitrateAllocatorTest() {}
54
perkj71ee44c2016-06-15 00:47:53 -070055 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080056 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000057};
58
59TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
60 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070061 const uint32_t kMinSendBitrateBps = 100000;
62 const uint32_t kPadUpToBitrateBps = 50000;
63
64 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
65 kPadUpToBitrateBps));
perkj57c21f92016-06-17 07:27:16 -070066 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
67 kPadUpToBitrateBps, true);
68 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000069 allocator_->OnNetworkChanged(200000, 0, 0);
perkj57c21f92016-06-17 07:27:16 -070070 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000071
Peter Boström8e4e8b02015-09-15 15:08:03 +020072 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080073 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020074 allocator_->OnNetworkChanged(4000000, 0, 0);
perkj57c21f92016-06-17 07:27:16 -070075 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -070076
77 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
78 EXPECT_CALL(limit_observer_,
79 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -070080 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
81 true);
82 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000083
perkj71ee44c2016-06-15 00:47:53 -070084 EXPECT_CALL(limit_observer_,
85 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -070086 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
87 true);
88 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +020089 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000090 allocator_->OnNetworkChanged(1500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020091 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000092}
93
94TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
95 TestBitrateObserver bitrate_observer_1;
96 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -070097 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
perkj71ee44c2016-06-15 00:47:53 -070098 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true);
perkj57c21f92016-06-17 07:27:16 -070099 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
100 EXPECT_CALL(limit_observer_,
101 OnAllocationLimitsChanged(100000 + 200000, 0));
perkj71ee44c2016-06-15 00:47:53 -0700102 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true);
perkj57c21f92016-06-17 07:27:16 -0700103 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000104
perkj57c21f92016-06-17 07:27:16 -0700105 // Test too low start bitrate, hence lower than sum of min. Min bitrates
106 // will
107 // be allocated to all observers.
108 allocator_->OnNetworkChanged(200000, 0, 50);
109 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
110 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
111 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
112 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
113 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
114 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000115
perkj57c21f92016-06-17 07:27:16 -0700116 // Test a bitrate which should be distributed equally.
117 allocator_->OnNetworkChanged(500000, 0, 50);
118 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
119 EXPECT_EQ(100000u + kBitrateToShare / 2,
120 bitrate_observer_1.last_bitrate_bps_);
121 EXPECT_EQ(200000u + kBitrateToShare / 2,
122 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000123
perkj57c21f92016-06-17 07:27:16 -0700124 // Limited by 2x max bitrates since we leave room for FEC and
125 // retransmissions.
126 allocator_->OnNetworkChanged(1500000, 0, 50);
127 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
128 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700129
perkj57c21f92016-06-17 07:27:16 -0700130 // Verify that if the bandwidth estimate is set to zero, the allocated
131 // rate is
132 // zero.
133 allocator_->OnNetworkChanged(0, 0, 50);
134 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
135 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000136}
137
perkj71ee44c2016-06-15 00:47:53 -0700138TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
139 TestBitrateObserver bitrate_observer;
140 const uint32_t kMinSendBitrateBps = 100000;
141 const uint32_t kPadUpToBitrateBps = 50000;
142
143 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
144 kPadUpToBitrateBps));
145 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
146 kPadUpToBitrateBps, true);
147 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
148 allocator_->RemoveObserver(&bitrate_observer);
149}
150
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000151class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
152 protected:
perkj71ee44c2016-06-15 00:47:53 -0700153 BitrateAllocatorTestNoEnforceMin()
154 : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +0100155 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000156 }
157 ~BitrateAllocatorTestNoEnforceMin() {}
158
perkj71ee44c2016-06-15 00:47:53 -0700159 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800160 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000161};
162
mflodman101f2502016-06-09 17:21:19 +0200163// The following three tests verify enforcing a minimum bitrate works as
164// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000165TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
166 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700167 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
168 // AddObserver is called with |enforce_min_bitrate| = false.
169 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
perkj71ee44c2016-06-15 00:47:53 -0700170 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
perkj57c21f92016-06-17 07:27:16 -0700171 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000172
perkj57c21f92016-06-17 07:27:16 -0700173 // High BWE.
174 allocator_->OnNetworkChanged(150000, 0, 0);
175 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000176
perkj57c21f92016-06-17 07:27:16 -0700177 // Low BWE.
178 allocator_->OnNetworkChanged(10000, 0, 0);
179 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000180
perkj57c21f92016-06-17 07:27:16 -0700181 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
182 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000183}
184
185TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
186 TestBitrateObserver bitrate_observer_1;
187 TestBitrateObserver bitrate_observer_2;
188 TestBitrateObserver bitrate_observer_3;
189 // Set up the observers with min bitrates at 100000, 200000, and 300000.
perkj57c21f92016-06-17 07:27:16 -0700190 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
191 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100192
perkj57c21f92016-06-17 07:27:16 -0700193 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
194 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200195 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100196
perkj57c21f92016-06-17 07:27:16 -0700197 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false);
198 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200199 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
200 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000201
mflodman101f2502016-06-09 17:21:19 +0200202 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
203 // what is left after each controller gets its min rate).
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000204 allocator_->OnNetworkChanged(690000, 0, 0);
205 // Verify that each observer gets its min rate (sum of min rates is 600000),
206 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100207 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200208 EXPECT_EQ(100000u + bitrate_to_share / 3,
209 bitrate_observer_1.last_bitrate_bps_);
210 EXPECT_EQ(200000u + bitrate_to_share / 3,
211 bitrate_observer_2.last_bitrate_bps_);
212 EXPECT_EQ(300000u + bitrate_to_share / 3,
213 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000214
mflodman101f2502016-06-09 17:21:19 +0200215 // BWE below the sum of observer's min bitrate.
216 allocator_->OnNetworkChanged(300000, 0, 0);
217 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
218 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
219 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
220
221 // Increased BWE, but still below the sum of configured min bitrates for all
222 // observers and too little for observer 3. 1 and 2 will share the rest.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000223 allocator_->OnNetworkChanged(500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200224 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
225 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
226 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000227
mflodman101f2502016-06-09 17:21:19 +0200228 // Below min for all.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000229 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200230 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
231 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
232 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000233
perkjec81bcd2016-05-11 06:01:13 -0700234 // Verify that zero estimated bandwidth, means that that all gets zero,
235 // regardless of set min bitrate.
mflodman101f2502016-06-09 17:21:19 +0200236 allocator_->OnNetworkChanged(0, 0, 0);
237 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
238 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
239 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700240
mflodman86aabb22016-03-11 15:44:32 +0100241 allocator_->RemoveObserver(&bitrate_observer_1);
242 allocator_->RemoveObserver(&bitrate_observer_2);
243 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000244}
245
mflodman101f2502016-06-09 17:21:19 +0200246TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000247 TestBitrateObserver bitrate_observer_1;
248 TestBitrateObserver bitrate_observer_2;
249 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100250
perkj57c21f92016-06-17 07:27:16 -0700251 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true);
252 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
253
254 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true);
255 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200256 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100257
perkj71ee44c2016-06-15 00:47:53 -0700258 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true);
perkj57c21f92016-06-17 07:27:16 -0700259 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
260 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
261 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000262
perkj57c21f92016-06-17 07:27:16 -0700263 // Low BWE. Verify that all observers still get their respective min
264 // bitrate.
265 allocator_->OnNetworkChanged(1000, 0, 0);
266 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
267 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
268 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000269
perkj57c21f92016-06-17 07:27:16 -0700270 allocator_->RemoveObserver(&bitrate_observer_1);
271 allocator_->RemoveObserver(&bitrate_observer_2);
272 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000273}
perkjfea93092016-05-14 00:58:48 -0700274
275TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
276 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700277 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700278
279 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true);
280 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700281
282 // Set network down, ie, no available bitrate.
283 allocator_->OnNetworkChanged(0, 0, 0);
284
mflodman101f2502016-06-09 17:21:19 +0200285 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700286
287 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700288 // Adding an observer while the network is down should not affect the limits.
289 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700290 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true);
perkjfea93092016-05-14 00:58:48 -0700291
292 // Expect the start_bitrate to be set as if the network was still up but that
293 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700294 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200295 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
296 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700297
298 // Set network back up.
299 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200300 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
301 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
302}
303
304TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
305 TestBitrateObserver enforced_observer;
perkj71ee44c2016-06-15 00:47:53 -0700306 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true);
perkj57c21f92016-06-17 07:27:16 -0700307 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200308
perkj57c21f92016-06-17 07:27:16 -0700309 TestBitrateObserver not_enforced_observer;
perkj71ee44c2016-06-15 00:47:53 -0700310 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false);
perkj57c21f92016-06-17 07:27:16 -0700311 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
312 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200313
perkj57c21f92016-06-17 07:27:16 -0700314 allocator_->OnNetworkChanged(36000, 0, 50);
315 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
316 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200317
perkj57c21f92016-06-17 07:27:16 -0700318 allocator_->OnNetworkChanged(35000, 0, 50);
319 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
320 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200321
perkj57c21f92016-06-17 07:27:16 -0700322 allocator_->OnNetworkChanged(5000, 0, 50);
323 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
324 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200325
perkj57c21f92016-06-17 07:27:16 -0700326 allocator_->OnNetworkChanged(36000, 0, 50);
327 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
328 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200329
perkj57c21f92016-06-17 07:27:16 -0700330 allocator_->OnNetworkChanged(55000, 0, 50);
331 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
332 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200333
perkj57c21f92016-06-17 07:27:16 -0700334 allocator_->OnNetworkChanged(56000, 0, 50);
335 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
336 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200337
perkj57c21f92016-06-17 07:27:16 -0700338 allocator_->OnNetworkChanged(56000, 0, 50);
339 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
340 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200341
perkj57c21f92016-06-17 07:27:16 -0700342 allocator_->RemoveObserver(&enforced_observer);
343 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200344}
345
346TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
347 TestBitrateObserver observer;
perkj71ee44c2016-06-15 00:47:53 -0700348 allocator_->AddObserver(&observer, 30000, 300000, 0, false);
perkj57c21f92016-06-17 07:27:16 -0700349 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200350
perkj57c21f92016-06-17 07:27:16 -0700351 allocator_->OnNetworkChanged(30000, 0, 50);
352 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200353
perkj57c21f92016-06-17 07:27:16 -0700354 allocator_->OnNetworkChanged(20000, 0, 50);
355 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200356
perkj57c21f92016-06-17 07:27:16 -0700357 allocator_->OnNetworkChanged(30000, 0, 50);
358 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200359
perkj57c21f92016-06-17 07:27:16 -0700360 allocator_->OnNetworkChanged(49000, 0, 50);
361 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200362
perkj57c21f92016-06-17 07:27:16 -0700363 allocator_->OnNetworkChanged(50000, 0, 50);
364 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200365
perkj57c21f92016-06-17 07:27:16 -0700366 allocator_->OnNetworkChanged(30000, 0, 50);
367 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200368
perkj57c21f92016-06-17 07:27:16 -0700369 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200370}
371
372TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
373 TestBitrateObserver observer;
perkj71ee44c2016-06-15 00:47:53 -0700374 allocator_->AddObserver(&observer, 300000, 600000, 0, false);
perkj57c21f92016-06-17 07:27:16 -0700375 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200376
perkj57c21f92016-06-17 07:27:16 -0700377 allocator_->OnNetworkChanged(300000, 0, 50);
378 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200379
perkj57c21f92016-06-17 07:27:16 -0700380 allocator_->OnNetworkChanged(200000, 0, 50);
381 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200382
perkj57c21f92016-06-17 07:27:16 -0700383 allocator_->OnNetworkChanged(300000, 0, 50);
384 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200385
perkj57c21f92016-06-17 07:27:16 -0700386 allocator_->OnNetworkChanged(329000, 0, 50);
387 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200388
perkj57c21f92016-06-17 07:27:16 -0700389 allocator_->OnNetworkChanged(330000, 0, 50);
390 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200391
perkj57c21f92016-06-17 07:27:16 -0700392 allocator_->OnNetworkChanged(300000, 0, 50);
393 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200394
perkj57c21f92016-06-17 07:27:16 -0700395 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700396}
397
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000398} // namespace webrtc