blob: 61d5410540aedc580e2dfccebece7cba186b46af [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) {
Erik Språngd1d7b232018-12-06 17:31:25 +0100338 const uint32_t kMinBitrateBps = 100000;
339 const uint32_t kMaxBitrateBps = 400000;
340 // Hysteresis adds another 10% or 20kbps to min bitrate.
341 const uint32_t kMinStartBitrateBps =
342 kMinBitrateBps + std::max(20000u, kMinBitrateBps / 10);
343
mflodman48a4beb2016-07-01 13:03:59 +0200344 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
345 // AddObserver is called with |enforce_min_bitrate| = false.
Erik Språngd1d7b232018-12-06 17:31:25 +0100346 TestBitrateObserver bitrate_observer;
347 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
348 AddObserver(&bitrate_observer, kMinBitrateBps, kMaxBitrateBps, 0, false, "",
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200349 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200350 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
351
352 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800353 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200354 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
355
356 // Add loss and use a part of the bitrate for protection.
Erik Språngd1d7b232018-12-06 17:31:25 +0100357 const double kProtectionRatio = 0.4;
358 uint32_t target_bitrate_bps = 200000;
359 const uint32_t kMaxBitrateWithProtectionBps =
360 static_cast<uint32_t>(kMaxBitrateBps / (1 - kProtectionRatio));
361 uint8_t fraction_loss = kProtectionRatio * 256;
362 bitrate_observer.SetBitrateProtectionRatio(kProtectionRatio);
363 EXPECT_CALL(limit_observer_,
364 OnAllocationLimitsChanged(0, 0, kMaxBitrateWithProtectionBps));
365 allocator_->OnNetworkChanged(target_bitrate_bps, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800366 kDefaultProbingIntervalMs);
Erik Språngd1d7b232018-12-06 17:31:25 +0100367 EXPECT_EQ(target_bitrate_bps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200368
369 // Above the min threshold, but not enough given the protection used.
Erik Språngd1d7b232018-12-06 17:31:25 +0100370 // Limits changed, as we will video is now off and we need to pad up to the
371 // start bitrate.
372 target_bitrate_bps = kMinStartBitrateBps + 1000;
373 // Verify the hysteresis is added for the protection.
374 const uint32_t kMinStartBitrateWithProtectionBps =
375 static_cast<uint32_t>(kMinStartBitrateBps * (1 + kProtectionRatio));
376 EXPECT_CALL(limit_observer_,
377 OnAllocationLimitsChanged(0, kMinStartBitrateWithProtectionBps,
378 kMaxBitrateWithProtectionBps));
379 allocator_->OnNetworkChanged(kMinStartBitrateBps + 1000, 0, fraction_loss,
minyue78b4d562016-11-30 04:47:39 -0800380 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200381 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
382
Erik Språngd1d7b232018-12-06 17:31:25 +0100383 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0,
384 fraction_loss, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200385 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
386
387 // Just enough to enable video again.
Erik Språngd1d7b232018-12-06 17:31:25 +0100388 target_bitrate_bps = kMinStartBitrateWithProtectionBps;
389 EXPECT_CALL(limit_observer_,
390 OnAllocationLimitsChanged(0, 0, kMaxBitrateWithProtectionBps));
391 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps, 0,
392 fraction_loss, kDefaultProbingIntervalMs);
393 EXPECT_EQ(kMinStartBitrateWithProtectionBps,
394 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200395
396 // Remove all protection and make sure video is not paused as earlier.
397 bitrate_observer.SetBitrateProtectionRatio(0.0);
Erik Språngd1d7b232018-12-06 17:31:25 +0100398 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, kMaxBitrateBps));
399 allocator_->OnNetworkChanged(kMinStartBitrateWithProtectionBps - 1000, 0, 0,
400 kDefaultProbingIntervalMs);
401 EXPECT_EQ(kMinStartBitrateWithProtectionBps - 1000,
402 bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200403
Erik Språngd1d7b232018-12-06 17:31:25 +0100404 allocator_->OnNetworkChanged(kMinStartBitrateBps, 0, 0,
405 kDefaultProbingIntervalMs);
406 EXPECT_EQ(kMinStartBitrateBps, bitrate_observer.last_bitrate_bps_);
mflodman48a4beb2016-07-01 13:03:59 +0200407
Erik Språngd1d7b232018-12-06 17:31:25 +0100408 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200409 allocator_->RemoveObserver(&bitrate_observer);
410}
411
412TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
413 TestBitrateObserver bitrate_observer_1;
414 TestBitrateObserver bitrate_observer_2;
415
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200416 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
417 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200418 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200419 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
420 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200421 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
422 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
423
424 // Enough bitrate for both.
425 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800426 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200427 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
428 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
429
430 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800431 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200432 EXPECT_EQ(330000u, 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(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200436 EXPECT_EQ(100000u, 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(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200440 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
441 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
442
minyue78b4d562016-11-30 04:47:39 -0800443 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200444 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
445 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
446
minyue78b4d562016-11-30 04:47:39 -0800447 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200448 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
449 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
450
451 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800452 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200453 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
454 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
455
minyue78b4d562016-11-30 04:47:39 -0800456 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200457 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
458 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
459
460 allocator_->RemoveObserver(&bitrate_observer_1);
461 allocator_->RemoveObserver(&bitrate_observer_2);
462}
463
mflodman101f2502016-06-09 17:21:19 +0200464TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000465 TestBitrateObserver bitrate_observer_1;
466 TestBitrateObserver bitrate_observer_2;
467 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100468
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200469 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
470 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700471 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
472
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200473 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
474 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700475 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200476 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100477
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200478 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
479 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200480 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
481 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
482 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000483
mflodman48a4beb2016-07-01 13:03:59 +0200484 // Low BWE. Verify that all observers still get their respective min
485 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800486 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200487 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
488 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
489 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000490
mflodman48a4beb2016-07-01 13:03:59 +0200491 allocator_->RemoveObserver(&bitrate_observer_1);
492 allocator_->RemoveObserver(&bitrate_observer_2);
493 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000494}
perkjfea93092016-05-14 00:58:48 -0700495
496TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
497 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100498 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700499
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200500 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
501 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700502 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700503
504 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800505 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700506
mflodman101f2502016-06-09 17:21:19 +0200507 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700508
509 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700510 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100511 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200512 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
513 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700514
515 // Expect the start_bitrate to be set as if the network was still up but that
516 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700517 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200518 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
519 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700520
521 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800522 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200523 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
524 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
525}
526
527TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
528 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200529 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
530 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200531 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200532
mflodman48a4beb2016-07-01 13:03:59 +0200533 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200534 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
535 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200536 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
537 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200538
minyue78b4d562016-11-30 04:47:39 -0800539 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200540 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
541 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200542
minyue78b4d562016-11-30 04:47:39 -0800543 allocator_->OnNetworkChanged(35000, 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(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200548 EXPECT_EQ(6000u, 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(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
553 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200554
minyue78b4d562016-11-30 04:47:39 -0800555 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200556 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
557 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200558
minyue78b4d562016-11-30 04:47:39 -0800559 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200560 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
561 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200562
minyue78b4d562016-11-30 04:47:39 -0800563 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200564 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
565 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200566
mflodman48a4beb2016-07-01 13:03:59 +0200567 allocator_->RemoveObserver(&enforced_observer);
568 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200569}
570
571TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
572 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200573 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200574 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200575
minyue78b4d562016-11-30 04:47:39 -0800576 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200577 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200578
minyue78b4d562016-11-30 04:47:39 -0800579 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200580 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200581
minyue78b4d562016-11-30 04:47:39 -0800582 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200583 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200584
minyue78b4d562016-11-30 04:47:39 -0800585 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200586 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200587
minyue78b4d562016-11-30 04:47:39 -0800588 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200589 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200590
minyue78b4d562016-11-30 04:47:39 -0800591 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200592 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200593
mflodman48a4beb2016-07-01 13:03:59 +0200594 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200595}
596
597TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
598 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200599 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200600 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200601
minyue78b4d562016-11-30 04:47:39 -0800602 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200603 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200604
minyue78b4d562016-11-30 04:47:39 -0800605 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200606 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200607
minyue78b4d562016-11-30 04:47:39 -0800608 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200609 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200610
minyue78b4d562016-11-30 04:47:39 -0800611 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200612 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200613
minyue78b4d562016-11-30 04:47:39 -0800614 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200615 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200616
minyue78b4d562016-11-30 04:47:39 -0800617 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200618 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200619
mflodman48a4beb2016-07-01 13:03:59 +0200620 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700621}
622
minyue78b4d562016-11-30 04:47:39 -0800623TEST_F(BitrateAllocatorTest, PassProbingInterval) {
624 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200625 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800626 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
627
628 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
629 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
630
631 allocator_->RemoveObserver(&observer);
632}
633
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800634TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
635 TestBitrateObserver observer;
636 const uint32_t kMinSendBitrateBps = 10;
637 const uint32_t kMaxSendBitrateBps = 60;
638 const uint32_t kNetworkBandwidthBps = 30;
639
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200640 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
641 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800642 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
643 kDefaultProbingIntervalMs);
644
645 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
646
647 allocator_->RemoveObserver(&observer);
648}
649
650// Tests that two observers with the same bitrate priority are allocated
651// their bitrate evenly.
652TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
653 TestBitrateObserver observer_low_1;
654 TestBitrateObserver observer_low_2;
655 const uint32_t kMinSendBitrateBps = 10;
656 const uint32_t kMaxSendBitrateBps = 60;
657 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200658 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
659 "low1", 2.0);
660 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
661 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800662 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
663 kDefaultProbingIntervalMs);
664
665 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
666 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
667
668 allocator_->RemoveObserver(&observer_low_1);
669 allocator_->RemoveObserver(&observer_low_2);
670}
671
672// Tests that there is no difference in functionality when the min bitrate is
673// enforced.
674TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
675 TestBitrateObserver observer_low_1;
676 TestBitrateObserver observer_low_2;
677 const uint32_t kMinSendBitrateBps = 0;
678 const uint32_t kMaxSendBitrateBps = 60;
679 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200680 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
681 "low1", 2.0);
682 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
683 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800684 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
685 kDefaultProbingIntervalMs);
686
687 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
688 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
689
690 allocator_->RemoveObserver(&observer_low_1);
691 allocator_->RemoveObserver(&observer_low_2);
692}
693
694// Tests that if the available bandwidth is the sum of the max bitrate
695// of all observers, they will be allocated their max.
696TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
697 TestBitrateObserver observer_low;
698 TestBitrateObserver observer_mid;
699 const uint32_t kMinSendBitrateBps = 0;
700 const uint32_t kMaxSendBitrateBps = 60;
701 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200702 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
703 "low", 2.0);
704 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
705 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800706 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
707 kDefaultProbingIntervalMs);
708
709 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
710 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
711
712 allocator_->RemoveObserver(&observer_low);
713 allocator_->RemoveObserver(&observer_mid);
714}
715
716// Tests that after a higher bitrate priority observer has been allocated its
717// max bitrate the lower priority observer will then be allocated the remaining
718// bitrate.
719TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
720 TestBitrateObserver observer_low;
721 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200722 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
723 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800724 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
725
726 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
727 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
728
729 allocator_->RemoveObserver(&observer_low);
730 allocator_->RemoveObserver(&observer_mid);
731}
732
733// Tests that three observers with three different bitrate priorities will all
734// be allocated bitrate according to their relative bitrate priority.
735TEST_F(BitrateAllocatorTest,
736 PriorityRateThreeObserversAllocatedRelativeAmounts) {
737 TestBitrateObserver observer_low;
738 TestBitrateObserver observer_mid;
739 TestBitrateObserver observer_high;
740 const uint32_t kMaxBitrate = 100;
741 // Not enough bandwidth to fill any observer's max bitrate.
742 const uint32_t kNetworkBandwidthBps = 70;
743 const double kLowBitratePriority = 2.0;
744 const double kMidBitratePriority = 4.0;
745 const double kHighBitratePriority = 8.0;
746 const double kTotalBitratePriority =
747 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200748 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
749 kLowBitratePriority);
750 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
751 kMidBitratePriority);
752 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
753 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800754 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
755 kDefaultProbingIntervalMs);
756
757 const double kLowFractionAllocated =
758 kLowBitratePriority / kTotalBitratePriority;
759 const double kMidFractionAllocated =
760 kMidBitratePriority / kTotalBitratePriority;
761 const double kHighFractionAllocated =
762 kHighBitratePriority / kTotalBitratePriority;
763 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
764 observer_low.last_bitrate_bps_);
765 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
766 observer_mid.last_bitrate_bps_);
767 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
768 observer_high.last_bitrate_bps_);
769
770 allocator_->RemoveObserver(&observer_low);
771 allocator_->RemoveObserver(&observer_mid);
772 allocator_->RemoveObserver(&observer_high);
773}
774
775// Tests that after the high priority observer has been allocated its maximum
776// bitrate, the other two observers are still allocated bitrate according to
777// their relative bitrate priority.
778TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
779 TestBitrateObserver observer_low;
780 const double kLowBitratePriority = 2.0;
781 TestBitrateObserver observer_mid;
782 const double kMidBitratePriority = 4.0;
783 TestBitrateObserver observer_high;
784 const double kHighBitratePriority = 8.0;
785
786 const uint32_t kAvailableBitrate = 90;
787 const uint32_t kMaxBitrate = 40;
788 const uint32_t kMinBitrate = 10;
789 // Remaining bitrate after allocating to all mins and knowing that the high
790 // priority observer will have its max bitrate allocated.
791 const uint32_t kRemainingBitrate =
792 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
793
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200794 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
795 kLowBitratePriority);
796 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
797 kMidBitratePriority);
798 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
799 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800800 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
801 kDefaultProbingIntervalMs);
802
803 const double kLowFractionAllocated =
804 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
805 const double kMidFractionAllocated =
806 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
807 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
808 observer_low.last_bitrate_bps_);
809 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
810 observer_mid.last_bitrate_bps_);
811 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
812
813 allocator_->RemoveObserver(&observer_low);
814 allocator_->RemoveObserver(&observer_mid);
815 allocator_->RemoveObserver(&observer_high);
816}
817
818// Tests that after the low priority observer has been allocated its maximum
819// bitrate, the other two observers are still allocated bitrate according to
820// their relative bitrate priority.
821TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
822 TestBitrateObserver observer_low;
823 const double kLowBitratePriority = 2.0;
824 const uint32_t kLowMaxBitrate = 10;
825 TestBitrateObserver observer_mid;
826 const double kMidBitratePriority = 4.0;
827 TestBitrateObserver observer_high;
828 const double kHighBitratePriority = 8.0;
829
830 const uint32_t kMinBitrate = 0;
831 const uint32_t kMaxBitrate = 60;
832 const uint32_t kAvailableBitrate = 100;
833 // Remaining bitrate knowing that the low priority observer is allocated its
834 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
835 // available bitrate, so 70 bps would be sufficient network bandwidth.
836 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
837
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200838 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
839 kLowBitratePriority);
840 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
841 kMidBitratePriority);
842 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
843 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800844 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
845 kDefaultProbingIntervalMs);
846
847 const double kMidFractionAllocated =
848 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
849 const double kHighFractionAllocated =
850 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
851 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
852 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
853 observer_mid.last_bitrate_bps_);
854 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
855 observer_high.last_bitrate_bps_);
856
857 allocator_->RemoveObserver(&observer_low);
858 allocator_->RemoveObserver(&observer_mid);
859 allocator_->RemoveObserver(&observer_high);
860}
861
862// Tests that after two observers are allocated bitrate to their max, the
863// the remaining observer is allocated what's left appropriately. This test
864// handles an edge case where the medium and high observer reach their
865// "relative" max allocation at the same time. The high has 40 to allocate
866// above its min, and the mid has 20 to allocate above its min, which scaled
867// by their bitrate priority is the same for each.
868TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
869 TestBitrateObserver observer_low;
870 TestBitrateObserver observer_mid;
871 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200872 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800873 // Scaled allocation above the min allocation is the same for these two,
874 // meaning they will get allocated their max at the same time.
875 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200876 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
877 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800878 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
879
880 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
881 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
882 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
883
884 allocator_->RemoveObserver(&observer_low);
885 allocator_->RemoveObserver(&observer_mid);
886 allocator_->RemoveObserver(&observer_high);
887}
888
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000889} // namespace webrtc