blob: e0aae7baedca667fbe1278835b141a5ffe1d6ec3 [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 {
63 last_bitrate_bps_ = update.bitrate_bps;
64 last_fraction_loss_ = update.fraction_loss;
65 last_rtt_ms_ = update.rtt;
66 last_probing_interval_ms_ = update.bwe_period_ms;
67 return update.bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068 }
mflodman101f2502016-06-09 17:21:19 +020069 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000070 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020071 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080072 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020073 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000074};
75
Sebastian Jansson89c94b92018-11-20 17:16:36 +010076class BitrateAllocatorForTest : public BitrateAllocator {
77 public:
78 using BitrateAllocator::BitrateAllocator;
79 void OnNetworkChanged(uint32_t target_bitrate_bps,
80 uint8_t fraction_loss,
81 int64_t rtt,
82 int64_t bwe_period_ms) {
83 BitrateAllocator::OnNetworkChanged(target_bitrate_bps, target_bitrate_bps,
84 fraction_loss, rtt, bwe_period_ms);
85 }
86};
87
minyue78b4d562016-11-30 04:47:39 -080088namespace {
89constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080090const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020091} // namespace
minyue78b4d562016-11-30 04:47:39 -080092
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000093class BitrateAllocatorTest : public ::testing::Test {
94 protected:
Sebastian Jansson89c94b92018-11-20 17:16:36 +010095 BitrateAllocatorTest()
96 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080097 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010098 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000099 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200100 void AddObserver(BitrateAllocatorObserver* observer,
101 uint32_t min_bitrate_bps,
102 uint32_t max_bitrate_bps,
103 uint32_t pad_up_bitrate_bps,
104 bool enforce_min_bitrate,
105 std::string track_id,
106 double bitrate_priority) {
107 allocator_->AddObserver(
108 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
109 enforce_min_bitrate, track_id, bitrate_priority, false});
110 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000111
perkj71ee44c2016-06-15 00:47:53 -0700112 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100113 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000114};
115
116TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
117 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700118 const uint32_t kMinSendBitrateBps = 100000;
119 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100120 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700121
philipelf69e7682018-02-28 13:06:28 +0100122 EXPECT_CALL(limit_observer_,
123 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
124 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200125 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
126 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700127 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800128 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700129 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000130
Peter Boström8e4e8b02015-09-15 15:08:03 +0200131 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800132 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800133 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700134 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700135
136 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
137 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100138 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200139 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
140 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200141 EXPECT_CALL(limit_observer_,
142 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700143 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000144
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200145 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
146 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700147 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200148 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100149 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200150 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000151}
152
153TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
154 TestBitrateObserver bitrate_observer_1;
155 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100156 const uint32_t kObs1StartBitrateBps = 100000;
157 const uint32_t kObs2StartBitrateBps = 200000;
158 const uint32_t kObs1MaxBitrateBps = 300000;
159 const uint32_t kObs2MaxBitrateBps = 300000;
160
161 EXPECT_CALL(
162 limit_observer_,
163 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200164 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
165 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100166 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
167 allocator_->GetStartBitrate(&bitrate_observer_1));
168 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
169 kObs1StartBitrateBps + kObs2StartBitrateBps,
170 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200171 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
172 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100173 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
174 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000175
mflodman48a4beb2016-07-01 13:03:59 +0200176 // Test too low start bitrate, hence lower than sum of min. Min bitrates
177 // will
178 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100179 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
180 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200181 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
182 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
183 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
184 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
185 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
186 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000187
mflodman48a4beb2016-07-01 13:03:59 +0200188 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800189 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100190 const uint32_t kBitrateToShare =
191 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200192 EXPECT_EQ(100000u + kBitrateToShare / 2,
193 bitrate_observer_1.last_bitrate_bps_);
194 EXPECT_EQ(200000u + kBitrateToShare / 2,
195 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000196
mflodman48a4beb2016-07-01 13:03:59 +0200197 // Limited by 2x max bitrates since we leave room for FEC and
198 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800199 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200200 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
201 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700202
mflodman48a4beb2016-07-01 13:03:59 +0200203 // Verify that if the bandwidth estimate is set to zero, the allocated
204 // rate is
205 // zero.
minyue78b4d562016-11-30 04:47:39 -0800206 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200207 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
208 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000209}
210
perkj71ee44c2016-06-15 00:47:53 -0700211TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
212 TestBitrateObserver bitrate_observer;
213 const uint32_t kMinSendBitrateBps = 100000;
214 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100215 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700216
philipelf69e7682018-02-28 13:06:28 +0100217 EXPECT_CALL(limit_observer_,
218 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
219 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200220 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
221 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100222 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700223 allocator_->RemoveObserver(&bitrate_observer);
224}
225
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000226class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
227 protected:
perkj71ee44c2016-06-15 00:47:53 -0700228 BitrateAllocatorTestNoEnforceMin()
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100229 : allocator_(new BitrateAllocatorForTest(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800230 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000231 }
232 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200233 void AddObserver(BitrateAllocatorObserver* observer,
234 uint32_t min_bitrate_bps,
235 uint32_t max_bitrate_bps,
236 uint32_t pad_up_bitrate_bps,
237 bool enforce_min_bitrate,
238 std::string track_id,
239 double bitrate_priority) {
240 allocator_->AddObserver(
241 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
242 enforce_min_bitrate, track_id, bitrate_priority, false});
243 }
perkj71ee44c2016-06-15 00:47:53 -0700244 NiceMock<MockLimitObserver> limit_observer_;
Sebastian Jansson89c94b92018-11-20 17:16:36 +0100245 std::unique_ptr<BitrateAllocatorForTest> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000246};
247
mflodman101f2502016-06-09 17:21:19 +0200248// The following three tests verify enforcing a minimum bitrate works as
249// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000250TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
251 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700252 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
253 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200254 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100255 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200256 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
257 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200258 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000259
mflodman48a4beb2016-07-01 13:03:59 +0200260 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800261 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200262 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000263
mflodman48a4beb2016-07-01 13:03:59 +0200264 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800265 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200266 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000267
philipelf69e7682018-02-28 13:06:28 +0100268 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200269 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000270}
271
272TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
273 TestBitrateObserver bitrate_observer_1;
274 TestBitrateObserver bitrate_observer_2;
275 TestBitrateObserver bitrate_observer_3;
276 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200277 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
278 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700279 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100280
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200281 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
282 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700283 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200284 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100285
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200286 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
287 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700288 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200289 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
290 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000291
mflodman101f2502016-06-09 17:21:19 +0200292 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
293 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800294 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000295 // Verify that each observer gets its min rate (sum of min rates is 600000),
296 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100297 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200298 EXPECT_EQ(100000u + bitrate_to_share / 3,
299 bitrate_observer_1.last_bitrate_bps_);
300 EXPECT_EQ(200000u + bitrate_to_share / 3,
301 bitrate_observer_2.last_bitrate_bps_);
302 EXPECT_EQ(300000u + bitrate_to_share / 3,
303 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000304
mflodman101f2502016-06-09 17:21:19 +0200305 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800306 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200307 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
308 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200309 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200310
311 // Increased BWE, but still below the sum of configured min bitrates for all
312 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800313 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200314 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
315 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200316 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000317
mflodman101f2502016-06-09 17:21:19 +0200318 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800319 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200320 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
321 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
322 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000323
perkjec81bcd2016-05-11 06:01:13 -0700324 // Verify that zero estimated bandwidth, means that that all gets zero,
325 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800326 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200327 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
328 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
329 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700330
mflodman86aabb22016-03-11 15:44:32 +0100331 allocator_->RemoveObserver(&bitrate_observer_1);
332 allocator_->RemoveObserver(&bitrate_observer_2);
333 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000334}
335
mflodman48a4beb2016-07-01 13:03:59 +0200336TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
337 TestBitrateObserver bitrate_observer;
338 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
339 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200340 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100341 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200342 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
343 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200344 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
345
346 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800347 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200348 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
349
350 // Add loss and use a part of the bitrate for protection.
351 double protection_ratio = 0.4;
352 uint8_t fraction_loss = protection_ratio * 256;
353 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800354 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
355 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200356 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
357
358 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800359 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
360 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200361 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
362
363 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800364 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
365 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200366 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
367
368 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100369 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800370 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
371 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200372 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
373
374 // Remove all protection and make sure video is not paused as earlier.
375 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800376 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200377 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
378
minyue78b4d562016-11-30 04:47:39 -0800379 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200380 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
381
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200382 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200383 allocator_->RemoveObserver(&bitrate_observer);
384}
385
386TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
387 TestBitrateObserver bitrate_observer_1;
388 TestBitrateObserver bitrate_observer_2;
389
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200390 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
391 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200392 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200393 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
394 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200395 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
396 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
397
398 // Enough bitrate for both.
399 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800400 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200401 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
402 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
403
404 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800405 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200406 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
407 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
408
minyue78b4d562016-11-30 04:47:39 -0800409 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200410 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
411 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
412
minyue78b4d562016-11-30 04:47:39 -0800413 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200414 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
415 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
416
minyue78b4d562016-11-30 04:47:39 -0800417 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200418 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
419 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
420
minyue78b4d562016-11-30 04:47:39 -0800421 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200422 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
423 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
424
425 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800426 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200427 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
428 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
429
minyue78b4d562016-11-30 04:47:39 -0800430 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200431 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
432 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
433
434 allocator_->RemoveObserver(&bitrate_observer_1);
435 allocator_->RemoveObserver(&bitrate_observer_2);
436}
437
mflodman101f2502016-06-09 17:21:19 +0200438TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000439 TestBitrateObserver bitrate_observer_1;
440 TestBitrateObserver bitrate_observer_2;
441 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100442
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200443 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
444 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700445 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
446
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200447 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
448 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700449 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200450 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100451
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200452 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
453 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200454 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
455 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
456 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000457
mflodman48a4beb2016-07-01 13:03:59 +0200458 // Low BWE. Verify that all observers still get their respective min
459 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800460 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200461 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
462 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
463 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000464
mflodman48a4beb2016-07-01 13:03:59 +0200465 allocator_->RemoveObserver(&bitrate_observer_1);
466 allocator_->RemoveObserver(&bitrate_observer_2);
467 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000468}
perkjfea93092016-05-14 00:58:48 -0700469
470TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
471 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100472 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700473
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200474 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
475 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700476 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700477
478 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800479 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700480
mflodman101f2502016-06-09 17:21:19 +0200481 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700482
483 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700484 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100485 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200486 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
487 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700488
489 // Expect the start_bitrate to be set as if the network was still up but that
490 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700491 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200492 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
493 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700494
495 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800496 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200497 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
498 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
499}
500
501TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
502 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200503 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
504 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200506
mflodman48a4beb2016-07-01 13:03:59 +0200507 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200508 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
509 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200510 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
511 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200512
minyue78b4d562016-11-30 04:47:39 -0800513 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200514 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
515 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200516
minyue78b4d562016-11-30 04:47:39 -0800517 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200518 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
519 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200520
minyue78b4d562016-11-30 04:47:39 -0800521 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200522 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
523 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200524
minyue78b4d562016-11-30 04:47:39 -0800525 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200526 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
527 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200528
minyue78b4d562016-11-30 04:47:39 -0800529 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200530 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
531 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200532
minyue78b4d562016-11-30 04:47:39 -0800533 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200534 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
535 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200536
minyue78b4d562016-11-30 04:47:39 -0800537 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200538 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
539 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200540
mflodman48a4beb2016-07-01 13:03:59 +0200541 allocator_->RemoveObserver(&enforced_observer);
542 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200543}
544
545TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
546 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200547 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200548 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200549
minyue78b4d562016-11-30 04:47:39 -0800550 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200551 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200552
minyue78b4d562016-11-30 04:47:39 -0800553 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200554 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200555
minyue78b4d562016-11-30 04:47:39 -0800556 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200557 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200558
minyue78b4d562016-11-30 04:47:39 -0800559 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200560 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200561
minyue78b4d562016-11-30 04:47:39 -0800562 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200563 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200564
minyue78b4d562016-11-30 04:47:39 -0800565 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200566 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200567
mflodman48a4beb2016-07-01 13:03:59 +0200568 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200569}
570
571TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
572 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200573 AddObserver(&observer, 300000, 600000, 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(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200577 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200578
minyue78b4d562016-11-30 04:47:39 -0800579 allocator_->OnNetworkChanged(200000, 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(300000, 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(329000, 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(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200589 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200590
minyue78b4d562016-11-30 04:47:39 -0800591 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200592 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200593
mflodman48a4beb2016-07-01 13:03:59 +0200594 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700595}
596
minyue78b4d562016-11-30 04:47:39 -0800597TEST_F(BitrateAllocatorTest, PassProbingInterval) {
598 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200599 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800600 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
601
602 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
603 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
604
605 allocator_->RemoveObserver(&observer);
606}
607
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800608TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
609 TestBitrateObserver observer;
610 const uint32_t kMinSendBitrateBps = 10;
611 const uint32_t kMaxSendBitrateBps = 60;
612 const uint32_t kNetworkBandwidthBps = 30;
613
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200614 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
615 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800616 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
617 kDefaultProbingIntervalMs);
618
619 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
620
621 allocator_->RemoveObserver(&observer);
622}
623
624// Tests that two observers with the same bitrate priority are allocated
625// their bitrate evenly.
626TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
627 TestBitrateObserver observer_low_1;
628 TestBitrateObserver observer_low_2;
629 const uint32_t kMinSendBitrateBps = 10;
630 const uint32_t kMaxSendBitrateBps = 60;
631 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200632 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
633 "low1", 2.0);
634 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
635 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800636 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
637 kDefaultProbingIntervalMs);
638
639 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
640 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
641
642 allocator_->RemoveObserver(&observer_low_1);
643 allocator_->RemoveObserver(&observer_low_2);
644}
645
646// Tests that there is no difference in functionality when the min bitrate is
647// enforced.
648TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
649 TestBitrateObserver observer_low_1;
650 TestBitrateObserver observer_low_2;
651 const uint32_t kMinSendBitrateBps = 0;
652 const uint32_t kMaxSendBitrateBps = 60;
653 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200654 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
655 "low1", 2.0);
656 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
657 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800658 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
659 kDefaultProbingIntervalMs);
660
661 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
662 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
663
664 allocator_->RemoveObserver(&observer_low_1);
665 allocator_->RemoveObserver(&observer_low_2);
666}
667
668// Tests that if the available bandwidth is the sum of the max bitrate
669// of all observers, they will be allocated their max.
670TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
671 TestBitrateObserver observer_low;
672 TestBitrateObserver observer_mid;
673 const uint32_t kMinSendBitrateBps = 0;
674 const uint32_t kMaxSendBitrateBps = 60;
675 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200676 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
677 "low", 2.0);
678 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
679 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800680 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
681 kDefaultProbingIntervalMs);
682
683 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
684 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
685
686 allocator_->RemoveObserver(&observer_low);
687 allocator_->RemoveObserver(&observer_mid);
688}
689
690// Tests that after a higher bitrate priority observer has been allocated its
691// max bitrate the lower priority observer will then be allocated the remaining
692// bitrate.
693TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
694 TestBitrateObserver observer_low;
695 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200696 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
697 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800698 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
699
700 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
701 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
702
703 allocator_->RemoveObserver(&observer_low);
704 allocator_->RemoveObserver(&observer_mid);
705}
706
707// Tests that three observers with three different bitrate priorities will all
708// be allocated bitrate according to their relative bitrate priority.
709TEST_F(BitrateAllocatorTest,
710 PriorityRateThreeObserversAllocatedRelativeAmounts) {
711 TestBitrateObserver observer_low;
712 TestBitrateObserver observer_mid;
713 TestBitrateObserver observer_high;
714 const uint32_t kMaxBitrate = 100;
715 // Not enough bandwidth to fill any observer's max bitrate.
716 const uint32_t kNetworkBandwidthBps = 70;
717 const double kLowBitratePriority = 2.0;
718 const double kMidBitratePriority = 4.0;
719 const double kHighBitratePriority = 8.0;
720 const double kTotalBitratePriority =
721 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200722 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
723 kLowBitratePriority);
724 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
725 kMidBitratePriority);
726 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
727 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800728 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
729 kDefaultProbingIntervalMs);
730
731 const double kLowFractionAllocated =
732 kLowBitratePriority / kTotalBitratePriority;
733 const double kMidFractionAllocated =
734 kMidBitratePriority / kTotalBitratePriority;
735 const double kHighFractionAllocated =
736 kHighBitratePriority / kTotalBitratePriority;
737 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
738 observer_low.last_bitrate_bps_);
739 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
740 observer_mid.last_bitrate_bps_);
741 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
742 observer_high.last_bitrate_bps_);
743
744 allocator_->RemoveObserver(&observer_low);
745 allocator_->RemoveObserver(&observer_mid);
746 allocator_->RemoveObserver(&observer_high);
747}
748
749// Tests that after the high priority observer has been allocated its maximum
750// bitrate, the other two observers are still allocated bitrate according to
751// their relative bitrate priority.
752TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
753 TestBitrateObserver observer_low;
754 const double kLowBitratePriority = 2.0;
755 TestBitrateObserver observer_mid;
756 const double kMidBitratePriority = 4.0;
757 TestBitrateObserver observer_high;
758 const double kHighBitratePriority = 8.0;
759
760 const uint32_t kAvailableBitrate = 90;
761 const uint32_t kMaxBitrate = 40;
762 const uint32_t kMinBitrate = 10;
763 // Remaining bitrate after allocating to all mins and knowing that the high
764 // priority observer will have its max bitrate allocated.
765 const uint32_t kRemainingBitrate =
766 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
767
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200768 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
769 kLowBitratePriority);
770 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
771 kMidBitratePriority);
772 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
773 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800774 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
775 kDefaultProbingIntervalMs);
776
777 const double kLowFractionAllocated =
778 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
779 const double kMidFractionAllocated =
780 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
781 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
782 observer_low.last_bitrate_bps_);
783 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
784 observer_mid.last_bitrate_bps_);
785 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
786
787 allocator_->RemoveObserver(&observer_low);
788 allocator_->RemoveObserver(&observer_mid);
789 allocator_->RemoveObserver(&observer_high);
790}
791
792// Tests that after the low priority observer has been allocated its maximum
793// bitrate, the other two observers are still allocated bitrate according to
794// their relative bitrate priority.
795TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
796 TestBitrateObserver observer_low;
797 const double kLowBitratePriority = 2.0;
798 const uint32_t kLowMaxBitrate = 10;
799 TestBitrateObserver observer_mid;
800 const double kMidBitratePriority = 4.0;
801 TestBitrateObserver observer_high;
802 const double kHighBitratePriority = 8.0;
803
804 const uint32_t kMinBitrate = 0;
805 const uint32_t kMaxBitrate = 60;
806 const uint32_t kAvailableBitrate = 100;
807 // Remaining bitrate knowing that the low priority observer is allocated its
808 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
809 // available bitrate, so 70 bps would be sufficient network bandwidth.
810 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
811
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200812 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
813 kLowBitratePriority);
814 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
815 kMidBitratePriority);
816 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
817 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800818 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
819 kDefaultProbingIntervalMs);
820
821 const double kMidFractionAllocated =
822 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
823 const double kHighFractionAllocated =
824 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
825 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
826 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
827 observer_mid.last_bitrate_bps_);
828 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
829 observer_high.last_bitrate_bps_);
830
831 allocator_->RemoveObserver(&observer_low);
832 allocator_->RemoveObserver(&observer_mid);
833 allocator_->RemoveObserver(&observer_high);
834}
835
836// Tests that after two observers are allocated bitrate to their max, the
837// the remaining observer is allocated what's left appropriately. This test
838// handles an edge case where the medium and high observer reach their
839// "relative" max allocation at the same time. The high has 40 to allocate
840// above its min, and the mid has 20 to allocate above its min, which scaled
841// by their bitrate priority is the same for each.
842TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
843 TestBitrateObserver observer_low;
844 TestBitrateObserver observer_mid;
845 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200846 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800847 // Scaled allocation above the min allocation is the same for these two,
848 // meaning they will get allocated their max at the same time.
849 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200850 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
851 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800852 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
853
854 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
855 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
856 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
857
858 allocator_->RemoveObserver(&observer_low);
859 allocator_->RemoveObserver(&observer_mid);
860 allocator_->RemoveObserver(&observer_high);
861}
862
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000863} // namespace webrtc