blob: 5b07a81e788d00035ec3e0beb8bb652c84466b66 [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;
minyue78b4d562016-11-30 04:47:39 -080081}
82
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() {}
89
perkj71ee44c2016-06-15 00:47:53 -070090 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080091 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000092};
93
94TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
95 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070096 const uint32_t kMinSendBitrateBps = 100000;
97 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +010098 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -070099
philipelf69e7682018-02-28 13:06:28 +0100100 EXPECT_CALL(limit_observer_,
101 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
102 kMaxBitrateBps));
103 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Seth Hampson24722b32017-12-22 09:36:42 -0800104 kPadUpToBitrateBps, true, "",
105 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700106 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -0800107 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700108 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000109
Peter Boström8e4e8b02015-09-15 15:08:03 +0200110 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -0800111 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -0800112 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -0700113 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -0700114
115 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
116 EXPECT_CALL(limit_observer_,
philipelf69e7682018-02-28 13:06:28 +0100117 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700118 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
Seth Hampson24722b32017-12-22 09:36:42 -0800119 true, "", kDefaultBitratePriority);
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200120 EXPECT_CALL(limit_observer_,
121 OnAllocationLimitsChanged(kMinSendBitrateBps, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700122 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000123
philipelf69e7682018-02-28 13:06:28 +0100124 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
125 0, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700126 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200127 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100128 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200129 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000130}
131
132TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
133 TestBitrateObserver bitrate_observer_1;
134 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100135 const uint32_t kObs1StartBitrateBps = 100000;
136 const uint32_t kObs2StartBitrateBps = 200000;
137 const uint32_t kObs1MaxBitrateBps = 300000;
138 const uint32_t kObs2MaxBitrateBps = 300000;
139
140 EXPECT_CALL(
141 limit_observer_,
142 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
143 allocator_->AddObserver(&bitrate_observer_1, kObs1StartBitrateBps,
144 kObs1MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800145 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100146 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
147 allocator_->GetStartBitrate(&bitrate_observer_1));
148 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
149 kObs1StartBitrateBps + kObs2StartBitrateBps,
150 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
151 allocator_->AddObserver(&bitrate_observer_2, kObs2StartBitrateBps,
152 kObs2MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800153 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100154 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
155 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000156
mflodman48a4beb2016-07-01 13:03:59 +0200157 // Test too low start bitrate, hence lower than sum of min. Min bitrates
158 // will
159 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100160 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
161 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200162 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
163 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
164 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
165 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
166 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
167 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000168
mflodman48a4beb2016-07-01 13:03:59 +0200169 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800170 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100171 const uint32_t kBitrateToShare =
172 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200173 EXPECT_EQ(100000u + kBitrateToShare / 2,
174 bitrate_observer_1.last_bitrate_bps_);
175 EXPECT_EQ(200000u + kBitrateToShare / 2,
176 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000177
mflodman48a4beb2016-07-01 13:03:59 +0200178 // Limited by 2x max bitrates since we leave room for FEC and
179 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800180 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200181 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
182 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700183
mflodman48a4beb2016-07-01 13:03:59 +0200184 // Verify that if the bandwidth estimate is set to zero, the allocated
185 // rate is
186 // zero.
minyue78b4d562016-11-30 04:47:39 -0800187 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200188 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
189 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000190}
191
perkj71ee44c2016-06-15 00:47:53 -0700192TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
193 TestBitrateObserver bitrate_observer;
194 const uint32_t kMinSendBitrateBps = 100000;
195 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100196 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700197
philipelf69e7682018-02-28 13:06:28 +0100198 EXPECT_CALL(limit_observer_,
199 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
200 kMaxBitrateBps));
201 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Seth Hampson24722b32017-12-22 09:36:42 -0800202 kPadUpToBitrateBps, true, "",
203 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100204 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700205 allocator_->RemoveObserver(&bitrate_observer);
206}
207
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000208class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
209 protected:
perkj71ee44c2016-06-15 00:47:53 -0700210 BitrateAllocatorTestNoEnforceMin()
211 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800212 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000213 }
214 ~BitrateAllocatorTestNoEnforceMin() {}
215
perkj71ee44c2016-06-15 00:47:53 -0700216 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800217 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000218};
219
mflodman101f2502016-06-09 17:21:19 +0200220// The following three tests verify enforcing a minimum bitrate works as
221// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000222TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
223 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700224 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
225 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200226 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100227 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800228 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
229 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200230 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000231
mflodman48a4beb2016-07-01 13:03:59 +0200232 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800233 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200234 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000235
mflodman48a4beb2016-07-01 13:03:59 +0200236 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800237 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200238 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239
philipelf69e7682018-02-28 13:06:28 +0100240 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200241 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000242}
243
244TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
245 TestBitrateObserver bitrate_observer_1;
246 TestBitrateObserver bitrate_observer_2;
247 TestBitrateObserver bitrate_observer_3;
248 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Seth Hampson24722b32017-12-22 09:36:42 -0800249 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
250 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700251 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100252
Seth Hampson24722b32017-12-22 09:36:42 -0800253 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
254 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700255 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200256 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100257
Seth Hampson24722b32017-12-22 09:36:42 -0800258 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
259 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700260 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200261 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
262 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000263
mflodman101f2502016-06-09 17:21:19 +0200264 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
265 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800266 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000267 // Verify that each observer gets its min rate (sum of min rates is 600000),
268 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100269 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200270 EXPECT_EQ(100000u + bitrate_to_share / 3,
271 bitrate_observer_1.last_bitrate_bps_);
272 EXPECT_EQ(200000u + bitrate_to_share / 3,
273 bitrate_observer_2.last_bitrate_bps_);
274 EXPECT_EQ(300000u + bitrate_to_share / 3,
275 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000276
mflodman101f2502016-06-09 17:21:19 +0200277 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800278 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200279 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
280 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
281 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
282
283 // Increased BWE, but still below the sum of configured min bitrates for all
284 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800285 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200286 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
287 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
288 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000289
mflodman101f2502016-06-09 17:21:19 +0200290 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800291 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200292 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
293 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
294 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000295
perkjec81bcd2016-05-11 06:01:13 -0700296 // Verify that zero estimated bandwidth, means that that all gets zero,
297 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800298 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200299 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
300 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
301 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700302
mflodman86aabb22016-03-11 15:44:32 +0100303 allocator_->RemoveObserver(&bitrate_observer_1);
304 allocator_->RemoveObserver(&bitrate_observer_2);
305 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000306}
307
mflodman48a4beb2016-07-01 13:03:59 +0200308TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
309 TestBitrateObserver bitrate_observer;
310 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
311 // AddObserver is called with |enforce_min_bitrate| = false.
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200312 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
philipelf69e7682018-02-28 13:06:28 +0100313 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800314 allocator_->AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
315 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200316 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
317
318 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800319 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200320 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
321
322 // Add loss and use a part of the bitrate for protection.
323 double protection_ratio = 0.4;
324 uint8_t fraction_loss = protection_ratio * 256;
325 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800326 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
327 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200328 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
329
330 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800331 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
332 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200333 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
334
335 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800336 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
337 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200338 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
339
340 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100341 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800342 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
343 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200344 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
345
346 // Remove all protection and make sure video is not paused as earlier.
347 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800348 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200349 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
350
minyue78b4d562016-11-30 04:47:39 -0800351 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200352 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
353
Sebastian Jansson448f4d52018-04-04 14:52:07 +0200354 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200355 allocator_->RemoveObserver(&bitrate_observer);
356}
357
358TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
359 TestBitrateObserver bitrate_observer_1;
360 TestBitrateObserver bitrate_observer_2;
361
Seth Hampson24722b32017-12-22 09:36:42 -0800362 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
363 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200364 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Seth Hampson24722b32017-12-22 09:36:42 -0800365 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
366 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200367 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
368 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
369
370 // Enough bitrate for both.
371 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800372 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200373 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
374 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
375
376 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800377 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200378 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
379 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
380
minyue78b4d562016-11-30 04:47:39 -0800381 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200382 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
383 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
384
minyue78b4d562016-11-30 04:47:39 -0800385 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200386 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
387 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
388
minyue78b4d562016-11-30 04:47:39 -0800389 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200390 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
391 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
392
minyue78b4d562016-11-30 04:47:39 -0800393 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200394 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
395 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
396
397 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800398 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200399 EXPECT_EQ(400000u, 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(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200403 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
404 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
405
406 allocator_->RemoveObserver(&bitrate_observer_1);
407 allocator_->RemoveObserver(&bitrate_observer_2);
408}
409
mflodman101f2502016-06-09 17:21:19 +0200410TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000411 TestBitrateObserver bitrate_observer_1;
412 TestBitrateObserver bitrate_observer_2;
413 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100414
Seth Hampson24722b32017-12-22 09:36:42 -0800415 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
416 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700417 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
418
Seth Hampson24722b32017-12-22 09:36:42 -0800419 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
420 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700421 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200422 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100423
Seth Hampson24722b32017-12-22 09:36:42 -0800424 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
425 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200426 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
427 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
428 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000429
mflodman48a4beb2016-07-01 13:03:59 +0200430 // Low BWE. Verify that all observers still get their respective min
431 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800432 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200433 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
434 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
435 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000436
mflodman48a4beb2016-07-01 13:03:59 +0200437 allocator_->RemoveObserver(&bitrate_observer_1);
438 allocator_->RemoveObserver(&bitrate_observer_2);
439 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000440}
perkjfea93092016-05-14 00:58:48 -0700441
442TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
443 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100444 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700445
Seth Hampson24722b32017-12-22 09:36:42 -0800446 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
447 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700448 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700449
450 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800451 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700452
mflodman101f2502016-06-09 17:21:19 +0200453 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700454
455 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700456 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100457 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800458 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
459 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700460
461 // Expect the start_bitrate to be set as if the network was still up but that
462 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700463 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200464 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
465 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700466
467 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800468 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200469 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
470 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
471}
472
473TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
474 TestBitrateObserver enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800475 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
476 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200477 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200478
mflodman48a4beb2016-07-01 13:03:59 +0200479 TestBitrateObserver not_enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800480 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
481 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200482 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
483 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200484
minyue78b4d562016-11-30 04:47:39 -0800485 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200486 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
487 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200488
minyue78b4d562016-11-30 04:47:39 -0800489 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200490 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
491 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200492
minyue78b4d562016-11-30 04:47:39 -0800493 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200494 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
495 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200496
minyue78b4d562016-11-30 04:47:39 -0800497 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200498 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
499 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200500
minyue78b4d562016-11-30 04:47:39 -0800501 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200502 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
503 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200504
minyue78b4d562016-11-30 04:47:39 -0800505 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200506 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
507 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200508
minyue78b4d562016-11-30 04:47:39 -0800509 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200510 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
511 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200512
mflodman48a4beb2016-07-01 13:03:59 +0200513 allocator_->RemoveObserver(&enforced_observer);
514 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200515}
516
517TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
518 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800519 allocator_->AddObserver(&observer, 30000, 300000, 0, false, "",
520 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200521 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200522
minyue78b4d562016-11-30 04:47:39 -0800523 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200524 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200525
minyue78b4d562016-11-30 04:47:39 -0800526 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200527 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200528
minyue78b4d562016-11-30 04:47:39 -0800529 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200530 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200531
minyue78b4d562016-11-30 04:47:39 -0800532 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200533 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200534
minyue78b4d562016-11-30 04:47:39 -0800535 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200536 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200537
minyue78b4d562016-11-30 04:47:39 -0800538 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200539 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200540
mflodman48a4beb2016-07-01 13:03:59 +0200541 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200542}
543
544TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
545 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800546 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
547 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200548 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200549
minyue78b4d562016-11-30 04:47:39 -0800550 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200551 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200552
minyue78b4d562016-11-30 04:47:39 -0800553 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200554 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200555
minyue78b4d562016-11-30 04:47:39 -0800556 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200557 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200558
minyue78b4d562016-11-30 04:47:39 -0800559 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200560 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200561
minyue78b4d562016-11-30 04:47:39 -0800562 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200563 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
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
mflodman48a4beb2016-07-01 13:03:59 +0200568 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700569}
570
minyue78b4d562016-11-30 04:47:39 -0800571TEST_F(BitrateAllocatorTest, PassProbingInterval) {
572 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800573 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
574 kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800575 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
576
577 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
578 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
579
580 allocator_->RemoveObserver(&observer);
581}
582
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800583TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
584 TestBitrateObserver observer;
585 const uint32_t kMinSendBitrateBps = 10;
586 const uint32_t kMaxSendBitrateBps = 60;
587 const uint32_t kNetworkBandwidthBps = 30;
588
589 allocator_->AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0,
590 true, "", 2.0);
591 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
592 kDefaultProbingIntervalMs);
593
594 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
595
596 allocator_->RemoveObserver(&observer);
597}
598
599// Tests that two observers with the same bitrate priority are allocated
600// their bitrate evenly.
601TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
602 TestBitrateObserver observer_low_1;
603 TestBitrateObserver observer_low_2;
604 const uint32_t kMinSendBitrateBps = 10;
605 const uint32_t kMaxSendBitrateBps = 60;
606 const uint32_t kNetworkBandwidthBps = 60;
607 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
608 kMaxSendBitrateBps, 0, false, "low1", 2.0);
609 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
610 kMaxSendBitrateBps, 0, false, "low2", 2.0);
611 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
612 kDefaultProbingIntervalMs);
613
614 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
615 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
616
617 allocator_->RemoveObserver(&observer_low_1);
618 allocator_->RemoveObserver(&observer_low_2);
619}
620
621// Tests that there is no difference in functionality when the min bitrate is
622// enforced.
623TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
624 TestBitrateObserver observer_low_1;
625 TestBitrateObserver observer_low_2;
626 const uint32_t kMinSendBitrateBps = 0;
627 const uint32_t kMaxSendBitrateBps = 60;
628 const uint32_t kNetworkBandwidthBps = 60;
629 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
630 kMaxSendBitrateBps, 0, true, "low1", 2.0);
631 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
632 kMaxSendBitrateBps, 0, true, "low2", 2.0);
633 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
634 kDefaultProbingIntervalMs);
635
636 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
637 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
638
639 allocator_->RemoveObserver(&observer_low_1);
640 allocator_->RemoveObserver(&observer_low_2);
641}
642
643// Tests that if the available bandwidth is the sum of the max bitrate
644// of all observers, they will be allocated their max.
645TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
646 TestBitrateObserver observer_low;
647 TestBitrateObserver observer_mid;
648 const uint32_t kMinSendBitrateBps = 0;
649 const uint32_t kMaxSendBitrateBps = 60;
650 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
651 allocator_->AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps,
652 0, true, "low", 2.0);
653 allocator_->AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps,
654 0, true, "mid", 4.0);
655 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
656 kDefaultProbingIntervalMs);
657
658 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
659 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
660
661 allocator_->RemoveObserver(&observer_low);
662 allocator_->RemoveObserver(&observer_mid);
663}
664
665// Tests that after a higher bitrate priority observer has been allocated its
666// max bitrate the lower priority observer will then be allocated the remaining
667// bitrate.
668TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
669 TestBitrateObserver observer_low;
670 TestBitrateObserver observer_mid;
671 allocator_->AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
672 allocator_->AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
673 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
674
675 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
676 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
677
678 allocator_->RemoveObserver(&observer_low);
679 allocator_->RemoveObserver(&observer_mid);
680}
681
682// Tests that three observers with three different bitrate priorities will all
683// be allocated bitrate according to their relative bitrate priority.
684TEST_F(BitrateAllocatorTest,
685 PriorityRateThreeObserversAllocatedRelativeAmounts) {
686 TestBitrateObserver observer_low;
687 TestBitrateObserver observer_mid;
688 TestBitrateObserver observer_high;
689 const uint32_t kMaxBitrate = 100;
690 // Not enough bandwidth to fill any observer's max bitrate.
691 const uint32_t kNetworkBandwidthBps = 70;
692 const double kLowBitratePriority = 2.0;
693 const double kMidBitratePriority = 4.0;
694 const double kHighBitratePriority = 8.0;
695 const double kTotalBitratePriority =
696 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
697 allocator_->AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
698 kLowBitratePriority);
699 allocator_->AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
700 kMidBitratePriority);
701 allocator_->AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
702 kHighBitratePriority);
703 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
704 kDefaultProbingIntervalMs);
705
706 const double kLowFractionAllocated =
707 kLowBitratePriority / kTotalBitratePriority;
708 const double kMidFractionAllocated =
709 kMidBitratePriority / kTotalBitratePriority;
710 const double kHighFractionAllocated =
711 kHighBitratePriority / kTotalBitratePriority;
712 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
713 observer_low.last_bitrate_bps_);
714 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
715 observer_mid.last_bitrate_bps_);
716 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
717 observer_high.last_bitrate_bps_);
718
719 allocator_->RemoveObserver(&observer_low);
720 allocator_->RemoveObserver(&observer_mid);
721 allocator_->RemoveObserver(&observer_high);
722}
723
724// Tests that after the high priority observer has been allocated its maximum
725// bitrate, the other two observers are still allocated bitrate according to
726// their relative bitrate priority.
727TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
728 TestBitrateObserver observer_low;
729 const double kLowBitratePriority = 2.0;
730 TestBitrateObserver observer_mid;
731 const double kMidBitratePriority = 4.0;
732 TestBitrateObserver observer_high;
733 const double kHighBitratePriority = 8.0;
734
735 const uint32_t kAvailableBitrate = 90;
736 const uint32_t kMaxBitrate = 40;
737 const uint32_t kMinBitrate = 10;
738 // Remaining bitrate after allocating to all mins and knowing that the high
739 // priority observer will have its max bitrate allocated.
740 const uint32_t kRemainingBitrate =
741 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
742
743 allocator_->AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
744 "low", kLowBitratePriority);
745 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
746 "mid", kMidBitratePriority);
747 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
748 "high", kHighBitratePriority);
749 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
750 kDefaultProbingIntervalMs);
751
752 const double kLowFractionAllocated =
753 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
754 const double kMidFractionAllocated =
755 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
756 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
757 observer_low.last_bitrate_bps_);
758 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
759 observer_mid.last_bitrate_bps_);
760 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
761
762 allocator_->RemoveObserver(&observer_low);
763 allocator_->RemoveObserver(&observer_mid);
764 allocator_->RemoveObserver(&observer_high);
765}
766
767// Tests that after the low priority observer has been allocated its maximum
768// bitrate, the other two observers are still allocated bitrate according to
769// their relative bitrate priority.
770TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
771 TestBitrateObserver observer_low;
772 const double kLowBitratePriority = 2.0;
773 const uint32_t kLowMaxBitrate = 10;
774 TestBitrateObserver observer_mid;
775 const double kMidBitratePriority = 4.0;
776 TestBitrateObserver observer_high;
777 const double kHighBitratePriority = 8.0;
778
779 const uint32_t kMinBitrate = 0;
780 const uint32_t kMaxBitrate = 60;
781 const uint32_t kAvailableBitrate = 100;
782 // Remaining bitrate knowing that the low priority observer is allocated its
783 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
784 // available bitrate, so 70 bps would be sufficient network bandwidth.
785 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
786
787 allocator_->AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
788 "low", kLowBitratePriority);
789 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
790 "mid", kMidBitratePriority);
791 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
792 "high", kHighBitratePriority);
793 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
794 kDefaultProbingIntervalMs);
795
796 const double kMidFractionAllocated =
797 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
798 const double kHighFractionAllocated =
799 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
800 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
801 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
802 observer_mid.last_bitrate_bps_);
803 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
804 observer_high.last_bitrate_bps_);
805
806 allocator_->RemoveObserver(&observer_low);
807 allocator_->RemoveObserver(&observer_mid);
808 allocator_->RemoveObserver(&observer_high);
809}
810
811// Tests that after two observers are allocated bitrate to their max, the
812// the remaining observer is allocated what's left appropriately. This test
813// handles an edge case where the medium and high observer reach their
814// "relative" max allocation at the same time. The high has 40 to allocate
815// above its min, and the mid has 20 to allocate above its min, which scaled
816// by their bitrate priority is the same for each.
817TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
818 TestBitrateObserver observer_low;
819 TestBitrateObserver observer_mid;
820 TestBitrateObserver observer_high;
821 allocator_->AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
822 // Scaled allocation above the min allocation is the same for these two,
823 // meaning they will get allocated their max at the same time.
824 // Scaled (target allocation) = (max - min) / bitrate priority
825 allocator_->AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
826 allocator_->AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
827 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
828
829 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
830 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
831 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
832
833 allocator_->RemoveObserver(&observer_low);
834 allocator_->RemoveObserver(&observer_mid);
835 allocator_->RemoveObserver(&observer_high);
836}
837
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000838} // namespace webrtc