blob: 0771f798edcd8b19d379759bc8e44b08e23c36f2 [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:
28 void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
29 uint32_t max_padding_bitrate_bps,
30 uint32_t total_bitrate_bps,
Sebastian Jansson35fa2802018-10-01 09:16:12 +020031 uint32_t allocated_without_feedback_bps,
Sebastian Janssonfe617a32018-03-21 12:45:20 +010032 bool has_packet_feedback) override {
33 OnAllocationLimitsChanged(min_send_bitrate_bps, max_padding_bitrate_bps,
34 total_bitrate_bps);
35 }
36 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
37 uint32_t max_padding_bitrate_bps,
38 uint32_t total_bitrate_bps) = 0;
39};
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000040
Sebastian Janssonfe617a32018-03-21 12:45:20 +010041class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070042 public:
philipelf69e7682018-02-28 13:06:28 +010043 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070044 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010045 uint32_t max_padding_bitrate_bps,
46 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070047};
48
mflodman86aabb22016-03-11 15:44:32 +010049class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050 public:
51 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020052 : last_bitrate_bps_(0),
53 last_fraction_loss_(0),
54 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080055 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020056 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000057
mflodman48a4beb2016-07-01 13:03:59 +020058 void SetBitrateProtectionRatio(double protection_ratio) {
59 protection_ratio_ = protection_ratio;
60 }
61
Sebastian Janssonc0e4d452018-10-25 15:08:32 +020062 uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override {
Sebastian Jansson13e59032018-11-21 19:13:07 +010063 last_bitrate_bps_ = update.target_bitrate.bps();
64 last_fraction_loss_ =
65 rtc::dchecked_cast<uint8_t>(update.packet_loss_ratio * 256);
66 last_rtt_ms_ = update.round_trip_time.ms();
67 last_probing_interval_ms_ = update.bwe_period.ms();
68 return update.target_bitrate.bps() * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000069 }
mflodman101f2502016-06-09 17:21:19 +020070 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000071 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020072 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080073 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020074 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000075};
76
Sebastian Jansson89c94b92018-11-20 17:16:36 +010077class BitrateAllocatorForTest : public BitrateAllocator {
78 public:
79 using BitrateAllocator::BitrateAllocator;
80 void OnNetworkChanged(uint32_t target_bitrate_bps,
81 uint8_t fraction_loss,
82 int64_t rtt,
83 int64_t bwe_period_ms) {
84 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
85 fraction_loss, rtt, bwe_period_ms);
86 }
87};
88
minyue78b4d562016-11-30 04:47:39 -080089namespace {
90constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080091const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020092} // namespace
minyue78b4d562016-11-30 04:47:39 -080093
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000094class BitrateAllocatorTest : public ::testing::Test {
95 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010096 BitrateAllocatorTest()
97 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080098 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010099 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000100 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200101 void AddObserver(BitrateAllocatorObserver* observer,
102 uint32_t min_bitrate_bps,
103 uint32_t max_bitrate_bps,
104 uint32_t pad_up_bitrate_bps,
105 bool enforce_min_bitrate,
106 std::string track_id,
107 double bitrate_priority) {
108 allocator_->AddObserver(
109 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
110 enforce_min_bitrate, track_id, bitrate_priority, false});
111 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000112
perkj71ee44c2016-06-15 00:47:53 -0700113 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100114 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000115};
116
117TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
118 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700119 const uint32_t kMinSendBitrateBps = 100000;
120 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100121 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700122
philipelf69e7682018-02-28 13:06:28 +0100123 EXPECT_CALL(limit_observer_,
124 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
125 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200126 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
127 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700128 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800129 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700130 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000131
Peter Boström8e4e8b02015-09-15 15:08:03 +0200132 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800133 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800134 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700135 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700136
137 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
138 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100139 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200140 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
141 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200142 EXPECT_CALL(limit_observer_,
143 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700144 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000145
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200146 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
147 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700148 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200149 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100150 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200151 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000152}
153
154TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
155 TestBitrateObserver bitrate_observer_1;
156 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100157 const uint32_t kObs1StartBitrateBps = 100000;
158 const uint32_t kObs2StartBitrateBps = 200000;
159 const uint32_t kObs1MaxBitrateBps = 300000;
160 const uint32_t kObs2MaxBitrateBps = 300000;
161
162 EXPECT_CALL(
163 limit_observer_,
164 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200165 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
166 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100167 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
168 allocator_->GetStartBitrate(&bitrate_observer_1));
169 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
170 kObs1StartBitrateBps + kObs2StartBitrateBps,
171 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200172 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
173 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100174 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
175 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000176
mflodman48a4beb2016-07-01 13:03:59 +0200177 // Test too low start bitrate, hence lower than sum of min. Min bitrates
178 // will
179 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100180 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
181 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200182 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
183 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
184 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
185 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
186 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
187 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000188
mflodman48a4beb2016-07-01 13:03:59 +0200189 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800190 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100191 const uint32_t kBitrateToShare =
192 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200193 EXPECT_EQ(100000u + kBitrateToShare / 2,
194 bitrate_observer_1.last_bitrate_bps_);
195 EXPECT_EQ(200000u + kBitrateToShare / 2,
196 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000197
mflodman48a4beb2016-07-01 13:03:59 +0200198 // Limited by 2x max bitrates since we leave room for FEC and
199 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800200 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200201 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
202 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700203
mflodman48a4beb2016-07-01 13:03:59 +0200204 // Verify that if the bandwidth estimate is set to zero, the allocated
205 // rate is
206 // zero.
minyue78b4d562016-11-30 04:47:39 -0800207 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200208 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
209 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000210}
211
perkj71ee44c2016-06-15 00:47:53 -0700212TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
213 TestBitrateObserver bitrate_observer;
214 const uint32_t kMinSendBitrateBps = 100000;
215 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100216 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700217
philipelf69e7682018-02-28 13:06:28 +0100218 EXPECT_CALL(limit_observer_,
219 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
220 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200221 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
222 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100223 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700224 allocator_->RemoveObserver(&bitrate_observer);
225}
226
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000227class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
228 protected:
perkj71ee44c2016-06-15 00:47:53 -0700229 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100230 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800231 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000232 }
233 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200234 void AddObserver(BitrateAllocatorObserver* observer,
235 uint32_t min_bitrate_bps,
236 uint32_t max_bitrate_bps,
237 uint32_t pad_up_bitrate_bps,
238 bool enforce_min_bitrate,
239 std::string track_id,
240 double bitrate_priority) {
241 allocator_->AddObserver(
242 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
243 enforce_min_bitrate, track_id, bitrate_priority, false});
244 }
perkj71ee44c2016-06-15 00:47:53 -0700245 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100246 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000247};
248
mflodman101f2502016-06-09 17:21:19 +0200249// The following three tests verify enforcing a minimum bitrate works as
250// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000251TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
252 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700253 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
254 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200255 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100256 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200257 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
258 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200259 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000260
mflodman48a4beb2016-07-01 13:03:59 +0200261 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800262 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200263 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000264
mflodman48a4beb2016-07-01 13:03:59 +0200265 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800266 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200267 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000268
philipelf69e7682018-02-28 13:06:28 +0100269 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200270 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000271}
272
273TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
274 TestBitrateObserver bitrate_observer_1;
275 TestBitrateObserver bitrate_observer_2;
276 TestBitrateObserver bitrate_observer_3;
277 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200278 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
279 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700280 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100281
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200282 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
283 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700284 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200285 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100286
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200287 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
288 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700289 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200290 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
291 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000292
mflodman101f2502016-06-09 17:21:19 +0200293 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
294 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800295 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000296 // Verify that each observer gets its min rate (sum of min rates is 600000),
297 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100298 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200299 EXPECT_EQ(100000u + bitrate_to_share / 3,
300 bitrate_observer_1.last_bitrate_bps_);
301 EXPECT_EQ(200000u + bitrate_to_share / 3,
302 bitrate_observer_2.last_bitrate_bps_);
303 EXPECT_EQ(300000u + bitrate_to_share / 3,
304 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000305
mflodman101f2502016-06-09 17:21:19 +0200306 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800307 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200308 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
309 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200310 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200311
312 // Increased BWE, but still below the sum of configured min bitrates for all
313 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800314 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200315 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
316 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200317 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000318
mflodman101f2502016-06-09 17:21:19 +0200319 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800320 allocator_->OnNetworkChanged(10000, 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_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000324
perkjec81bcd2016-05-11 06:01:13 -0700325 // Verify that zero estimated bandwidth, means that that all gets zero,
326 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800327 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200328 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
329 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
330 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700331
mflodman86aabb22016-03-11 15:44:32 +0100332 allocator_->RemoveObserver(&bitrate_observer_1);
333 allocator_->RemoveObserver(&bitrate_observer_2);
334 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000335}
336
mflodman48a4beb2016-07-01 13:03:59 +0200337TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
338 TestBitrateObserver bitrate_observer;
339 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
340 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200341 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100342 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200343 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
344 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200345 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
346
347 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800348 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200349 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
350
351 // Add loss and use a part of the bitrate for protection.
352 double protection_ratio = 0.4;
353 uint8_t fraction_loss = protection_ratio * 256;
354 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800355 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
356 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200357 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
358
359 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800360 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
361 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200362 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
363
364 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800365 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
366 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200367 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
368
369 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100370 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800371 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
372 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200373 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
374
375 // Remove all protection and make sure video is not paused as earlier.
376 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800377 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200378 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
379
minyue78b4d562016-11-30 04:47:39 -0800380 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200381 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
382
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200383 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200384 allocator_->RemoveObserver(&bitrate_observer);
385}
386
387TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
388 TestBitrateObserver bitrate_observer_1;
389 TestBitrateObserver bitrate_observer_2;
390
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200391 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
392 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200393 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200394 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
395 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200396 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
397 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
398
399 // Enough bitrate for both.
400 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800401 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200402 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
403 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
404
405 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800406 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200407 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
408 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
409
minyue78b4d562016-11-30 04:47:39 -0800410 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200411 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
412 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
413
minyue78b4d562016-11-30 04:47:39 -0800414 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200415 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
416 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
417
minyue78b4d562016-11-30 04:47:39 -0800418 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200419 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
420 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
421
minyue78b4d562016-11-30 04:47:39 -0800422 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200423 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
424 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
425
426 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800427 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200428 EXPECT_EQ(400000u, 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(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200432 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
433 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
434
435 allocator_->RemoveObserver(&bitrate_observer_1);
436 allocator_->RemoveObserver(&bitrate_observer_2);
437}
438
mflodman101f2502016-06-09 17:21:19 +0200439TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000440 TestBitrateObserver bitrate_observer_1;
441 TestBitrateObserver bitrate_observer_2;
442 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100443
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200444 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
445 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700446 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
447
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200448 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
449 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700450 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200451 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100452
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200453 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
454 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200455 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
456 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
457 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000458
mflodman48a4beb2016-07-01 13:03:59 +0200459 // Low BWE. Verify that all observers still get their respective min
460 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800461 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200462 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
463 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
464 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000465
mflodman48a4beb2016-07-01 13:03:59 +0200466 allocator_->RemoveObserver(&bitrate_observer_1);
467 allocator_->RemoveObserver(&bitrate_observer_2);
468 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000469}
perkjfea93092016-05-14 00:58:48 -0700470
471TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
472 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100473 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700474
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200475 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
476 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700477 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700478
479 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800480 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700481
mflodman101f2502016-06-09 17:21:19 +0200482 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700483
484 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700485 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100486 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200487 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
488 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700489
490 // Expect the start_bitrate to be set as if the network was still up but that
491 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700492 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200493 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
494 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700495
496 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800497 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200498 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
499 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
500}
501
502TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
503 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200504 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
505 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200506 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200507
mflodman48a4beb2016-07-01 13:03:59 +0200508 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200509 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
510 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200511 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
512 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200513
minyue78b4d562016-11-30 04:47:39 -0800514 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200515 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
516 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200517
minyue78b4d562016-11-30 04:47:39 -0800518 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200519 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
520 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200521
minyue78b4d562016-11-30 04:47:39 -0800522 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200523 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
524 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200525
minyue78b4d562016-11-30 04:47:39 -0800526 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200527 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
528 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200529
minyue78b4d562016-11-30 04:47:39 -0800530 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200531 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
532 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200533
minyue78b4d562016-11-30 04:47:39 -0800534 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200535 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
536 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200537
minyue78b4d562016-11-30 04:47:39 -0800538 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200539 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
540 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200541
mflodman48a4beb2016-07-01 13:03:59 +0200542 allocator_->RemoveObserver(&enforced_observer);
543 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200544}
545
546TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
547 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200548 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200549 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200550
minyue78b4d562016-11-30 04:47:39 -0800551 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200553
minyue78b4d562016-11-30 04:47:39 -0800554 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200555 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200556
minyue78b4d562016-11-30 04:47:39 -0800557 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200558 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200559
minyue78b4d562016-11-30 04:47:39 -0800560 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200561 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200562
minyue78b4d562016-11-30 04:47:39 -0800563 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200564 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200565
minyue78b4d562016-11-30 04:47:39 -0800566 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200567 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200568
mflodman48a4beb2016-07-01 13:03:59 +0200569 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200570}
571
572TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
573 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200574 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200575 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200576
minyue78b4d562016-11-30 04:47:39 -0800577 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200578 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200579
minyue78b4d562016-11-30 04:47:39 -0800580 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200581 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200582
minyue78b4d562016-11-30 04:47:39 -0800583 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200584 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200585
minyue78b4d562016-11-30 04:47:39 -0800586 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200587 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200588
minyue78b4d562016-11-30 04:47:39 -0800589 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200590 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200591
minyue78b4d562016-11-30 04:47:39 -0800592 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200593 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200594
mflodman48a4beb2016-07-01 13:03:59 +0200595 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700596}
597
minyue78b4d562016-11-30 04:47:39 -0800598TEST_F(BitrateAllocatorTest, PassProbingInterval) {
599 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200600 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800601 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
602
603 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
604 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
605
606 allocator_->RemoveObserver(&observer);
607}
608
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800609TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
610 TestBitrateObserver observer;
611 const uint32_t kMinSendBitrateBps = 10;
612 const uint32_t kMaxSendBitrateBps = 60;
613 const uint32_t kNetworkBandwidthBps = 30;
614
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200615 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
616 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800617 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
618 kDefaultProbingIntervalMs);
619
620 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
621
622 allocator_->RemoveObserver(&observer);
623}
624
625// Tests that two observers with the same bitrate priority are allocated
626// their bitrate evenly.
627TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
628 TestBitrateObserver observer_low_1;
629 TestBitrateObserver observer_low_2;
630 const uint32_t kMinSendBitrateBps = 10;
631 const uint32_t kMaxSendBitrateBps = 60;
632 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200633 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
634 "low1", 2.0);
635 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
636 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800637 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
638 kDefaultProbingIntervalMs);
639
640 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
641 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
642
643 allocator_->RemoveObserver(&observer_low_1);
644 allocator_->RemoveObserver(&observer_low_2);
645}
646
647// Tests that there is no difference in functionality when the min bitrate is
648// enforced.
649TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
650 TestBitrateObserver observer_low_1;
651 TestBitrateObserver observer_low_2;
652 const uint32_t kMinSendBitrateBps = 0;
653 const uint32_t kMaxSendBitrateBps = 60;
654 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200655 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
656 "low1", 2.0);
657 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
658 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800659 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
660 kDefaultProbingIntervalMs);
661
662 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
663 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
664
665 allocator_->RemoveObserver(&observer_low_1);
666 allocator_->RemoveObserver(&observer_low_2);
667}
668
669// Tests that if the available bandwidth is the sum of the max bitrate
670// of all observers, they will be allocated their max.
671TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
672 TestBitrateObserver observer_low;
673 TestBitrateObserver observer_mid;
674 const uint32_t kMinSendBitrateBps = 0;
675 const uint32_t kMaxSendBitrateBps = 60;
676 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200677 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
678 "low", 2.0);
679 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
680 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800681 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
682 kDefaultProbingIntervalMs);
683
684 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
685 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
686
687 allocator_->RemoveObserver(&observer_low);
688 allocator_->RemoveObserver(&observer_mid);
689}
690
691// Tests that after a higher bitrate priority observer has been allocated its
692// max bitrate the lower priority observer will then be allocated the remaining
693// bitrate.
694TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
695 TestBitrateObserver observer_low;
696 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200697 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
698 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800699 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
700
701 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
702 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
703
704 allocator_->RemoveObserver(&observer_low);
705 allocator_->RemoveObserver(&observer_mid);
706}
707
708// Tests that three observers with three different bitrate priorities will all
709// be allocated bitrate according to their relative bitrate priority.
710TEST_F(BitrateAllocatorTest,
711 PriorityRateThreeObserversAllocatedRelativeAmounts) {
712 TestBitrateObserver observer_low;
713 TestBitrateObserver observer_mid;
714 TestBitrateObserver observer_high;
715 const uint32_t kMaxBitrate = 100;
716 // Not enough bandwidth to fill any observer's max bitrate.
717 const uint32_t kNetworkBandwidthBps = 70;
718 const double kLowBitratePriority = 2.0;
719 const double kMidBitratePriority = 4.0;
720 const double kHighBitratePriority = 8.0;
721 const double kTotalBitratePriority =
722 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200723 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
724 kLowBitratePriority);
725 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
726 kMidBitratePriority);
727 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
728 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800729 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
730 kDefaultProbingIntervalMs);
731
732 const double kLowFractionAllocated =
733 kLowBitratePriority / kTotalBitratePriority;
734 const double kMidFractionAllocated =
735 kMidBitratePriority / kTotalBitratePriority;
736 const double kHighFractionAllocated =
737 kHighBitratePriority / kTotalBitratePriority;
738 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
739 observer_low.last_bitrate_bps_);
740 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
741 observer_mid.last_bitrate_bps_);
742 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
743 observer_high.last_bitrate_bps_);
744
745 allocator_->RemoveObserver(&observer_low);
746 allocator_->RemoveObserver(&observer_mid);
747 allocator_->RemoveObserver(&observer_high);
748}
749
750// Tests that after the high priority observer has been allocated its maximum
751// bitrate, the other two observers are still allocated bitrate according to
752// their relative bitrate priority.
753TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
754 TestBitrateObserver observer_low;
755 const double kLowBitratePriority = 2.0;
756 TestBitrateObserver observer_mid;
757 const double kMidBitratePriority = 4.0;
758 TestBitrateObserver observer_high;
759 const double kHighBitratePriority = 8.0;
760
761 const uint32_t kAvailableBitrate = 90;
762 const uint32_t kMaxBitrate = 40;
763 const uint32_t kMinBitrate = 10;
764 // Remaining bitrate after allocating to all mins and knowing that the high
765 // priority observer will have its max bitrate allocated.
766 const uint32_t kRemainingBitrate =
767 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
768
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200769 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
770 kLowBitratePriority);
771 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
772 kMidBitratePriority);
773 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
774 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800775 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
776 kDefaultProbingIntervalMs);
777
778 const double kLowFractionAllocated =
779 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
780 const double kMidFractionAllocated =
781 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
782 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
783 observer_low.last_bitrate_bps_);
784 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
785 observer_mid.last_bitrate_bps_);
786 EXPECT_EQ(40u, 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 low 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, PriorityRateThreeObserversLowAllocatedToMax) {
797 TestBitrateObserver observer_low;
798 const double kLowBitratePriority = 2.0;
799 const uint32_t kLowMaxBitrate = 10;
800 TestBitrateObserver observer_mid;
801 const double kMidBitratePriority = 4.0;
802 TestBitrateObserver observer_high;
803 const double kHighBitratePriority = 8.0;
804
805 const uint32_t kMinBitrate = 0;
806 const uint32_t kMaxBitrate = 60;
807 const uint32_t kAvailableBitrate = 100;
808 // Remaining bitrate knowing that the low priority observer is allocated its
809 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
810 // available bitrate, so 70 bps would be sufficient network bandwidth.
811 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
812
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200813 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
814 kLowBitratePriority);
815 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
816 kMidBitratePriority);
817 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
818 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800819 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
820 kDefaultProbingIntervalMs);
821
822 const double kMidFractionAllocated =
823 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
824 const double kHighFractionAllocated =
825 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
826 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
827 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
828 observer_mid.last_bitrate_bps_);
829 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
830 observer_high.last_bitrate_bps_);
831
832 allocator_->RemoveObserver(&observer_low);
833 allocator_->RemoveObserver(&observer_mid);
834 allocator_->RemoveObserver(&observer_high);
835}
836
837// Tests that after two observers are allocated bitrate to their max, the
838// the remaining observer is allocated what's left appropriately. This test
839// handles an edge case where the medium and high observer reach their
840// "relative" max allocation at the same time. The high has 40 to allocate
841// above its min, and the mid has 20 to allocate above its min, which scaled
842// by their bitrate priority is the same for each.
843TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
844 TestBitrateObserver observer_low;
845 TestBitrateObserver observer_mid;
846 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200847 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800848 // Scaled allocation above the min allocation is the same for these two,
849 // meaning they will get allocated their max at the same time.
850 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200851 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
852 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800853 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
854
855 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
856 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
857 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
858
859 allocator_->RemoveObserver(&observer_low);
860 allocator_->RemoveObserver(&observer_mid);
861 allocator_->RemoveObserver(&observer_high);
862}
863
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000864} // namespace webrtc