blob: 6857d22d82421d0fb9f8221f7876d09100cbd228 [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/bitrate_allocator.h"
12
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080014#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000015#include <vector>
16
Sebastian Jansson4ad51d82019-06-11 11:24:40 +020017#include "system_wrappers/include/clock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gmock.h"
19#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000020
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080021using ::testing::_;
Rasmus Brandt681de202019-02-04 15:09:34 +010022using ::testing::NiceMock;
perkj71ee44c2016-06-15 00:47:53 -070023
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000024namespace webrtc {
Sebastian Janssonfe617a32018-03-21 12:45:20 +010025// Emulating old interface for test suite compatibility.
26// TODO(srte): Update tests to reflect new interface.
27class LimitObserverWrapper : public BitrateAllocator::LimitObserver {
28 public:
Sebastian Janssonfe617a32018-03-21 12:45:20 +010029 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
30 uint32_t max_padding_bitrate_bps,
31 uint32_t total_bitrate_bps) = 0;
32};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000033
Sebastian Janssonfe617a32018-03-21 12:45:20 +010034class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070035 public:
philipelf69e7682018-02-28 13:06:28 +010036 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070037 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010038 uint32_t max_padding_bitrate_bps,
39 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070040};
41
mflodman86aabb22016-03-11 15:44:32 +010042class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 public:
44 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020045 : last_bitrate_bps_(0),
46 last_fraction_loss_(0),
47 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080048 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020049 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050
mflodman48a4beb2016-07-01 13:03:59 +020051 void SetBitrateProtectionRatio(double protection_ratio) {
52 protection_ratio_ = protection_ratio;
53 }
54
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020055 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010056 last_bitrate_bps_ = update.target_bitrate.bps();
57 last_fraction_loss_ =
58 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
59 last_rtt_ms_ = update.round_trip_time.ms();
60 last_probing_interval_ms_ = update.bwe_period.ms();
61 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000062 }
mflodman101f2502016-06-09 17:21:19 +020063 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000064 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020065 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080066 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020067 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068};
69
Sebastian Jansson89c94b92018-11-20 17:16:36 +010070class BitrateAllocatorForTest : public BitrateAllocator {
71 public:
72 using BitrateAllocator::BitrateAllocator;
73 void OnNetworkChanged(uint32_t target_bitrate_bps,
74 uint8_t fraction_loss,
75 int64_t rtt,
76 int64_t bwe_period_ms) {
77 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
Florent Castelli4e615d52019-08-22 16:09:06 +020078 target_bitrate_bps, fraction_loss, rtt,
79 bwe_period_ms);
Sebastian Jansson89c94b92018-11-20 17:16:36 +010080 }
81};
82
minyue78b4d562016-11-30 04:47:39 -080083namespace {
84constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080085const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020086} // namespace
minyue78b4d562016-11-30 04:47:39 -080087
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000088class BitrateAllocatorTest : public ::testing::Test {
89 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010090 BitrateAllocatorTest()
Sebastian Janssonda6806c2019-03-04 17:05:12 +010091 : allocator_(new BitrateAllocatorForTest(Clock::GetRealTimeClock(),
92 &limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080093 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010094 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000095 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020096 void AddObserver(BitrateAllocatorObserver* observer,
97 uint32_t min_bitrate_bps,
98 uint32_t max_bitrate_bps,
99 uint32_t pad_up_bitrate_bps,
100 bool enforce_min_bitrate,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200101 double bitrate_priority) {
102 allocator_->AddObserver(
Jonas Olsson0182a032019-07-09 12:31:20 +0200103 observer,
104 {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
105 /* priority_bitrate */ 0, enforce_min_bitrate, bitrate_priority});
Sebastian Jansson464a5572019-02-12 13:32:32 +0100106 }
107 MediaStreamAllocationConfig DefaultConfig() const {
108 MediaStreamAllocationConfig default_config;
109 default_config.min_bitrate_bps = 0;
110 default_config.max_bitrate_bps = 1500000;
111 default_config.pad_up_bitrate_bps = 0;
112 default_config.priority_bitrate_bps = 0;
113 default_config.enforce_min_bitrate = true;
Sebastian Jansson464a5572019-02-12 13:32:32 +0100114 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200167 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, _));
Jonas Olsson0182a032019-07-09 12:31:20 +0200180 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200181 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200187 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200206 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200213 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200262 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200284 enforce_min_bitrate, 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
Jonas Olsson0182a032019-07-09 12:31:20 +0200536 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200537 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700538 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
539
Jonas Olsson0182a032019-07-09 12:31:20 +0200540 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200541 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
Jonas Olsson0182a032019-07-09 12:31:20 +0200545 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200546 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
Jonas Olsson0182a032019-07-09 12:31:20 +0200567 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200568 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, _));
Jonas Olsson0182a032019-07-09 12:31:20 +0200579 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200580 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;
Jonas Olsson0182a032019-07-09 12:31:20 +0200596 AddObserver(&enforced_observer, 6000, 30000, 0, true,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200597 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;
Jonas Olsson0182a032019-07-09 12:31:20 +0200601 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200602 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;
Jonas Olsson0182a032019-07-09 12:31:20 +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;
Jonas Olsson0182a032019-07-09 12:31:20 +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;
Jonas Olsson0182a032019-07-09 12:31:20 +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
Jonas Olsson0182a032019-07-09 12:31:20 +0200707 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200725 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200726 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
Jonas Olsson0182a032019-07-09 12:31:20 +0200727 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200747 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200748 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200749 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,
Jonas Olsson0182a032019-07-09 12:31:20 +0200769 2.0);
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200770 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
Jonas Olsson0182a032019-07-09 12:31:20 +0200771 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;
Jonas Olsson0182a032019-07-09 12:31:20 +0200788 AddObserver(&observer_low, 10, 50, 0, false, 2.0);
789 AddObserver(&observer_mid, 10, 50, 0, false, 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;
Jonas Olsson0182a032019-07-09 12:31:20 +0200814 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, kLowBitratePriority);
815 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, kMidBitratePriority);
816 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800817 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
818 kDefaultProbingIntervalMs);
819
820 const double kLowFractionAllocated =
821 kLowBitratePriority / kTotalBitratePriority;
822 const double kMidFractionAllocated =
823 kMidBitratePriority / kTotalBitratePriority;
824 const double kHighFractionAllocated =
825 kHighBitratePriority / kTotalBitratePriority;
826 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
827 observer_low.last_bitrate_bps_);
828 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
829 observer_mid.last_bitrate_bps_);
830 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
831 observer_high.last_bitrate_bps_);
832
833 allocator_->RemoveObserver(&observer_low);
834 allocator_->RemoveObserver(&observer_mid);
835 allocator_->RemoveObserver(&observer_high);
836}
837
838// Tests that after the high priority observer has been allocated its maximum
839// bitrate, the other two observers are still allocated bitrate according to
840// their relative bitrate priority.
841TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
842 TestBitrateObserver observer_low;
843 const double kLowBitratePriority = 2.0;
844 TestBitrateObserver observer_mid;
845 const double kMidBitratePriority = 4.0;
846 TestBitrateObserver observer_high;
847 const double kHighBitratePriority = 8.0;
848
849 const uint32_t kAvailableBitrate = 90;
850 const uint32_t kMaxBitrate = 40;
851 const uint32_t kMinBitrate = 10;
852 // Remaining bitrate after allocating to all mins and knowing that the high
853 // priority observer will have its max bitrate allocated.
854 const uint32_t kRemainingBitrate =
855 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
856
Jonas Olsson0182a032019-07-09 12:31:20 +0200857 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200858 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200859 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200860 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200861 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200862 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800863 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
864 kDefaultProbingIntervalMs);
865
866 const double kLowFractionAllocated =
867 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
868 const double kMidFractionAllocated =
869 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
870 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
871 observer_low.last_bitrate_bps_);
872 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
873 observer_mid.last_bitrate_bps_);
874 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
875
876 allocator_->RemoveObserver(&observer_low);
877 allocator_->RemoveObserver(&observer_mid);
878 allocator_->RemoveObserver(&observer_high);
879}
880
881// Tests that after the low priority observer has been allocated its maximum
882// bitrate, the other two observers are still allocated bitrate according to
883// their relative bitrate priority.
884TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
885 TestBitrateObserver observer_low;
886 const double kLowBitratePriority = 2.0;
887 const uint32_t kLowMaxBitrate = 10;
888 TestBitrateObserver observer_mid;
889 const double kMidBitratePriority = 4.0;
890 TestBitrateObserver observer_high;
891 const double kHighBitratePriority = 8.0;
892
893 const uint32_t kMinBitrate = 0;
894 const uint32_t kMaxBitrate = 60;
895 const uint32_t kAvailableBitrate = 100;
896 // Remaining bitrate knowing that the low priority observer is allocated its
897 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
898 // available bitrate, so 70 bps would be sufficient network bandwidth.
899 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
900
Jonas Olsson0182a032019-07-09 12:31:20 +0200901 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200902 kLowBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200903 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200904 kMidBitratePriority);
Jonas Olsson0182a032019-07-09 12:31:20 +0200905 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200906 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800907 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
908 kDefaultProbingIntervalMs);
909
910 const double kMidFractionAllocated =
911 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
912 const double kHighFractionAllocated =
913 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
914 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
915 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
916 observer_mid.last_bitrate_bps_);
917 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
918 observer_high.last_bitrate_bps_);
919
920 allocator_->RemoveObserver(&observer_low);
921 allocator_->RemoveObserver(&observer_mid);
922 allocator_->RemoveObserver(&observer_high);
923}
924
925// Tests that after two observers are allocated bitrate to their max, the
926// the remaining observer is allocated what's left appropriately. This test
927// handles an edge case where the medium and high observer reach their
928// "relative" max allocation at the same time. The high has 40 to allocate
929// above its min, and the mid has 20 to allocate above its min, which scaled
930// by their bitrate priority is the same for each.
931TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
932 TestBitrateObserver observer_low;
933 TestBitrateObserver observer_mid;
934 TestBitrateObserver observer_high;
Jonas Olsson0182a032019-07-09 12:31:20 +0200935 AddObserver(&observer_low, 10, 40, 0, false, 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800936 // Scaled allocation above the min allocation is the same for these two,
937 // meaning they will get allocated their max at the same time.
938 // Scaled (target allocation) = (max - min) / bitrate priority
Jonas Olsson0182a032019-07-09 12:31:20 +0200939 AddObserver(&observer_mid, 10, 30, 0, false, 4.0);
940 AddObserver(&observer_high, 10, 50, 0, false, 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800941 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
942
943 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
944 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
945 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
946
947 allocator_->RemoveObserver(&observer_low);
948 allocator_->RemoveObserver(&observer_mid);
949 allocator_->RemoveObserver(&observer_high);
950}
951
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000952} // namespace webrtc