blob: b1df347caf90d695e329cfe5378717f139887f91 [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::NiceMock;
21using ::testing::_;
perkj71ee44c2016-06-15 00:47:53 -070022
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000023namespace webrtc {
Sebastian Janssonfe617a32018-03-21 12:45:20 +010024// Emulating old interface for test suite compatibility.
25// TODO(srte): Update tests to reflect new interface.
26class LimitObserverWrapper : public BitrateAllocator::LimitObserver {
27 public:
Sebastian Janssonfe617a32018-03-21 12:45:20 +010028 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
29 uint32_t max_padding_bitrate_bps,
30 uint32_t total_bitrate_bps) = 0;
31};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000032
Sebastian Janssonfe617a32018-03-21 12:45:20 +010033class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070034 public:
philipelf69e7682018-02-28 13:06:28 +010035 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070036 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010037 uint32_t max_padding_bitrate_bps,
38 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070039};
40
mflodman86aabb22016-03-11 15:44:32 +010041class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000042 public:
43 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020044 : last_bitrate_bps_(0),
45 last_fraction_loss_(0),
46 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080047 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020048 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000049
mflodman48a4beb2016-07-01 13:03:59 +020050 void SetBitrateProtectionRatio(double protection_ratio) {
51 protection_ratio_ = protection_ratio;
52 }
53
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020054 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010055 last_bitrate_bps_ = update.target_bitrate.bps();
56 last_fraction_loss_ =
57 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
58 last_rtt_ms_ = update.round_trip_time.ms();
59 last_probing_interval_ms_ = update.bwe_period.ms();
60 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000061 }
mflodman101f2502016-06-09 17:21:19 +020062 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000063 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020064 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080065 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020066 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000067};
68
Sebastian Jansson89c94b92018-11-20 17:16:36 +010069class BitrateAllocatorForTest : public BitrateAllocator {
70 public:
71 using BitrateAllocator::BitrateAllocator;
72 void OnNetworkChanged(uint32_t target_bitrate_bps,
73 uint8_t fraction_loss,
74 int64_t rtt,
75 int64_t bwe_period_ms) {
76 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
77 fraction_loss, rtt, bwe_period_ms);
78 }
79};
80
minyue78b4d562016-11-30 04:47:39 -080081namespace {
82constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080083const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020084} // namespace
minyue78b4d562016-11-30 04:47:39 -080085
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000086class BitrateAllocatorTest : public ::testing::Test {
87 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010088 BitrateAllocatorTest()
89 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080090 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010091 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000092 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020093 void AddObserver(BitrateAllocatorObserver* observer,
94 uint32_t min_bitrate_bps,
95 uint32_t max_bitrate_bps,
96 uint32_t pad_up_bitrate_bps,
97 bool enforce_min_bitrate,
98 std::string track_id,
99 double bitrate_priority) {
100 allocator_->AddObserver(
101 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100102 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200103 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000104
perkj71ee44c2016-06-15 00:47:53 -0700105 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100106 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000107};
108
109TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
110 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700111 const uint32_t kMinSendBitrateBps = 100000;
112 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100113 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700114
philipelf69e7682018-02-28 13:06:28 +0100115 EXPECT_CALL(limit_observer_,
116 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
117 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200118 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
119 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700120 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800121 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700122 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000123
Peter Boström8e4e8b02015-09-15 15:08:03 +0200124 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800125 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800126 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700127 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700128
129 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
130 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100131 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200132 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
133 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200134 EXPECT_CALL(limit_observer_,
135 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700136 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000137
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200138 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
139 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700140 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200141 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100142 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200143 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000144}
145
146TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
147 TestBitrateObserver bitrate_observer_1;
148 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100149 const uint32_t kObs1StartBitrateBps = 100000;
150 const uint32_t kObs2StartBitrateBps = 200000;
151 const uint32_t kObs1MaxBitrateBps = 300000;
152 const uint32_t kObs2MaxBitrateBps = 300000;
153
154 EXPECT_CALL(
155 limit_observer_,
156 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200157 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
158 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100159 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
160 allocator_->GetStartBitrate(&bitrate_observer_1));
161 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
162 kObs1StartBitrateBps + kObs2StartBitrateBps,
163 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200164 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
165 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100166 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
167 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000168
mflodman48a4beb2016-07-01 13:03:59 +0200169 // Test too low start bitrate, hence lower than sum of min. Min bitrates
170 // will
171 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100172 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
173 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200174 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
175 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
176 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
177 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
178 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
179 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000180
mflodman48a4beb2016-07-01 13:03:59 +0200181 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800182 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100183 const uint32_t kBitrateToShare =
184 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200185 EXPECT_EQ(100000u + kBitrateToShare / 2,
186 bitrate_observer_1.last_bitrate_bps_);
187 EXPECT_EQ(200000u + kBitrateToShare / 2,
188 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000189
mflodman48a4beb2016-07-01 13:03:59 +0200190 // Limited by 2x max bitrates since we leave room for FEC and
191 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800192 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200193 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
194 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700195
mflodman48a4beb2016-07-01 13:03:59 +0200196 // Verify that if the bandwidth estimate is set to zero, the allocated
197 // rate is
198 // zero.
minyue78b4d562016-11-30 04:47:39 -0800199 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200200 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
201 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000202}
203
perkj71ee44c2016-06-15 00:47:53 -0700204TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
205 TestBitrateObserver bitrate_observer;
206 const uint32_t kMinSendBitrateBps = 100000;
207 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100208 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700209
philipelf69e7682018-02-28 13:06:28 +0100210 EXPECT_CALL(limit_observer_,
211 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
212 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200213 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
214 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100215 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700216 allocator_->RemoveObserver(&bitrate_observer);
217}
218
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000219class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
220 protected:
perkj71ee44c2016-06-15 00:47:53 -0700221 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100222 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800223 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000224 }
225 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200226 void AddObserver(BitrateAllocatorObserver* observer,
227 uint32_t min_bitrate_bps,
228 uint32_t max_bitrate_bps,
229 uint32_t pad_up_bitrate_bps,
230 bool enforce_min_bitrate,
231 std::string track_id,
232 double bitrate_priority) {
233 allocator_->AddObserver(
234 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
Sebastian Jansson79f0d4d2019-01-23 09:41:43 +0100235 enforce_min_bitrate, track_id, bitrate_priority});
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200236 }
perkj71ee44c2016-06-15 00:47:53 -0700237 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100238 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239};
240
mflodman101f2502016-06-09 17:21:19 +0200241// The following three tests verify enforcing a minimum bitrate works as
242// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000243TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
244 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700245 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
246 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200247 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100248 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200249 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
250 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200251 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000252
mflodman48a4beb2016-07-01 13:03:59 +0200253 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800254 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200255 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000256
mflodman48a4beb2016-07-01 13:03:59 +0200257 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800258 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200259 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000260
philipelf69e7682018-02-28 13:06:28 +0100261 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200262 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000263}
264
265TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
266 TestBitrateObserver bitrate_observer_1;
267 TestBitrateObserver bitrate_observer_2;
268 TestBitrateObserver bitrate_observer_3;
269 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200270 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
271 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700272 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100273
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200274 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
275 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700276 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200277 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100278
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200279 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
280 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700281 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200282 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
283 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000284
mflodman101f2502016-06-09 17:21:19 +0200285 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
286 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800287 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000288 // Verify that each observer gets its min rate (sum of min rates is 600000),
289 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100290 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200291 EXPECT_EQ(100000u + bitrate_to_share / 3,
292 bitrate_observer_1.last_bitrate_bps_);
293 EXPECT_EQ(200000u + bitrate_to_share / 3,
294 bitrate_observer_2.last_bitrate_bps_);
295 EXPECT_EQ(300000u + bitrate_to_share / 3,
296 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000297
mflodman101f2502016-06-09 17:21:19 +0200298 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800299 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200300 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
301 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200302 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200303
304 // Increased BWE, but still below the sum of configured min bitrates for all
305 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800306 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200307 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
308 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200309 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000310
mflodman101f2502016-06-09 17:21:19 +0200311 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800312 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200313 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
314 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
315 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000316
perkjec81bcd2016-05-11 06:01:13 -0700317 // Verify that zero estimated bandwidth, means that that all gets zero,
318 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800319 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200320 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
321 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
322 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700323
mflodman86aabb22016-03-11 15:44:32 +0100324 allocator_->RemoveObserver(&bitrate_observer_1);
325 allocator_->RemoveObserver(&bitrate_observer_2);
326 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000327}
328
mflodman48a4beb2016-07-01 13:03:59 +0200329TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100330 const uint32_t kMinBitrateBps = 100000;
331 const uint32_t kMaxBitrateBps = 400000;
332 // Hysteresis adds another 10% or 20kbps to min bitrate.
333 const uint32_t kMinStartBitrateBps =
334 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
335
mflodman48a4beb2016-07-01 13:03:59 +0200336 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
337 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100338 TestBitrateObserver bitrate_observer;
339 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
340 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200341 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200342 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
343
344 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800345 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200346 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
347
348 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100349 const double kProtectionRatio = 0.4;
350 uint32_t target_bitrate_bps = 200000;
351 const uint32_t kMaxBitrateWithProtectionBps =
Erik Språng00672b12018-12-11 15:29:29 +0100352 static_cast<uint32_t>(kMaxBitrateBps * 2);
Erik Språngd1d7b232018-12-06 17:31:25 +0100353 uint8_t fraction_loss = kProtectionRatio * 256;
354 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
355 EXPECT_CALL(limit_observer_,
356 OnAllocationLimitsChanged(0, 0, kMaxBitrateWithProtectionBps));
357 allocator_->OnNetworkChanged(target_bitrate_bps, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800358 kDefaultProbingIntervalMs);
Erik Språngd1d7b232018-12-06 17:31:25 +0100359 EXPECT_EQ(target_bitrate_bps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200360
361 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100362 // Limits changed, as we will video is now off and we need to pad up to the
363 // start bitrate.
364 target_bitrate_bps = kMinStartBitrateBps + 1000;
365 // Verify the hysteresis is added for the protection.
366 const uint32_t kMinStartBitrateWithProtectionBps =
367 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
368 EXPECT_CALL(limit_observer_,
369 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
370 kMaxBitrateWithProtectionBps));
371 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800372 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200373 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
374
Erik Språngd1d7b232018-12-06 17:31:25 +0100375 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
376 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200377 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
378
379 // Just enough to enable video again.
Erik Språngd1d7b232018-12-06 17:31:25 +0100380 target_bitrate_bps = kMinStartBitrateWithProtectionBps;
381 EXPECT_CALL(limit_observer_,
382 OnAllocationLimitsChanged(0, 0, kMaxBitrateWithProtectionBps));
383 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
384 fraction_loss, kDefaultProbingIntervalMs);
385 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
386 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200387
388 // Remove all protection and make sure video is not paused as earlier.
389 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100390 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
391 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
392 kDefaultProbingIntervalMs);
393 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
394 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200395
Erik Språngd1d7b232018-12-06 17:31:25 +0100396 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
397 kDefaultProbingIntervalMs);
398 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200399
Erik Språngd1d7b232018-12-06 17:31:25 +0100400 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200401 allocator_->RemoveObserver(&bitrate_observer);
402}
403
404TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
405 TestBitrateObserver bitrate_observer_1;
406 TestBitrateObserver bitrate_observer_2;
407
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200408 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
409 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200410 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200411 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
412 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200413 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
414 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
415
416 // Enough bitrate for both.
417 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800418 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200419 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
420 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
421
422 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800423 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200424 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
425 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
426
minyue78b4d562016-11-30 04:47:39 -0800427 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200428 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
429 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
430
minyue78b4d562016-11-30 04:47:39 -0800431 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200432 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
433 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
434
minyue78b4d562016-11-30 04:47:39 -0800435 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200436 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
437 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
438
minyue78b4d562016-11-30 04:47:39 -0800439 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200440 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
441 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
442
443 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800444 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200445 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
446 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
447
minyue78b4d562016-11-30 04:47:39 -0800448 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200449 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
450 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
451
452 allocator_->RemoveObserver(&bitrate_observer_1);
453 allocator_->RemoveObserver(&bitrate_observer_2);
454}
455
mflodman101f2502016-06-09 17:21:19 +0200456TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000457 TestBitrateObserver bitrate_observer_1;
458 TestBitrateObserver bitrate_observer_2;
459 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100460
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200461 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
462 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700463 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
464
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200465 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
466 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700467 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200468 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100469
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200470 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
471 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200472 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
473 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
474 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000475
mflodman48a4beb2016-07-01 13:03:59 +0200476 // Low BWE. Verify that all observers still get their respective min
477 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800478 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200479 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
480 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
481 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000482
mflodman48a4beb2016-07-01 13:03:59 +0200483 allocator_->RemoveObserver(&bitrate_observer_1);
484 allocator_->RemoveObserver(&bitrate_observer_2);
485 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000486}
perkjfea93092016-05-14 00:58:48 -0700487
488TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
489 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100490 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700491
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200492 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
493 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700494 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700495
496 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800497 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700498
mflodman101f2502016-06-09 17:21:19 +0200499 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700500
501 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700502 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100503 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200504 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
505 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700506
507 // Expect the start_bitrate to be set as if the network was still up but that
508 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700509 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200510 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
511 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700512
513 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800514 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200515 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
516 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
517}
518
519TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
520 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200521 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
522 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200523 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200524
mflodman48a4beb2016-07-01 13:03:59 +0200525 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200526 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
527 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200528 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
529 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200530
minyue78b4d562016-11-30 04:47:39 -0800531 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200532 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
533 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200534
minyue78b4d562016-11-30 04:47:39 -0800535 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200536 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
537 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200538
minyue78b4d562016-11-30 04:47:39 -0800539 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200540 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
541 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200542
minyue78b4d562016-11-30 04:47:39 -0800543 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200544 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
545 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200546
minyue78b4d562016-11-30 04:47:39 -0800547 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200548 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
549 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200550
minyue78b4d562016-11-30 04:47:39 -0800551 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
553 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200554
minyue78b4d562016-11-30 04:47:39 -0800555 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200556 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
557 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200558
mflodman48a4beb2016-07-01 13:03:59 +0200559 allocator_->RemoveObserver(&enforced_observer);
560 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200561}
562
563TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
564 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200565 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200566 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200567
minyue78b4d562016-11-30 04:47:39 -0800568 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200569 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200570
minyue78b4d562016-11-30 04:47:39 -0800571 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200572 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200573
minyue78b4d562016-11-30 04:47:39 -0800574 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200575 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200576
minyue78b4d562016-11-30 04:47:39 -0800577 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200578 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200579
minyue78b4d562016-11-30 04:47:39 -0800580 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200581 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200582
minyue78b4d562016-11-30 04:47:39 -0800583 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200584 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200585
mflodman48a4beb2016-07-01 13:03:59 +0200586 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200587}
588
589TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
590 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200591 AddObserver(&observer, 300000, 600000, 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(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200595 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200596
minyue78b4d562016-11-30 04:47:39 -0800597 allocator_->OnNetworkChanged(200000, 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(300000, 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(329000, 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(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200607 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200608
minyue78b4d562016-11-30 04:47:39 -0800609 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200610 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200611
mflodman48a4beb2016-07-01 13:03:59 +0200612 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700613}
614
minyue78b4d562016-11-30 04:47:39 -0800615TEST_F(BitrateAllocatorTest, PassProbingInterval) {
616 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200617 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800618 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
619
620 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
621 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
622
623 allocator_->RemoveObserver(&observer);
624}
625
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800626TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
627 TestBitrateObserver observer;
628 const uint32_t kMinSendBitrateBps = 10;
629 const uint32_t kMaxSendBitrateBps = 60;
630 const uint32_t kNetworkBandwidthBps = 30;
631
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200632 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
633 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800634 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
635 kDefaultProbingIntervalMs);
636
637 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
638
639 allocator_->RemoveObserver(&observer);
640}
641
642// Tests that two observers with the same bitrate priority are allocated
643// their bitrate evenly.
644TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
645 TestBitrateObserver observer_low_1;
646 TestBitrateObserver observer_low_2;
647 const uint32_t kMinSendBitrateBps = 10;
648 const uint32_t kMaxSendBitrateBps = 60;
649 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200650 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
651 "low1", 2.0);
652 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
653 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800654 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
655 kDefaultProbingIntervalMs);
656
657 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
658 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
659
660 allocator_->RemoveObserver(&observer_low_1);
661 allocator_->RemoveObserver(&observer_low_2);
662}
663
664// Tests that there is no difference in functionality when the min bitrate is
665// enforced.
666TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
667 TestBitrateObserver observer_low_1;
668 TestBitrateObserver observer_low_2;
669 const uint32_t kMinSendBitrateBps = 0;
670 const uint32_t kMaxSendBitrateBps = 60;
671 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200672 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
673 "low1", 2.0);
674 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
675 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800676 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
677 kDefaultProbingIntervalMs);
678
679 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
680 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
681
682 allocator_->RemoveObserver(&observer_low_1);
683 allocator_->RemoveObserver(&observer_low_2);
684}
685
686// Tests that if the available bandwidth is the sum of the max bitrate
687// of all observers, they will be allocated their max.
688TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
689 TestBitrateObserver observer_low;
690 TestBitrateObserver observer_mid;
691 const uint32_t kMinSendBitrateBps = 0;
692 const uint32_t kMaxSendBitrateBps = 60;
693 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200694 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
695 "low", 2.0);
696 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
697 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800698 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
699 kDefaultProbingIntervalMs);
700
701 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
702 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
703
704 allocator_->RemoveObserver(&observer_low);
705 allocator_->RemoveObserver(&observer_mid);
706}
707
708// Tests that after a higher bitrate priority observer has been allocated its
709// max bitrate the lower priority observer will then be allocated the remaining
710// bitrate.
711TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
712 TestBitrateObserver observer_low;
713 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200714 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
715 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800716 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
717
718 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
719 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
720
721 allocator_->RemoveObserver(&observer_low);
722 allocator_->RemoveObserver(&observer_mid);
723}
724
725// Tests that three observers with three different bitrate priorities will all
726// be allocated bitrate according to their relative bitrate priority.
727TEST_F(BitrateAllocatorTest,
728 PriorityRateThreeObserversAllocatedRelativeAmounts) {
729 TestBitrateObserver observer_low;
730 TestBitrateObserver observer_mid;
731 TestBitrateObserver observer_high;
732 const uint32_t kMaxBitrate = 100;
733 // Not enough bandwidth to fill any observer's max bitrate.
734 const uint32_t kNetworkBandwidthBps = 70;
735 const double kLowBitratePriority = 2.0;
736 const double kMidBitratePriority = 4.0;
737 const double kHighBitratePriority = 8.0;
738 const double kTotalBitratePriority =
739 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200740 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
741 kLowBitratePriority);
742 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
743 kMidBitratePriority);
744 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
745 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800746 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
747 kDefaultProbingIntervalMs);
748
749 const double kLowFractionAllocated =
750 kLowBitratePriority / kTotalBitratePriority;
751 const double kMidFractionAllocated =
752 kMidBitratePriority / kTotalBitratePriority;
753 const double kHighFractionAllocated =
754 kHighBitratePriority / kTotalBitratePriority;
755 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
756 observer_low.last_bitrate_bps_);
757 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
758 observer_mid.last_bitrate_bps_);
759 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
760 observer_high.last_bitrate_bps_);
761
762 allocator_->RemoveObserver(&observer_low);
763 allocator_->RemoveObserver(&observer_mid);
764 allocator_->RemoveObserver(&observer_high);
765}
766
767// Tests that after the high priority observer has been allocated its maximum
768// bitrate, the other two observers are still allocated bitrate according to
769// their relative bitrate priority.
770TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
771 TestBitrateObserver observer_low;
772 const double kLowBitratePriority = 2.0;
773 TestBitrateObserver observer_mid;
774 const double kMidBitratePriority = 4.0;
775 TestBitrateObserver observer_high;
776 const double kHighBitratePriority = 8.0;
777
778 const uint32_t kAvailableBitrate = 90;
779 const uint32_t kMaxBitrate = 40;
780 const uint32_t kMinBitrate = 10;
781 // Remaining bitrate after allocating to all mins and knowing that the high
782 // priority observer will have its max bitrate allocated.
783 const uint32_t kRemainingBitrate =
784 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
785
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200786 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
787 kLowBitratePriority);
788 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
789 kMidBitratePriority);
790 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
791 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800792 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
793 kDefaultProbingIntervalMs);
794
795 const double kLowFractionAllocated =
796 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
797 const double kMidFractionAllocated =
798 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
799 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
800 observer_low.last_bitrate_bps_);
801 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
802 observer_mid.last_bitrate_bps_);
803 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
804
805 allocator_->RemoveObserver(&observer_low);
806 allocator_->RemoveObserver(&observer_mid);
807 allocator_->RemoveObserver(&observer_high);
808}
809
810// Tests that after the low priority observer has been allocated its maximum
811// bitrate, the other two observers are still allocated bitrate according to
812// their relative bitrate priority.
813TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
814 TestBitrateObserver observer_low;
815 const double kLowBitratePriority = 2.0;
816 const uint32_t kLowMaxBitrate = 10;
817 TestBitrateObserver observer_mid;
818 const double kMidBitratePriority = 4.0;
819 TestBitrateObserver observer_high;
820 const double kHighBitratePriority = 8.0;
821
822 const uint32_t kMinBitrate = 0;
823 const uint32_t kMaxBitrate = 60;
824 const uint32_t kAvailableBitrate = 100;
825 // Remaining bitrate knowing that the low priority observer is allocated its
826 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
827 // available bitrate, so 70 bps would be sufficient network bandwidth.
828 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
829
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200830 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
831 kLowBitratePriority);
832 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
833 kMidBitratePriority);
834 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
835 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800836 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
837 kDefaultProbingIntervalMs);
838
839 const double kMidFractionAllocated =
840 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
841 const double kHighFractionAllocated =
842 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
843 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
844 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
845 observer_mid.last_bitrate_bps_);
846 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
847 observer_high.last_bitrate_bps_);
848
849 allocator_->RemoveObserver(&observer_low);
850 allocator_->RemoveObserver(&observer_mid);
851 allocator_->RemoveObserver(&observer_high);
852}
853
854// Tests that after two observers are allocated bitrate to their max, the
855// the remaining observer is allocated what's left appropriately. This test
856// handles an edge case where the medium and high observer reach their
857// "relative" max allocation at the same time. The high has 40 to allocate
858// above its min, and the mid has 20 to allocate above its min, which scaled
859// by their bitrate priority is the same for each.
860TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
861 TestBitrateObserver observer_low;
862 TestBitrateObserver observer_mid;
863 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200864 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800865 // Scaled allocation above the min allocation is the same for these two,
866 // meaning they will get allocated their max at the same time.
867 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200868 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
869 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800870 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
871
872 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
873 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
874 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
875
876 allocator_->RemoveObserver(&observer_low);
877 allocator_->RemoveObserver(&observer_mid);
878 allocator_->RemoveObserver(&observer_high);
879}
880
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000881} // namespace webrtc