blob: 9956a88d71a9d204df633f56a35128634eb732a9 [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080012#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <vector>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "call/bitrate_allocator.h"
16#include "modules/bitrate_controller/include/bitrate_controller.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000019
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080020using ::testing::_;
Rasmus Brandt681de202019-02-04 15:09:34 +010021using ::testing::NiceMock;
22using ::testing::StrictMock;
perkj71ee44c2016-06-15 00:47:53 -070023
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000024namespace webrtc {
Sebastian Janssonfe617a32018-03-21 12:45:20 +010025// Emulating old interface for test suite compatibility.
26// TODO(srte): Update tests to reflect new interface.
27class LimitObserverWrapper : public BitrateAllocator::LimitObserver {
28 public:
Sebastian Janssonfe617a32018-03-21 12:45:20 +010029 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
30 uint32_t max_padding_bitrate_bps,
31 uint32_t total_bitrate_bps) = 0;
32};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000033
Sebastian Janssonfe617a32018-03-21 12:45:20 +010034class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070035 public:
philipelf69e7682018-02-28 13:06:28 +010036 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070037 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010038 uint32_t max_padding_bitrate_bps,
39 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070040};
41
mflodman86aabb22016-03-11 15:44:32 +010042class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 public:
44 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020045 : last_bitrate_bps_(0),
46 last_fraction_loss_(0),
47 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080048 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020049 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050
mflodman48a4beb2016-07-01 13:03:59 +020051 void SetBitrateProtectionRatio(double protection_ratio) {
52 protection_ratio_ = protection_ratio;
53 }
54
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020055 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010056 last_bitrate_bps_ = update.target_bitrate.bps();
57 last_fraction_loss_ =
58 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
59 last_rtt_ms_ = update.round_trip_time.ms();
60 last_probing_interval_ms_ = update.bwe_period.ms();
61 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000062 }
mflodman101f2502016-06-09 17:21:19 +020063 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000064 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020065 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080066 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020067 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068};
69
Sebastian Jansson89c94b92018-11-20 17:16:36 +010070class BitrateAllocatorForTest : public BitrateAllocator {
71 public:
72 using BitrateAllocator::BitrateAllocator;
73 void OnNetworkChanged(uint32_t target_bitrate_bps,
74 uint8_t fraction_loss,
75 int64_t rtt,
76 int64_t bwe_period_ms) {
77 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
78 fraction_loss, rtt, bwe_period_ms);
79 }
80};
81
minyue78b4d562016-11-30 04:47:39 -080082namespace {
83constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080084const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020085} // namespace
minyue78b4d562016-11-30 04:47:39 -080086
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000087class BitrateAllocatorTest : public ::testing::Test {
88 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010089 BitrateAllocatorTest()
90 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080091 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010092 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000093 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020094 void AddObserver(BitrateAllocatorObserver* observer,
95 uint32_t min_bitrate_bps,
96 uint32_t max_bitrate_bps,
97 uint32_t pad_up_bitrate_bps,
98 bool enforce_min_bitrate,
99 std::string track_id,
100 double bitrate_priority) {
101 allocator_->AddObserver(
102 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100103 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200104 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000105
perkj71ee44c2016-06-15 00:47:53 -0700106 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100107 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000108};
109
110TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
111 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700112 const uint32_t kMinSendBitrateBps = 100000;
113 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100114 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700115
philipelf69e7682018-02-28 13:06:28 +0100116 EXPECT_CALL(limit_observer_,
117 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
118 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200119 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
120 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700121 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800122 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700123 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000124
Peter Boström8e4e8b02015-09-15 15:08:03 +0200125 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800126 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800127 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700128 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700129
130 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
131 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100132 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200133 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
134 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200135 EXPECT_CALL(limit_observer_,
136 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700137 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000138
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200139 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
140 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700141 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200142 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100143 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200144 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000145}
146
147TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
148 TestBitrateObserver bitrate_observer_1;
149 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100150 const uint32_t kObs1StartBitrateBps = 100000;
151 const uint32_t kObs2StartBitrateBps = 200000;
152 const uint32_t kObs1MaxBitrateBps = 300000;
153 const uint32_t kObs2MaxBitrateBps = 300000;
154
155 EXPECT_CALL(
156 limit_observer_,
157 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200158 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
159 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100160 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
161 allocator_->GetStartBitrate(&bitrate_observer_1));
162 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
163 kObs1StartBitrateBps + kObs2StartBitrateBps,
164 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200165 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
166 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100167 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
168 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000169
mflodman48a4beb2016-07-01 13:03:59 +0200170 // Test too low start bitrate, hence lower than sum of min. Min bitrates
171 // will
172 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100173 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
174 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200175 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
176 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
177 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
178 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
179 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
180 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000181
mflodman48a4beb2016-07-01 13:03:59 +0200182 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800183 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100184 const uint32_t kBitrateToShare =
185 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200186 EXPECT_EQ(100000u + kBitrateToShare / 2,
187 bitrate_observer_1.last_bitrate_bps_);
188 EXPECT_EQ(200000u + kBitrateToShare / 2,
189 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000190
mflodman48a4beb2016-07-01 13:03:59 +0200191 // Limited by 2x max bitrates since we leave room for FEC and
192 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800193 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200194 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
195 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700196
mflodman48a4beb2016-07-01 13:03:59 +0200197 // Verify that if the bandwidth estimate is set to zero, the allocated
198 // rate is
199 // zero.
minyue78b4d562016-11-30 04:47:39 -0800200 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200201 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
202 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000203}
204
perkj71ee44c2016-06-15 00:47:53 -0700205TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
206 TestBitrateObserver bitrate_observer;
207 const uint32_t kMinSendBitrateBps = 100000;
208 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100209 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700210
philipelf69e7682018-02-28 13:06:28 +0100211 EXPECT_CALL(limit_observer_,
212 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
213 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200214 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
215 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100216 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700217 allocator_->RemoveObserver(&bitrate_observer);
218}
219
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000220class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
221 protected:
perkj71ee44c2016-06-15 00:47:53 -0700222 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100223 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800224 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000225 }
226 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200227 void AddObserver(BitrateAllocatorObserver* observer,
228 uint32_t min_bitrate_bps,
229 uint32_t max_bitrate_bps,
230 uint32_t pad_up_bitrate_bps,
231 bool enforce_min_bitrate,
232 std::string track_id,
233 double bitrate_priority) {
234 allocator_->AddObserver(
235 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100236 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200237 }
perkj71ee44c2016-06-15 00:47:53 -0700238 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100239 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000240};
241
mflodman101f2502016-06-09 17:21:19 +0200242// The following three tests verify enforcing a minimum bitrate works as
243// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000244TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
245 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700246 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
247 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200248 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100249 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200250 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
251 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200252 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000253
mflodman48a4beb2016-07-01 13:03:59 +0200254 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800255 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200256 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000257
mflodman48a4beb2016-07-01 13:03:59 +0200258 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800259 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200260 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000261
philipelf69e7682018-02-28 13:06:28 +0100262 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200263 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000264}
265
266TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
267 TestBitrateObserver bitrate_observer_1;
268 TestBitrateObserver bitrate_observer_2;
269 TestBitrateObserver bitrate_observer_3;
270 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200271 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
272 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700273 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100274
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200275 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
276 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700277 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200278 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100279
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200280 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
281 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700282 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200283 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
284 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000285
mflodman101f2502016-06-09 17:21:19 +0200286 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
287 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800288 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000289 // Verify that each observer gets its min rate (sum of min rates is 600000),
290 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100291 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200292 EXPECT_EQ(100000u + bitrate_to_share / 3,
293 bitrate_observer_1.last_bitrate_bps_);
294 EXPECT_EQ(200000u + bitrate_to_share / 3,
295 bitrate_observer_2.last_bitrate_bps_);
296 EXPECT_EQ(300000u + bitrate_to_share / 3,
297 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000298
mflodman101f2502016-06-09 17:21:19 +0200299 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800300 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200301 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
302 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200303 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200304
305 // Increased BWE, but still below the sum of configured min bitrates for all
306 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800307 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200308 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
309 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200310 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000311
mflodman101f2502016-06-09 17:21:19 +0200312 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800313 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200314 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
315 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
316 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000317
perkjec81bcd2016-05-11 06:01:13 -0700318 // Verify that zero estimated bandwidth, means that that all gets zero,
319 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800320 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200321 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
322 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
323 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700324
mflodman86aabb22016-03-11 15:44:32 +0100325 allocator_->RemoveObserver(&bitrate_observer_1);
326 allocator_->RemoveObserver(&bitrate_observer_2);
327 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000328}
329
mflodman48a4beb2016-07-01 13:03:59 +0200330TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100331 const uint32_t kMinBitrateBps = 100000;
332 const uint32_t kMaxBitrateBps = 400000;
333 // Hysteresis adds another 10% or 20kbps to min bitrate.
334 const uint32_t kMinStartBitrateBps =
335 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
336
mflodman48a4beb2016-07-01 13:03:59 +0200337 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
338 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100339 TestBitrateObserver bitrate_observer;
340 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
341 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200342 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200343 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
344
345 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800346 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200347 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
348
349 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100350 const double kProtectionRatio = 0.4;
Rasmus Brandt681de202019-02-04 15:09:34 +0100351 const uint8_t fraction_loss = kProtectionRatio * 256;
Erik Språngd1d7b232018-12-06 17:31:25 +0100352 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
Rasmus Brandt681de202019-02-04 15:09:34 +0100353 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800354 kDefaultProbingIntervalMs);
Rasmus Brandt681de202019-02-04 15:09:34 +0100355 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200356
357 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100358 // Limits changed, as we will video is now off and we need to pad up to the
359 // start bitrate.
Erik Språngd1d7b232018-12-06 17:31:25 +0100360 // Verify the hysteresis is added for the protection.
361 const uint32_t kMinStartBitrateWithProtectionBps =
362 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
363 EXPECT_CALL(limit_observer_,
364 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
Rasmus Brandt681de202019-02-04 15:09:34 +0100365 kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100366 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800367 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200368 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
369
Erik Språngd1d7b232018-12-06 17:31:25 +0100370 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
371 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200372 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
373
374 // Just enough to enable video again.
Rasmus Brandt681de202019-02-04 15:09:34 +0100375 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
Erik Språngd1d7b232018-12-06 17:31:25 +0100376 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
377 fraction_loss, kDefaultProbingIntervalMs);
378 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
379 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200380
381 // Remove all protection and make sure video is not paused as earlier.
382 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100383 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
384 kDefaultProbingIntervalMs);
385 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
386 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200387
Erik Språngd1d7b232018-12-06 17:31:25 +0100388 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
389 kDefaultProbingIntervalMs);
390 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200391
Erik Språngd1d7b232018-12-06 17:31:25 +0100392 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200393 allocator_->RemoveObserver(&bitrate_observer);
394}
395
Rasmus Brandt681de202019-02-04 15:09:34 +0100396TEST_F(BitrateAllocatorTest,
397 TotalAllocationLimitsAreUnaffectedByProtectionRatio) {
398 TestBitrateObserver bitrate_observer;
399
400 const uint32_t kMinBitrateBps = 100000;
401 const uint32_t kMaxBitrateBps = 400000;
402
403 // Register |bitrate_observer| and expect total allocation limits to change.
404 EXPECT_CALL(limit_observer_,
405 OnAllocationLimitsChanged(kMinBitrateBps, 0, kMaxBitrateBps))
406 .Times(1);
407 allocator_->AddObserver(
408 &bitrate_observer,
409 {kMinBitrateBps, kMaxBitrateBps, 0, true, "", kDefaultBitratePriority});
410
411 // Observer uses 20% of it's allocated bitrate for protection.
412 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
413 // Total allocation limits are unaffected by the protection rate change.
414 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
415 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
416
417 // Observer uses 0% of it's allocated bitrate for protection.
418 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.0);
419 // Total allocation limits are unaffected by the protection rate change.
420 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
421 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
422
423 // Observer again uses 20% of it's allocated bitrate for protection.
424 bitrate_observer.SetBitrateProtectionRatio(/*protection_ratio=*/0.2);
425 // Total allocation limits are unaffected by the protection rate change.
426 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(_, _, _)).Times(0);
427 allocator_->OnNetworkChanged(200000u, 0, 100, kDefaultProbingIntervalMs);
428}
429
mflodman48a4beb2016-07-01 13:03:59 +0200430TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
431 TestBitrateObserver bitrate_observer_1;
432 TestBitrateObserver bitrate_observer_2;
433
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200434 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
435 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200436 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200437 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
438 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200439 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
440 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
441
442 // Enough bitrate for both.
443 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800444 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200445 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
446 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
447
448 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800449 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200450 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
451 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
452
minyue78b4d562016-11-30 04:47:39 -0800453 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200454 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
455 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
456
minyue78b4d562016-11-30 04:47:39 -0800457 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200458 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
459 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
460
minyue78b4d562016-11-30 04:47:39 -0800461 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200462 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
463 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
464
minyue78b4d562016-11-30 04:47:39 -0800465 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200466 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
467 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
468
469 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800470 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200471 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
472 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
473
minyue78b4d562016-11-30 04:47:39 -0800474 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200475 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
476 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
477
478 allocator_->RemoveObserver(&bitrate_observer_1);
479 allocator_->RemoveObserver(&bitrate_observer_2);
480}
481
mflodman101f2502016-06-09 17:21:19 +0200482TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000483 TestBitrateObserver bitrate_observer_1;
484 TestBitrateObserver bitrate_observer_2;
485 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100486
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200487 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
488 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700489 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
490
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200491 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
492 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700493 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200494 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100495
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200496 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
497 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200498 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
499 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
500 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000501
mflodman48a4beb2016-07-01 13:03:59 +0200502 // Low BWE. Verify that all observers still get their respective min
503 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800504 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
506 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
507 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000508
mflodman48a4beb2016-07-01 13:03:59 +0200509 allocator_->RemoveObserver(&bitrate_observer_1);
510 allocator_->RemoveObserver(&bitrate_observer_2);
511 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000512}
perkjfea93092016-05-14 00:58:48 -0700513
514TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
515 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100516 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700517
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200518 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
519 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700520 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700521
522 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800523 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700524
mflodman101f2502016-06-09 17:21:19 +0200525 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700526
527 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700528 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100529 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200530 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
531 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700532
533 // Expect the start_bitrate to be set as if the network was still up but that
534 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700535 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200536 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
537 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700538
539 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800540 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200541 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
542 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
543}
544
545TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
546 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200547 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
548 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200549 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200550
mflodman48a4beb2016-07-01 13:03:59 +0200551 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200552 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
553 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200554 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
555 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200556
minyue78b4d562016-11-30 04:47:39 -0800557 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200558 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
559 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200560
minyue78b4d562016-11-30 04:47:39 -0800561 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200562 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
563 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200564
minyue78b4d562016-11-30 04:47:39 -0800565 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200566 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
567 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200568
minyue78b4d562016-11-30 04:47:39 -0800569 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200570 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
571 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200572
minyue78b4d562016-11-30 04:47:39 -0800573 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200574 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
575 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200576
minyue78b4d562016-11-30 04:47:39 -0800577 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200578 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
579 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200580
minyue78b4d562016-11-30 04:47:39 -0800581 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200582 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
583 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200584
mflodman48a4beb2016-07-01 13:03:59 +0200585 allocator_->RemoveObserver(&enforced_observer);
586 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200587}
588
589TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
590 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200591 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200592 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200593
minyue78b4d562016-11-30 04:47:39 -0800594 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200595 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200596
minyue78b4d562016-11-30 04:47:39 -0800597 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200598 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200599
minyue78b4d562016-11-30 04:47:39 -0800600 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200601 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200602
minyue78b4d562016-11-30 04:47:39 -0800603 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200604 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200605
minyue78b4d562016-11-30 04:47:39 -0800606 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200607 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200608
minyue78b4d562016-11-30 04:47:39 -0800609 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200610 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200611
mflodman48a4beb2016-07-01 13:03:59 +0200612 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200613}
614
615TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
616 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200617 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200618 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200619
minyue78b4d562016-11-30 04:47:39 -0800620 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200621 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200622
minyue78b4d562016-11-30 04:47:39 -0800623 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200624 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200625
minyue78b4d562016-11-30 04:47:39 -0800626 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200627 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200628
minyue78b4d562016-11-30 04:47:39 -0800629 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200630 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200631
minyue78b4d562016-11-30 04:47:39 -0800632 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200633 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200634
minyue78b4d562016-11-30 04:47:39 -0800635 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200636 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200637
mflodman48a4beb2016-07-01 13:03:59 +0200638 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700639}
640
minyue78b4d562016-11-30 04:47:39 -0800641TEST_F(BitrateAllocatorTest, PassProbingInterval) {
642 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200643 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800644 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
645
646 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
647 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
648
649 allocator_->RemoveObserver(&observer);
650}
651
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800652TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
653 TestBitrateObserver observer;
654 const uint32_t kMinSendBitrateBps = 10;
655 const uint32_t kMaxSendBitrateBps = 60;
656 const uint32_t kNetworkBandwidthBps = 30;
657
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200658 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
659 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800660 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
661 kDefaultProbingIntervalMs);
662
663 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
664
665 allocator_->RemoveObserver(&observer);
666}
667
668// Tests that two observers with the same bitrate priority are allocated
669// their bitrate evenly.
670TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
671 TestBitrateObserver observer_low_1;
672 TestBitrateObserver observer_low_2;
673 const uint32_t kMinSendBitrateBps = 10;
674 const uint32_t kMaxSendBitrateBps = 60;
675 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200676 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
677 "low1", 2.0);
678 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
679 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800680 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
681 kDefaultProbingIntervalMs);
682
683 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
684 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
685
686 allocator_->RemoveObserver(&observer_low_1);
687 allocator_->RemoveObserver(&observer_low_2);
688}
689
690// Tests that there is no difference in functionality when the min bitrate is
691// enforced.
692TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
693 TestBitrateObserver observer_low_1;
694 TestBitrateObserver observer_low_2;
695 const uint32_t kMinSendBitrateBps = 0;
696 const uint32_t kMaxSendBitrateBps = 60;
697 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200698 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
699 "low1", 2.0);
700 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
701 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800702 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
703 kDefaultProbingIntervalMs);
704
705 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
706 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
707
708 allocator_->RemoveObserver(&observer_low_1);
709 allocator_->RemoveObserver(&observer_low_2);
710}
711
712// Tests that if the available bandwidth is the sum of the max bitrate
713// of all observers, they will be allocated their max.
714TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
715 TestBitrateObserver observer_low;
716 TestBitrateObserver observer_mid;
717 const uint32_t kMinSendBitrateBps = 0;
718 const uint32_t kMaxSendBitrateBps = 60;
719 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200720 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
721 "low", 2.0);
722 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
723 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800724 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
725 kDefaultProbingIntervalMs);
726
727 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
728 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
729
730 allocator_->RemoveObserver(&observer_low);
731 allocator_->RemoveObserver(&observer_mid);
732}
733
734// Tests that after a higher bitrate priority observer has been allocated its
735// max bitrate the lower priority observer will then be allocated the remaining
736// bitrate.
737TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
738 TestBitrateObserver observer_low;
739 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200740 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
741 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800742 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
743
744 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
745 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
746
747 allocator_->RemoveObserver(&observer_low);
748 allocator_->RemoveObserver(&observer_mid);
749}
750
751// Tests that three observers with three different bitrate priorities will all
752// be allocated bitrate according to their relative bitrate priority.
753TEST_F(BitrateAllocatorTest,
754 PriorityRateThreeObserversAllocatedRelativeAmounts) {
755 TestBitrateObserver observer_low;
756 TestBitrateObserver observer_mid;
757 TestBitrateObserver observer_high;
758 const uint32_t kMaxBitrate = 100;
759 // Not enough bandwidth to fill any observer's max bitrate.
760 const uint32_t kNetworkBandwidthBps = 70;
761 const double kLowBitratePriority = 2.0;
762 const double kMidBitratePriority = 4.0;
763 const double kHighBitratePriority = 8.0;
764 const double kTotalBitratePriority =
765 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200766 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
767 kLowBitratePriority);
768 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
769 kMidBitratePriority);
770 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
771 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800772 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
773 kDefaultProbingIntervalMs);
774
775 const double kLowFractionAllocated =
776 kLowBitratePriority / kTotalBitratePriority;
777 const double kMidFractionAllocated =
778 kMidBitratePriority / kTotalBitratePriority;
779 const double kHighFractionAllocated =
780 kHighBitratePriority / kTotalBitratePriority;
781 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
782 observer_low.last_bitrate_bps_);
783 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
784 observer_mid.last_bitrate_bps_);
785 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
786 observer_high.last_bitrate_bps_);
787
788 allocator_->RemoveObserver(&observer_low);
789 allocator_->RemoveObserver(&observer_mid);
790 allocator_->RemoveObserver(&observer_high);
791}
792
793// Tests that after the high priority observer has been allocated its maximum
794// bitrate, the other two observers are still allocated bitrate according to
795// their relative bitrate priority.
796TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
797 TestBitrateObserver observer_low;
798 const double kLowBitratePriority = 2.0;
799 TestBitrateObserver observer_mid;
800 const double kMidBitratePriority = 4.0;
801 TestBitrateObserver observer_high;
802 const double kHighBitratePriority = 8.0;
803
804 const uint32_t kAvailableBitrate = 90;
805 const uint32_t kMaxBitrate = 40;
806 const uint32_t kMinBitrate = 10;
807 // Remaining bitrate after allocating to all mins and knowing that the high
808 // priority observer will have its max bitrate allocated.
809 const uint32_t kRemainingBitrate =
810 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
811
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200812 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
813 kLowBitratePriority);
814 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
815 kMidBitratePriority);
816 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
817 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800818 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
819 kDefaultProbingIntervalMs);
820
821 const double kLowFractionAllocated =
822 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
823 const double kMidFractionAllocated =
824 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
825 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
826 observer_low.last_bitrate_bps_);
827 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
828 observer_mid.last_bitrate_bps_);
829 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
830
831 allocator_->RemoveObserver(&observer_low);
832 allocator_->RemoveObserver(&observer_mid);
833 allocator_->RemoveObserver(&observer_high);
834}
835
836// Tests that after the low priority observer has been allocated its maximum
837// bitrate, the other two observers are still allocated bitrate according to
838// their relative bitrate priority.
839TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
840 TestBitrateObserver observer_low;
841 const double kLowBitratePriority = 2.0;
842 const uint32_t kLowMaxBitrate = 10;
843 TestBitrateObserver observer_mid;
844 const double kMidBitratePriority = 4.0;
845 TestBitrateObserver observer_high;
846 const double kHighBitratePriority = 8.0;
847
848 const uint32_t kMinBitrate = 0;
849 const uint32_t kMaxBitrate = 60;
850 const uint32_t kAvailableBitrate = 100;
851 // Remaining bitrate knowing that the low priority observer is allocated its
852 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
853 // available bitrate, so 70 bps would be sufficient network bandwidth.
854 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
855
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200856 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
857 kLowBitratePriority);
858 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
859 kMidBitratePriority);
860 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
861 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800862 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
863 kDefaultProbingIntervalMs);
864
865 const double kMidFractionAllocated =
866 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
867 const double kHighFractionAllocated =
868 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
869 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
870 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
871 observer_mid.last_bitrate_bps_);
872 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
873 observer_high.last_bitrate_bps_);
874
875 allocator_->RemoveObserver(&observer_low);
876 allocator_->RemoveObserver(&observer_mid);
877 allocator_->RemoveObserver(&observer_high);
878}
879
880// Tests that after two observers are allocated bitrate to their max, the
881// the remaining observer is allocated what's left appropriately. This test
882// handles an edge case where the medium and high observer reach their
883// "relative" max allocation at the same time. The high has 40 to allocate
884// above its min, and the mid has 20 to allocate above its min, which scaled
885// by their bitrate priority is the same for each.
886TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
887 TestBitrateObserver observer_low;
888 TestBitrateObserver observer_mid;
889 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200890 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800891 // Scaled allocation above the min allocation is the same for these two,
892 // meaning they will get allocated their max at the same time.
893 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200894 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
895 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800896 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
897
898 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
899 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
900 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
901
902 allocator_->RemoveObserver(&observer_low);
903 allocator_->RemoveObserver(&observer_mid);
904 allocator_->RemoveObserver(&observer_high);
905}
906
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000907} // namespace webrtc