blob: 33747efb34233357ddafcabaae63a513d4875b89 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "call/bitrate_allocator.h"
16#include "modules/bitrate_controller/include/bitrate_controller.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000019
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080020using ::testing::_;
Rasmus Brandt681de202019-02-04 15:09:34 +010021using ::testing::NiceMock;
22using ::testing::StrictMock;
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()
90 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080091 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010092 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000093 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020094 void AddObserver(BitrateAllocatorObserver* observer,
95 uint32_t min_bitrate_bps,
96 uint32_t max_bitrate_bps,
97 uint32_t pad_up_bitrate_bps,
98 bool enforce_min_bitrate,
99 std::string track_id,
100 double bitrate_priority) {
101 allocator_->AddObserver(
102 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson464a5572019-02-12 13:32:32 +0100103 /* priority_bitrate */ 0, enforce_min_bitrate, track_id,
104 bitrate_priority});
105 }
106 MediaStreamAllocationConfig DefaultConfig() const {
107 MediaStreamAllocationConfig default_config;
108 default_config.min_bitrate_bps = 0;
109 default_config.max_bitrate_bps = 1500000;
110 default_config.pad_up_bitrate_bps = 0;
111 default_config.priority_bitrate_bps = 0;
112 default_config.enforce_min_bitrate = true;
113 default_config.track_id = "";
114 default_config.bitrate_priority = kDefaultBitratePriority;
115 return default_config;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200116 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000117
perkj71ee44c2016-06-15 00:47:53 -0700118 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100119 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000120};
121
Sebastian Jansson464a5572019-02-12 13:32:32 +0100122TEST_F(BitrateAllocatorTest, RespectsPriorityBitrate) {
123 TestBitrateObserver stream_a;
124 auto config_a = DefaultConfig();
125 config_a.min_bitrate_bps = 100000;
126 config_a.priority_bitrate_bps = 0;
127 allocator_->AddObserver(&stream_a, config_a);
128
129 TestBitrateObserver stream_b;
130 auto config_b = DefaultConfig();
131 config_b.min_bitrate_bps = 100000;
132 config_b.max_bitrate_bps = 300000;
133 config_b.priority_bitrate_bps = 300000;
134 allocator_->AddObserver(&stream_b, config_b);
135
136 allocator_->OnNetworkChanged(100000, 0, 0, 0);
137 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
138 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
139
140 allocator_->OnNetworkChanged(200000, 0, 0, 0);
141 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
142 EXPECT_EQ(stream_b.last_bitrate_bps_, 100000u);
143
144 allocator_->OnNetworkChanged(300000, 0, 0, 0);
145 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
146 EXPECT_EQ(stream_b.last_bitrate_bps_, 200000u);
147
148 allocator_->OnNetworkChanged(400000, 0, 0, 0);
149 EXPECT_EQ(stream_a.last_bitrate_bps_, 100000u);
150 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
151
152 allocator_->OnNetworkChanged(800000, 0, 0, 0);
153 EXPECT_EQ(stream_a.last_bitrate_bps_, 500000u);
154 EXPECT_EQ(stream_b.last_bitrate_bps_, 300000u);
155}
156
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000157TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
158 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700159 const uint32_t kMinSendBitrateBps = 100000;
160 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100161 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700162
philipelf69e7682018-02-28 13:06:28 +0100163 EXPECT_CALL(limit_observer_,
164 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
165 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200166 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
167 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700168 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800169 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700170 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000171
Peter Boström8e4e8b02015-09-15 15:08:03 +0200172 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800173 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800174 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700175 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700176
177 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
178 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100179 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200180 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
181 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200182 EXPECT_CALL(limit_observer_,
183 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700184 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000185
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200186 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
187 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700188 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200189 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100190 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200191 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000192}
193
194TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
195 TestBitrateObserver bitrate_observer_1;
196 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100197 const uint32_t kObs1StartBitrateBps = 100000;
198 const uint32_t kObs2StartBitrateBps = 200000;
199 const uint32_t kObs1MaxBitrateBps = 300000;
200 const uint32_t kObs2MaxBitrateBps = 300000;
201
202 EXPECT_CALL(
203 limit_observer_,
204 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200205 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
206 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100207 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
208 allocator_->GetStartBitrate(&bitrate_observer_1));
209 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
210 kObs1StartBitrateBps + kObs2StartBitrateBps,
211 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200212 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
213 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100214 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
215 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216
mflodman48a4beb2016-07-01 13:03:59 +0200217 // Test too low start bitrate, hence lower than sum of min. Min bitrates
218 // will
219 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100220 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
221 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200222 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
223 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
224 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
225 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
226 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
227 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000228
mflodman48a4beb2016-07-01 13:03:59 +0200229 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800230 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100231 const uint32_t kBitrateToShare =
232 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200233 EXPECT_EQ(100000u + kBitrateToShare / 2,
234 bitrate_observer_1.last_bitrate_bps_);
235 EXPECT_EQ(200000u + kBitrateToShare / 2,
236 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000237
mflodman48a4beb2016-07-01 13:03:59 +0200238 // Limited by 2x max bitrates since we leave room for FEC and
239 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800240 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200241 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
242 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700243
mflodman48a4beb2016-07-01 13:03:59 +0200244 // Verify that if the bandwidth estimate is set to zero, the allocated
245 // rate is
246 // zero.
minyue78b4d562016-11-30 04:47:39 -0800247 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200248 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
249 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000250}
251
perkj71ee44c2016-06-15 00:47:53 -0700252TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
253 TestBitrateObserver bitrate_observer;
254 const uint32_t kMinSendBitrateBps = 100000;
255 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100256 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700257
philipelf69e7682018-02-28 13:06:28 +0100258 EXPECT_CALL(limit_observer_,
259 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
260 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200261 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
262 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100263 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700264 allocator_->RemoveObserver(&bitrate_observer);
265}
266
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000267class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
268 protected:
perkj71ee44c2016-06-15 00:47:53 -0700269 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100270 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800271 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000272 }
273 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200274 void AddObserver(BitrateAllocatorObserver* observer,
275 uint32_t min_bitrate_bps,
276 uint32_t max_bitrate_bps,
277 uint32_t pad_up_bitrate_bps,
278 bool enforce_min_bitrate,
279 std::string track_id,
280 double bitrate_priority) {
281 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100282 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100283 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200284 }
perkj71ee44c2016-06-15 00:47:53 -0700285 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100286 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000287};
288
mflodman101f2502016-06-09 17:21:19 +0200289// The following three tests verify enforcing a minimum bitrate works as
290// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000291TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
292 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700293 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
294 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200295 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100296 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200297 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
298 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200299 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000300
mflodman48a4beb2016-07-01 13:03:59 +0200301 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800302 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200303 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000304
mflodman48a4beb2016-07-01 13:03:59 +0200305 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800306 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200307 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000308
philipelf69e7682018-02-28 13:06:28 +0100309 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200310 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000311}
312
313TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
314 TestBitrateObserver bitrate_observer_1;
315 TestBitrateObserver bitrate_observer_2;
316 TestBitrateObserver bitrate_observer_3;
317 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200318 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
319 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700320 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100321
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200322 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
323 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700324 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200325 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100326
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200327 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
328 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700329 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200330 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
331 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000332
mflodman101f2502016-06-09 17:21:19 +0200333 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
334 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800335 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000336 // Verify that each observer gets its min rate (sum of min rates is 600000),
337 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100338 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200339 EXPECT_EQ(100000u + bitrate_to_share / 3,
340 bitrate_observer_1.last_bitrate_bps_);
341 EXPECT_EQ(200000u + bitrate_to_share / 3,
342 bitrate_observer_2.last_bitrate_bps_);
343 EXPECT_EQ(300000u + bitrate_to_share / 3,
344 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000345
mflodman101f2502016-06-09 17:21:19 +0200346 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800347 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200348 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
349 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200350 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200351
352 // Increased BWE, but still below the sum of configured min bitrates for all
353 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800354 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200355 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
356 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200357 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000358
mflodman101f2502016-06-09 17:21:19 +0200359 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800360 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200361 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
362 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
363 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000364
perkjec81bcd2016-05-11 06:01:13 -0700365 // Verify that zero estimated bandwidth, means that that all gets zero,
366 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800367 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200368 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
369 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
370 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700371
mflodman86aabb22016-03-11 15:44:32 +0100372 allocator_->RemoveObserver(&bitrate_observer_1);
373 allocator_->RemoveObserver(&bitrate_observer_2);
374 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000375}
376
mflodman48a4beb2016-07-01 13:03:59 +0200377TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100378 const uint32_t kMinBitrateBps = 100000;
379 const uint32_t kMaxBitrateBps = 400000;
380 // Hysteresis adds another 10% or 20kbps to min bitrate.
381 const uint32_t kMinStartBitrateBps =
382 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
383
mflodman48a4beb2016-07-01 13:03:59 +0200384 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
385 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100386 TestBitrateObserver bitrate_observer;
387 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
388 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200389 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200390 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
391
392 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800393 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200394 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
395
396 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100397 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100398 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100399 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Rasmus Brandt681de202019-02-04 15:09:34 +0100400 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800401 kDefaultProbingIntervalMs);
Rasmus Brandt681de202019-02-04 15:09:34 +0100402 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200403
404 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100405 // Limits changed, as we will video is now off and we need to pad up to the
406 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100407 // Verify the hysteresis is added for the protection.
408 const uint32_t kMinStartBitrateWithProtectionBps =
409 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
410 EXPECT_CALL(limit_observer_,
411 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
Rasmus Brandt681de202019-02-04 15:09:34 +0100412 kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100413 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800414 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200415 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
416
Erik Språngd1d7b232018-12-06 17:31:25 +0100417 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
418 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200419 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
420
421 // Just enough to enable video again.
Rasmus Brandt681de202019-02-04 15:09:34 +0100422 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100423 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
424 fraction_loss, kDefaultProbingIntervalMs);
425 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
426 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200427
428 // Remove all protection and make sure video is not paused as earlier.
429 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100430 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
431 kDefaultProbingIntervalMs);
432 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
433 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200434
Erik Språngd1d7b232018-12-06 17:31:25 +0100435 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
436 kDefaultProbingIntervalMs);
437 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200438
Erik Språngd1d7b232018-12-06 17:31:25 +0100439 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200440 allocator_->RemoveObserver(&bitrate_observer);
441}
442
Rasmus Brandt681de202019-02-04 15:09:34 +0100443TEST_F(BitrateAllocatorTest,
444 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
445 TestBitrateObserver bitrate_observer;
446
447 const uint32_t kMinBitrateBps = 100000;
448 const uint32_t kMaxBitrateBps = 400000;
449
450 // Register |bitrate_observer| and expect total allocation limits to change.
451 EXPECT_CALL(limit_observer_,
452 OnAllocationLimitsChanged(kMinBitrateBps, 0, kMaxBitrateBps))
453 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100454 MediaStreamAllocationConfig allocation_config = DefaultConfig();
455 allocation_config.min_bitrate_bps = kMinBitrateBps;
456 allocation_config.max_bitrate_bps = kMaxBitrateBps;
457 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100458
459 // Observer uses 20% of it's allocated bitrate for protection.
460 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
461 // Total allocation limits are unaffected by the protection rate change.
462 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
463 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
464
465 // Observer uses 0% of it's allocated bitrate for protection.
466 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
467 // Total allocation limits are unaffected by the protection rate change.
468 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
469 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
470
471 // Observer again uses 20% of it's allocated bitrate for protection.
472 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
473 // Total allocation limits are unaffected by the protection rate change.
474 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
475 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
476}
477
mflodman48a4beb2016-07-01 13:03:59 +0200478TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
479 TestBitrateObserver bitrate_observer_1;
480 TestBitrateObserver bitrate_observer_2;
481
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200482 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
483 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200484 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200485 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
486 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200487 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
488 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
489
490 // Enough bitrate for both.
491 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800492 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200493 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
494 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
495
496 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800497 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200498 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
499 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
500
minyue78b4d562016-11-30 04:47:39 -0800501 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200502 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
503 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
504
minyue78b4d562016-11-30 04:47:39 -0800505 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200506 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
507 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
508
minyue78b4d562016-11-30 04:47:39 -0800509 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200510 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
511 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
512
minyue78b4d562016-11-30 04:47:39 -0800513 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200514 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
515 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
516
517 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800518 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200519 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
520 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
521
minyue78b4d562016-11-30 04:47:39 -0800522 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200523 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
524 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
525
526 allocator_->RemoveObserver(&bitrate_observer_1);
527 allocator_->RemoveObserver(&bitrate_observer_2);
528}
529
mflodman101f2502016-06-09 17:21:19 +0200530TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000531 TestBitrateObserver bitrate_observer_1;
532 TestBitrateObserver bitrate_observer_2;
533 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100534
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200535 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
536 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700537 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
538
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200539 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
540 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700541 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200542 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100543
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200544 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
545 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200546 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
547 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
548 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000549
mflodman48a4beb2016-07-01 13:03:59 +0200550 // Low BWE. Verify that all observers still get their respective min
551 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800552 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200553 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
554 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
555 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000556
mflodman48a4beb2016-07-01 13:03:59 +0200557 allocator_->RemoveObserver(&bitrate_observer_1);
558 allocator_->RemoveObserver(&bitrate_observer_2);
559 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000560}
perkjfea93092016-05-14 00:58:48 -0700561
562TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
563 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100564 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700565
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200566 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
567 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700568 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700569
570 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800571 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700572
mflodman101f2502016-06-09 17:21:19 +0200573 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700574
575 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700576 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100577 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200578 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
579 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700580
581 // Expect the start_bitrate to be set as if the network was still up but that
582 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700583 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200584 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
585 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700586
587 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800588 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200589 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
590 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
591}
592
593TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
594 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200595 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
596 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200597 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200598
mflodman48a4beb2016-07-01 13:03:59 +0200599 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200600 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
601 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200602 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
603 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200604
minyue78b4d562016-11-30 04:47:39 -0800605 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200606 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
607 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200608
minyue78b4d562016-11-30 04:47:39 -0800609 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200610 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
611 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200612
minyue78b4d562016-11-30 04:47:39 -0800613 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200614 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
615 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200616
minyue78b4d562016-11-30 04:47:39 -0800617 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200618 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
619 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200620
minyue78b4d562016-11-30 04:47:39 -0800621 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200622 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
623 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200624
minyue78b4d562016-11-30 04:47:39 -0800625 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200626 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
627 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200628
minyue78b4d562016-11-30 04:47:39 -0800629 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200630 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
631 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200632
mflodman48a4beb2016-07-01 13:03:59 +0200633 allocator_->RemoveObserver(&enforced_observer);
634 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200635}
636
637TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
638 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200639 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200640 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200641
minyue78b4d562016-11-30 04:47:39 -0800642 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200643 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200644
minyue78b4d562016-11-30 04:47:39 -0800645 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200646 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200647
minyue78b4d562016-11-30 04:47:39 -0800648 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200649 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200650
minyue78b4d562016-11-30 04:47:39 -0800651 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200652 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200653
minyue78b4d562016-11-30 04:47:39 -0800654 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200655 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200656
minyue78b4d562016-11-30 04:47:39 -0800657 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200658 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200659
mflodman48a4beb2016-07-01 13:03:59 +0200660 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200661}
662
663TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
664 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200665 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200666 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200667
minyue78b4d562016-11-30 04:47:39 -0800668 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200669 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200670
minyue78b4d562016-11-30 04:47:39 -0800671 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200672 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200673
minyue78b4d562016-11-30 04:47:39 -0800674 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200675 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200676
minyue78b4d562016-11-30 04:47:39 -0800677 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200678 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200679
minyue78b4d562016-11-30 04:47:39 -0800680 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200681 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200682
minyue78b4d562016-11-30 04:47:39 -0800683 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200684 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200685
mflodman48a4beb2016-07-01 13:03:59 +0200686 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700687}
688
minyue78b4d562016-11-30 04:47:39 -0800689TEST_F(BitrateAllocatorTest, PassProbingInterval) {
690 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200691 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800692 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
693
694 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
695 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
696
697 allocator_->RemoveObserver(&observer);
698}
699
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800700TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
701 TestBitrateObserver observer;
702 const uint32_t kMinSendBitrateBps = 10;
703 const uint32_t kMaxSendBitrateBps = 60;
704 const uint32_t kNetworkBandwidthBps = 30;
705
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200706 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
707 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800708 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
709 kDefaultProbingIntervalMs);
710
711 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
712
713 allocator_->RemoveObserver(&observer);
714}
715
716// Tests that two observers with the same bitrate priority are allocated
717// their bitrate evenly.
718TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
719 TestBitrateObserver observer_low_1;
720 TestBitrateObserver observer_low_2;
721 const uint32_t kMinSendBitrateBps = 10;
722 const uint32_t kMaxSendBitrateBps = 60;
723 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200724 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
725 "low1", 2.0);
726 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
727 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800728 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
729 kDefaultProbingIntervalMs);
730
731 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
732 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
733
734 allocator_->RemoveObserver(&observer_low_1);
735 allocator_->RemoveObserver(&observer_low_2);
736}
737
738// Tests that there is no difference in functionality when the min bitrate is
739// enforced.
740TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
741 TestBitrateObserver observer_low_1;
742 TestBitrateObserver observer_low_2;
743 const uint32_t kMinSendBitrateBps = 0;
744 const uint32_t kMaxSendBitrateBps = 60;
745 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200746 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
747 "low1", 2.0);
748 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
749 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800750 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
751 kDefaultProbingIntervalMs);
752
753 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
754 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
755
756 allocator_->RemoveObserver(&observer_low_1);
757 allocator_->RemoveObserver(&observer_low_2);
758}
759
760// Tests that if the available bandwidth is the sum of the max bitrate
761// of all observers, they will be allocated their max.
762TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
763 TestBitrateObserver observer_low;
764 TestBitrateObserver observer_mid;
765 const uint32_t kMinSendBitrateBps = 0;
766 const uint32_t kMaxSendBitrateBps = 60;
767 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200768 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
769 "low", 2.0);
770 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
771 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800772 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
773 kDefaultProbingIntervalMs);
774
775 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
776 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
777
778 allocator_->RemoveObserver(&observer_low);
779 allocator_->RemoveObserver(&observer_mid);
780}
781
782// Tests that after a higher bitrate priority observer has been allocated its
783// max bitrate the lower priority observer will then be allocated the remaining
784// bitrate.
785TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
786 TestBitrateObserver observer_low;
787 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200788 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
789 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800790 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
791
792 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
793 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
794
795 allocator_->RemoveObserver(&observer_low);
796 allocator_->RemoveObserver(&observer_mid);
797}
798
799// Tests that three observers with three different bitrate priorities will all
800// be allocated bitrate according to their relative bitrate priority.
801TEST_F(BitrateAllocatorTest,
802 PriorityRateThreeObserversAllocatedRelativeAmounts) {
803 TestBitrateObserver observer_low;
804 TestBitrateObserver observer_mid;
805 TestBitrateObserver observer_high;
806 const uint32_t kMaxBitrate = 100;
807 // Not enough bandwidth to fill any observer's max bitrate.
808 const uint32_t kNetworkBandwidthBps = 70;
809 const double kLowBitratePriority = 2.0;
810 const double kMidBitratePriority = 4.0;
811 const double kHighBitratePriority = 8.0;
812 const double kTotalBitratePriority =
813 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200814 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
815 kLowBitratePriority);
816 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
817 kMidBitratePriority);
818 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
819 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800820 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
821 kDefaultProbingIntervalMs);
822
823 const double kLowFractionAllocated =
824 kLowBitratePriority / kTotalBitratePriority;
825 const double kMidFractionAllocated =
826 kMidBitratePriority / kTotalBitratePriority;
827 const double kHighFractionAllocated =
828 kHighBitratePriority / kTotalBitratePriority;
829 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
830 observer_low.last_bitrate_bps_);
831 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
832 observer_mid.last_bitrate_bps_);
833 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
834 observer_high.last_bitrate_bps_);
835
836 allocator_->RemoveObserver(&observer_low);
837 allocator_->RemoveObserver(&observer_mid);
838 allocator_->RemoveObserver(&observer_high);
839}
840
841// Tests that after the high priority observer has been allocated its maximum
842// bitrate, the other two observers are still allocated bitrate according to
843// their relative bitrate priority.
844TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
845 TestBitrateObserver observer_low;
846 const double kLowBitratePriority = 2.0;
847 TestBitrateObserver observer_mid;
848 const double kMidBitratePriority = 4.0;
849 TestBitrateObserver observer_high;
850 const double kHighBitratePriority = 8.0;
851
852 const uint32_t kAvailableBitrate = 90;
853 const uint32_t kMaxBitrate = 40;
854 const uint32_t kMinBitrate = 10;
855 // Remaining bitrate after allocating to all mins and knowing that the high
856 // priority observer will have its max bitrate allocated.
857 const uint32_t kRemainingBitrate =
858 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
859
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200860 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
861 kLowBitratePriority);
862 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
863 kMidBitratePriority);
864 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
865 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800866 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
867 kDefaultProbingIntervalMs);
868
869 const double kLowFractionAllocated =
870 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
871 const double kMidFractionAllocated =
872 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
873 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
874 observer_low.last_bitrate_bps_);
875 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
876 observer_mid.last_bitrate_bps_);
877 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
878
879 allocator_->RemoveObserver(&observer_low);
880 allocator_->RemoveObserver(&observer_mid);
881 allocator_->RemoveObserver(&observer_high);
882}
883
884// Tests that after the low priority observer has been allocated its maximum
885// bitrate, the other two observers are still allocated bitrate according to
886// their relative bitrate priority.
887TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
888 TestBitrateObserver observer_low;
889 const double kLowBitratePriority = 2.0;
890 const uint32_t kLowMaxBitrate = 10;
891 TestBitrateObserver observer_mid;
892 const double kMidBitratePriority = 4.0;
893 TestBitrateObserver observer_high;
894 const double kHighBitratePriority = 8.0;
895
896 const uint32_t kMinBitrate = 0;
897 const uint32_t kMaxBitrate = 60;
898 const uint32_t kAvailableBitrate = 100;
899 // Remaining bitrate knowing that the low priority observer is allocated its
900 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
901 // available bitrate, so 70 bps would be sufficient network bandwidth.
902 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
903
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200904 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
905 kLowBitratePriority);
906 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
907 kMidBitratePriority);
908 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
909 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800910 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
911 kDefaultProbingIntervalMs);
912
913 const double kMidFractionAllocated =
914 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
915 const double kHighFractionAllocated =
916 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
917 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
918 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
919 observer_mid.last_bitrate_bps_);
920 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
921 observer_high.last_bitrate_bps_);
922
923 allocator_->RemoveObserver(&observer_low);
924 allocator_->RemoveObserver(&observer_mid);
925 allocator_->RemoveObserver(&observer_high);
926}
927
928// Tests that after two observers are allocated bitrate to their max, the
929// the remaining observer is allocated what's left appropriately. This test
930// handles an edge case where the medium and high observer reach their
931// "relative" max allocation at the same time. The high has 40 to allocate
932// above its min, and the mid has 20 to allocate above its min, which scaled
933// by their bitrate priority is the same for each.
934TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
935 TestBitrateObserver observer_low;
936 TestBitrateObserver observer_mid;
937 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200938 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800939 // Scaled allocation above the min allocation is the same for these two,
940 // meaning they will get allocated their max at the same time.
941 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200942 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
943 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800944 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
945
946 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
947 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
948 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
949
950 allocator_->RemoveObserver(&observer_low);
951 allocator_->RemoveObserver(&observer_mid);
952 allocator_->RemoveObserver(&observer_high);
953}
954
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000955} // namespace webrtc