blob: ca35d1499dbc5f2d02a270406a5524996de07d20 [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);
perkj57c21f92016-06-17 07:27:16 -0700120 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000121
philipelf69e7682018-02-28 13:06:28 +0100122 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
123 0, true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700124 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200125 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
philipelf69e7682018-02-28 13:06:28 +0100126 allocator_->OnNetworkChanged(kMaxBitrateBps, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200127 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000128}
129
130TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
131 TestBitrateObserver bitrate_observer_1;
132 TestBitrateObserver bitrate_observer_2;
philipelf69e7682018-02-28 13:06:28 +0100133 const uint32_t kObs1StartBitrateBps = 100000;
134 const uint32_t kObs2StartBitrateBps = 200000;
135 const uint32_t kObs1MaxBitrateBps = 300000;
136 const uint32_t kObs2MaxBitrateBps = 300000;
137
138 EXPECT_CALL(
139 limit_observer_,
140 OnAllocationLimitsChanged(kObs1StartBitrateBps, 0, kObs1MaxBitrateBps));
141 allocator_->AddObserver(&bitrate_observer_1, kObs1StartBitrateBps,
142 kObs1MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800143 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100144 EXPECT_EQ(static_cast<int>(kObs1MaxBitrateBps),
145 allocator_->GetStartBitrate(&bitrate_observer_1));
146 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(
147 kObs1StartBitrateBps + kObs2StartBitrateBps,
148 0, kObs1MaxBitrateBps + kObs2MaxBitrateBps));
149 allocator_->AddObserver(&bitrate_observer_2, kObs2StartBitrateBps,
150 kObs2MaxBitrateBps, 0, true, "",
Seth Hampson24722b32017-12-22 09:36:42 -0800151 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100152 EXPECT_EQ(static_cast<int>(kObs2StartBitrateBps),
153 allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000154
mflodman48a4beb2016-07-01 13:03:59 +0200155 // Test too low start bitrate, hence lower than sum of min. Min bitrates
156 // will
157 // be allocated to all observers.
philipelf69e7682018-02-28 13:06:28 +0100158 allocator_->OnNetworkChanged(kObs2StartBitrateBps, 0, 50,
159 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200160 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
161 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
162 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
163 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
164 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
165 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000166
mflodman48a4beb2016-07-01 13:03:59 +0200167 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800168 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
philipelf69e7682018-02-28 13:06:28 +0100169 const uint32_t kBitrateToShare =
170 500000 - kObs2StartBitrateBps - kObs1StartBitrateBps;
mflodman48a4beb2016-07-01 13:03:59 +0200171 EXPECT_EQ(100000u + kBitrateToShare / 2,
172 bitrate_observer_1.last_bitrate_bps_);
173 EXPECT_EQ(200000u + kBitrateToShare / 2,
174 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000175
mflodman48a4beb2016-07-01 13:03:59 +0200176 // Limited by 2x max bitrates since we leave room for FEC and
177 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800178 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200179 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
180 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700181
mflodman48a4beb2016-07-01 13:03:59 +0200182 // Verify that if the bandwidth estimate is set to zero, the allocated
183 // rate is
184 // zero.
minyue78b4d562016-11-30 04:47:39 -0800185 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200186 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
187 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000188}
189
perkj71ee44c2016-06-15 00:47:53 -0700190TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
191 TestBitrateObserver bitrate_observer;
192 const uint32_t kMinSendBitrateBps = 100000;
193 const uint32_t kPadUpToBitrateBps = 50000;
philipelf69e7682018-02-28 13:06:28 +0100194 const uint32_t kMaxBitrateBps = 1500000;
perkj71ee44c2016-06-15 00:47:53 -0700195
philipelf69e7682018-02-28 13:06:28 +0100196 EXPECT_CALL(limit_observer_,
197 OnAllocationLimitsChanged(kMinSendBitrateBps, kPadUpToBitrateBps,
198 kMaxBitrateBps));
199 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, kMaxBitrateBps,
Seth Hampson24722b32017-12-22 09:36:42 -0800200 kPadUpToBitrateBps, true, "",
201 kDefaultBitratePriority);
philipelf69e7682018-02-28 13:06:28 +0100202 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
perkj71ee44c2016-06-15 00:47:53 -0700203 allocator_->RemoveObserver(&bitrate_observer);
204}
205
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000206class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
207 protected:
perkj71ee44c2016-06-15 00:47:53 -0700208 BitrateAllocatorTestNoEnforceMin()
209 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800210 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000211 }
212 ~BitrateAllocatorTestNoEnforceMin() {}
213
perkj71ee44c2016-06-15 00:47:53 -0700214 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800215 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216};
217
mflodman101f2502016-06-09 17:21:19 +0200218// The following three tests verify enforcing a minimum bitrate works as
219// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000220TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
221 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700222 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
223 // AddObserver is called with |enforce_min_bitrate| = false.
philipelf69e7682018-02-28 13:06:28 +0100224 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800225 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
226 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200227 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000228
mflodman48a4beb2016-07-01 13:03:59 +0200229 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800230 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200231 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000232
mflodman48a4beb2016-07-01 13:03:59 +0200233 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800234 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200235 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000236
philipelf69e7682018-02-28 13:06:28 +0100237 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
mflodman48a4beb2016-07-01 13:03:59 +0200238 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239}
240
241TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
242 TestBitrateObserver bitrate_observer_1;
243 TestBitrateObserver bitrate_observer_2;
244 TestBitrateObserver bitrate_observer_3;
245 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Seth Hampson24722b32017-12-22 09:36:42 -0800246 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
247 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700248 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100249
Seth Hampson24722b32017-12-22 09:36:42 -0800250 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
251 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700252 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200253 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100254
Seth Hampson24722b32017-12-22 09:36:42 -0800255 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
256 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700257 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200258 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
259 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000260
mflodman101f2502016-06-09 17:21:19 +0200261 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
262 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800263 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000264 // Verify that each observer gets its min rate (sum of min rates is 600000),
265 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100266 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200267 EXPECT_EQ(100000u + bitrate_to_share / 3,
268 bitrate_observer_1.last_bitrate_bps_);
269 EXPECT_EQ(200000u + bitrate_to_share / 3,
270 bitrate_observer_2.last_bitrate_bps_);
271 EXPECT_EQ(300000u + bitrate_to_share / 3,
272 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000273
mflodman101f2502016-06-09 17:21:19 +0200274 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800275 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200276 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
277 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
278 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
279
280 // Increased BWE, but still below the sum of configured min bitrates for all
281 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800282 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200283 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
284 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
285 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000286
mflodman101f2502016-06-09 17:21:19 +0200287 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800288 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200289 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
290 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
291 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000292
perkjec81bcd2016-05-11 06:01:13 -0700293 // Verify that zero estimated bandwidth, means that that all gets zero,
294 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800295 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200296 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
297 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
298 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700299
mflodman86aabb22016-03-11 15:44:32 +0100300 allocator_->RemoveObserver(&bitrate_observer_1);
301 allocator_->RemoveObserver(&bitrate_observer_2);
302 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000303}
304
mflodman48a4beb2016-07-01 13:03:59 +0200305TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
306 TestBitrateObserver bitrate_observer;
307 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
308 // AddObserver is called with |enforce_min_bitrate| = false.
philipelf69e7682018-02-28 13:06:28 +0100309 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800310 allocator_->AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
311 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200312 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
313
314 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800315 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200316 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
317
318 // Add loss and use a part of the bitrate for protection.
319 double protection_ratio = 0.4;
320 uint8_t fraction_loss = protection_ratio * 256;
321 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800322 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
323 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200324 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
325
326 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800327 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
328 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200329 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
330
331 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800332 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
333 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200334 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
335
336 // Just enough to enable video again.
philipelf69e7682018-02-28 13:06:28 +0100337 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0, _));
minyue78b4d562016-11-30 04:47:39 -0800338 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
339 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200340 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
341
342 // Remove all protection and make sure video is not paused as earlier.
343 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800344 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200345 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
346
minyue78b4d562016-11-30 04:47:39 -0800347 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200348 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
349
mflodman48a4beb2016-07-01 13:03:59 +0200350 allocator_->RemoveObserver(&bitrate_observer);
351}
352
353TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
354 TestBitrateObserver bitrate_observer_1;
355 TestBitrateObserver bitrate_observer_2;
356
Seth Hampson24722b32017-12-22 09:36:42 -0800357 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
358 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200359 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Seth Hampson24722b32017-12-22 09:36:42 -0800360 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
361 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200362 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
363 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
364
365 // Enough bitrate for both.
366 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800367 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200368 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
369 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
370
371 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800372 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200373 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
374 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
375
minyue78b4d562016-11-30 04:47:39 -0800376 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200377 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
378 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
379
minyue78b4d562016-11-30 04:47:39 -0800380 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200381 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
382 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
383
minyue78b4d562016-11-30 04:47:39 -0800384 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200385 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
386 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
387
minyue78b4d562016-11-30 04:47:39 -0800388 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200389 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
390 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
391
392 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800393 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200394 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
395 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
396
minyue78b4d562016-11-30 04:47:39 -0800397 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200398 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
399 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
400
401 allocator_->RemoveObserver(&bitrate_observer_1);
402 allocator_->RemoveObserver(&bitrate_observer_2);
403}
404
mflodman101f2502016-06-09 17:21:19 +0200405TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000406 TestBitrateObserver bitrate_observer_1;
407 TestBitrateObserver bitrate_observer_2;
408 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100409
Seth Hampson24722b32017-12-22 09:36:42 -0800410 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
411 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700412 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
413
Seth Hampson24722b32017-12-22 09:36:42 -0800414 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
415 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700416 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200417 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100418
Seth Hampson24722b32017-12-22 09:36:42 -0800419 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
420 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200421 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
422 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
423 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000424
mflodman48a4beb2016-07-01 13:03:59 +0200425 // Low BWE. Verify that all observers still get their respective min
426 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800427 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200428 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
429 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
430 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000431
mflodman48a4beb2016-07-01 13:03:59 +0200432 allocator_->RemoveObserver(&bitrate_observer_1);
433 allocator_->RemoveObserver(&bitrate_observer_2);
434 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000435}
perkjfea93092016-05-14 00:58:48 -0700436
437TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
438 TestBitrateObserver bitrate_observer_1;
philipelf69e7682018-02-28 13:06:28 +0100439 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0, _));
perkj57c21f92016-06-17 07:27:16 -0700440
Seth Hampson24722b32017-12-22 09:36:42 -0800441 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
442 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700443 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700444
445 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800446 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700447
mflodman101f2502016-06-09 17:21:19 +0200448 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700449
450 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700451 // Adding an observer while the network is down should not affect the limits.
philipelf69e7682018-02-28 13:06:28 +0100452 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0, _));
Seth Hampson24722b32017-12-22 09:36:42 -0800453 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
454 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700455
456 // Expect the start_bitrate to be set as if the network was still up but that
457 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700458 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200459 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
460 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700461
462 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800463 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200464 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
465 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
466}
467
468TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
469 TestBitrateObserver enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800470 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
471 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200472 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200473
mflodman48a4beb2016-07-01 13:03:59 +0200474 TestBitrateObserver not_enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800475 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
476 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200477 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
478 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200479
minyue78b4d562016-11-30 04:47:39 -0800480 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200481 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
482 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200483
minyue78b4d562016-11-30 04:47:39 -0800484 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200485 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
486 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200487
minyue78b4d562016-11-30 04:47:39 -0800488 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200489 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
490 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200491
minyue78b4d562016-11-30 04:47:39 -0800492 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200493 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
494 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200495
minyue78b4d562016-11-30 04:47:39 -0800496 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200497 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
498 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200499
minyue78b4d562016-11-30 04:47:39 -0800500 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200501 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
502 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200503
minyue78b4d562016-11-30 04:47:39 -0800504 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
506 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200507
mflodman48a4beb2016-07-01 13:03:59 +0200508 allocator_->RemoveObserver(&enforced_observer);
509 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200510}
511
512TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
513 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800514 allocator_->AddObserver(&observer, 30000, 300000, 0, false, "",
515 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200516 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
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
minyue78b4d562016-11-30 04:47:39 -0800521 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200522 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200523
minyue78b4d562016-11-30 04:47:39 -0800524 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200525 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200526
minyue78b4d562016-11-30 04:47:39 -0800527 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200528 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200529
minyue78b4d562016-11-30 04:47:39 -0800530 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200531 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200532
minyue78b4d562016-11-30 04:47:39 -0800533 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200534 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200535
mflodman48a4beb2016-07-01 13:03:59 +0200536 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200537}
538
539TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
540 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800541 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
542 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200543 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
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
minyue78b4d562016-11-30 04:47:39 -0800548 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200549 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200550
minyue78b4d562016-11-30 04:47:39 -0800551 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200552 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200553
minyue78b4d562016-11-30 04:47:39 -0800554 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200555 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200556
minyue78b4d562016-11-30 04:47:39 -0800557 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200558 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200559
minyue78b4d562016-11-30 04:47:39 -0800560 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200561 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200562
mflodman48a4beb2016-07-01 13:03:59 +0200563 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700564}
565
minyue78b4d562016-11-30 04:47:39 -0800566TEST_F(BitrateAllocatorTest, PassProbingInterval) {
567 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800568 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
569 kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800570 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
571
572 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
573 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
574
575 allocator_->RemoveObserver(&observer);
576}
577
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800578TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
579 TestBitrateObserver observer;
580 const uint32_t kMinSendBitrateBps = 10;
581 const uint32_t kMaxSendBitrateBps = 60;
582 const uint32_t kNetworkBandwidthBps = 30;
583
584 allocator_->AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0,
585 true, "", 2.0);
586 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
587 kDefaultProbingIntervalMs);
588
589 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
590
591 allocator_->RemoveObserver(&observer);
592}
593
594// Tests that two observers with the same bitrate priority are allocated
595// their bitrate evenly.
596TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
597 TestBitrateObserver observer_low_1;
598 TestBitrateObserver observer_low_2;
599 const uint32_t kMinSendBitrateBps = 10;
600 const uint32_t kMaxSendBitrateBps = 60;
601 const uint32_t kNetworkBandwidthBps = 60;
602 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
603 kMaxSendBitrateBps, 0, false, "low1", 2.0);
604 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
605 kMaxSendBitrateBps, 0, false, "low2", 2.0);
606 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
607 kDefaultProbingIntervalMs);
608
609 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
610 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
611
612 allocator_->RemoveObserver(&observer_low_1);
613 allocator_->RemoveObserver(&observer_low_2);
614}
615
616// Tests that there is no difference in functionality when the min bitrate is
617// enforced.
618TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
619 TestBitrateObserver observer_low_1;
620 TestBitrateObserver observer_low_2;
621 const uint32_t kMinSendBitrateBps = 0;
622 const uint32_t kMaxSendBitrateBps = 60;
623 const uint32_t kNetworkBandwidthBps = 60;
624 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
625 kMaxSendBitrateBps, 0, true, "low1", 2.0);
626 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
627 kMaxSendBitrateBps, 0, true, "low2", 2.0);
628 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
629 kDefaultProbingIntervalMs);
630
631 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
632 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
633
634 allocator_->RemoveObserver(&observer_low_1);
635 allocator_->RemoveObserver(&observer_low_2);
636}
637
638// Tests that if the available bandwidth is the sum of the max bitrate
639// of all observers, they will be allocated their max.
640TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
641 TestBitrateObserver observer_low;
642 TestBitrateObserver observer_mid;
643 const uint32_t kMinSendBitrateBps = 0;
644 const uint32_t kMaxSendBitrateBps = 60;
645 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
646 allocator_->AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps,
647 0, true, "low", 2.0);
648 allocator_->AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps,
649 0, true, "mid", 4.0);
650 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
651 kDefaultProbingIntervalMs);
652
653 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
654 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
655
656 allocator_->RemoveObserver(&observer_low);
657 allocator_->RemoveObserver(&observer_mid);
658}
659
660// Tests that after a higher bitrate priority observer has been allocated its
661// max bitrate the lower priority observer will then be allocated the remaining
662// bitrate.
663TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
664 TestBitrateObserver observer_low;
665 TestBitrateObserver observer_mid;
666 allocator_->AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
667 allocator_->AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
668 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
669
670 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
671 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
672
673 allocator_->RemoveObserver(&observer_low);
674 allocator_->RemoveObserver(&observer_mid);
675}
676
677// Tests that three observers with three different bitrate priorities will all
678// be allocated bitrate according to their relative bitrate priority.
679TEST_F(BitrateAllocatorTest,
680 PriorityRateThreeObserversAllocatedRelativeAmounts) {
681 TestBitrateObserver observer_low;
682 TestBitrateObserver observer_mid;
683 TestBitrateObserver observer_high;
684 const uint32_t kMaxBitrate = 100;
685 // Not enough bandwidth to fill any observer's max bitrate.
686 const uint32_t kNetworkBandwidthBps = 70;
687 const double kLowBitratePriority = 2.0;
688 const double kMidBitratePriority = 4.0;
689 const double kHighBitratePriority = 8.0;
690 const double kTotalBitratePriority =
691 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
692 allocator_->AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
693 kLowBitratePriority);
694 allocator_->AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
695 kMidBitratePriority);
696 allocator_->AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
697 kHighBitratePriority);
698 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
699 kDefaultProbingIntervalMs);
700
701 const double kLowFractionAllocated =
702 kLowBitratePriority / kTotalBitratePriority;
703 const double kMidFractionAllocated =
704 kMidBitratePriority / kTotalBitratePriority;
705 const double kHighFractionAllocated =
706 kHighBitratePriority / kTotalBitratePriority;
707 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
708 observer_low.last_bitrate_bps_);
709 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
710 observer_mid.last_bitrate_bps_);
711 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
712 observer_high.last_bitrate_bps_);
713
714 allocator_->RemoveObserver(&observer_low);
715 allocator_->RemoveObserver(&observer_mid);
716 allocator_->RemoveObserver(&observer_high);
717}
718
719// Tests that after the high priority observer has been allocated its maximum
720// bitrate, the other two observers are still allocated bitrate according to
721// their relative bitrate priority.
722TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
723 TestBitrateObserver observer_low;
724 const double kLowBitratePriority = 2.0;
725 TestBitrateObserver observer_mid;
726 const double kMidBitratePriority = 4.0;
727 TestBitrateObserver observer_high;
728 const double kHighBitratePriority = 8.0;
729
730 const uint32_t kAvailableBitrate = 90;
731 const uint32_t kMaxBitrate = 40;
732 const uint32_t kMinBitrate = 10;
733 // Remaining bitrate after allocating to all mins and knowing that the high
734 // priority observer will have its max bitrate allocated.
735 const uint32_t kRemainingBitrate =
736 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
737
738 allocator_->AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
739 "low", kLowBitratePriority);
740 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
741 "mid", kMidBitratePriority);
742 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
743 "high", kHighBitratePriority);
744 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
745 kDefaultProbingIntervalMs);
746
747 const double kLowFractionAllocated =
748 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
749 const double kMidFractionAllocated =
750 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
751 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
752 observer_low.last_bitrate_bps_);
753 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
754 observer_mid.last_bitrate_bps_);
755 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
756
757 allocator_->RemoveObserver(&observer_low);
758 allocator_->RemoveObserver(&observer_mid);
759 allocator_->RemoveObserver(&observer_high);
760}
761
762// Tests that after the low priority observer has been allocated its maximum
763// bitrate, the other two observers are still allocated bitrate according to
764// their relative bitrate priority.
765TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
766 TestBitrateObserver observer_low;
767 const double kLowBitratePriority = 2.0;
768 const uint32_t kLowMaxBitrate = 10;
769 TestBitrateObserver observer_mid;
770 const double kMidBitratePriority = 4.0;
771 TestBitrateObserver observer_high;
772 const double kHighBitratePriority = 8.0;
773
774 const uint32_t kMinBitrate = 0;
775 const uint32_t kMaxBitrate = 60;
776 const uint32_t kAvailableBitrate = 100;
777 // Remaining bitrate knowing that the low priority observer is allocated its
778 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
779 // available bitrate, so 70 bps would be sufficient network bandwidth.
780 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
781
782 allocator_->AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
783 "low", kLowBitratePriority);
784 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
785 "mid", kMidBitratePriority);
786 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
787 "high", kHighBitratePriority);
788 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
789 kDefaultProbingIntervalMs);
790
791 const double kMidFractionAllocated =
792 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
793 const double kHighFractionAllocated =
794 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
795 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
796 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
797 observer_mid.last_bitrate_bps_);
798 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
799 observer_high.last_bitrate_bps_);
800
801 allocator_->RemoveObserver(&observer_low);
802 allocator_->RemoveObserver(&observer_mid);
803 allocator_->RemoveObserver(&observer_high);
804}
805
806// Tests that after two observers are allocated bitrate to their max, the
807// the remaining observer is allocated what's left appropriately. This test
808// handles an edge case where the medium and high observer reach their
809// "relative" max allocation at the same time. The high has 40 to allocate
810// above its min, and the mid has 20 to allocate above its min, which scaled
811// by their bitrate priority is the same for each.
812TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
813 TestBitrateObserver observer_low;
814 TestBitrateObserver observer_mid;
815 TestBitrateObserver observer_high;
816 allocator_->AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
817 // Scaled allocation above the min allocation is the same for these two,
818 // meaning they will get allocated their max at the same time.
819 // Scaled (target allocation) = (max - min) / bitrate priority
820 allocator_->AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
821 allocator_->AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
822 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
823
824 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
825 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
826 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
827
828 allocator_->RemoveObserver(&observer_low);
829 allocator_->RemoveObserver(&observer_mid);
830 allocator_->RemoveObserver(&observer_high);
831}
832
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000833} // namespace webrtc