blob: b325f518c24b12db545e8dfd3e9f837d9fa15e22 [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:261/*
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 14:10:4412#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:2613#include <vector>
14
Mirko Bonadei92ea95e2017-09-15 04:47:3115#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:2619
Seth Hampsonfe73d6a2017-11-14 18:49:0620using ::testing::NiceMock;
21using ::testing::_;
perkj71ee44c2016-06-15 07:47:5322
stefan@webrtc.org792f1a12015-03-04 12:24:2623namespace webrtc {
Sebastian Janssonfe617a32018-03-21 11:45:2024// 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,
31 bool has_packet_feedback) override {
32 OnAllocationLimitsChanged(min_send_bitrate_bps, max_padding_bitrate_bps,
33 total_bitrate_bps);
34 }
35 virtual void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
36 uint32_t max_padding_bitrate_bps,
37 uint32_t total_bitrate_bps) = 0;
38};
stefan@webrtc.org792f1a12015-03-04 12:24:2639
Sebastian Janssonfe617a32018-03-21 11:45:2040class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 07:47:5341 public:
philipelf69e7682018-02-28 12:06:2842 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 07:47:5343 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 12:06:2844 uint32_t max_padding_bitrate_bps,
45 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 07:47:5346};
47
mflodman86aabb22016-03-11 14:44:3248class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:2649 public:
50 TestBitrateObserver()
mflodman48a4beb2016-07-01 11:03:5951 : last_bitrate_bps_(0),
52 last_fraction_loss_(0),
53 last_rtt_ms_(0),
minyue78b4d562016-11-30 12:47:3954 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 11:03:5955 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:2656
mflodman48a4beb2016-07-01 11:03:5957 void SetBitrateProtectionRatio(double protection_ratio) {
58 protection_ratio_ = protection_ratio;
59 }
60
61 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
62 uint8_t fraction_loss,
minyue78b4d562016-11-30 12:47:3963 int64_t rtt,
64 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 15:21:1965 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:2666 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 15:21:1967 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 12:47:3968 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 11:03:5969 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:2670 }
mflodman101f2502016-06-09 15:21:1971 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:2672 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 15:21:1973 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 12:47:3974 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 11:03:5975 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:2676};
77
minyue78b4d562016-11-30 12:47:3978namespace {
79constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 17:36:4280const double kDefaultBitratePriority = 1.0;
minyue78b4d562016-11-30 12:47:3981}
82
stefan@webrtc.org792f1a12015-03-04 12:24:2683class BitrateAllocatorTest : public ::testing::Test {
84 protected:
perkj71ee44c2016-06-15 07:47:5385 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 12:47:3986 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 10:11:0687 }
stefan@webrtc.org792f1a12015-03-04 12:24:2688 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 06:25:1289 void AddObserver(BitrateAllocatorObserver* observer,
90 uint32_t min_bitrate_bps,
91 uint32_t max_bitrate_bps,
92 uint32_t pad_up_bitrate_bps,
93 bool enforce_min_bitrate,
94 std::string track_id,
95 double bitrate_priority) {
96 allocator_->AddObserver(
97 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
98 enforce_min_bitrate, track_id, bitrate_priority, false});
99 }
stefan@webrtc.org792f1a12015-03-04 12:24:26100
perkj71ee44c2016-06-15 07:47:53101 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 14:10:44102 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26103};
104
105TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
106 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 07:47:53107 const uint32_t kMinSendBitrateBps = 100000;
108 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 12:06:28109 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 07:47:53110
philipelf69e7682018-02-28 12:06:28111 EXPECT_CALL(limit_observer_,
112 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
113 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 06:25:12114 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
115 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16116 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 12:47:39117 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 14:27:16118 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26119
Peter Boström8e4e8b02015-09-15 13:08:03120 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-13 05:02:42121 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 12:47:39122 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 14:27:16123 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 07:47:53124
125 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
126 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 12:06:28127 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 06:25:12128 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
129 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 12:52:07130 EXPECT_CALL(limit_observer_,
131 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 14:27:16132 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26133
Sebastian Jansson24ad7202018-04-19 06:25:12134 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
135 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16136 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 15:21:19137 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 12:06:28138 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19139 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26140}
141
142TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
143 TestBitrateObserver bitrate_observer_1;
144 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 12:06:28145 const uint32_t kObs1StartBitrateBps = 100000;
146 const uint32_t kObs2StartBitrateBps = 200000;
147 const uint32_t kObs1MaxBitrateBps = 300000;
148 const uint32_t kObs2MaxBitrateBps = 300000;
149
150 EXPECT_CALL(
151 limit_observer_,
152 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 06:25:12153 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
154 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 12:06:28155 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
156 allocator_->GetStartBitrate(&bitrate_observer_1));
157 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
158 kObs1StartBitrateBps + kObs2StartBitrateBps,
159 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 06:25:12160 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
161 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 12:06:28162 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
163 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26164
mflodman48a4beb2016-07-01 11:03:59165 // Test too low start bitrate, hence lower than sum of min. Min bitrates
166 // will
167 // be allocated to all observers.
philipelf69e7682018-02-28 12:06:28168 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
169 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59170 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
171 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
172 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
173 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
174 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
175 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26176
mflodman48a4beb2016-07-01 11:03:59177 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 12:47:39178 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 12:06:28179 const uint32_t kBitrateToShare =
180 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 11:03:59181 EXPECT_EQ(100000u + kBitrateToShare / 2,
182 bitrate_observer_1.last_bitrate_bps_);
183 EXPECT_EQ(200000u + kBitrateToShare / 2,
184 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26185
mflodman48a4beb2016-07-01 11:03:59186 // Limited by 2x max bitrates since we leave room for FEC and
187 // retransmissions.
minyue78b4d562016-11-30 12:47:39188 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59189 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
190 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 13:01:13191
mflodman48a4beb2016-07-01 11:03:59192 // Verify that if the bandwidth estimate is set to zero, the allocated
193 // rate is
194 // zero.
minyue78b4d562016-11-30 12:47:39195 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59196 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
197 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26198}
199
perkj71ee44c2016-06-15 07:47:53200TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
201 TestBitrateObserver bitrate_observer;
202 const uint32_t kMinSendBitrateBps = 100000;
203 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 12:06:28204 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 07:47:53205
philipelf69e7682018-02-28 12:06:28206 EXPECT_CALL(limit_observer_,
207 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
208 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 06:25:12209 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
210 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 12:06:28211 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 07:47:53212 allocator_->RemoveObserver(&bitrate_observer);
213}
214
stefan@webrtc.org792f1a12015-03-04 12:24:26215class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
216 protected:
perkj71ee44c2016-06-15 07:47:53217 BitrateAllocatorTestNoEnforceMin()
218 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 12:47:39219 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26220 }
221 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 06:25:12222 void AddObserver(BitrateAllocatorObserver* observer,
223 uint32_t min_bitrate_bps,
224 uint32_t max_bitrate_bps,
225 uint32_t pad_up_bitrate_bps,
226 bool enforce_min_bitrate,
227 std::string track_id,
228 double bitrate_priority) {
229 allocator_->AddObserver(
230 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
231 enforce_min_bitrate, track_id, bitrate_priority, false});
232 }
perkj71ee44c2016-06-15 07:47:53233 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 14:10:44234 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26235};
236
mflodman101f2502016-06-09 15:21:19237// The following three tests verify enforcing a minimum bitrate works as
238// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26239TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
240 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 07:47:53241 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
242 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 12:52:07243 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 12:06:28244 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 06:25:12245 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
246 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59247 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26248
mflodman48a4beb2016-07-01 11:03:59249 // High BWE.
minyue78b4d562016-11-30 12:47:39250 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59251 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26252
mflodman48a4beb2016-07-01 11:03:59253 // Low BWE.
minyue78b4d562016-11-30 12:47:39254 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59255 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26256
philipelf69e7682018-02-28 12:06:28257 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 11:03:59258 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26259}
260
261TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
262 TestBitrateObserver bitrate_observer_1;
263 TestBitrateObserver bitrate_observer_2;
264 TestBitrateObserver bitrate_observer_3;
265 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 06:25:12266 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
267 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16268 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 10:11:06269
Sebastian Jansson24ad7202018-04-19 06:25:12270 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
271 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16272 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 15:21:19273 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 10:11:06274
Sebastian Jansson24ad7202018-04-19 06:25:12275 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
276 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16277 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 15:21:19278 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
279 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26280
mflodman101f2502016-06-09 15:21:19281 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
282 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 12:47:39283 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26284 // Verify that each observer gets its min rate (sum of min rates is 600000),
285 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 10:11:06286 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 15:21:19287 EXPECT_EQ(100000u + bitrate_to_share / 3,
288 bitrate_observer_1.last_bitrate_bps_);
289 EXPECT_EQ(200000u + bitrate_to_share / 3,
290 bitrate_observer_2.last_bitrate_bps_);
291 EXPECT_EQ(300000u + bitrate_to_share / 3,
292 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26293
mflodman101f2502016-06-09 15:21:19294 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 12:47:39295 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19296 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
297 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
298 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
299
300 // Increased BWE, but still below the sum of configured min bitrates for all
301 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 12:47:39302 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19303 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
304 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
305 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26306
mflodman101f2502016-06-09 15:21:19307 // Below min for all.
minyue78b4d562016-11-30 12:47:39308 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19309 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
310 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
311 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26312
perkjec81bcd2016-05-11 13:01:13313 // Verify that zero estimated bandwidth, means that that all gets zero,
314 // regardless of set min bitrate.
minyue78b4d562016-11-30 12:47:39315 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19316 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
317 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
318 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 13:01:13319
mflodman86aabb22016-03-11 14:44:32320 allocator_->RemoveObserver(&bitrate_observer_1);
321 allocator_->RemoveObserver(&bitrate_observer_2);
322 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26323}
324
mflodman48a4beb2016-07-01 11:03:59325TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
326 TestBitrateObserver bitrate_observer;
327 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
328 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 12:52:07329 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 12:06:28330 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 06:25:12331 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
332 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59333 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
334
335 // High BWE.
minyue78b4d562016-11-30 12:47:39336 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59337 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
338
339 // Add loss and use a part of the bitrate for protection.
340 double protection_ratio = 0.4;
341 uint8_t fraction_loss = protection_ratio * 256;
342 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 12:47:39343 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
344 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59345 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
346
347 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 12:47:39348 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
349 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59350 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
351
352 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 12:47:39353 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
354 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59355 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
356
357 // Just enough to enable video again.
philipelf69e7682018-02-28 12:06:28358 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 12:47:39359 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
360 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59361 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
362
363 // Remove all protection and make sure video is not paused as earlier.
364 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 12:47:39365 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59366 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
367
minyue78b4d562016-11-30 12:47:39368 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59369 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
370
Sebastian Jansson448f4d52018-04-04 12:52:07371 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 11:03:59372 allocator_->RemoveObserver(&bitrate_observer);
373}
374
375TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
376 TestBitrateObserver bitrate_observer_1;
377 TestBitrateObserver bitrate_observer_2;
378
Sebastian Jansson24ad7202018-04-19 06:25:12379 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
380 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59381 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 06:25:12382 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
383 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59384 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
385 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
386
387 // Enough bitrate for both.
388 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 12:47:39389 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59390 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
391 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
392
393 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 12:47:39394 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59395 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
396 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
397
minyue78b4d562016-11-30 12:47:39398 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59399 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
400 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
401
minyue78b4d562016-11-30 12:47:39402 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59403 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
404 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
405
minyue78b4d562016-11-30 12:47:39406 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59407 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
408 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
409
minyue78b4d562016-11-30 12:47:39410 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59411 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
412 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
413
414 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 12:47:39415 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59416 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
417 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
418
minyue78b4d562016-11-30 12:47:39419 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59420 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
421 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
422
423 allocator_->RemoveObserver(&bitrate_observer_1);
424 allocator_->RemoveObserver(&bitrate_observer_2);
425}
426
mflodman101f2502016-06-09 15:21:19427TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26428 TestBitrateObserver bitrate_observer_1;
429 TestBitrateObserver bitrate_observer_2;
430 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 10:11:06431
Sebastian Jansson24ad7202018-04-19 06:25:12432 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
433 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16434 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
435
Sebastian Jansson24ad7202018-04-19 06:25:12436 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
437 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16438 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 15:21:19439 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 10:11:06440
Sebastian Jansson24ad7202018-04-19 06:25:12441 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
442 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59443 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
444 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
445 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26446
mflodman48a4beb2016-07-01 11:03:59447 // Low BWE. Verify that all observers still get their respective min
448 // bitrate.
minyue78b4d562016-11-30 12:47:39449 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59450 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
451 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
452 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26453
mflodman48a4beb2016-07-01 11:03:59454 allocator_->RemoveObserver(&bitrate_observer_1);
455 allocator_->RemoveObserver(&bitrate_observer_2);
456 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26457}
perkjfea93092016-05-14 07:58:48458
459TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
460 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 12:06:28461 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 14:27:16462
Sebastian Jansson24ad7202018-04-19 06:25:12463 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
464 kDefaultBitratePriority);
perkj57c21f92016-06-17 14:27:16465 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 07:58:48466
467 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 12:47:39468 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 07:58:48469
mflodman101f2502016-06-09 15:21:19470 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 07:58:48471
472 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 07:47:53473 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 12:06:28474 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 06:25:12475 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
476 kDefaultBitratePriority);
perkjfea93092016-05-14 07:58:48477
478 // Expect the start_bitrate to be set as if the network was still up but that
479 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 14:27:16480 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 15:21:19481 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
482 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 07:58:48483
484 // Set network back up.
minyue78b4d562016-11-30 12:47:39485 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 15:21:19486 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
487 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
488}
489
490TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
491 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 06:25:12492 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
493 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59494 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 15:21:19495
mflodman48a4beb2016-07-01 11:03:59496 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 06:25:12497 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
498 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59499 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
500 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19501
minyue78b4d562016-11-30 12:47:39502 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59503 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
504 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19505
minyue78b4d562016-11-30 12:47:39506 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59507 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
508 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19509
minyue78b4d562016-11-30 12:47:39510 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59511 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
512 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19513
minyue78b4d562016-11-30 12:47:39514 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59515 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
516 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19517
minyue78b4d562016-11-30 12:47:39518 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59519 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
520 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19521
minyue78b4d562016-11-30 12:47:39522 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59523 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
524 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19525
minyue78b4d562016-11-30 12:47:39526 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59527 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
528 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19529
mflodman48a4beb2016-07-01 11:03:59530 allocator_->RemoveObserver(&enforced_observer);
531 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 15:21:19532}
533
534TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
535 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 06:25:12536 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59537 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 15:21:19538
minyue78b4d562016-11-30 12:47:39539 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59540 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19541
minyue78b4d562016-11-30 12:47:39542 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59543 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19544
minyue78b4d562016-11-30 12:47:39545 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59546 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19547
minyue78b4d562016-11-30 12:47:39548 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59549 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19550
minyue78b4d562016-11-30 12:47:39551 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59552 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19553
minyue78b4d562016-11-30 12:47:39554 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59555 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19556
mflodman48a4beb2016-07-01 11:03:59557 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 15:21:19558}
559
560TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
561 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 06:25:12562 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 11:03:59563 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 15:21:19564
minyue78b4d562016-11-30 12:47:39565 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59566 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19567
minyue78b4d562016-11-30 12:47:39568 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59569 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19570
minyue78b4d562016-11-30 12:47:39571 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59572 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19573
minyue78b4d562016-11-30 12:47:39574 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59575 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19576
minyue78b4d562016-11-30 12:47:39577 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59578 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19579
minyue78b4d562016-11-30 12:47:39580 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 11:03:59581 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 15:21:19582
mflodman48a4beb2016-07-01 11:03:59583 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 07:58:48584}
585
minyue78b4d562016-11-30 12:47:39586TEST_F(BitrateAllocatorTest, PassProbingInterval) {
587 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 06:25:12588 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 12:47:39589 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
590
591 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
592 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
593
594 allocator_->RemoveObserver(&observer);
595}
596
Seth Hampsonfe73d6a2017-11-14 18:49:06597TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
598 TestBitrateObserver observer;
599 const uint32_t kMinSendBitrateBps = 10;
600 const uint32_t kMaxSendBitrateBps = 60;
601 const uint32_t kNetworkBandwidthBps = 30;
602
Sebastian Jansson24ad7202018-04-19 06:25:12603 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
604 2.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06605 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
606 kDefaultProbingIntervalMs);
607
608 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
609
610 allocator_->RemoveObserver(&observer);
611}
612
613// Tests that two observers with the same bitrate priority are allocated
614// their bitrate evenly.
615TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
616 TestBitrateObserver observer_low_1;
617 TestBitrateObserver observer_low_2;
618 const uint32_t kMinSendBitrateBps = 10;
619 const uint32_t kMaxSendBitrateBps = 60;
620 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 06:25:12621 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
622 "low1", 2.0);
623 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
624 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06625 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
626 kDefaultProbingIntervalMs);
627
628 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
629 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
630
631 allocator_->RemoveObserver(&observer_low_1);
632 allocator_->RemoveObserver(&observer_low_2);
633}
634
635// Tests that there is no difference in functionality when the min bitrate is
636// enforced.
637TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
638 TestBitrateObserver observer_low_1;
639 TestBitrateObserver observer_low_2;
640 const uint32_t kMinSendBitrateBps = 0;
641 const uint32_t kMaxSendBitrateBps = 60;
642 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 06:25:12643 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
644 "low1", 2.0);
645 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
646 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06647 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
648 kDefaultProbingIntervalMs);
649
650 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
651 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
652
653 allocator_->RemoveObserver(&observer_low_1);
654 allocator_->RemoveObserver(&observer_low_2);
655}
656
657// Tests that if the available bandwidth is the sum of the max bitrate
658// of all observers, they will be allocated their max.
659TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
660 TestBitrateObserver observer_low;
661 TestBitrateObserver observer_mid;
662 const uint32_t kMinSendBitrateBps = 0;
663 const uint32_t kMaxSendBitrateBps = 60;
664 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 06:25:12665 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
666 "low", 2.0);
667 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
668 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06669 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
670 kDefaultProbingIntervalMs);
671
672 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
673 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
674
675 allocator_->RemoveObserver(&observer_low);
676 allocator_->RemoveObserver(&observer_mid);
677}
678
679// Tests that after a higher bitrate priority observer has been allocated its
680// max bitrate the lower priority observer will then be allocated the remaining
681// bitrate.
682TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
683 TestBitrateObserver observer_low;
684 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 06:25:12685 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
686 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06687 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
688
689 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
690 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
691
692 allocator_->RemoveObserver(&observer_low);
693 allocator_->RemoveObserver(&observer_mid);
694}
695
696// Tests that three observers with three different bitrate priorities will all
697// be allocated bitrate according to their relative bitrate priority.
698TEST_F(BitrateAllocatorTest,
699 PriorityRateThreeObserversAllocatedRelativeAmounts) {
700 TestBitrateObserver observer_low;
701 TestBitrateObserver observer_mid;
702 TestBitrateObserver observer_high;
703 const uint32_t kMaxBitrate = 100;
704 // Not enough bandwidth to fill any observer's max bitrate.
705 const uint32_t kNetworkBandwidthBps = 70;
706 const double kLowBitratePriority = 2.0;
707 const double kMidBitratePriority = 4.0;
708 const double kHighBitratePriority = 8.0;
709 const double kTotalBitratePriority =
710 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 06:25:12711 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
712 kLowBitratePriority);
713 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
714 kMidBitratePriority);
715 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
716 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 18:49:06717 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
718 kDefaultProbingIntervalMs);
719
720 const double kLowFractionAllocated =
721 kLowBitratePriority / kTotalBitratePriority;
722 const double kMidFractionAllocated =
723 kMidBitratePriority / kTotalBitratePriority;
724 const double kHighFractionAllocated =
725 kHighBitratePriority / kTotalBitratePriority;
726 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
727 observer_low.last_bitrate_bps_);
728 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
729 observer_mid.last_bitrate_bps_);
730 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
731 observer_high.last_bitrate_bps_);
732
733 allocator_->RemoveObserver(&observer_low);
734 allocator_->RemoveObserver(&observer_mid);
735 allocator_->RemoveObserver(&observer_high);
736}
737
738// Tests that after the high priority observer has been allocated its maximum
739// bitrate, the other two observers are still allocated bitrate according to
740// their relative bitrate priority.
741TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
742 TestBitrateObserver observer_low;
743 const double kLowBitratePriority = 2.0;
744 TestBitrateObserver observer_mid;
745 const double kMidBitratePriority = 4.0;
746 TestBitrateObserver observer_high;
747 const double kHighBitratePriority = 8.0;
748
749 const uint32_t kAvailableBitrate = 90;
750 const uint32_t kMaxBitrate = 40;
751 const uint32_t kMinBitrate = 10;
752 // Remaining bitrate after allocating to all mins and knowing that the high
753 // priority observer will have its max bitrate allocated.
754 const uint32_t kRemainingBitrate =
755 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
756
Sebastian Jansson24ad7202018-04-19 06:25:12757 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
758 kLowBitratePriority);
759 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
760 kMidBitratePriority);
761 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
762 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 18:49:06763 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
764 kDefaultProbingIntervalMs);
765
766 const double kLowFractionAllocated =
767 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
768 const double kMidFractionAllocated =
769 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
770 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
771 observer_low.last_bitrate_bps_);
772 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
773 observer_mid.last_bitrate_bps_);
774 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
775
776 allocator_->RemoveObserver(&observer_low);
777 allocator_->RemoveObserver(&observer_mid);
778 allocator_->RemoveObserver(&observer_high);
779}
780
781// Tests that after the low priority observer has been allocated its maximum
782// bitrate, the other two observers are still allocated bitrate according to
783// their relative bitrate priority.
784TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
785 TestBitrateObserver observer_low;
786 const double kLowBitratePriority = 2.0;
787 const uint32_t kLowMaxBitrate = 10;
788 TestBitrateObserver observer_mid;
789 const double kMidBitratePriority = 4.0;
790 TestBitrateObserver observer_high;
791 const double kHighBitratePriority = 8.0;
792
793 const uint32_t kMinBitrate = 0;
794 const uint32_t kMaxBitrate = 60;
795 const uint32_t kAvailableBitrate = 100;
796 // Remaining bitrate knowing that the low priority observer is allocated its
797 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
798 // available bitrate, so 70 bps would be sufficient network bandwidth.
799 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
800
Sebastian Jansson24ad7202018-04-19 06:25:12801 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
802 kLowBitratePriority);
803 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
804 kMidBitratePriority);
805 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
806 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 18:49:06807 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
808 kDefaultProbingIntervalMs);
809
810 const double kMidFractionAllocated =
811 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
812 const double kHighFractionAllocated =
813 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
814 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
815 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
816 observer_mid.last_bitrate_bps_);
817 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
818 observer_high.last_bitrate_bps_);
819
820 allocator_->RemoveObserver(&observer_low);
821 allocator_->RemoveObserver(&observer_mid);
822 allocator_->RemoveObserver(&observer_high);
823}
824
825// Tests that after two observers are allocated bitrate to their max, the
826// the remaining observer is allocated what's left appropriately. This test
827// handles an edge case where the medium and high observer reach their
828// "relative" max allocation at the same time. The high has 40 to allocate
829// above its min, and the mid has 20 to allocate above its min, which scaled
830// by their bitrate priority is the same for each.
831TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
832 TestBitrateObserver observer_low;
833 TestBitrateObserver observer_mid;
834 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 06:25:12835 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06836 // Scaled allocation above the min allocation is the same for these two,
837 // meaning they will get allocated their max at the same time.
838 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 06:25:12839 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
840 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 18:49:06841 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
842
843 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
844 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
845 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
846
847 allocator_->RemoveObserver(&observer_low);
848 allocator_->RemoveObserver(&observer_mid);
849 allocator_->RemoveObserver(&observer_high);
850}
851
stefan@webrtc.org792f1a12015-03-04 12:24:26852} // namespace webrtc