blob: 7814655358c596a819c5a543ffb18fd5f52efc98 [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,
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:26 +000039
Sebastian Janssonfe617a32018-03-21 12:45:20 +010040class MockLimitObserver : public LimitObserverWrapper {
perkj71ee44c2016-06-15 00:47:53 -070041 public:
philipelf69e7682018-02-28 13:06:28 +010042 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070043 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010044 uint32_t max_padding_bitrate_bps,
45 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070046};
47
mflodman86aabb22016-03-11 15:44:32 +010048class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000049 public:
50 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020051 : last_bitrate_bps_(0),
52 last_fraction_loss_(0),
53 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080054 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020055 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000056
mflodman48a4beb2016-07-01 13:03:59 +020057 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 04:47:39 -080063 int64_t rtt,
64 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 17:21:19 +020065 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000066 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020067 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 04:47:39 -080068 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 13:03:59 +020069 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000070 }
mflodman101f2502016-06-09 17:21:19 +020071 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000072 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020073 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080074 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020075 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000076};
77
minyue78b4d562016-11-30 04:47:39 -080078namespace {
79constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080080const double kDefaultBitratePriority = 1.0;
Yves Gerey665174f2018-06-19 15:03:05 +020081} // namespace
minyue78b4d562016-11-30 04:47:39 -080082
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000083class BitrateAllocatorTest : public ::testing::Test {
84 protected:
perkj71ee44c2016-06-15 00:47:53 -070085 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080086 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010087 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000088 ~BitrateAllocatorTest() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +020089 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:26 +0000100
perkj71ee44c2016-06-15 00:47:53 -0700101 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800102 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000103};
104
105TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
106 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -0700107 const uint32_t kMinSendBitrateBps = 100000;
108 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100109 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700110
philipelf69e7682018-02-28 13:06:28 +0100111 EXPECT_CALL(limit_observer_,
112 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
113 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200114 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
115 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700116 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800117 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700118 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000119
Peter Boström8e4e8b02015-09-15 15:08:03 +0200120 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800121 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800122 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700123 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700124
125 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
126 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100127 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200128 AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0, true, "",
129 kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200130 EXPECT_CALL(limit_observer_,
131 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700132 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000133
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200134 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps, 0, true,
135 "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700136 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200137 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100138 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200139 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000140}
141
142TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
143 TestBitrateObserver bitrate_observer_1;
144 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100145 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 08:25:12 +0200153 AddObserver(&bitrate_observer_1, kObs1StartBitrateBps, kObs1MaxBitrateBps, 0,
154 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100155 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 08:25:12 +0200160 AddObserver(&bitrate_observer_2, kObs2StartBitrateBps, kObs2MaxBitrateBps, 0,
161 true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100162 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
163 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000164
mflodman48a4beb2016-07-01 13:03:59 +0200165 // Test too low start bitrate, hence lower than sum of min. Min bitrates
166 // will
167 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100168 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
169 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200170 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:26 +0000176
mflodman48a4beb2016-07-01 13:03:59 +0200177 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800178 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100179 const uint32_t kBitrateToShare =
180 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200181 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:26 +0000185
mflodman48a4beb2016-07-01 13:03:59 +0200186 // Limited by 2x max bitrates since we leave room for FEC and
187 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800188 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200189 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
190 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700191
mflodman48a4beb2016-07-01 13:03:59 +0200192 // Verify that if the bandwidth estimate is set to zero, the allocated
193 // rate is
194 // zero.
minyue78b4d562016-11-30 04:47:39 -0800195 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200196 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:26 +0000198}
199
perkj71ee44c2016-06-15 00:47:53 -0700200TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
201 TestBitrateObserver bitrate_observer;
202 const uint32_t kMinSendBitrateBps = 100000;
203 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100204 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700205
philipelf69e7682018-02-28 13:06:28 +0100206 EXPECT_CALL(limit_observer_,
207 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
208 kMaxBitrateBps));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200209 AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
210 kPadUpToBitrateBps, true, "", kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100211 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700212 allocator_->RemoveObserver(&bitrate_observer);
213}
214
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000215class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
216 protected:
perkj71ee44c2016-06-15 00:47:53 -0700217 BitrateAllocatorTestNoEnforceMin()
218 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800219 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000220 }
221 ~BitrateAllocatorTestNoEnforceMin() {}
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200222 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 00:47:53 -0700233 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800234 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000235};
236
mflodman101f2502016-06-09 17:21:19 +0200237// The following three tests verify enforcing a minimum bitrate works as
238// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
240 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700241 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
242 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200243 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100244 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200245 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
246 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200247 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000248
mflodman48a4beb2016-07-01 13:03:59 +0200249 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800250 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200251 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000252
mflodman48a4beb2016-07-01 13:03:59 +0200253 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800254 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200255 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000256
philipelf69e7682018-02-28 13:06:28 +0100257 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200258 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000259}
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 08:25:12 +0200266 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
267 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700268 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100269
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200270 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
271 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700272 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200273 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100274
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200275 AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
276 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700277 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200278 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:26 +0000280
mflodman101f2502016-06-09 17:21:19 +0200281 // 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 04:47:39 -0800283 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000284 // 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 11:11:06 +0100286 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200287 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:26 +0000293
mflodman101f2502016-06-09 17:21:19 +0200294 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800295 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200296 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
297 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
Yves Gerey665174f2018-06-19 15:03:05 +0200298 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
mflodman101f2502016-06-09 17:21:19 +0200299
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 04:47:39 -0800302 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200303 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
304 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
Yves Gerey665174f2018-06-19 15:03:05 +0200305 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000306
mflodman101f2502016-06-09 17:21:19 +0200307 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800308 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200309 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:26 +0000312
perkjec81bcd2016-05-11 06:01:13 -0700313 // Verify that zero estimated bandwidth, means that that all gets zero,
314 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800315 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200316 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 06:01:13 -0700319
mflodman86aabb22016-03-11 15:44:32 +0100320 allocator_->RemoveObserver(&bitrate_observer_1);
321 allocator_->RemoveObserver(&bitrate_observer_2);
322 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000323}
324
mflodman48a4beb2016-07-01 13:03:59 +0200325TEST_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 14:52:07 +0200329 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100330 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200331 AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
332 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200333 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
334
335 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800336 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200337 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 04:47:39 -0800343 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
344 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200345 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
346
347 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800348 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
349 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200350 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
351
352 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800353 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
354 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200355 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
356
357 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100358 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800359 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
360 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200361 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 04:47:39 -0800365 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200366 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
367
minyue78b4d562016-11-30 04:47:39 -0800368 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200369 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
370
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200371 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200372 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 08:25:12 +0200379 AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
380 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200381 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200382 AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
383 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200384 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 04:47:39 -0800389 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200390 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 04:47:39 -0800394 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200395 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
396 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
397
minyue78b4d562016-11-30 04:47:39 -0800398 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200399 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
400 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
401
minyue78b4d562016-11-30 04:47:39 -0800402 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200403 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
404 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
405
minyue78b4d562016-11-30 04:47:39 -0800406 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200407 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
408 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
409
minyue78b4d562016-11-30 04:47:39 -0800410 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200411 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 04:47:39 -0800415 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200416 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
417 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
418
minyue78b4d562016-11-30 04:47:39 -0800419 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200420 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 17:21:19 +0200427TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000428 TestBitrateObserver bitrate_observer_1;
429 TestBitrateObserver bitrate_observer_2;
430 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100431
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200432 AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
433 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700434 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
435
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200436 AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
437 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700438 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200439 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100440
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200441 AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
442 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200443 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:26 +0000446
mflodman48a4beb2016-07-01 13:03:59 +0200447 // Low BWE. Verify that all observers still get their respective min
448 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800449 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200450 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:26 +0000453
mflodman48a4beb2016-07-01 13:03:59 +0200454 allocator_->RemoveObserver(&bitrate_observer_1);
455 allocator_->RemoveObserver(&bitrate_observer_2);
456 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000457}
perkjfea93092016-05-14 00:58:48 -0700458
459TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
460 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100461 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700462
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200463 AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
464 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700465 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700466
467 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800468 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700469
mflodman101f2502016-06-09 17:21:19 +0200470 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700471
472 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700473 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100474 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200475 AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
476 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700477
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 07:27:16 -0700480 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200481 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
482 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700483
484 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800485 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200486 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 08:25:12 +0200492 AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
493 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200494 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200495
mflodman48a4beb2016-07-01 13:03:59 +0200496 TestBitrateObserver not_enforced_observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200497 AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
498 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200499 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
500 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200501
minyue78b4d562016-11-30 04:47:39 -0800502 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200503 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
504 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200505
minyue78b4d562016-11-30 04:47:39 -0800506 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200507 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
508 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200509
minyue78b4d562016-11-30 04:47:39 -0800510 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200511 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
512 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200513
minyue78b4d562016-11-30 04:47:39 -0800514 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200515 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
516 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200517
minyue78b4d562016-11-30 04:47:39 -0800518 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200519 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
520 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200521
minyue78b4d562016-11-30 04:47:39 -0800522 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200523 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
524 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200525
minyue78b4d562016-11-30 04:47:39 -0800526 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200527 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
528 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200529
mflodman48a4beb2016-07-01 13:03:59 +0200530 allocator_->RemoveObserver(&enforced_observer);
531 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200532}
533
534TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
535 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200536 AddObserver(&observer, 30000, 300000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200537 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200538
minyue78b4d562016-11-30 04:47:39 -0800539 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200540 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200541
minyue78b4d562016-11-30 04:47:39 -0800542 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200543 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200544
minyue78b4d562016-11-30 04:47:39 -0800545 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200546 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200547
minyue78b4d562016-11-30 04:47:39 -0800548 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200549 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200550
minyue78b4d562016-11-30 04:47:39 -0800551 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200553
minyue78b4d562016-11-30 04:47:39 -0800554 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200555 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200556
mflodman48a4beb2016-07-01 13:03:59 +0200557 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200558}
559
560TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
561 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200562 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200563 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200564
minyue78b4d562016-11-30 04:47:39 -0800565 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200566 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200567
minyue78b4d562016-11-30 04:47:39 -0800568 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200569 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200570
minyue78b4d562016-11-30 04:47:39 -0800571 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200572 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200573
minyue78b4d562016-11-30 04:47:39 -0800574 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200575 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200576
minyue78b4d562016-11-30 04:47:39 -0800577 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200578 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200579
minyue78b4d562016-11-30 04:47:39 -0800580 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200581 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200582
mflodman48a4beb2016-07-01 13:03:59 +0200583 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700584}
585
minyue78b4d562016-11-30 04:47:39 -0800586TEST_F(BitrateAllocatorTest, PassProbingInterval) {
587 TestBitrateObserver observer;
Sebastian Jansson24ad7202018-04-19 08:25:12 +0200588 AddObserver(&observer, 300000, 600000, 0, false, "", kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800589 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 10:49:06 -0800597TEST_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 08:25:12 +0200603 AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0, true, "",
604 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800605 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 08:25:12 +0200621 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 10:49:06 -0800625 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 08:25:12 +0200643 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 10:49:06 -0800647 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 08:25:12 +0200665 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 10:49:06 -0800669 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 08:25:12 +0200685 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 10:49:06 -0800687 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 08:25:12 +0200711 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 10:49:06 -0800717 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 08:25:12 +0200757 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 10:49:06 -0800763 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 08:25:12 +0200801 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 10:49:06 -0800807 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 08:25:12 +0200835 AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800836 // 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 08:25:12 +0200839 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 10:49:06 -0800841 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:26 +0000852} // namespace webrtc