blob: 31828b6cc1b22c5d0aeec78dbc51b1a10223f3aa [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
perkj71ee44c2016-06-15 00:47:53 -070020using testing::NiceMock;
21
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000022namespace webrtc {
23
perkj71ee44c2016-06-15 00:47:53 -070024class MockLimitObserver : public BitrateAllocator::LimitObserver {
25 public:
26 MOCK_METHOD2(OnAllocationLimitsChanged,
27 void(uint32_t min_send_bitrate_bps,
28 uint32_t max_padding_bitrate_bps));
29};
30
mflodman86aabb22016-03-11 15:44:32 +010031class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000032 public:
33 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020034 : last_bitrate_bps_(0),
35 last_fraction_loss_(0),
36 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080037 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020038 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000039
mflodman48a4beb2016-07-01 13:03:59 +020040 void SetBitrateProtectionRatio(double protection_ratio) {
41 protection_ratio_ = protection_ratio;
42 }
43
44 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
45 uint8_t fraction_loss,
minyue78b4d562016-11-30 04:47:39 -080046 int64_t rtt,
47 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 17:21:19 +020048 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000049 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020050 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 04:47:39 -080051 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 13:03:59 +020052 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 }
mflodman101f2502016-06-09 17:21:19 +020054 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000055 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020056 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080057 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020058 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000059};
60
minyue78b4d562016-11-30 04:47:39 -080061namespace {
62constexpr int64_t kDefaultProbingIntervalMs = 3000;
63}
64
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000065class BitrateAllocatorTest : public ::testing::Test {
66 protected:
perkj71ee44c2016-06-15 00:47:53 -070067 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080068 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010069 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000070 ~BitrateAllocatorTest() {}
71
perkj71ee44c2016-06-15 00:47:53 -070072 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080073 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000074};
75
76TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
77 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070078 const uint32_t kMinSendBitrateBps = 100000;
79 const uint32_t kPadUpToBitrateBps = 50000;
80
81 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
82 kPadUpToBitrateBps));
perkj57c21f92016-06-17 07:27:16 -070083 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
Alex Narestb3944f02017-10-13 14:56:18 +020084 kPadUpToBitrateBps, true, "");
perkj57c21f92016-06-17 07:27:16 -070085 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -080086 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070087 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000088
Peter Boström8e4e8b02015-09-15 15:08:03 +020089 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080090 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -080091 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070092 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -070093
94 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
95 EXPECT_CALL(limit_observer_,
96 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -070097 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
Alex Narestb3944f02017-10-13 14:56:18 +020098 true, "");
perkj57c21f92016-06-17 07:27:16 -070099 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000100
perkj57c21f92016-06-17 07:27:16 -0700101 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
Alex Narestb3944f02017-10-13 14:56:18 +0200102 true, "");
perkj57c21f92016-06-17 07:27:16 -0700103 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200104 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
minyue78b4d562016-11-30 04:47:39 -0800105 allocator_->OnNetworkChanged(1500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200106 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000107}
108
109TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
110 TestBitrateObserver bitrate_observer_1;
111 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700112 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
Alex Narestb3944f02017-10-13 14:56:18 +0200113 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true, "");
mflodman48a4beb2016-07-01 13:03:59 +0200114 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
115 EXPECT_CALL(limit_observer_,
116 OnAllocationLimitsChanged(100000 + 200000, 0));
Alex Narestb3944f02017-10-13 14:56:18 +0200117 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true, "");
mflodman48a4beb2016-07-01 13:03:59 +0200118 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000119
mflodman48a4beb2016-07-01 13:03:59 +0200120 // Test too low start bitrate, hence lower than sum of min. Min bitrates
121 // will
122 // be allocated to all observers.
minyue78b4d562016-11-30 04:47:39 -0800123 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200124 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
125 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
126 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
127 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
128 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
129 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000130
mflodman48a4beb2016-07-01 13:03:59 +0200131 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800132 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200133 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
134 EXPECT_EQ(100000u + kBitrateToShare / 2,
135 bitrate_observer_1.last_bitrate_bps_);
136 EXPECT_EQ(200000u + kBitrateToShare / 2,
137 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000138
mflodman48a4beb2016-07-01 13:03:59 +0200139 // Limited by 2x max bitrates since we leave room for FEC and
140 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800141 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200142 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
143 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700144
mflodman48a4beb2016-07-01 13:03:59 +0200145 // Verify that if the bandwidth estimate is set to zero, the allocated
146 // rate is
147 // zero.
minyue78b4d562016-11-30 04:47:39 -0800148 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200149 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
150 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000151}
152
perkj71ee44c2016-06-15 00:47:53 -0700153TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
154 TestBitrateObserver bitrate_observer;
155 const uint32_t kMinSendBitrateBps = 100000;
156 const uint32_t kPadUpToBitrateBps = 50000;
157
158 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
159 kPadUpToBitrateBps));
160 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
Alex Narestb3944f02017-10-13 14:56:18 +0200161 kPadUpToBitrateBps, true, "");
perkj71ee44c2016-06-15 00:47:53 -0700162 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
163 allocator_->RemoveObserver(&bitrate_observer);
164}
165
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000166class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
167 protected:
perkj71ee44c2016-06-15 00:47:53 -0700168 BitrateAllocatorTestNoEnforceMin()
169 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800170 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000171 }
172 ~BitrateAllocatorTestNoEnforceMin() {}
173
perkj71ee44c2016-06-15 00:47:53 -0700174 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800175 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000176};
177
mflodman101f2502016-06-09 17:21:19 +0200178// The following three tests verify enforcing a minimum bitrate works as
179// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000180TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
181 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700182 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
183 // AddObserver is called with |enforce_min_bitrate| = false.
philipel5ef2bc12017-02-21 07:28:31 -0800184 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000));
Alex Narestb3944f02017-10-13 14:56:18 +0200185 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200186 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000187
mflodman48a4beb2016-07-01 13:03:59 +0200188 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800189 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200190 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000191
mflodman48a4beb2016-07-01 13:03:59 +0200192 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800193 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200194 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000195
mflodman48a4beb2016-07-01 13:03:59 +0200196 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
197 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000198}
199
200TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
201 TestBitrateObserver bitrate_observer_1;
202 TestBitrateObserver bitrate_observer_2;
203 TestBitrateObserver bitrate_observer_3;
204 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Alex Narestb3944f02017-10-13 14:56:18 +0200205 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "");
perkj57c21f92016-06-17 07:27:16 -0700206 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100207
Alex Narestb3944f02017-10-13 14:56:18 +0200208 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "");
perkj57c21f92016-06-17 07:27:16 -0700209 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200210 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100211
Alex Narestb3944f02017-10-13 14:56:18 +0200212 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "");
perkj57c21f92016-06-17 07:27:16 -0700213 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200214 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
215 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216
mflodman101f2502016-06-09 17:21:19 +0200217 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
218 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800219 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000220 // Verify that each observer gets its min rate (sum of min rates is 600000),
221 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100222 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200223 EXPECT_EQ(100000u + bitrate_to_share / 3,
224 bitrate_observer_1.last_bitrate_bps_);
225 EXPECT_EQ(200000u + bitrate_to_share / 3,
226 bitrate_observer_2.last_bitrate_bps_);
227 EXPECT_EQ(300000u + bitrate_to_share / 3,
228 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000229
mflodman101f2502016-06-09 17:21:19 +0200230 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800231 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200232 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
233 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
234 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
235
236 // Increased BWE, but still below the sum of configured min bitrates for all
237 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800238 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200239 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
240 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
241 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000242
mflodman101f2502016-06-09 17:21:19 +0200243 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800244 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200245 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
246 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
247 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000248
perkjec81bcd2016-05-11 06:01:13 -0700249 // Verify that zero estimated bandwidth, means that that all gets zero,
250 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800251 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200252 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
253 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
254 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700255
mflodman86aabb22016-03-11 15:44:32 +0100256 allocator_->RemoveObserver(&bitrate_observer_1);
257 allocator_->RemoveObserver(&bitrate_observer_2);
258 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000259}
260
mflodman48a4beb2016-07-01 13:03:59 +0200261TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
262 TestBitrateObserver bitrate_observer;
263 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
264 // AddObserver is called with |enforce_min_bitrate| = false.
philipel5ef2bc12017-02-21 07:28:31 -0800265 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000));
Alex Narestb3944f02017-10-13 14:56:18 +0200266 allocator_->AddObserver(&bitrate_observer, 100000, 400000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200267 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
268
269 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800270 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200271 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
272
273 // Add loss and use a part of the bitrate for protection.
274 double protection_ratio = 0.4;
275 uint8_t fraction_loss = protection_ratio * 256;
276 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800277 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
278 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200279 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
280
281 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800282 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
283 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200284 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
285
286 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800287 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
288 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200289 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
290
291 // Just enough to enable video again.
philipel5ef2bc12017-02-21 07:28:31 -0800292 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
minyue78b4d562016-11-30 04:47:39 -0800293 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
294 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200295 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
296
297 // Remove all protection and make sure video is not paused as earlier.
298 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800299 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200300 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
301
minyue78b4d562016-11-30 04:47:39 -0800302 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200303 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
304
mflodman48a4beb2016-07-01 13:03:59 +0200305 allocator_->RemoveObserver(&bitrate_observer);
306}
307
308TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
309 TestBitrateObserver bitrate_observer_1;
310 TestBitrateObserver bitrate_observer_2;
311
Alex Narestb3944f02017-10-13 14:56:18 +0200312 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200313 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Alex Narestb3944f02017-10-13 14:56:18 +0200314 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200315 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
316 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
317
318 // Enough bitrate for both.
319 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800320 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200321 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
322 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
323
324 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800325 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200326 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
327 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
328
minyue78b4d562016-11-30 04:47:39 -0800329 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200330 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
331 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
332
minyue78b4d562016-11-30 04:47:39 -0800333 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200334 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
335 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
336
minyue78b4d562016-11-30 04:47:39 -0800337 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200338 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
339 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
340
minyue78b4d562016-11-30 04:47:39 -0800341 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200342 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
343 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
344
345 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800346 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200347 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
348 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
349
minyue78b4d562016-11-30 04:47:39 -0800350 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200351 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
352 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
353
354 allocator_->RemoveObserver(&bitrate_observer_1);
355 allocator_->RemoveObserver(&bitrate_observer_2);
356}
357
mflodman101f2502016-06-09 17:21:19 +0200358TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000359 TestBitrateObserver bitrate_observer_1;
360 TestBitrateObserver bitrate_observer_2;
361 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100362
Alex Narestb3944f02017-10-13 14:56:18 +0200363 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "");
perkj57c21f92016-06-17 07:27:16 -0700364 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
365
Alex Narestb3944f02017-10-13 14:56:18 +0200366 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "");
perkj57c21f92016-06-17 07:27:16 -0700367 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200368 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100369
Alex Narestb3944f02017-10-13 14:56:18 +0200370 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "");
mflodman48a4beb2016-07-01 13:03:59 +0200371 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
372 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
373 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000374
mflodman48a4beb2016-07-01 13:03:59 +0200375 // Low BWE. Verify that all observers still get their respective min
376 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800377 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200378 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
379 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
380 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000381
mflodman48a4beb2016-07-01 13:03:59 +0200382 allocator_->RemoveObserver(&bitrate_observer_1);
383 allocator_->RemoveObserver(&bitrate_observer_2);
384 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000385}
perkjfea93092016-05-14 00:58:48 -0700386
387TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
388 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700389 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700390
Alex Narestb3944f02017-10-13 14:56:18 +0200391 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "");
perkj57c21f92016-06-17 07:27:16 -0700392 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700393
394 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800395 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700396
mflodman101f2502016-06-09 17:21:19 +0200397 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700398
399 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700400 // Adding an observer while the network is down should not affect the limits.
401 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
Alex Narestb3944f02017-10-13 14:56:18 +0200402 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "");
perkjfea93092016-05-14 00:58:48 -0700403
404 // Expect the start_bitrate to be set as if the network was still up but that
405 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700406 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200407 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
408 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700409
410 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800411 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200412 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
413 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
414}
415
416TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
417 TestBitrateObserver enforced_observer;
Alex Narestb3944f02017-10-13 14:56:18 +0200418 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true, "");
mflodman48a4beb2016-07-01 13:03:59 +0200419 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200420
mflodman48a4beb2016-07-01 13:03:59 +0200421 TestBitrateObserver not_enforced_observer;
Alex Narestb3944f02017-10-13 14:56:18 +0200422 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200423 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
424 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200425
minyue78b4d562016-11-30 04:47:39 -0800426 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200427 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
428 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200429
minyue78b4d562016-11-30 04:47:39 -0800430 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200431 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
432 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200433
minyue78b4d562016-11-30 04:47:39 -0800434 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200435 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
436 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200437
minyue78b4d562016-11-30 04:47:39 -0800438 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200439 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
440 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200441
minyue78b4d562016-11-30 04:47:39 -0800442 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200443 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
444 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200445
minyue78b4d562016-11-30 04:47:39 -0800446 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200447 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
448 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200449
minyue78b4d562016-11-30 04:47:39 -0800450 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200451 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
452 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200453
mflodman48a4beb2016-07-01 13:03:59 +0200454 allocator_->RemoveObserver(&enforced_observer);
455 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200456}
457
458TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
459 TestBitrateObserver observer;
Alex Narestb3944f02017-10-13 14:56:18 +0200460 allocator_->AddObserver(&observer, 30000, 300000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200461 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200462
minyue78b4d562016-11-30 04:47:39 -0800463 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200464 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200465
minyue78b4d562016-11-30 04:47:39 -0800466 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200467 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200468
minyue78b4d562016-11-30 04:47:39 -0800469 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200470 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200471
minyue78b4d562016-11-30 04:47:39 -0800472 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200473 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200474
minyue78b4d562016-11-30 04:47:39 -0800475 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200476 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200477
minyue78b4d562016-11-30 04:47:39 -0800478 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200479 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200480
mflodman48a4beb2016-07-01 13:03:59 +0200481 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200482}
483
484TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
485 TestBitrateObserver observer;
Alex Narestb3944f02017-10-13 14:56:18 +0200486 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "");
mflodman48a4beb2016-07-01 13:03:59 +0200487 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200488
minyue78b4d562016-11-30 04:47:39 -0800489 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200490 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200491
minyue78b4d562016-11-30 04:47:39 -0800492 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200493 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200494
minyue78b4d562016-11-30 04:47:39 -0800495 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200496 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200497
minyue78b4d562016-11-30 04:47:39 -0800498 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200499 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200500
minyue78b4d562016-11-30 04:47:39 -0800501 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200502 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200503
minyue78b4d562016-11-30 04:47:39 -0800504 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200506
mflodman48a4beb2016-07-01 13:03:59 +0200507 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700508}
509
minyue78b4d562016-11-30 04:47:39 -0800510TEST_F(BitrateAllocatorTest, PassProbingInterval) {
511 TestBitrateObserver observer;
Alex Narestb3944f02017-10-13 14:56:18 +0200512 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "");
minyue78b4d562016-11-30 04:47:39 -0800513 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
514
515 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
516 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
517
518 allocator_->RemoveObserver(&observer);
519}
520
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000521} // namespace webrtc