blob: 1fc6cd61746f2e312e2c3699d302fd50cfe75073 [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
minyue78b4d562016-11-30 04:47:39 -080076namespace {
77constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080078const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020079} // namespace
minyue78b4d562016-11-30 04:47:39 -080080
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000081class BitrateAllocatorTest : public ::testing::Test {
82 protected:
perkj71ee44c2016-06-15 00:47:53 -070083 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080084 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010085 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000086 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020087 void AddObserver(BitrateAllocatorObserver* observer,
88 uint32_t min_bitrate_bps,
89 uint32_t max_bitrate_bps,
90 uint32_t pad_up_bitrate_bps,
91 bool enforce_min_bitrate,
92 std::string track_id,
93 double bitrate_priority) {
94 allocator_->AddObserver(
95 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
96 enforce_min_bitrate, track_id, bitrate_priority, false});
97 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000098
perkj71ee44c2016-06-15 00:47:53 -070099 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800100 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000101};
102
103TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
104 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700105 const uint32_t kMinSendBitrateBps = 100000;
106 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100107 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700108
philipelf69e7682018-02-28 13:06:28 +0100109 EXPECT_CALL(limit_observer_,
110 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
111 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200112 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
113 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700114 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800115 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700116 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000117
Peter Boström8e4e8b02015-09-15 15:08:03 +0200118 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800119 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800120 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700121 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700122
123 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
124 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100125 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200126 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
127 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200128 EXPECT_CALL(limit_observer_,
129 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700130 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000131
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200132 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
133 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700134 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200135 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100136 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200137 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000138}
139
140TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
141 TestBitrateObserver bitrate_observer_1;
142 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100143 const uint32_t kObs1StartBitrateBps = 100000;
144 const uint32_t kObs2StartBitrateBps = 200000;
145 const uint32_t kObs1MaxBitrateBps = 300000;
146 const uint32_t kObs2MaxBitrateBps = 300000;
147
148 EXPECT_CALL(
149 limit_observer_,
150 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200151 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
152 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100153 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
154 allocator_->GetStartBitrate(&bitrate_observer_1));
155 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
156 kObs1StartBitrateBps + kObs2StartBitrateBps,
157 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200158 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
159 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100160 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
161 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000162
mflodman48a4beb2016-07-01 13:03:59 +0200163 // Test too low start bitrate, hence lower than sum of min. Min bitrates
164 // will
165 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100166 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
167 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200168 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
169 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
170 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
171 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
172 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
173 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000174
mflodman48a4beb2016-07-01 13:03:59 +0200175 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800176 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100177 const uint32_t kBitrateToShare =
178 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200179 EXPECT_EQ(100000u + kBitrateToShare / 2,
180 bitrate_observer_1.last_bitrate_bps_);
181 EXPECT_EQ(200000u + kBitrateToShare / 2,
182 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000183
mflodman48a4beb2016-07-01 13:03:59 +0200184 // Limited by 2x max bitrates since we leave room for FEC and
185 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800186 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200187 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
188 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700189
mflodman48a4beb2016-07-01 13:03:59 +0200190 // Verify that if the bandwidth estimate is set to zero, the allocated
191 // rate is
192 // zero.
minyue78b4d562016-11-30 04:47:39 -0800193 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200194 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
195 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000196}
197
perkj71ee44c2016-06-15 00:47:53 -0700198TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
199 TestBitrateObserver bitrate_observer;
200 const uint32_t kMinSendBitrateBps = 100000;
201 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100202 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700203
philipelf69e7682018-02-28 13:06:28 +0100204 EXPECT_CALL(limit_observer_,
205 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
206 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200207 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
208 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100209 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700210 allocator_->RemoveObserver(&bitrate_observer);
211}
212
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000213class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
214 protected:
perkj71ee44c2016-06-15 00:47:53 -0700215 BitrateAllocatorTestNoEnforceMin()
216 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800217 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000218 }
219 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200220 void AddObserver(BitrateAllocatorObserver* observer,
221 uint32_t min_bitrate_bps,
222 uint32_t max_bitrate_bps,
223 uint32_t pad_up_bitrate_bps,
224 bool enforce_min_bitrate,
225 std::string track_id,
226 double bitrate_priority) {
227 allocator_->AddObserver(
228 observer, {min_bitrate_bps, max_bitrate_bps, pad_up_bitrate_bps,
229 enforce_min_bitrate, track_id, bitrate_priority, false});
230 }
perkj71ee44c2016-06-15 00:47:53 -0700231 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800232 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000233};
234
mflodman101f2502016-06-09 17:21:19 +0200235// The following three tests verify enforcing a minimum bitrate works as
236// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000237TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
238 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700239 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
240 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200241 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100242 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200243 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
244 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200245 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000246
mflodman48a4beb2016-07-01 13:03:59 +0200247 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800248 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200249 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000250
mflodman48a4beb2016-07-01 13:03:59 +0200251 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800252 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200253 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000254
philipelf69e7682018-02-28 13:06:28 +0100255 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200256 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000257}
258
259TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
260 TestBitrateObserver bitrate_observer_1;
261 TestBitrateObserver bitrate_observer_2;
262 TestBitrateObserver bitrate_observer_3;
263 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200264 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
265 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700266 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100267
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200268 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
269 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700270 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200271 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100272
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200273 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
274 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700275 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200276 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
277 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000278
mflodman101f2502016-06-09 17:21:19 +0200279 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
280 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800281 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000282 // Verify that each observer gets its min rate (sum of min rates is 600000),
283 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100284 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200285 EXPECT_EQ(100000u + bitrate_to_share / 3,
286 bitrate_observer_1.last_bitrate_bps_);
287 EXPECT_EQ(200000u + bitrate_to_share / 3,
288 bitrate_observer_2.last_bitrate_bps_);
289 EXPECT_EQ(300000u + bitrate_to_share / 3,
290 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000291
mflodman101f2502016-06-09 17:21:19 +0200292 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800293 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200294 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
295 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200296 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200297
298 // Increased BWE, but still below the sum of configured min bitrates for all
299 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800300 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200301 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
302 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200303 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000304
mflodman101f2502016-06-09 17:21:19 +0200305 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800306 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200307 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
308 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
309 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000310
perkjec81bcd2016-05-11 06:01:13 -0700311 // Verify that zero estimated bandwidth, means that that all gets zero,
312 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800313 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200314 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
315 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
316 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700317
mflodman86aabb22016-03-11 15:44:32 +0100318 allocator_->RemoveObserver(&bitrate_observer_1);
319 allocator_->RemoveObserver(&bitrate_observer_2);
320 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000321}
322
mflodman48a4beb2016-07-01 13:03:59 +0200323TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
324 TestBitrateObserver bitrate_observer;
325 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
326 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200327 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100328 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200329 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
330 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200331 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
332
333 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800334 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200335 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
336
337 // Add loss and use a part of the bitrate for protection.
338 double protection_ratio = 0.4;
339 uint8_t fraction_loss = protection_ratio * 256;
340 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800341 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
342 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200343 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
344
345 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800346 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
347 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200348 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
349
350 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800351 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
352 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200353 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
354
355 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100356 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800357 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
358 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200359 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
360
361 // Remove all protection and make sure video is not paused as earlier.
362 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800363 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200364 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
365
minyue78b4d562016-11-30 04:47:39 -0800366 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200367 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
368
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200369 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200370 allocator_->RemoveObserver(&bitrate_observer);
371}
372
373TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
374 TestBitrateObserver bitrate_observer_1;
375 TestBitrateObserver bitrate_observer_2;
376
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200377 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
378 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200379 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200380 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
381 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200382 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
383 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
384
385 // Enough bitrate for both.
386 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800387 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200388 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
389 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
390
391 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800392 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200393 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
394 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
395
minyue78b4d562016-11-30 04:47:39 -0800396 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200397 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
398 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
399
minyue78b4d562016-11-30 04:47:39 -0800400 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200401 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
402 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
403
minyue78b4d562016-11-30 04:47:39 -0800404 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200405 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
406 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
407
minyue78b4d562016-11-30 04:47:39 -0800408 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200409 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
410 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
411
412 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800413 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200414 EXPECT_EQ(400000u, 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(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200418 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
419 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
420
421 allocator_->RemoveObserver(&bitrate_observer_1);
422 allocator_->RemoveObserver(&bitrate_observer_2);
423}
424
mflodman101f2502016-06-09 17:21:19 +0200425TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000426 TestBitrateObserver bitrate_observer_1;
427 TestBitrateObserver bitrate_observer_2;
428 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100429
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200430 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
431 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700432 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
433
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200434 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
435 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700436 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200437 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100438
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200439 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
440 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200441 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
442 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
443 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000444
mflodman48a4beb2016-07-01 13:03:59 +0200445 // Low BWE. Verify that all observers still get their respective min
446 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800447 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200448 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
449 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
450 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000451
mflodman48a4beb2016-07-01 13:03:59 +0200452 allocator_->RemoveObserver(&bitrate_observer_1);
453 allocator_->RemoveObserver(&bitrate_observer_2);
454 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000455}
perkjfea93092016-05-14 00:58:48 -0700456
457TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
458 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100459 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700460
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200461 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
462 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700463 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700464
465 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800466 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700467
mflodman101f2502016-06-09 17:21:19 +0200468 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700469
470 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700471 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100472 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200473 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
474 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700475
476 // Expect the start_bitrate to be set as if the network was still up but that
477 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700478 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200479 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
480 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700481
482 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800483 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200484 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
485 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
486}
487
488TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
489 TestBitrateObserver enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200490 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
491 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200492 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200493
mflodman48a4beb2016-07-01 13:03:59 +0200494 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200495 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
496 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200497 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
498 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200499
minyue78b4d562016-11-30 04:47:39 -0800500 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200501 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
502 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200503
minyue78b4d562016-11-30 04:47:39 -0800504 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
506 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200507
minyue78b4d562016-11-30 04:47:39 -0800508 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200509 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
510 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200511
minyue78b4d562016-11-30 04:47:39 -0800512 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200513 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
514 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200515
minyue78b4d562016-11-30 04:47:39 -0800516 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200517 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
518 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200519
minyue78b4d562016-11-30 04:47:39 -0800520 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200521 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
522 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200523
minyue78b4d562016-11-30 04:47:39 -0800524 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200525 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
526 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200527
mflodman48a4beb2016-07-01 13:03:59 +0200528 allocator_->RemoveObserver(&enforced_observer);
529 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200530}
531
532TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
533 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200534 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200535 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200536
minyue78b4d562016-11-30 04:47:39 -0800537 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200538 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200539
minyue78b4d562016-11-30 04:47:39 -0800540 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200541 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200542
minyue78b4d562016-11-30 04:47:39 -0800543 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200544 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200545
minyue78b4d562016-11-30 04:47:39 -0800546 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200547 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200548
minyue78b4d562016-11-30 04:47:39 -0800549 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200550 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200551
minyue78b4d562016-11-30 04:47:39 -0800552 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200553 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200554
mflodman48a4beb2016-07-01 13:03:59 +0200555 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200556}
557
558TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
559 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200560 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200561 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200562
minyue78b4d562016-11-30 04:47:39 -0800563 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200564 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200565
minyue78b4d562016-11-30 04:47:39 -0800566 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200567 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200568
minyue78b4d562016-11-30 04:47:39 -0800569 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200570 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200571
minyue78b4d562016-11-30 04:47:39 -0800572 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200573 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200574
minyue78b4d562016-11-30 04:47:39 -0800575 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200576 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200577
minyue78b4d562016-11-30 04:47:39 -0800578 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200579 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200580
mflodman48a4beb2016-07-01 13:03:59 +0200581 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700582}
583
minyue78b4d562016-11-30 04:47:39 -0800584TEST_F(BitrateAllocatorTest, PassProbingInterval) {
585 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200586 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800587 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
588
589 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
590 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
591
592 allocator_->RemoveObserver(&observer);
593}
594
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800595TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
596 TestBitrateObserver observer;
597 const uint32_t kMinSendBitrateBps = 10;
598 const uint32_t kMaxSendBitrateBps = 60;
599 const uint32_t kNetworkBandwidthBps = 30;
600
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200601 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
602 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800603 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
604 kDefaultProbingIntervalMs);
605
606 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
607
608 allocator_->RemoveObserver(&observer);
609}
610
611// Tests that two observers with the same bitrate priority are allocated
612// their bitrate evenly.
613TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
614 TestBitrateObserver observer_low_1;
615 TestBitrateObserver observer_low_2;
616 const uint32_t kMinSendBitrateBps = 10;
617 const uint32_t kMaxSendBitrateBps = 60;
618 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200619 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
620 "low1", 2.0);
621 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, false,
622 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800623 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
624 kDefaultProbingIntervalMs);
625
626 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
627 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
628
629 allocator_->RemoveObserver(&observer_low_1);
630 allocator_->RemoveObserver(&observer_low_2);
631}
632
633// Tests that there is no difference in functionality when the min bitrate is
634// enforced.
635TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
636 TestBitrateObserver observer_low_1;
637 TestBitrateObserver observer_low_2;
638 const uint32_t kMinSendBitrateBps = 0;
639 const uint32_t kMaxSendBitrateBps = 60;
640 const uint32_t kNetworkBandwidthBps = 60;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200641 AddObserver(&observer_low_1, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
642 "low1", 2.0);
643 AddObserver(&observer_low_2, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
644 "low2", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800645 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
646 kDefaultProbingIntervalMs);
647
648 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
649 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
650
651 allocator_->RemoveObserver(&observer_low_1);
652 allocator_->RemoveObserver(&observer_low_2);
653}
654
655// Tests that if the available bandwidth is the sum of the max bitrate
656// of all observers, they will be allocated their max.
657TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
658 TestBitrateObserver observer_low;
659 TestBitrateObserver observer_mid;
660 const uint32_t kMinSendBitrateBps = 0;
661 const uint32_t kMaxSendBitrateBps = 60;
662 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200663 AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
664 "low", 2.0);
665 AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true,
666 "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800667 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
668 kDefaultProbingIntervalMs);
669
670 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
671 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
672
673 allocator_->RemoveObserver(&observer_low);
674 allocator_->RemoveObserver(&observer_mid);
675}
676
677// Tests that after a higher bitrate priority observer has been allocated its
678// max bitrate the lower priority observer will then be allocated the remaining
679// bitrate.
680TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
681 TestBitrateObserver observer_low;
682 TestBitrateObserver observer_mid;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200683 AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
684 AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800685 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
686
687 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
688 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
689
690 allocator_->RemoveObserver(&observer_low);
691 allocator_->RemoveObserver(&observer_mid);
692}
693
694// Tests that three observers with three different bitrate priorities will all
695// be allocated bitrate according to their relative bitrate priority.
696TEST_F(BitrateAllocatorTest,
697 PriorityRateThreeObserversAllocatedRelativeAmounts) {
698 TestBitrateObserver observer_low;
699 TestBitrateObserver observer_mid;
700 TestBitrateObserver observer_high;
701 const uint32_t kMaxBitrate = 100;
702 // Not enough bandwidth to fill any observer's max bitrate.
703 const uint32_t kNetworkBandwidthBps = 70;
704 const double kLowBitratePriority = 2.0;
705 const double kMidBitratePriority = 4.0;
706 const double kHighBitratePriority = 8.0;
707 const double kTotalBitratePriority =
708 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200709 AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
710 kLowBitratePriority);
711 AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
712 kMidBitratePriority);
713 AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
714 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800715 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
716 kDefaultProbingIntervalMs);
717
718 const double kLowFractionAllocated =
719 kLowBitratePriority / kTotalBitratePriority;
720 const double kMidFractionAllocated =
721 kMidBitratePriority / kTotalBitratePriority;
722 const double kHighFractionAllocated =
723 kHighBitratePriority / kTotalBitratePriority;
724 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
725 observer_low.last_bitrate_bps_);
726 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
727 observer_mid.last_bitrate_bps_);
728 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
729 observer_high.last_bitrate_bps_);
730
731 allocator_->RemoveObserver(&observer_low);
732 allocator_->RemoveObserver(&observer_mid);
733 allocator_->RemoveObserver(&observer_high);
734}
735
736// Tests that after the high priority observer has been allocated its maximum
737// bitrate, the other two observers are still allocated bitrate according to
738// their relative bitrate priority.
739TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
740 TestBitrateObserver observer_low;
741 const double kLowBitratePriority = 2.0;
742 TestBitrateObserver observer_mid;
743 const double kMidBitratePriority = 4.0;
744 TestBitrateObserver observer_high;
745 const double kHighBitratePriority = 8.0;
746
747 const uint32_t kAvailableBitrate = 90;
748 const uint32_t kMaxBitrate = 40;
749 const uint32_t kMinBitrate = 10;
750 // Remaining bitrate after allocating to all mins and knowing that the high
751 // priority observer will have its max bitrate allocated.
752 const uint32_t kRemainingBitrate =
753 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
754
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200755 AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false, "low",
756 kLowBitratePriority);
757 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
758 kMidBitratePriority);
759 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
760 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800761 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
762 kDefaultProbingIntervalMs);
763
764 const double kLowFractionAllocated =
765 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
766 const double kMidFractionAllocated =
767 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
768 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
769 observer_low.last_bitrate_bps_);
770 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
771 observer_mid.last_bitrate_bps_);
772 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
773
774 allocator_->RemoveObserver(&observer_low);
775 allocator_->RemoveObserver(&observer_mid);
776 allocator_->RemoveObserver(&observer_high);
777}
778
779// Tests that after the low priority observer has been allocated its maximum
780// bitrate, the other two observers are still allocated bitrate according to
781// their relative bitrate priority.
782TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
783 TestBitrateObserver observer_low;
784 const double kLowBitratePriority = 2.0;
785 const uint32_t kLowMaxBitrate = 10;
786 TestBitrateObserver observer_mid;
787 const double kMidBitratePriority = 4.0;
788 TestBitrateObserver observer_high;
789 const double kHighBitratePriority = 8.0;
790
791 const uint32_t kMinBitrate = 0;
792 const uint32_t kMaxBitrate = 60;
793 const uint32_t kAvailableBitrate = 100;
794 // Remaining bitrate knowing that the low priority observer is allocated its
795 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
796 // available bitrate, so 70 bps would be sufficient network bandwidth.
797 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
798
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200799 AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false, "low",
800 kLowBitratePriority);
801 AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false, "mid",
802 kMidBitratePriority);
803 AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false, "high",
804 kHighBitratePriority);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800805 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
806 kDefaultProbingIntervalMs);
807
808 const double kMidFractionAllocated =
809 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
810 const double kHighFractionAllocated =
811 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
812 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
813 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
814 observer_mid.last_bitrate_bps_);
815 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
816 observer_high.last_bitrate_bps_);
817
818 allocator_->RemoveObserver(&observer_low);
819 allocator_->RemoveObserver(&observer_mid);
820 allocator_->RemoveObserver(&observer_high);
821}
822
823// Tests that after two observers are allocated bitrate to their max, the
824// the remaining observer is allocated what's left appropriately. This test
825// handles an edge case where the medium and high observer reach their
826// "relative" max allocation at the same time. The high has 40 to allocate
827// above its min, and the mid has 20 to allocate above its min, which scaled
828// by their bitrate priority is the same for each.
829TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
830 TestBitrateObserver observer_low;
831 TestBitrateObserver observer_mid;
832 TestBitrateObserver observer_high;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200833 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800834 // Scaled allocation above the min allocation is the same for these two,
835 // meaning they will get allocated their max at the same time.
836 // Scaled (target allocation) = (max - min) / bitrate priority
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200837 AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
838 AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800839 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
840
841 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
842 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
843 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
844
845 allocator_->RemoveObserver(&observer_low);
846 allocator_->RemoveObserver(&observer_mid);
847 allocator_->RemoveObserver(&observer_high);
848}
849
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000850} // namespace webrtc