blob: f177cafc08a2206912a3ca4813b8d1e32956a43b [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/bitrate_allocator.h"
12
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080014#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000015#include <vector>
16
Sebastian Jansson4ad51d82019-06-11 11:24:40 +020017#include "system_wrappers/include/clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gmock.h"
19#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000020
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080021using ::testing::_;
Rasmus Brandt681de202019-02-04 15:09:34 +010022using ::testing::NiceMock;
perkj71ee44c2016-06-15 00:47:53 -070023
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000024namespace webrtc {
Sebastian Janssonfe617a32018-03-21 12:45:20 +010025// Emulating old interface for test suite compatibility.
26// TODO(srte): Update tests to reflect new interface.
27class LimitObserverWrapper : public BitrateAllocator::LimitObserver {
28 public:
Sebastian Janssonfe617a32018-03-21 12:45:20 +010029 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
30 uint32_t max_padding_bitrate_bps,
31 uint32_t total_bitrate_bps) = 0;
32};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000033
Sebastian Janssonfe617a32018-03-21 12:45:20 +010034class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070035 public:
philipelf69e7682018-02-28 13:06:28 +010036 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070037 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010038 uint32_t max_padding_bitrate_bps,
39 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070040};
41
mflodman86aabb22016-03-11 15:44:32 +010042class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 public:
44 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020045 : last_bitrate_bps_(0),
46 last_fraction_loss_(0),
47 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080048 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020049 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050
mflodman48a4beb2016-07-01 13:03:59 +020051 void SetBitrateProtectionRatio(double protection_ratio) {
52 protection_ratio_ = protection_ratio;
53 }
54
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020055 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010056 last_bitrate_bps_ = update.target_bitrate.bps();
57 last_fraction_loss_ =
58 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
59 last_rtt_ms_ = update.round_trip_time.ms();
60 last_probing_interval_ms_ = update.bwe_period.ms();
61 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000062 }
mflodman101f2502016-06-09 17:21:19 +020063 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000064 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020065 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080066 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020067 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068};
69
Sebastian Jansson89c94b92018-11-20 17:16:36 +010070class BitrateAllocatorForTest : public BitrateAllocator {
71 public:
72 using BitrateAllocator::BitrateAllocator;
73 void OnNetworkChanged(uint32_t target_bitrate_bps,
74 uint8_t fraction_loss,
75 int64_t rtt,
76 int64_t bwe_period_ms) {
77 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
78 fraction_loss, rtt, bwe_period_ms);
79 }
80};
81
minyue78b4d562016-11-30 04:47:39 -080082namespace {
83constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080084const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020085} // namespace
minyue78b4d562016-11-30 04:47:39 -080086
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000087class BitrateAllocatorTest : public ::testing::Test {
88 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010089 BitrateAllocatorTest()
Sebastian Janssonda6806c2019-03-04 17:05:12 +010090 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
91 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080092 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010093 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000094 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020095 void AddObserver(BitrateAllocatorObserver* observer,
96 uint32_t min_bitrate_bps,
97 uint32_t max_bitrate_bps,
98 uint32_t pad_up_bitrate_bps,
99 bool enforce_min_bitrate,
100 std::string track_id,
101 double bitrate_priority) {
102 allocator_->AddObserver(
103 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson464a5572019-02-12 13:32:32 +0100104 /* priority_bitrate */ 0, enforce_min_bitrate, track_id,
105 bitrate_priority});
106 }
107 MediaStreamAllocationConfig DefaultConfig() const {
108 MediaStreamAllocationConfig default_config;
109 default_config.min_bitrate_bps = 0;
110 default_config.max_bitrate_bps = 1500000;
111 default_config.pad_up_bitrate_bps = 0;
112 default_config.priority_bitrate_bps = 0;
113 default_config.enforce_min_bitrate = true;
114 default_config.track_id = "";
115 default_config.bitrate_priority = kDefaultBitratePriority;
116 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200117 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000118
perkj71ee44c2016-06-15 00:47:53 -0700119 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100120 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000121};
122
Sebastian Jansson464a5572019-02-12 13:32:32 +0100123TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
124 TestBitrateObserver stream_a;
125 auto config_a = DefaultConfig();
126 config_a.min_bitrate_bps = 100000;
127 config_a.priority_bitrate_bps = 0;
128 allocator_->AddObserver(&stream_a, config_a);
129
130 TestBitrateObserver stream_b;
131 auto config_b = DefaultConfig();
132 config_b.min_bitrate_bps = 100000;
133 config_b.max_bitrate_bps = 300000;
134 config_b.priority_bitrate_bps = 300000;
135 allocator_->AddObserver(&stream_b, config_b);
136
137 allocator_->OnNetworkChanged(100000, 0, 0, 0);
138 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
139 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
140
141 allocator_->OnNetworkChanged(200000, 0, 0, 0);
142 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
143 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
144
145 allocator_->OnNetworkChanged(300000, 0, 0, 0);
146 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
147 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
148
149 allocator_->OnNetworkChanged(400000, 0, 0, 0);
150 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
151 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
152
153 allocator_->OnNetworkChanged(800000, 0, 0, 0);
154 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
155 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
156}
157
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000158TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
159 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700160 const uint32_t kMinSendBitrateBps = 100000;
161 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100162 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700163
philipelf69e7682018-02-28 13:06:28 +0100164 EXPECT_CALL(limit_observer_,
165 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
166 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200167 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
168 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700169 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800170 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700171 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000172
Peter Boström8e4e8b02015-09-15 15:08:03 +0200173 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800174 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800175 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700176 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700177
178 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
179 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100180 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200181 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
182 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200183 EXPECT_CALL(limit_observer_,
184 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700185 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000186
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200187 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
188 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700189 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200190 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100191 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200192 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000193}
194
195TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
196 TestBitrateObserver bitrate_observer_1;
197 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100198 const uint32_t kObs1StartBitrateBps = 100000;
199 const uint32_t kObs2StartBitrateBps = 200000;
200 const uint32_t kObs1MaxBitrateBps = 300000;
201 const uint32_t kObs2MaxBitrateBps = 300000;
202
203 EXPECT_CALL(
204 limit_observer_,
205 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200206 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
207 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100208 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
209 allocator_->GetStartBitrate(&bitrate_observer_1));
210 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
211 kObs1StartBitrateBps + kObs2StartBitrateBps,
212 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200213 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
214 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100215 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
216 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000217
mflodman48a4beb2016-07-01 13:03:59 +0200218 // Test too low start bitrate, hence lower than sum of min. Min bitrates
219 // will
220 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100221 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
222 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200223 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
224 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
225 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
226 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
227 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
228 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000229
mflodman48a4beb2016-07-01 13:03:59 +0200230 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800231 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100232 const uint32_t kBitrateToShare =
233 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200234 EXPECT_EQ(100000u + kBitrateToShare / 2,
235 bitrate_observer_1.last_bitrate_bps_);
236 EXPECT_EQ(200000u + kBitrateToShare / 2,
237 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000238
mflodman48a4beb2016-07-01 13:03:59 +0200239 // Limited by 2x max bitrates since we leave room for FEC and
240 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800241 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200242 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
243 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700244
mflodman48a4beb2016-07-01 13:03:59 +0200245 // Verify that if the bandwidth estimate is set to zero, the allocated
246 // rate is
247 // zero.
minyue78b4d562016-11-30 04:47:39 -0800248 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200249 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
250 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000251}
252
perkj71ee44c2016-06-15 00:47:53 -0700253TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
254 TestBitrateObserver bitrate_observer;
255 const uint32_t kMinSendBitrateBps = 100000;
256 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100257 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700258
philipelf69e7682018-02-28 13:06:28 +0100259 EXPECT_CALL(limit_observer_,
260 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
261 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200262 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
263 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100264 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700265 allocator_->RemoveObserver(&bitrate_observer);
266}
267
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000268class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
269 protected:
perkj71ee44c2016-06-15 00:47:53 -0700270 BitrateAllocatorTestNoEnforceMin()
Sebastian Janssonda6806c2019-03-04 17:05:12 +0100271 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
272 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800273 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000274 }
275 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200276 void AddObserver(BitrateAllocatorObserver* observer,
277 uint32_t min_bitrate_bps,
278 uint32_t max_bitrate_bps,
279 uint32_t pad_up_bitrate_bps,
280 bool enforce_min_bitrate,
281 std::string track_id,
282 double bitrate_priority) {
283 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100284 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100285 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200286 }
perkj71ee44c2016-06-15 00:47:53 -0700287 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100288 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000289};
290
mflodman101f2502016-06-09 17:21:19 +0200291// The following three tests verify enforcing a minimum bitrate works as
292// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000293TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
294 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700295 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
296 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200297 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100298 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200299 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
300 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200301 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000302
mflodman48a4beb2016-07-01 13:03:59 +0200303 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800304 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200305 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000306
mflodman48a4beb2016-07-01 13:03:59 +0200307 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800308 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200309 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000310
philipelf69e7682018-02-28 13:06:28 +0100311 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200312 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000313}
314
315TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
316 TestBitrateObserver bitrate_observer_1;
317 TestBitrateObserver bitrate_observer_2;
318 TestBitrateObserver bitrate_observer_3;
319 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200320 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
321 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700322 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100323
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200324 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
325 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700326 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200327 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100328
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200329 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
330 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700331 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200332 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
333 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000334
mflodman101f2502016-06-09 17:21:19 +0200335 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
336 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800337 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000338 // Verify that each observer gets its min rate (sum of min rates is 600000),
339 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100340 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200341 EXPECT_EQ(100000u + bitrate_to_share / 3,
342 bitrate_observer_1.last_bitrate_bps_);
343 EXPECT_EQ(200000u + bitrate_to_share / 3,
344 bitrate_observer_2.last_bitrate_bps_);
345 EXPECT_EQ(300000u + bitrate_to_share / 3,
346 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000347
mflodman101f2502016-06-09 17:21:19 +0200348 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800349 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200350 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
351 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200352 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200353
354 // Increased BWE, but still below the sum of configured min bitrates for all
355 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800356 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200357 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
358 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200359 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000360
mflodman101f2502016-06-09 17:21:19 +0200361 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800362 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200363 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
364 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
365 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000366
perkjec81bcd2016-05-11 06:01:13 -0700367 // Verify that zero estimated bandwidth, means that that all gets zero,
368 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800369 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200370 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
371 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
372 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700373
mflodman86aabb22016-03-11 15:44:32 +0100374 allocator_->RemoveObserver(&bitrate_observer_1);
375 allocator_->RemoveObserver(&bitrate_observer_2);
376 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000377}
378
mflodman48a4beb2016-07-01 13:03:59 +0200379TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100380 const uint32_t kMinBitrateBps = 100000;
381 const uint32_t kMaxBitrateBps = 400000;
382 // Hysteresis adds another 10% or 20kbps to min bitrate.
383 const uint32_t kMinStartBitrateBps =
384 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
385
mflodman48a4beb2016-07-01 13:03:59 +0200386 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
387 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100388 TestBitrateObserver bitrate_observer;
389 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
390 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200391 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200392 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
393
394 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800395 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200396 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
397
398 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100399 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100400 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100401 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Rasmus Brandt681de202019-02-04 15:09:34 +0100402 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800403 kDefaultProbingIntervalMs);
Rasmus Brandt681de202019-02-04 15:09:34 +0100404 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200405
406 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100407 // Limits changed, as we will video is now off and we need to pad up to the
408 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100409 // Verify the hysteresis is added for the protection.
410 const uint32_t kMinStartBitrateWithProtectionBps =
411 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
412 EXPECT_CALL(limit_observer_,
413 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
Rasmus Brandt681de202019-02-04 15:09:34 +0100414 kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100415 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800416 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200417 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
418
Erik Språngd1d7b232018-12-06 17:31:25 +0100419 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
420 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200421 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
422
423 // Just enough to enable video again.
Rasmus Brandt681de202019-02-04 15:09:34 +0100424 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100425 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
426 fraction_loss, kDefaultProbingIntervalMs);
427 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
428 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200429
430 // Remove all protection and make sure video is not paused as earlier.
431 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100432 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
433 kDefaultProbingIntervalMs);
434 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
435 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200436
Erik Språngd1d7b232018-12-06 17:31:25 +0100437 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
438 kDefaultProbingIntervalMs);
439 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200440
Erik Språngd1d7b232018-12-06 17:31:25 +0100441 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200442 allocator_->RemoveObserver(&bitrate_observer);
443}
444
Rasmus Brandt681de202019-02-04 15:09:34 +0100445TEST_F(BitrateAllocatorTest,
446 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
447 TestBitrateObserver bitrate_observer;
448
449 const uint32_t kMinBitrateBps = 100000;
450 const uint32_t kMaxBitrateBps = 400000;
451
452 // Register |bitrate_observer| and expect total allocation limits to change.
453 EXPECT_CALL(limit_observer_,
454 OnAllocationLimitsChanged(kMinBitrateBps, 0, kMaxBitrateBps))
455 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100456 MediaStreamAllocationConfig allocation_config = DefaultConfig();
457 allocation_config.min_bitrate_bps = kMinBitrateBps;
458 allocation_config.max_bitrate_bps = kMaxBitrateBps;
459 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100460
461 // Observer uses 20% of it's allocated bitrate for protection.
462 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
463 // Total allocation limits are unaffected by the protection rate change.
464 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
465 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
466
467 // Observer uses 0% of it's allocated bitrate for protection.
468 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
469 // Total allocation limits are unaffected by the protection rate change.
470 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
471 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
472
473 // Observer again uses 20% of it's allocated bitrate for protection.
474 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
475 // Total allocation limits are unaffected by the protection rate change.
476 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
477 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
478}
479
mflodman48a4beb2016-07-01 13:03:59 +0200480TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
481 TestBitrateObserver bitrate_observer_1;
482 TestBitrateObserver bitrate_observer_2;
483
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200484 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
485 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200486 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200487 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
488 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200489 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
490 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
491
492 // Enough bitrate for both.
493 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800494 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200495 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
496 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
497
498 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800499 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200500 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
501 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
502
minyue78b4d562016-11-30 04:47:39 -0800503 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200504 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
505 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
506
minyue78b4d562016-11-30 04:47:39 -0800507 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200508 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
509 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
510
minyue78b4d562016-11-30 04:47:39 -0800511 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200512 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
513 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
514
minyue78b4d562016-11-30 04:47:39 -0800515 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200516 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
517 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
518
519 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800520 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200521 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
522 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
523
minyue78b4d562016-11-30 04:47:39 -0800524 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200525 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
526 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
527
528 allocator_->RemoveObserver(&bitrate_observer_1);
529 allocator_->RemoveObserver(&bitrate_observer_2);
530}
531
mflodman101f2502016-06-09 17:21:19 +0200532TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000533 TestBitrateObserver bitrate_observer_1;
534 TestBitrateObserver bitrate_observer_2;
535 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100536
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200537 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
538 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700539 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
540
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200541 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
542 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700543 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200544 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100545
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200546 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
547 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200548 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
549 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
550 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000551
mflodman48a4beb2016-07-01 13:03:59 +0200552 // Low BWE. Verify that all observers still get their respective min
553 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800554 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200555 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
556 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
557 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000558
mflodman48a4beb2016-07-01 13:03:59 +0200559 allocator_->RemoveObserver(&bitrate_observer_1);
560 allocator_->RemoveObserver(&bitrate_observer_2);
561 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000562}
perkjfea93092016-05-14 00:58:48 -0700563
564TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
565 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100566 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700567
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200568 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
569 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700570 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700571
572 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800573 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700574
mflodman101f2502016-06-09 17:21:19 +0200575 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700576
577 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700578 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100579 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200580 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
581 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700582
583 // Expect the start_bitrate to be set as if the network was still up but that
584 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700585 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200586 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
587 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700588
589 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800590 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200591 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
592 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
593}
594
595TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
596 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200597 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
598 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200599 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200600
mflodman48a4beb2016-07-01 13:03:59 +0200601 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200602 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
603 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200604 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
605 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200606
minyue78b4d562016-11-30 04:47:39 -0800607 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200608 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
609 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200610
minyue78b4d562016-11-30 04:47:39 -0800611 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200612 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
613 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200614
minyue78b4d562016-11-30 04:47:39 -0800615 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200616 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
617 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200618
minyue78b4d562016-11-30 04:47:39 -0800619 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200620 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
621 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200622
minyue78b4d562016-11-30 04:47:39 -0800623 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200624 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
625 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200626
minyue78b4d562016-11-30 04:47:39 -0800627 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200628 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
629 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200630
minyue78b4d562016-11-30 04:47:39 -0800631 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200632 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
633 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200634
mflodman48a4beb2016-07-01 13:03:59 +0200635 allocator_->RemoveObserver(&enforced_observer);
636 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200637}
638
639TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
640 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200641 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200642 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200643
minyue78b4d562016-11-30 04:47:39 -0800644 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200645 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200646
minyue78b4d562016-11-30 04:47:39 -0800647 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200648 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200649
minyue78b4d562016-11-30 04:47:39 -0800650 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200651 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200652
minyue78b4d562016-11-30 04:47:39 -0800653 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200654 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200655
minyue78b4d562016-11-30 04:47:39 -0800656 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200657 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200658
minyue78b4d562016-11-30 04:47:39 -0800659 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200660 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200661
mflodman48a4beb2016-07-01 13:03:59 +0200662 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200663}
664
665TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
666 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200667 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200668 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200669
minyue78b4d562016-11-30 04:47:39 -0800670 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200671 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200672
minyue78b4d562016-11-30 04:47:39 -0800673 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200674 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200675
minyue78b4d562016-11-30 04:47:39 -0800676 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200677 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200678
minyue78b4d562016-11-30 04:47:39 -0800679 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200680 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200681
minyue78b4d562016-11-30 04:47:39 -0800682 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200683 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200684
minyue78b4d562016-11-30 04:47:39 -0800685 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200686 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200687
mflodman48a4beb2016-07-01 13:03:59 +0200688 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700689}
690
minyue78b4d562016-11-30 04:47:39 -0800691TEST_F(BitrateAllocatorTest, PassProbingInterval) {
692 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200693 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800694 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
695
696 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
697 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
698
699 allocator_->RemoveObserver(&observer);
700}
701
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800702TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
703 TestBitrateObserver observer;
704 const uint32_t kMinSendBitrateBps = 10;
705 const uint32_t kMaxSendBitrateBps = 60;
706 const uint32_t kNetworkBandwidthBps = 30;
707
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200708 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
709 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800710 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
711 kDefaultProbingIntervalMs);
712
713 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
714
715 allocator_->RemoveObserver(&observer);
716}
717
718// Tests that two observers with the same bitrate priority are allocated
719// their bitrate evenly.
720TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
721 TestBitrateObserver observer_low_1;
722 TestBitrateObserver observer_low_2;
723 const uint32_t kMinSendBitrateBps = 10;
724 const uint32_t kMaxSendBitrateBps = 60;
725 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200726 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
727 "low1", 2.0);
728 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
729 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800730 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
731 kDefaultProbingIntervalMs);
732
733 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
734 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
735
736 allocator_->RemoveObserver(&observer_low_1);
737 allocator_->RemoveObserver(&observer_low_2);
738}
739
740// Tests that there is no difference in functionality when the min bitrate is
741// enforced.
742TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
743 TestBitrateObserver observer_low_1;
744 TestBitrateObserver observer_low_2;
745 const uint32_t kMinSendBitrateBps = 0;
746 const uint32_t kMaxSendBitrateBps = 60;
747 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200748 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
749 "low1", 2.0);
750 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
751 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800752 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
753 kDefaultProbingIntervalMs);
754
755 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
756 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
757
758 allocator_->RemoveObserver(&observer_low_1);
759 allocator_->RemoveObserver(&observer_low_2);
760}
761
762// Tests that if the available bandwidth is the sum of the max bitrate
763// of all observers, they will be allocated their max.
764TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
765 TestBitrateObserver observer_low;
766 TestBitrateObserver observer_mid;
767 const uint32_t kMinSendBitrateBps = 0;
768 const uint32_t kMaxSendBitrateBps = 60;
769 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200770 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
771 "low", 2.0);
772 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
773 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800774 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
775 kDefaultProbingIntervalMs);
776
777 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
778 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
779
780 allocator_->RemoveObserver(&observer_low);
781 allocator_->RemoveObserver(&observer_mid);
782}
783
784// Tests that after a higher bitrate priority observer has been allocated its
785// max bitrate the lower priority observer will then be allocated the remaining
786// bitrate.
787TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
788 TestBitrateObserver observer_low;
789 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200790 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
791 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800792 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
793
794 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
795 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
796
797 allocator_->RemoveObserver(&observer_low);
798 allocator_->RemoveObserver(&observer_mid);
799}
800
801// Tests that three observers with three different bitrate priorities will all
802// be allocated bitrate according to their relative bitrate priority.
803TEST_F(BitrateAllocatorTest,
804 PriorityRateThreeObserversAllocatedRelativeAmounts) {
805 TestBitrateObserver observer_low;
806 TestBitrateObserver observer_mid;
807 TestBitrateObserver observer_high;
808 const uint32_t kMaxBitrate = 100;
809 // Not enough bandwidth to fill any observer's max bitrate.
810 const uint32_t kNetworkBandwidthBps = 70;
811 const double kLowBitratePriority = 2.0;
812 const double kMidBitratePriority = 4.0;
813 const double kHighBitratePriority = 8.0;
814 const double kTotalBitratePriority =
815 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200816 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
817 kLowBitratePriority);
818 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
819 kMidBitratePriority);
820 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
821 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800822 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
823 kDefaultProbingIntervalMs);
824
825 const double kLowFractionAllocated =
826 kLowBitratePriority / kTotalBitratePriority;
827 const double kMidFractionAllocated =
828 kMidBitratePriority / kTotalBitratePriority;
829 const double kHighFractionAllocated =
830 kHighBitratePriority / kTotalBitratePriority;
831 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
832 observer_low.last_bitrate_bps_);
833 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
834 observer_mid.last_bitrate_bps_);
835 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
836 observer_high.last_bitrate_bps_);
837
838 allocator_->RemoveObserver(&observer_low);
839 allocator_->RemoveObserver(&observer_mid);
840 allocator_->RemoveObserver(&observer_high);
841}
842
843// Tests that after the high priority observer has been allocated its maximum
844// bitrate, the other two observers are still allocated bitrate according to
845// their relative bitrate priority.
846TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
847 TestBitrateObserver observer_low;
848 const double kLowBitratePriority = 2.0;
849 TestBitrateObserver observer_mid;
850 const double kMidBitratePriority = 4.0;
851 TestBitrateObserver observer_high;
852 const double kHighBitratePriority = 8.0;
853
854 const uint32_t kAvailableBitrate = 90;
855 const uint32_t kMaxBitrate = 40;
856 const uint32_t kMinBitrate = 10;
857 // Remaining bitrate after allocating to all mins and knowing that the high
858 // priority observer will have its max bitrate allocated.
859 const uint32_t kRemainingBitrate =
860 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
861
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200862 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
863 kLowBitratePriority);
864 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
865 kMidBitratePriority);
866 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
867 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800868 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
869 kDefaultProbingIntervalMs);
870
871 const double kLowFractionAllocated =
872 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
873 const double kMidFractionAllocated =
874 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
875 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
876 observer_low.last_bitrate_bps_);
877 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
878 observer_mid.last_bitrate_bps_);
879 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
880
881 allocator_->RemoveObserver(&observer_low);
882 allocator_->RemoveObserver(&observer_mid);
883 allocator_->RemoveObserver(&observer_high);
884}
885
886// Tests that after the low priority observer has been allocated its maximum
887// bitrate, the other two observers are still allocated bitrate according to
888// their relative bitrate priority.
889TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
890 TestBitrateObserver observer_low;
891 const double kLowBitratePriority = 2.0;
892 const uint32_t kLowMaxBitrate = 10;
893 TestBitrateObserver observer_mid;
894 const double kMidBitratePriority = 4.0;
895 TestBitrateObserver observer_high;
896 const double kHighBitratePriority = 8.0;
897
898 const uint32_t kMinBitrate = 0;
899 const uint32_t kMaxBitrate = 60;
900 const uint32_t kAvailableBitrate = 100;
901 // Remaining bitrate knowing that the low priority observer is allocated its
902 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
903 // available bitrate, so 70 bps would be sufficient network bandwidth.
904 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
905
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200906 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
907 kLowBitratePriority);
908 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
909 kMidBitratePriority);
910 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
911 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800912 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
913 kDefaultProbingIntervalMs);
914
915 const double kMidFractionAllocated =
916 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
917 const double kHighFractionAllocated =
918 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
919 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
920 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
921 observer_mid.last_bitrate_bps_);
922 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
923 observer_high.last_bitrate_bps_);
924
925 allocator_->RemoveObserver(&observer_low);
926 allocator_->RemoveObserver(&observer_mid);
927 allocator_->RemoveObserver(&observer_high);
928}
929
930// Tests that after two observers are allocated bitrate to their max, the
931// the remaining observer is allocated what's left appropriately. This test
932// handles an edge case where the medium and high observer reach their
933// "relative" max allocation at the same time. The high has 40 to allocate
934// above its min, and the mid has 20 to allocate above its min, which scaled
935// by their bitrate priority is the same for each.
936TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
937 TestBitrateObserver observer_low;
938 TestBitrateObserver observer_mid;
939 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200940 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800941 // Scaled allocation above the min allocation is the same for these two,
942 // meaning they will get allocated their max at the same time.
943 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200944 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
945 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800946 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
947
948 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
949 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
950 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
951
952 allocator_->RemoveObserver(&observer_low);
953 allocator_->RemoveObserver(&observer_mid);
954 allocator_->RemoveObserver(&observer_high);
955}
956
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000957} // namespace webrtc