blob: 2961fd409ce98923487a2c3dc64b93da964724ad [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
62 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
63 uint8_t fraction_loss,
minyue78b4d562016-11-30 04:47:39 -080064 int64_t rtt,
65 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 17:21:19 +020066 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000067 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020068 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 04:47:39 -080069 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 13:03:59 +020070 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000071 }
mflodman101f2502016-06-09 17:21:19 +020072 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000073 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020074 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080075 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020076 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000077};
78
minyue78b4d562016-11-30 04:47:39 -080079namespace {
80constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080081const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020082} // namespace
minyue78b4d562016-11-30 04:47:39 -080083
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000084class BitrateAllocatorTest : public ::testing::Test {
85 protected:
perkj71ee44c2016-06-15 00:47:53 -070086 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080087 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010088 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000089 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020090 void AddObserver(BitrateAllocatorObserver* observer,
91 uint32_t min_bitrate_bps,
92 uint32_t max_bitrate_bps,
93 uint32_t pad_up_bitrate_bps,
94 bool enforce_min_bitrate,
95 std::string track_id,
96 double bitrate_priority) {
97 allocator_->AddObserver(
98 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
99 enforce_min_bitrate, track_id, bitrate_priority, false});
100 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000101
perkj71ee44c2016-06-15 00:47:53 -0700102 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800103 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000104};
105
106TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
107 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700108 const uint32_t kMinSendBitrateBps = 100000;
109 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100110 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700111
philipelf69e7682018-02-28 13:06:28 +0100112 EXPECT_CALL(limit_observer_,
113 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
114 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200115 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
116 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700117 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800118 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700119 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000120
Peter Boström8e4e8b02015-09-15 15:08:03 +0200121 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800122 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800123 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700124 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700125
126 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
127 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100128 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200129 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
130 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200131 EXPECT_CALL(limit_observer_,
132 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700133 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000134
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200135 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
136 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700137 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200138 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100139 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200140 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000141}
142
143TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
144 TestBitrateObserver bitrate_observer_1;
145 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100146 const uint32_t kObs1StartBitrateBps = 100000;
147 const uint32_t kObs2StartBitrateBps = 200000;
148 const uint32_t kObs1MaxBitrateBps = 300000;
149 const uint32_t kObs2MaxBitrateBps = 300000;
150
151 EXPECT_CALL(
152 limit_observer_,
153 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200154 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
155 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100156 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
157 allocator_->GetStartBitrate(&bitrate_observer_1));
158 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
159 kObs1StartBitrateBps + kObs2StartBitrateBps,
160 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200161 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
162 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100163 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
164 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000165
mflodman48a4beb2016-07-01 13:03:59 +0200166 // Test too low start bitrate, hence lower than sum of min. Min bitrates
167 // will
168 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100169 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
170 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200171 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
172 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
173 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
174 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
175 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
176 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000177
mflodman48a4beb2016-07-01 13:03:59 +0200178 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800179 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100180 const uint32_t kBitrateToShare =
181 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200182 EXPECT_EQ(100000u + kBitrateToShare / 2,
183 bitrate_observer_1.last_bitrate_bps_);
184 EXPECT_EQ(200000u + kBitrateToShare / 2,
185 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000186
mflodman48a4beb2016-07-01 13:03:59 +0200187 // Limited by 2x max bitrates since we leave room for FEC and
188 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800189 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200190 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
191 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700192
mflodman48a4beb2016-07-01 13:03:59 +0200193 // Verify that if the bandwidth estimate is set to zero, the allocated
194 // rate is
195 // zero.
minyue78b4d562016-11-30 04:47:39 -0800196 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200197 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
198 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000199}
200
perkj71ee44c2016-06-15 00:47:53 -0700201TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
202 TestBitrateObserver bitrate_observer;
203 const uint32_t kMinSendBitrateBps = 100000;
204 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100205 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700206
philipelf69e7682018-02-28 13:06:28 +0100207 EXPECT_CALL(limit_observer_,
208 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
209 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200210 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
211 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100212 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700213 allocator_->RemoveObserver(&bitrate_observer);
214}
215
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
217 protected:
perkj71ee44c2016-06-15 00:47:53 -0700218 BitrateAllocatorTestNoEnforceMin()
219 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800220 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000221 }
222 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200223 void AddObserver(BitrateAllocatorObserver* observer,
224 uint32_t min_bitrate_bps,
225 uint32_t max_bitrate_bps,
226 uint32_t pad_up_bitrate_bps,
227 bool enforce_min_bitrate,
228 std::string track_id,
229 double bitrate_priority) {
230 allocator_->AddObserver(
231 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
232 enforce_min_bitrate, track_id, bitrate_priority, false});
233 }
perkj71ee44c2016-06-15 00:47:53 -0700234 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800235 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000236};
237
mflodman101f2502016-06-09 17:21:19 +0200238// The following three tests verify enforcing a minimum bitrate works as
239// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000240TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
241 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700242 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
243 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200244 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100245 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200246 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
247 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200248 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000249
mflodman48a4beb2016-07-01 13:03:59 +0200250 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800251 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200252 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000253
mflodman48a4beb2016-07-01 13:03:59 +0200254 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800255 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200256 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000257
philipelf69e7682018-02-28 13:06:28 +0100258 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200259 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000260}
261
262TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
263 TestBitrateObserver bitrate_observer_1;
264 TestBitrateObserver bitrate_observer_2;
265 TestBitrateObserver bitrate_observer_3;
266 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200267 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
268 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700269 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100270
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200271 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
272 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700273 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200274 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100275
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200276 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
277 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700278 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200279 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
280 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000281
mflodman101f2502016-06-09 17:21:19 +0200282 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
283 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800284 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000285 // Verify that each observer gets its min rate (sum of min rates is 600000),
286 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100287 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200288 EXPECT_EQ(100000u + bitrate_to_share / 3,
289 bitrate_observer_1.last_bitrate_bps_);
290 EXPECT_EQ(200000u + bitrate_to_share / 3,
291 bitrate_observer_2.last_bitrate_bps_);
292 EXPECT_EQ(300000u + bitrate_to_share / 3,
293 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000294
mflodman101f2502016-06-09 17:21:19 +0200295 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800296 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200297 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
298 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200299 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200300
301 // Increased BWE, but still below the sum of configured min bitrates for all
302 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800303 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200304 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
305 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200306 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000307
mflodman101f2502016-06-09 17:21:19 +0200308 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800309 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200310 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
311 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
312 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000313
perkjec81bcd2016-05-11 06:01:13 -0700314 // Verify that zero estimated bandwidth, means that that all gets zero,
315 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800316 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200317 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
318 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
319 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700320
mflodman86aabb22016-03-11 15:44:32 +0100321 allocator_->RemoveObserver(&bitrate_observer_1);
322 allocator_->RemoveObserver(&bitrate_observer_2);
323 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000324}
325
mflodman48a4beb2016-07-01 13:03:59 +0200326TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
327 TestBitrateObserver bitrate_observer;
328 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
329 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200330 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100331 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200332 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
333 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200334 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
335
336 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800337 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200338 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
339
340 // Add loss and use a part of the bitrate for protection.
341 double protection_ratio = 0.4;
342 uint8_t fraction_loss = protection_ratio * 256;
343 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800344 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
345 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200346 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
347
348 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800349 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
350 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200351 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
352
353 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800354 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
355 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200356 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
357
358 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100359 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800360 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
361 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200362 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
363
364 // Remove all protection and make sure video is not paused as earlier.
365 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800366 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200367 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
368
minyue78b4d562016-11-30 04:47:39 -0800369 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200370 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
371
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200372 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200373 allocator_->RemoveObserver(&bitrate_observer);
374}
375
376TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
377 TestBitrateObserver bitrate_observer_1;
378 TestBitrateObserver bitrate_observer_2;
379
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200380 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
381 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200382 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200383 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
384 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200385 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
386 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
387
388 // Enough bitrate for both.
389 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800390 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200391 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
392 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
393
394 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800395 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200396 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
397 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
398
minyue78b4d562016-11-30 04:47:39 -0800399 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200400 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
401 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
402
minyue78b4d562016-11-30 04:47:39 -0800403 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200404 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
405 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
406
minyue78b4d562016-11-30 04:47:39 -0800407 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200408 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
409 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
410
minyue78b4d562016-11-30 04:47:39 -0800411 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200412 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
413 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
414
415 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800416 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200417 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
418 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
419
minyue78b4d562016-11-30 04:47:39 -0800420 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200421 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
422 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
423
424 allocator_->RemoveObserver(&bitrate_observer_1);
425 allocator_->RemoveObserver(&bitrate_observer_2);
426}
427
mflodman101f2502016-06-09 17:21:19 +0200428TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000429 TestBitrateObserver bitrate_observer_1;
430 TestBitrateObserver bitrate_observer_2;
431 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100432
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200433 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
434 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700435 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
436
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200437 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
438 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700439 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200440 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100441
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200442 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
443 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200444 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
445 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
446 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000447
mflodman48a4beb2016-07-01 13:03:59 +0200448 // Low BWE. Verify that all observers still get their respective min
449 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800450 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200451 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
452 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
453 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000454
mflodman48a4beb2016-07-01 13:03:59 +0200455 allocator_->RemoveObserver(&bitrate_observer_1);
456 allocator_->RemoveObserver(&bitrate_observer_2);
457 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000458}
perkjfea93092016-05-14 00:58:48 -0700459
460TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
461 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100462 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700463
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200464 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
465 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700466 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700467
468 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800469 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700470
mflodman101f2502016-06-09 17:21:19 +0200471 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700472
473 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700474 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100475 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200476 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
477 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700478
479 // Expect the start_bitrate to be set as if the network was still up but that
480 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700481 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200482 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
483 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700484
485 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800486 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200487 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
488 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
489}
490
491TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
492 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200493 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
494 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200495 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200496
mflodman48a4beb2016-07-01 13:03:59 +0200497 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200498 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
499 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200500 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
501 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200502
minyue78b4d562016-11-30 04:47:39 -0800503 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200504 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
505 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200506
minyue78b4d562016-11-30 04:47:39 -0800507 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200508 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
509 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200510
minyue78b4d562016-11-30 04:47:39 -0800511 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200512 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
513 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200514
minyue78b4d562016-11-30 04:47:39 -0800515 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200516 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
517 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200518
minyue78b4d562016-11-30 04:47:39 -0800519 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200520 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
521 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200522
minyue78b4d562016-11-30 04:47:39 -0800523 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200524 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
525 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200526
minyue78b4d562016-11-30 04:47:39 -0800527 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200528 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
529 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200530
mflodman48a4beb2016-07-01 13:03:59 +0200531 allocator_->RemoveObserver(&enforced_observer);
532 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200533}
534
535TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
536 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200537 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200538 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200539
minyue78b4d562016-11-30 04:47:39 -0800540 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200541 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200542
minyue78b4d562016-11-30 04:47:39 -0800543 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200544 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200545
minyue78b4d562016-11-30 04:47:39 -0800546 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200547 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200548
minyue78b4d562016-11-30 04:47:39 -0800549 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200550 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200551
minyue78b4d562016-11-30 04:47:39 -0800552 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200553 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200554
minyue78b4d562016-11-30 04:47:39 -0800555 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200556 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200557
mflodman48a4beb2016-07-01 13:03:59 +0200558 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200559}
560
561TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
562 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200563 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200564 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200565
minyue78b4d562016-11-30 04:47:39 -0800566 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200567 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200568
minyue78b4d562016-11-30 04:47:39 -0800569 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200570 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200571
minyue78b4d562016-11-30 04:47:39 -0800572 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200573 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200574
minyue78b4d562016-11-30 04:47:39 -0800575 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200576 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200577
minyue78b4d562016-11-30 04:47:39 -0800578 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200579 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200580
minyue78b4d562016-11-30 04:47:39 -0800581 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200582 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200583
mflodman48a4beb2016-07-01 13:03:59 +0200584 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700585}
586
minyue78b4d562016-11-30 04:47:39 -0800587TEST_F(BitrateAllocatorTest, PassProbingInterval) {
588 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200589 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800590 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
591
592 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
593 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
594
595 allocator_->RemoveObserver(&observer);
596}
597
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800598TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
599 TestBitrateObserver observer;
600 const uint32_t kMinSendBitrateBps = 10;
601 const uint32_t kMaxSendBitrateBps = 60;
602 const uint32_t kNetworkBandwidthBps = 30;
603
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200604 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
605 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800606 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
607 kDefaultProbingIntervalMs);
608
609 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
610
611 allocator_->RemoveObserver(&observer);
612}
613
614// Tests that two observers with the same bitrate priority are allocated
615// their bitrate evenly.
616TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
617 TestBitrateObserver observer_low_1;
618 TestBitrateObserver observer_low_2;
619 const uint32_t kMinSendBitrateBps = 10;
620 const uint32_t kMaxSendBitrateBps = 60;
621 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200622 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
623 "low1", 2.0);
624 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
625 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800626 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
627 kDefaultProbingIntervalMs);
628
629 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
630 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
631
632 allocator_->RemoveObserver(&observer_low_1);
633 allocator_->RemoveObserver(&observer_low_2);
634}
635
636// Tests that there is no difference in functionality when the min bitrate is
637// enforced.
638TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
639 TestBitrateObserver observer_low_1;
640 TestBitrateObserver observer_low_2;
641 const uint32_t kMinSendBitrateBps = 0;
642 const uint32_t kMaxSendBitrateBps = 60;
643 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200644 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
645 "low1", 2.0);
646 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
647 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800648 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
649 kDefaultProbingIntervalMs);
650
651 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
652 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
653
654 allocator_->RemoveObserver(&observer_low_1);
655 allocator_->RemoveObserver(&observer_low_2);
656}
657
658// Tests that if the available bandwidth is the sum of the max bitrate
659// of all observers, they will be allocated their max.
660TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
661 TestBitrateObserver observer_low;
662 TestBitrateObserver observer_mid;
663 const uint32_t kMinSendBitrateBps = 0;
664 const uint32_t kMaxSendBitrateBps = 60;
665 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200666 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
667 "low", 2.0);
668 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
669 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800670 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
671 kDefaultProbingIntervalMs);
672
673 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
674 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
675
676 allocator_->RemoveObserver(&observer_low);
677 allocator_->RemoveObserver(&observer_mid);
678}
679
680// Tests that after a higher bitrate priority observer has been allocated its
681// max bitrate the lower priority observer will then be allocated the remaining
682// bitrate.
683TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
684 TestBitrateObserver observer_low;
685 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200686 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
687 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800688 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
689
690 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
691 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
692
693 allocator_->RemoveObserver(&observer_low);
694 allocator_->RemoveObserver(&observer_mid);
695}
696
697// Tests that three observers with three different bitrate priorities will all
698// be allocated bitrate according to their relative bitrate priority.
699TEST_F(BitrateAllocatorTest,
700 PriorityRateThreeObserversAllocatedRelativeAmounts) {
701 TestBitrateObserver observer_low;
702 TestBitrateObserver observer_mid;
703 TestBitrateObserver observer_high;
704 const uint32_t kMaxBitrate = 100;
705 // Not enough bandwidth to fill any observer's max bitrate.
706 const uint32_t kNetworkBandwidthBps = 70;
707 const double kLowBitratePriority = 2.0;
708 const double kMidBitratePriority = 4.0;
709 const double kHighBitratePriority = 8.0;
710 const double kTotalBitratePriority =
711 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200712 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
713 kLowBitratePriority);
714 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
715 kMidBitratePriority);
716 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
717 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800718 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
719 kDefaultProbingIntervalMs);
720
721 const double kLowFractionAllocated =
722 kLowBitratePriority / kTotalBitratePriority;
723 const double kMidFractionAllocated =
724 kMidBitratePriority / kTotalBitratePriority;
725 const double kHighFractionAllocated =
726 kHighBitratePriority / kTotalBitratePriority;
727 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
728 observer_low.last_bitrate_bps_);
729 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
730 observer_mid.last_bitrate_bps_);
731 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
732 observer_high.last_bitrate_bps_);
733
734 allocator_->RemoveObserver(&observer_low);
735 allocator_->RemoveObserver(&observer_mid);
736 allocator_->RemoveObserver(&observer_high);
737}
738
739// Tests that after the high priority observer has been allocated its maximum
740// bitrate, the other two observers are still allocated bitrate according to
741// their relative bitrate priority.
742TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
743 TestBitrateObserver observer_low;
744 const double kLowBitratePriority = 2.0;
745 TestBitrateObserver observer_mid;
746 const double kMidBitratePriority = 4.0;
747 TestBitrateObserver observer_high;
748 const double kHighBitratePriority = 8.0;
749
750 const uint32_t kAvailableBitrate = 90;
751 const uint32_t kMaxBitrate = 40;
752 const uint32_t kMinBitrate = 10;
753 // Remaining bitrate after allocating to all mins and knowing that the high
754 // priority observer will have its max bitrate allocated.
755 const uint32_t kRemainingBitrate =
756 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
757
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200758 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
759 kLowBitratePriority);
760 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
761 kMidBitratePriority);
762 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
763 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800764 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
765 kDefaultProbingIntervalMs);
766
767 const double kLowFractionAllocated =
768 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
769 const double kMidFractionAllocated =
770 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
771 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
772 observer_low.last_bitrate_bps_);
773 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
774 observer_mid.last_bitrate_bps_);
775 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
776
777 allocator_->RemoveObserver(&observer_low);
778 allocator_->RemoveObserver(&observer_mid);
779 allocator_->RemoveObserver(&observer_high);
780}
781
782// Tests that after the low priority observer has been allocated its maximum
783// bitrate, the other two observers are still allocated bitrate according to
784// their relative bitrate priority.
785TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
786 TestBitrateObserver observer_low;
787 const double kLowBitratePriority = 2.0;
788 const uint32_t kLowMaxBitrate = 10;
789 TestBitrateObserver observer_mid;
790 const double kMidBitratePriority = 4.0;
791 TestBitrateObserver observer_high;
792 const double kHighBitratePriority = 8.0;
793
794 const uint32_t kMinBitrate = 0;
795 const uint32_t kMaxBitrate = 60;
796 const uint32_t kAvailableBitrate = 100;
797 // Remaining bitrate knowing that the low priority observer is allocated its
798 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
799 // available bitrate, so 70 bps would be sufficient network bandwidth.
800 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
801
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200802 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
803 kLowBitratePriority);
804 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
805 kMidBitratePriority);
806 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
807 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800808 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
809 kDefaultProbingIntervalMs);
810
811 const double kMidFractionAllocated =
812 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
813 const double kHighFractionAllocated =
814 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
815 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
816 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
817 observer_mid.last_bitrate_bps_);
818 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
819 observer_high.last_bitrate_bps_);
820
821 allocator_->RemoveObserver(&observer_low);
822 allocator_->RemoveObserver(&observer_mid);
823 allocator_->RemoveObserver(&observer_high);
824}
825
826// Tests that after two observers are allocated bitrate to their max, the
827// the remaining observer is allocated what's left appropriately. This test
828// handles an edge case where the medium and high observer reach their
829// "relative" max allocation at the same time. The high has 40 to allocate
830// above its min, and the mid has 20 to allocate above its min, which scaled
831// by their bitrate priority is the same for each.
832TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
833 TestBitrateObserver observer_low;
834 TestBitrateObserver observer_mid;
835 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200836 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800837 // Scaled allocation above the min allocation is the same for these two,
838 // meaning they will get allocated their max at the same time.
839 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200840 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
841 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800842 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
843
844 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
845 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
846 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
847
848 allocator_->RemoveObserver(&observer_low);
849 allocator_->RemoveObserver(&observer_mid);
850 allocator_->RemoveObserver(&observer_high);
851}
852
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000853} // namespace webrtc