blob: 57c0b98d0984cb8fa81f485b0010358b749385a5 [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 {
24
perkj71ee44c2016-06-15 00:47:53 -070025class MockLimitObserver : public BitrateAllocator::LimitObserver {
26 public:
philipelf69e7682018-02-28 13:06:28 +010027 MOCK_METHOD3(OnAllocationLimitsChanged,
perkj71ee44c2016-06-15 00:47:53 -070028 void(uint32_t min_send_bitrate_bps,
philipelf69e7682018-02-28 13:06:28 +010029 uint32_t max_padding_bitrate_bps,
30 uint32_t total_bitrate_bps));
perkj71ee44c2016-06-15 00:47:53 -070031};
32
mflodman86aabb22016-03-11 15:44:32 +010033class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000034 public:
35 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020036 : last_bitrate_bps_(0),
37 last_fraction_loss_(0),
38 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080039 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020040 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000041
mflodman48a4beb2016-07-01 13:03:59 +020042 void SetBitrateProtectionRatio(double protection_ratio) {
43 protection_ratio_ = protection_ratio;
44 }
45
46 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
47 uint8_t fraction_loss,
minyue78b4d562016-11-30 04:47:39 -080048 int64_t rtt,
49 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 17:21:19 +020050 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000051 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020052 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 04:47:39 -080053 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 13:03:59 +020054 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000055 }
mflodman101f2502016-06-09 17:21:19 +020056 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000057 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020058 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080059 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020060 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000061};
62
minyue78b4d562016-11-30 04:47:39 -080063namespace {
64constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080065const double kDefaultBitratePriority = 1.0;
minyue78b4d562016-11-30 04:47:39 -080066}
67
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000068class BitrateAllocatorTest : public ::testing::Test {
69 protected:
perkj71ee44c2016-06-15 00:47:53 -070070 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080071 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010072 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000073 ~BitrateAllocatorTest() {}
74
perkj71ee44c2016-06-15 00:47:53 -070075 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080076 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000077};
78
79TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
80 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070081 const uint32_t kMinSendBitrateBps = 100000;
82 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +010083 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -070084
philipelf69e7682018-02-28 13:06:28 +010085 EXPECT_CALL(limit_observer_,
86 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
87 kMaxBitrateBps));
88 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Seth Hampson24722b32017-12-22 09:36:42 -080089 kPadUpToBitrateBps, true, "",
90 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -070091 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -080092 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070093 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000094
Peter Boström8e4e8b02015-09-15 15:08:03 +020095 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080096 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -080097 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070098 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -070099
100 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
101 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100102 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700103 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
Seth Hampson24722b32017-12-22 09:36:42 -0800104 true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700105 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000106
philipelf69e7682018-02-28 13:06:28 +0100107 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
108 0, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700109 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200110 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100111 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200112 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000113}
114
115TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
116 TestBitrateObserver bitrate_observer_1;
117 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100118 const uint32_t kObs1StartBitrateBps = 100000;
119 const uint32_t kObs2StartBitrateBps = 200000;
120 const uint32_t kObs1MaxBitrateBps = 300000;
121 const uint32_t kObs2MaxBitrateBps = 300000;
122
123 EXPECT_CALL(
124 limit_observer_,
125 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
126 allocator_->AddObserver(&bitrate_observer_1, kObs1StartBitrateBps,
127 kObs1MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800128 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100129 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
130 allocator_->GetStartBitrate(&bitrate_observer_1));
131 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
132 kObs1StartBitrateBps + kObs2StartBitrateBps,
133 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
134 allocator_->AddObserver(&bitrate_observer_2, kObs2StartBitrateBps,
135 kObs2MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800136 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100137 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
138 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000139
mflodman48a4beb2016-07-01 13:03:59 +0200140 // Test too low start bitrate, hence lower than sum of min. Min bitrates
141 // will
142 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100143 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
144 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200145 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
146 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
147 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
148 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
149 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
150 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000151
mflodman48a4beb2016-07-01 13:03:59 +0200152 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800153 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100154 const uint32_t kBitrateToShare =
155 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200156 EXPECT_EQ(100000u + kBitrateToShare / 2,
157 bitrate_observer_1.last_bitrate_bps_);
158 EXPECT_EQ(200000u + kBitrateToShare / 2,
159 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000160
mflodman48a4beb2016-07-01 13:03:59 +0200161 // Limited by 2x max bitrates since we leave room for FEC and
162 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800163 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200164 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
165 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700166
mflodman48a4beb2016-07-01 13:03:59 +0200167 // Verify that if the bandwidth estimate is set to zero, the allocated
168 // rate is
169 // zero.
minyue78b4d562016-11-30 04:47:39 -0800170 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200171 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
172 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000173}
174
perkj71ee44c2016-06-15 00:47:53 -0700175TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
176 TestBitrateObserver bitrate_observer;
177 const uint32_t kMinSendBitrateBps = 100000;
178 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100179 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700180
philipelf69e7682018-02-28 13:06:28 +0100181 EXPECT_CALL(limit_observer_,
182 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
183 kMaxBitrateBps));
184 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Seth Hampson24722b32017-12-22 09:36:42 -0800185 kPadUpToBitrateBps, true, "",
186 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100187 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700188 allocator_->RemoveObserver(&bitrate_observer);
189}
190
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000191class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
192 protected:
perkj71ee44c2016-06-15 00:47:53 -0700193 BitrateAllocatorTestNoEnforceMin()
194 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800195 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000196 }
197 ~BitrateAllocatorTestNoEnforceMin() {}
198
perkj71ee44c2016-06-15 00:47:53 -0700199 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800200 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000201};
202
mflodman101f2502016-06-09 17:21:19 +0200203// The following three tests verify enforcing a minimum bitrate works as
204// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000205TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
206 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700207 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
208 // AddObserver is called with |enforce_min_bitrate| = false.
philipelf69e7682018-02-28 13:06:28 +0100209 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800210 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
211 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200212 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000213
mflodman48a4beb2016-07-01 13:03:59 +0200214 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800215 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200216 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000217
mflodman48a4beb2016-07-01 13:03:59 +0200218 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800219 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200220 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000221
philipelf69e7682018-02-28 13:06:28 +0100222 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200223 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000224}
225
226TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
227 TestBitrateObserver bitrate_observer_1;
228 TestBitrateObserver bitrate_observer_2;
229 TestBitrateObserver bitrate_observer_3;
230 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Seth Hampson24722b32017-12-22 09:36:42 -0800231 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
232 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700233 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100234
Seth Hampson24722b32017-12-22 09:36:42 -0800235 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
236 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700237 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200238 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100239
Seth Hampson24722b32017-12-22 09:36:42 -0800240 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
241 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700242 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200243 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
244 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000245
mflodman101f2502016-06-09 17:21:19 +0200246 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
247 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800248 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000249 // Verify that each observer gets its min rate (sum of min rates is 600000),
250 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100251 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200252 EXPECT_EQ(100000u + bitrate_to_share / 3,
253 bitrate_observer_1.last_bitrate_bps_);
254 EXPECT_EQ(200000u + bitrate_to_share / 3,
255 bitrate_observer_2.last_bitrate_bps_);
256 EXPECT_EQ(300000u + bitrate_to_share / 3,
257 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000258
mflodman101f2502016-06-09 17:21:19 +0200259 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800260 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200261 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
262 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
263 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
264
265 // Increased BWE, but still below the sum of configured min bitrates for all
266 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800267 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200268 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
269 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
270 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000271
mflodman101f2502016-06-09 17:21:19 +0200272 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800273 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200274 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
275 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
276 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000277
perkjec81bcd2016-05-11 06:01:13 -0700278 // Verify that zero estimated bandwidth, means that that all gets zero,
279 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800280 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200281 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
282 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
283 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700284
mflodman86aabb22016-03-11 15:44:32 +0100285 allocator_->RemoveObserver(&bitrate_observer_1);
286 allocator_->RemoveObserver(&bitrate_observer_2);
287 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000288}
289
mflodman48a4beb2016-07-01 13:03:59 +0200290TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
291 TestBitrateObserver bitrate_observer;
292 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
293 // AddObserver is called with |enforce_min_bitrate| = false.
philipelf69e7682018-02-28 13:06:28 +0100294 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800295 allocator_->AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
296 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200297 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
298
299 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800300 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200301 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
302
303 // Add loss and use a part of the bitrate for protection.
304 double protection_ratio = 0.4;
305 uint8_t fraction_loss = protection_ratio * 256;
306 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800307 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
308 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200309 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
310
311 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800312 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
313 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200314 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
315
316 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800317 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
318 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200319 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
320
321 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100322 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800323 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
324 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200325 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
326
327 // Remove all protection and make sure video is not paused as earlier.
328 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800329 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200330 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
331
minyue78b4d562016-11-30 04:47:39 -0800332 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200333 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
334
mflodman48a4beb2016-07-01 13:03:59 +0200335 allocator_->RemoveObserver(&bitrate_observer);
336}
337
338TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
339 TestBitrateObserver bitrate_observer_1;
340 TestBitrateObserver bitrate_observer_2;
341
Seth Hampson24722b32017-12-22 09:36:42 -0800342 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
343 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200344 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Seth Hampson24722b32017-12-22 09:36:42 -0800345 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
346 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200347 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
348 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
349
350 // Enough bitrate for both.
351 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800352 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200353 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
354 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
355
356 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800357 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200358 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
359 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
360
minyue78b4d562016-11-30 04:47:39 -0800361 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200362 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
363 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
364
minyue78b4d562016-11-30 04:47:39 -0800365 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200366 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
367 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
368
minyue78b4d562016-11-30 04:47:39 -0800369 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200370 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
371 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
372
minyue78b4d562016-11-30 04:47:39 -0800373 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200374 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
375 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
376
377 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800378 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200379 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
380 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
381
minyue78b4d562016-11-30 04:47:39 -0800382 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200383 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
384 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
385
386 allocator_->RemoveObserver(&bitrate_observer_1);
387 allocator_->RemoveObserver(&bitrate_observer_2);
388}
389
mflodman101f2502016-06-09 17:21:19 +0200390TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000391 TestBitrateObserver bitrate_observer_1;
392 TestBitrateObserver bitrate_observer_2;
393 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100394
Seth Hampson24722b32017-12-22 09:36:42 -0800395 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
396 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700397 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
398
Seth Hampson24722b32017-12-22 09:36:42 -0800399 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
400 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700401 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200402 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100403
Seth Hampson24722b32017-12-22 09:36:42 -0800404 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
405 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200406 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
407 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
408 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000409
mflodman48a4beb2016-07-01 13:03:59 +0200410 // Low BWE. Verify that all observers still get their respective min
411 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800412 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200413 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
414 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
415 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000416
mflodman48a4beb2016-07-01 13:03:59 +0200417 allocator_->RemoveObserver(&bitrate_observer_1);
418 allocator_->RemoveObserver(&bitrate_observer_2);
419 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000420}
perkjfea93092016-05-14 00:58:48 -0700421
422TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
423 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100424 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700425
Seth Hampson24722b32017-12-22 09:36:42 -0800426 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
427 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700428 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700429
430 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800431 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700432
mflodman101f2502016-06-09 17:21:19 +0200433 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700434
435 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700436 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100437 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800438 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
439 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700440
441 // Expect the start_bitrate to be set as if the network was still up but that
442 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700443 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200444 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
445 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700446
447 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800448 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200449 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
450 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
451}
452
453TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
454 TestBitrateObserver enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800455 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
456 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200457 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200458
mflodman48a4beb2016-07-01 13:03:59 +0200459 TestBitrateObserver not_enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800460 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
461 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200462 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
463 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200464
minyue78b4d562016-11-30 04:47:39 -0800465 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200466 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
467 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200468
minyue78b4d562016-11-30 04:47:39 -0800469 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200470 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
471 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200472
minyue78b4d562016-11-30 04:47:39 -0800473 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200474 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
475 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200476
minyue78b4d562016-11-30 04:47:39 -0800477 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200478 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
479 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200480
minyue78b4d562016-11-30 04:47:39 -0800481 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200482 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
483 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200484
minyue78b4d562016-11-30 04:47:39 -0800485 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200486 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
487 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200488
minyue78b4d562016-11-30 04:47:39 -0800489 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200490 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
491 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200492
mflodman48a4beb2016-07-01 13:03:59 +0200493 allocator_->RemoveObserver(&enforced_observer);
494 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200495}
496
497TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
498 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800499 allocator_->AddObserver(&observer, 30000, 300000, 0, false, "",
500 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200501 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200502
minyue78b4d562016-11-30 04:47:39 -0800503 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200504 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200505
minyue78b4d562016-11-30 04:47:39 -0800506 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200507 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200508
minyue78b4d562016-11-30 04:47:39 -0800509 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200510 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200511
minyue78b4d562016-11-30 04:47:39 -0800512 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200513 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200514
minyue78b4d562016-11-30 04:47:39 -0800515 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200516 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200517
minyue78b4d562016-11-30 04:47:39 -0800518 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200519 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200520
mflodman48a4beb2016-07-01 13:03:59 +0200521 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200522}
523
524TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
525 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800526 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
527 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200528 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200529
minyue78b4d562016-11-30 04:47:39 -0800530 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200531 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200532
minyue78b4d562016-11-30 04:47:39 -0800533 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200534 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200535
minyue78b4d562016-11-30 04:47:39 -0800536 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200537 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200538
minyue78b4d562016-11-30 04:47:39 -0800539 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200540 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200541
minyue78b4d562016-11-30 04:47:39 -0800542 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200543 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200544
minyue78b4d562016-11-30 04:47:39 -0800545 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200546 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200547
mflodman48a4beb2016-07-01 13:03:59 +0200548 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700549}
550
minyue78b4d562016-11-30 04:47:39 -0800551TEST_F(BitrateAllocatorTest, PassProbingInterval) {
552 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800553 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
554 kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800555 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
556
557 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
558 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
559
560 allocator_->RemoveObserver(&observer);
561}
562
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800563TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
564 TestBitrateObserver observer;
565 const uint32_t kMinSendBitrateBps = 10;
566 const uint32_t kMaxSendBitrateBps = 60;
567 const uint32_t kNetworkBandwidthBps = 30;
568
569 allocator_->AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0,
570 true, "", 2.0);
571 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
572 kDefaultProbingIntervalMs);
573
574 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
575
576 allocator_->RemoveObserver(&observer);
577}
578
579// Tests that two observers with the same bitrate priority are allocated
580// their bitrate evenly.
581TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
582 TestBitrateObserver observer_low_1;
583 TestBitrateObserver observer_low_2;
584 const uint32_t kMinSendBitrateBps = 10;
585 const uint32_t kMaxSendBitrateBps = 60;
586 const uint32_t kNetworkBandwidthBps = 60;
587 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
588 kMaxSendBitrateBps, 0, false, "low1", 2.0);
589 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
590 kMaxSendBitrateBps, 0, false, "low2", 2.0);
591 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
592 kDefaultProbingIntervalMs);
593
594 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
595 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
596
597 allocator_->RemoveObserver(&observer_low_1);
598 allocator_->RemoveObserver(&observer_low_2);
599}
600
601// Tests that there is no difference in functionality when the min bitrate is
602// enforced.
603TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
604 TestBitrateObserver observer_low_1;
605 TestBitrateObserver observer_low_2;
606 const uint32_t kMinSendBitrateBps = 0;
607 const uint32_t kMaxSendBitrateBps = 60;
608 const uint32_t kNetworkBandwidthBps = 60;
609 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
610 kMaxSendBitrateBps, 0, true, "low1", 2.0);
611 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
612 kMaxSendBitrateBps, 0, true, "low2", 2.0);
613 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
614 kDefaultProbingIntervalMs);
615
616 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
617 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
618
619 allocator_->RemoveObserver(&observer_low_1);
620 allocator_->RemoveObserver(&observer_low_2);
621}
622
623// Tests that if the available bandwidth is the sum of the max bitrate
624// of all observers, they will be allocated their max.
625TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
626 TestBitrateObserver observer_low;
627 TestBitrateObserver observer_mid;
628 const uint32_t kMinSendBitrateBps = 0;
629 const uint32_t kMaxSendBitrateBps = 60;
630 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
631 allocator_->AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps,
632 0, true, "low", 2.0);
633 allocator_->AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps,
634 0, true, "mid", 4.0);
635 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
636 kDefaultProbingIntervalMs);
637
638 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
639 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
640
641 allocator_->RemoveObserver(&observer_low);
642 allocator_->RemoveObserver(&observer_mid);
643}
644
645// Tests that after a higher bitrate priority observer has been allocated its
646// max bitrate the lower priority observer will then be allocated the remaining
647// bitrate.
648TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
649 TestBitrateObserver observer_low;
650 TestBitrateObserver observer_mid;
651 allocator_->AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
652 allocator_->AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
653 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
654
655 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
656 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
657
658 allocator_->RemoveObserver(&observer_low);
659 allocator_->RemoveObserver(&observer_mid);
660}
661
662// Tests that three observers with three different bitrate priorities will all
663// be allocated bitrate according to their relative bitrate priority.
664TEST_F(BitrateAllocatorTest,
665 PriorityRateThreeObserversAllocatedRelativeAmounts) {
666 TestBitrateObserver observer_low;
667 TestBitrateObserver observer_mid;
668 TestBitrateObserver observer_high;
669 const uint32_t kMaxBitrate = 100;
670 // Not enough bandwidth to fill any observer's max bitrate.
671 const uint32_t kNetworkBandwidthBps = 70;
672 const double kLowBitratePriority = 2.0;
673 const double kMidBitratePriority = 4.0;
674 const double kHighBitratePriority = 8.0;
675 const double kTotalBitratePriority =
676 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
677 allocator_->AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
678 kLowBitratePriority);
679 allocator_->AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
680 kMidBitratePriority);
681 allocator_->AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
682 kHighBitratePriority);
683 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
684 kDefaultProbingIntervalMs);
685
686 const double kLowFractionAllocated =
687 kLowBitratePriority / kTotalBitratePriority;
688 const double kMidFractionAllocated =
689 kMidBitratePriority / kTotalBitratePriority;
690 const double kHighFractionAllocated =
691 kHighBitratePriority / kTotalBitratePriority;
692 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
693 observer_low.last_bitrate_bps_);
694 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
695 observer_mid.last_bitrate_bps_);
696 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
697 observer_high.last_bitrate_bps_);
698
699 allocator_->RemoveObserver(&observer_low);
700 allocator_->RemoveObserver(&observer_mid);
701 allocator_->RemoveObserver(&observer_high);
702}
703
704// Tests that after the high priority observer has been allocated its maximum
705// bitrate, the other two observers are still allocated bitrate according to
706// their relative bitrate priority.
707TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
708 TestBitrateObserver observer_low;
709 const double kLowBitratePriority = 2.0;
710 TestBitrateObserver observer_mid;
711 const double kMidBitratePriority = 4.0;
712 TestBitrateObserver observer_high;
713 const double kHighBitratePriority = 8.0;
714
715 const uint32_t kAvailableBitrate = 90;
716 const uint32_t kMaxBitrate = 40;
717 const uint32_t kMinBitrate = 10;
718 // Remaining bitrate after allocating to all mins and knowing that the high
719 // priority observer will have its max bitrate allocated.
720 const uint32_t kRemainingBitrate =
721 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
722
723 allocator_->AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
724 "low", kLowBitratePriority);
725 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
726 "mid", kMidBitratePriority);
727 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
728 "high", kHighBitratePriority);
729 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
730 kDefaultProbingIntervalMs);
731
732 const double kLowFractionAllocated =
733 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
734 const double kMidFractionAllocated =
735 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
736 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
737 observer_low.last_bitrate_bps_);
738 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
739 observer_mid.last_bitrate_bps_);
740 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
741
742 allocator_->RemoveObserver(&observer_low);
743 allocator_->RemoveObserver(&observer_mid);
744 allocator_->RemoveObserver(&observer_high);
745}
746
747// Tests that after the low priority observer has been allocated its maximum
748// bitrate, the other two observers are still allocated bitrate according to
749// their relative bitrate priority.
750TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
751 TestBitrateObserver observer_low;
752 const double kLowBitratePriority = 2.0;
753 const uint32_t kLowMaxBitrate = 10;
754 TestBitrateObserver observer_mid;
755 const double kMidBitratePriority = 4.0;
756 TestBitrateObserver observer_high;
757 const double kHighBitratePriority = 8.0;
758
759 const uint32_t kMinBitrate = 0;
760 const uint32_t kMaxBitrate = 60;
761 const uint32_t kAvailableBitrate = 100;
762 // Remaining bitrate knowing that the low priority observer is allocated its
763 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
764 // available bitrate, so 70 bps would be sufficient network bandwidth.
765 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
766
767 allocator_->AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
768 "low", kLowBitratePriority);
769 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
770 "mid", kMidBitratePriority);
771 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
772 "high", kHighBitratePriority);
773 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
774 kDefaultProbingIntervalMs);
775
776 const double kMidFractionAllocated =
777 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
778 const double kHighFractionAllocated =
779 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
780 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
781 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
782 observer_mid.last_bitrate_bps_);
783 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
784 observer_high.last_bitrate_bps_);
785
786 allocator_->RemoveObserver(&observer_low);
787 allocator_->RemoveObserver(&observer_mid);
788 allocator_->RemoveObserver(&observer_high);
789}
790
791// Tests that after two observers are allocated bitrate to their max, the
792// the remaining observer is allocated what's left appropriately. This test
793// handles an edge case where the medium and high observer reach their
794// "relative" max allocation at the same time. The high has 40 to allocate
795// above its min, and the mid has 20 to allocate above its min, which scaled
796// by their bitrate priority is the same for each.
797TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
798 TestBitrateObserver observer_low;
799 TestBitrateObserver observer_mid;
800 TestBitrateObserver observer_high;
801 allocator_->AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
802 // Scaled allocation above the min allocation is the same for these two,
803 // meaning they will get allocated their max at the same time.
804 // Scaled (target allocation) = (max - min) / bitrate priority
805 allocator_->AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
806 allocator_->AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
807 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
808
809 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
810 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
811 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
812
813 allocator_->RemoveObserver(&observer_low);
814 allocator_->RemoveObserver(&observer_mid);
815 allocator_->RemoveObserver(&observer_high);
816}
817
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000818} // namespace webrtc