blob: 56344ac0b9d0f793121ad4e6617a5c407611a53c [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;
perkj71ee44c2016-06-15 00:47:53 -070022
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000023namespace webrtc {
Sebastian Janssonfe617a32018-03-21 12:45:20 +010024// Emulating old interface for test suite compatibility.
25// TODO(srte): Update tests to reflect new interface.
26class LimitObserverWrapper : public BitrateAllocator::LimitObserver {
27 public:
Sebastian Janssonfe617a32018-03-21 12:45:20 +010028 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
29 uint32_t max_padding_bitrate_bps,
30 uint32_t total_bitrate_bps) = 0;
31};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000032
Sebastian Janssonfe617a32018-03-21 12:45:20 +010033class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070034 public:
philipelf69e7682018-02-28 13:06:28 +010035 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070036 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010037 uint32_t max_padding_bitrate_bps,
38 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070039};
40
mflodman86aabb22016-03-11 15:44:32 +010041class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000042 public:
43 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020044 : last_bitrate_bps_(0),
45 last_fraction_loss_(0),
46 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080047 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020048 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000049
mflodman48a4beb2016-07-01 13:03:59 +020050 void SetBitrateProtectionRatio(double protection_ratio) {
51 protection_ratio_ = protection_ratio;
52 }
53
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020054 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010055 last_bitrate_bps_ = update.target_bitrate.bps();
56 last_fraction_loss_ =
57 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
58 last_rtt_ms_ = update.round_trip_time.ms();
59 last_probing_interval_ms_ = update.bwe_period.ms();
60 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000061 }
mflodman101f2502016-06-09 17:21:19 +020062 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000063 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020064 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080065 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020066 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000067};
68
Sebastian Jansson89c94b92018-11-20 17:16:36 +010069class BitrateAllocatorForTest : public BitrateAllocator {
70 public:
71 using BitrateAllocator::BitrateAllocator;
72 void OnNetworkChanged(uint32_t target_bitrate_bps,
73 uint8_t fraction_loss,
74 int64_t rtt,
75 int64_t bwe_period_ms) {
76 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
77 fraction_loss, rtt, bwe_period_ms);
78 }
79};
80
minyue78b4d562016-11-30 04:47:39 -080081namespace {
82constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080083const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020084} // namespace
minyue78b4d562016-11-30 04:47:39 -080085
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000086class BitrateAllocatorTest : public ::testing::Test {
87 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010088 BitrateAllocatorTest()
Sebastian Janssonda6806c2019-03-04 17:05:12 +010089 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
90 &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 Janssonda6806c2019-03-04 17:05:12 +0100270 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
271 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800272 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000273 }
274 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200275 void AddObserver(BitrateAllocatorObserver* observer,
276 uint32_t min_bitrate_bps,
277 uint32_t max_bitrate_bps,
278 uint32_t pad_up_bitrate_bps,
279 bool enforce_min_bitrate,
280 std::string track_id,
281 double bitrate_priority) {
282 allocator_->AddObserver(
Sebastian Jansson464a5572019-02-12 13:32:32 +0100283 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps, 0,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100284 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200285 }
perkj71ee44c2016-06-15 00:47:53 -0700286 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100287 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000288};
289
mflodman101f2502016-06-09 17:21:19 +0200290// The following three tests verify enforcing a minimum bitrate works as
291// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000292TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
293 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700294 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
295 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200296 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100297 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200298 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
299 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200300 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000301
mflodman48a4beb2016-07-01 13:03:59 +0200302 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800303 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200304 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000305
mflodman48a4beb2016-07-01 13:03:59 +0200306 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800307 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200308 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000309
philipelf69e7682018-02-28 13:06:28 +0100310 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200311 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000312}
313
314TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
315 TestBitrateObserver bitrate_observer_1;
316 TestBitrateObserver bitrate_observer_2;
317 TestBitrateObserver bitrate_observer_3;
318 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200319 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
320 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700321 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100322
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200323 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
324 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700325 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200326 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100327
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200328 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
329 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700330 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200331 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
332 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000333
mflodman101f2502016-06-09 17:21:19 +0200334 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
335 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800336 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000337 // Verify that each observer gets its min rate (sum of min rates is 600000),
338 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100339 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200340 EXPECT_EQ(100000u + bitrate_to_share / 3,
341 bitrate_observer_1.last_bitrate_bps_);
342 EXPECT_EQ(200000u + bitrate_to_share / 3,
343 bitrate_observer_2.last_bitrate_bps_);
344 EXPECT_EQ(300000u + bitrate_to_share / 3,
345 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000346
mflodman101f2502016-06-09 17:21:19 +0200347 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800348 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200349 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
350 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200351 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200352
353 // Increased BWE, but still below the sum of configured min bitrates for all
354 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800355 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200356 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
357 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200358 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000359
mflodman101f2502016-06-09 17:21:19 +0200360 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800361 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200362 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
363 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
364 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000365
perkjec81bcd2016-05-11 06:01:13 -0700366 // Verify that zero estimated bandwidth, means that that all gets zero,
367 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800368 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200369 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
370 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
371 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700372
mflodman86aabb22016-03-11 15:44:32 +0100373 allocator_->RemoveObserver(&bitrate_observer_1);
374 allocator_->RemoveObserver(&bitrate_observer_2);
375 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000376}
377
mflodman48a4beb2016-07-01 13:03:59 +0200378TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100379 const uint32_t kMinBitrateBps = 100000;
380 const uint32_t kMaxBitrateBps = 400000;
381 // Hysteresis adds another 10% or 20kbps to min bitrate.
382 const uint32_t kMinStartBitrateBps =
383 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
384
mflodman48a4beb2016-07-01 13:03:59 +0200385 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
386 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100387 TestBitrateObserver bitrate_observer;
388 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
389 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200390 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200391 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
392
393 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800394 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200395 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
396
397 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100398 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100399 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100400 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Rasmus Brandt681de202019-02-04 15:09:34 +0100401 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800402 kDefaultProbingIntervalMs);
Rasmus Brandt681de202019-02-04 15:09:34 +0100403 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200404
405 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100406 // Limits changed, as we will video is now off and we need to pad up to the
407 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100408 // Verify the hysteresis is added for the protection.
409 const uint32_t kMinStartBitrateWithProtectionBps =
410 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
411 EXPECT_CALL(limit_observer_,
412 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
Rasmus Brandt681de202019-02-04 15:09:34 +0100413 kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100414 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800415 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200416 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
417
Erik Språngd1d7b232018-12-06 17:31:25 +0100418 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
419 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200420 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
421
422 // Just enough to enable video again.
Rasmus Brandt681de202019-02-04 15:09:34 +0100423 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100424 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
425 fraction_loss, kDefaultProbingIntervalMs);
426 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
427 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200428
429 // Remove all protection and make sure video is not paused as earlier.
430 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100431 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
432 kDefaultProbingIntervalMs);
433 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
434 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200435
Erik Språngd1d7b232018-12-06 17:31:25 +0100436 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
437 kDefaultProbingIntervalMs);
438 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200439
Erik Språngd1d7b232018-12-06 17:31:25 +0100440 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200441 allocator_->RemoveObserver(&bitrate_observer);
442}
443
Rasmus Brandt681de202019-02-04 15:09:34 +0100444TEST_F(BitrateAllocatorTest,
445 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
446 TestBitrateObserver bitrate_observer;
447
448 const uint32_t kMinBitrateBps = 100000;
449 const uint32_t kMaxBitrateBps = 400000;
450
451 // Register |bitrate_observer| and expect total allocation limits to change.
452 EXPECT_CALL(limit_observer_,
453 OnAllocationLimitsChanged(kMinBitrateBps, 0, kMaxBitrateBps))
454 .Times(1);
Sebastian Jansson464a5572019-02-12 13:32:32 +0100455 MediaStreamAllocationConfig allocation_config = DefaultConfig();
456 allocation_config.min_bitrate_bps = kMinBitrateBps;
457 allocation_config.max_bitrate_bps = kMaxBitrateBps;
458 allocator_->AddObserver(&bitrate_observer, allocation_config);
Rasmus Brandt681de202019-02-04 15:09:34 +0100459
460 // Observer uses 20% of it's allocated bitrate for protection.
461 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
462 // Total allocation limits are unaffected by the protection rate change.
463 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
464 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
465
466 // Observer uses 0% of it's allocated bitrate for protection.
467 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
468 // Total allocation limits are unaffected by the protection rate change.
469 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
470 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
471
472 // Observer again uses 20% of it's allocated bitrate for protection.
473 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
474 // Total allocation limits are unaffected by the protection rate change.
475 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
476 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
477}
478
mflodman48a4beb2016-07-01 13:03:59 +0200479TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
480 TestBitrateObserver bitrate_observer_1;
481 TestBitrateObserver bitrate_observer_2;
482
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200483 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
484 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200485 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200486 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
487 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200488 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
489 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
490
491 // Enough bitrate for both.
492 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800493 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200494 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
495 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
496
497 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800498 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200499 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
500 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
501
minyue78b4d562016-11-30 04:47:39 -0800502 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200503 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
504 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
505
minyue78b4d562016-11-30 04:47:39 -0800506 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200507 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
508 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
509
minyue78b4d562016-11-30 04:47:39 -0800510 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200511 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
512 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
513
minyue78b4d562016-11-30 04:47:39 -0800514 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200515 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
516 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
517
518 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800519 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200520 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
521 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
522
minyue78b4d562016-11-30 04:47:39 -0800523 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200524 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
525 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
526
527 allocator_->RemoveObserver(&bitrate_observer_1);
528 allocator_->RemoveObserver(&bitrate_observer_2);
529}
530
mflodman101f2502016-06-09 17:21:19 +0200531TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000532 TestBitrateObserver bitrate_observer_1;
533 TestBitrateObserver bitrate_observer_2;
534 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100535
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200536 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
537 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700538 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
539
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200540 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
541 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700542 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200543 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100544
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200545 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
546 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200547 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
548 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
549 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000550
mflodman48a4beb2016-07-01 13:03:59 +0200551 // Low BWE. Verify that all observers still get their respective min
552 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800553 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200554 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
555 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
556 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000557
mflodman48a4beb2016-07-01 13:03:59 +0200558 allocator_->RemoveObserver(&bitrate_observer_1);
559 allocator_->RemoveObserver(&bitrate_observer_2);
560 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000561}
perkjfea93092016-05-14 00:58:48 -0700562
563TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
564 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100565 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700566
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200567 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
568 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700569 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700570
571 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800572 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700573
mflodman101f2502016-06-09 17:21:19 +0200574 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700575
576 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700577 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100578 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200579 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
580 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700581
582 // Expect the start_bitrate to be set as if the network was still up but that
583 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700584 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200585 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
586 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700587
588 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800589 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200590 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
591 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
592}
593
594TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
595 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200596 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
597 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200598 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200599
mflodman48a4beb2016-07-01 13:03:59 +0200600 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200601 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
602 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200603 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
604 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200605
minyue78b4d562016-11-30 04:47:39 -0800606 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200607 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
608 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200609
minyue78b4d562016-11-30 04:47:39 -0800610 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200611 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
612 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200613
minyue78b4d562016-11-30 04:47:39 -0800614 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200615 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
616 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200617
minyue78b4d562016-11-30 04:47:39 -0800618 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200619 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
620 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200621
minyue78b4d562016-11-30 04:47:39 -0800622 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200623 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
624 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200625
minyue78b4d562016-11-30 04:47:39 -0800626 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200627 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
628 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200629
minyue78b4d562016-11-30 04:47:39 -0800630 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200631 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
632 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200633
mflodman48a4beb2016-07-01 13:03:59 +0200634 allocator_->RemoveObserver(&enforced_observer);
635 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200636}
637
638TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
639 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200640 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200641 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200642
minyue78b4d562016-11-30 04:47:39 -0800643 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200644 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200645
minyue78b4d562016-11-30 04:47:39 -0800646 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200647 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200648
minyue78b4d562016-11-30 04:47:39 -0800649 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200650 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200651
minyue78b4d562016-11-30 04:47:39 -0800652 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200653 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200654
minyue78b4d562016-11-30 04:47:39 -0800655 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200656 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200657
minyue78b4d562016-11-30 04:47:39 -0800658 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200659 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200660
mflodman48a4beb2016-07-01 13:03:59 +0200661 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200662}
663
664TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
665 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200666 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200667 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200668
minyue78b4d562016-11-30 04:47:39 -0800669 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200670 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200671
minyue78b4d562016-11-30 04:47:39 -0800672 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200673 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200674
minyue78b4d562016-11-30 04:47:39 -0800675 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200676 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200677
minyue78b4d562016-11-30 04:47:39 -0800678 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200679 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200680
minyue78b4d562016-11-30 04:47:39 -0800681 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200682 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200683
minyue78b4d562016-11-30 04:47:39 -0800684 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200685 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200686
mflodman48a4beb2016-07-01 13:03:59 +0200687 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700688}
689
minyue78b4d562016-11-30 04:47:39 -0800690TEST_F(BitrateAllocatorTest, PassProbingInterval) {
691 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200692 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800693 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
694
695 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
696 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
697
698 allocator_->RemoveObserver(&observer);
699}
700
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800701TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
702 TestBitrateObserver observer;
703 const uint32_t kMinSendBitrateBps = 10;
704 const uint32_t kMaxSendBitrateBps = 60;
705 const uint32_t kNetworkBandwidthBps = 30;
706
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200707 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
708 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800709 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
710 kDefaultProbingIntervalMs);
711
712 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
713
714 allocator_->RemoveObserver(&observer);
715}
716
717// Tests that two observers with the same bitrate priority are allocated
718// their bitrate evenly.
719TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
720 TestBitrateObserver observer_low_1;
721 TestBitrateObserver observer_low_2;
722 const uint32_t kMinSendBitrateBps = 10;
723 const uint32_t kMaxSendBitrateBps = 60;
724 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200725 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
726 "low1", 2.0);
727 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
728 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800729 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
730 kDefaultProbingIntervalMs);
731
732 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
733 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
734
735 allocator_->RemoveObserver(&observer_low_1);
736 allocator_->RemoveObserver(&observer_low_2);
737}
738
739// Tests that there is no difference in functionality when the min bitrate is
740// enforced.
741TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
742 TestBitrateObserver observer_low_1;
743 TestBitrateObserver observer_low_2;
744 const uint32_t kMinSendBitrateBps = 0;
745 const uint32_t kMaxSendBitrateBps = 60;
746 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200747 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
748 "low1", 2.0);
749 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
750 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800751 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
752 kDefaultProbingIntervalMs);
753
754 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
755 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
756
757 allocator_->RemoveObserver(&observer_low_1);
758 allocator_->RemoveObserver(&observer_low_2);
759}
760
761// Tests that if the available bandwidth is the sum of the max bitrate
762// of all observers, they will be allocated their max.
763TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
764 TestBitrateObserver observer_low;
765 TestBitrateObserver observer_mid;
766 const uint32_t kMinSendBitrateBps = 0;
767 const uint32_t kMaxSendBitrateBps = 60;
768 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200769 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
770 "low", 2.0);
771 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
772 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800773 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
774 kDefaultProbingIntervalMs);
775
776 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
777 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
778
779 allocator_->RemoveObserver(&observer_low);
780 allocator_->RemoveObserver(&observer_mid);
781}
782
783// Tests that after a higher bitrate priority observer has been allocated its
784// max bitrate the lower priority observer will then be allocated the remaining
785// bitrate.
786TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
787 TestBitrateObserver observer_low;
788 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200789 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
790 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800791 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
792
793 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
794 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
795
796 allocator_->RemoveObserver(&observer_low);
797 allocator_->RemoveObserver(&observer_mid);
798}
799
800// Tests that three observers with three different bitrate priorities will all
801// be allocated bitrate according to their relative bitrate priority.
802TEST_F(BitrateAllocatorTest,
803 PriorityRateThreeObserversAllocatedRelativeAmounts) {
804 TestBitrateObserver observer_low;
805 TestBitrateObserver observer_mid;
806 TestBitrateObserver observer_high;
807 const uint32_t kMaxBitrate = 100;
808 // Not enough bandwidth to fill any observer's max bitrate.
809 const uint32_t kNetworkBandwidthBps = 70;
810 const double kLowBitratePriority = 2.0;
811 const double kMidBitratePriority = 4.0;
812 const double kHighBitratePriority = 8.0;
813 const double kTotalBitratePriority =
814 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200815 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
816 kLowBitratePriority);
817 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
818 kMidBitratePriority);
819 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
820 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800821 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
822 kDefaultProbingIntervalMs);
823
824 const double kLowFractionAllocated =
825 kLowBitratePriority / kTotalBitratePriority;
826 const double kMidFractionAllocated =
827 kMidBitratePriority / kTotalBitratePriority;
828 const double kHighFractionAllocated =
829 kHighBitratePriority / kTotalBitratePriority;
830 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
831 observer_low.last_bitrate_bps_);
832 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
833 observer_mid.last_bitrate_bps_);
834 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
835 observer_high.last_bitrate_bps_);
836
837 allocator_->RemoveObserver(&observer_low);
838 allocator_->RemoveObserver(&observer_mid);
839 allocator_->RemoveObserver(&observer_high);
840}
841
842// Tests that after the high priority observer has been allocated its maximum
843// bitrate, the other two observers are still allocated bitrate according to
844// their relative bitrate priority.
845TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
846 TestBitrateObserver observer_low;
847 const double kLowBitratePriority = 2.0;
848 TestBitrateObserver observer_mid;
849 const double kMidBitratePriority = 4.0;
850 TestBitrateObserver observer_high;
851 const double kHighBitratePriority = 8.0;
852
853 const uint32_t kAvailableBitrate = 90;
854 const uint32_t kMaxBitrate = 40;
855 const uint32_t kMinBitrate = 10;
856 // Remaining bitrate after allocating to all mins and knowing that the high
857 // priority observer will have its max bitrate allocated.
858 const uint32_t kRemainingBitrate =
859 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
860
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200861 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
862 kLowBitratePriority);
863 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
864 kMidBitratePriority);
865 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
866 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800867 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
868 kDefaultProbingIntervalMs);
869
870 const double kLowFractionAllocated =
871 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
872 const double kMidFractionAllocated =
873 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
874 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
875 observer_low.last_bitrate_bps_);
876 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
877 observer_mid.last_bitrate_bps_);
878 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
879
880 allocator_->RemoveObserver(&observer_low);
881 allocator_->RemoveObserver(&observer_mid);
882 allocator_->RemoveObserver(&observer_high);
883}
884
885// Tests that after the low priority observer has been allocated its maximum
886// bitrate, the other two observers are still allocated bitrate according to
887// their relative bitrate priority.
888TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
889 TestBitrateObserver observer_low;
890 const double kLowBitratePriority = 2.0;
891 const uint32_t kLowMaxBitrate = 10;
892 TestBitrateObserver observer_mid;
893 const double kMidBitratePriority = 4.0;
894 TestBitrateObserver observer_high;
895 const double kHighBitratePriority = 8.0;
896
897 const uint32_t kMinBitrate = 0;
898 const uint32_t kMaxBitrate = 60;
899 const uint32_t kAvailableBitrate = 100;
900 // Remaining bitrate knowing that the low priority observer is allocated its
901 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
902 // available bitrate, so 70 bps would be sufficient network bandwidth.
903 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
904
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200905 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
906 kLowBitratePriority);
907 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
908 kMidBitratePriority);
909 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
910 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800911 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
912 kDefaultProbingIntervalMs);
913
914 const double kMidFractionAllocated =
915 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
916 const double kHighFractionAllocated =
917 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
918 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
919 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
920 observer_mid.last_bitrate_bps_);
921 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
922 observer_high.last_bitrate_bps_);
923
924 allocator_->RemoveObserver(&observer_low);
925 allocator_->RemoveObserver(&observer_mid);
926 allocator_->RemoveObserver(&observer_high);
927}
928
929// Tests that after two observers are allocated bitrate to their max, the
930// the remaining observer is allocated what's left appropriately. This test
931// handles an edge case where the medium and high observer reach their
932// "relative" max allocation at the same time. The high has 40 to allocate
933// above its min, and the mid has 20 to allocate above its min, which scaled
934// by their bitrate priority is the same for each.
935TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
936 TestBitrateObserver observer_low;
937 TestBitrateObserver observer_mid;
938 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200939 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800940 // Scaled allocation above the min allocation is the same for these two,
941 // meaning they will get allocated their max at the same time.
942 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200943 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
944 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800945 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
946
947 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
948 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
949 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
950
951 allocator_->RemoveObserver(&observer_low);
952 allocator_->RemoveObserver(&observer_mid);
953 allocator_->RemoveObserver(&observer_high);
954}
955
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000956} // namespace webrtc