blob: 751ec93657d54c815c3b268744a46773c968bf3f [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
mflodman0e7e2592015-11-12 21:02:42 -080015#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000016#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
kwibergac9f8762016-09-30 22:29:43 -070017#include "webrtc/test/gmock.h"
18#include "webrtc/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,
84 kPadUpToBitrateBps, true);
85 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,
98 true);
99 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000100
perkj71ee44c2016-06-15 00:47:53 -0700101 EXPECT_CALL(limit_observer_,
102 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -0700103 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
104 true);
105 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200106 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
minyue78b4d562016-11-30 04:47:39 -0800107 allocator_->OnNetworkChanged(1500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200108 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000109}
110
111TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
112 TestBitrateObserver bitrate_observer_1;
113 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700114 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200115 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true);
116 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
117 EXPECT_CALL(limit_observer_,
118 OnAllocationLimitsChanged(100000 + 200000, 0));
119 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true);
120 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000121
mflodman48a4beb2016-07-01 13:03:59 +0200122 // Test too low start bitrate, hence lower than sum of min. Min bitrates
123 // will
124 // be allocated to all observers.
minyue78b4d562016-11-30 04:47:39 -0800125 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200126 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
127 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
128 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
129 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
130 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
131 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000132
mflodman48a4beb2016-07-01 13:03:59 +0200133 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800134 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200135 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
136 EXPECT_EQ(100000u + kBitrateToShare / 2,
137 bitrate_observer_1.last_bitrate_bps_);
138 EXPECT_EQ(200000u + kBitrateToShare / 2,
139 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000140
mflodman48a4beb2016-07-01 13:03:59 +0200141 // Limited by 2x max bitrates since we leave room for FEC and
142 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800143 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200144 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
145 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700146
mflodman48a4beb2016-07-01 13:03:59 +0200147 // Verify that if the bandwidth estimate is set to zero, the allocated
148 // rate is
149 // zero.
minyue78b4d562016-11-30 04:47:39 -0800150 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200151 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
152 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000153}
154
perkj71ee44c2016-06-15 00:47:53 -0700155TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
156 TestBitrateObserver bitrate_observer;
157 const uint32_t kMinSendBitrateBps = 100000;
158 const uint32_t kPadUpToBitrateBps = 50000;
159
160 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
161 kPadUpToBitrateBps));
162 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
163 kPadUpToBitrateBps, true);
164 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
165 allocator_->RemoveObserver(&bitrate_observer);
166}
167
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000168class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
169 protected:
perkj71ee44c2016-06-15 00:47:53 -0700170 BitrateAllocatorTestNoEnforceMin()
171 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800172 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000173 }
174 ~BitrateAllocatorTestNoEnforceMin() {}
175
perkj71ee44c2016-06-15 00:47:53 -0700176 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800177 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000178};
179
mflodman101f2502016-06-09 17:21:19 +0200180// The following three tests verify enforcing a minimum bitrate works as
181// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000182TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
183 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700184 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
185 // AddObserver is called with |enforce_min_bitrate| = false.
186 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
mflodman48a4beb2016-07-01 13:03:59 +0200187 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
188 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000189
mflodman48a4beb2016-07-01 13:03:59 +0200190 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800191 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200192 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000193
mflodman48a4beb2016-07-01 13:03:59 +0200194 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800195 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200196 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000197
mflodman48a4beb2016-07-01 13:03:59 +0200198 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
199 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000200}
201
202TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
203 TestBitrateObserver bitrate_observer_1;
204 TestBitrateObserver bitrate_observer_2;
205 TestBitrateObserver bitrate_observer_3;
206 // Set up the observers with min bitrates at 100000, 200000, and 300000.
perkj57c21f92016-06-17 07:27:16 -0700207 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
208 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100209
perkj57c21f92016-06-17 07:27:16 -0700210 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
211 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200212 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100213
perkj57c21f92016-06-17 07:27:16 -0700214 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false);
215 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200216 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
217 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000218
mflodman101f2502016-06-09 17:21:19 +0200219 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
220 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800221 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000222 // Verify that each observer gets its min rate (sum of min rates is 600000),
223 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100224 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200225 EXPECT_EQ(100000u + bitrate_to_share / 3,
226 bitrate_observer_1.last_bitrate_bps_);
227 EXPECT_EQ(200000u + bitrate_to_share / 3,
228 bitrate_observer_2.last_bitrate_bps_);
229 EXPECT_EQ(300000u + bitrate_to_share / 3,
230 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000231
mflodman101f2502016-06-09 17:21:19 +0200232 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800233 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200234 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
235 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
236 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
237
238 // Increased BWE, but still below the sum of configured min bitrates for all
239 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800240 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200241 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
242 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
243 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000244
mflodman101f2502016-06-09 17:21:19 +0200245 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800246 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200247 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
248 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
249 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000250
perkjec81bcd2016-05-11 06:01:13 -0700251 // Verify that zero estimated bandwidth, means that that all gets zero,
252 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800253 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200254 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
255 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
256 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700257
mflodman86aabb22016-03-11 15:44:32 +0100258 allocator_->RemoveObserver(&bitrate_observer_1);
259 allocator_->RemoveObserver(&bitrate_observer_2);
260 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000261}
262
mflodman48a4beb2016-07-01 13:03:59 +0200263TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
264 TestBitrateObserver bitrate_observer;
265 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
266 // AddObserver is called with |enforce_min_bitrate| = false.
267 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
268 allocator_->AddObserver(
269 &bitrate_observer, 100000, 400000, 0, false);
270 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
271
272 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800273 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200274 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
275
276 // Add loss and use a part of the bitrate for protection.
277 double protection_ratio = 0.4;
278 uint8_t fraction_loss = protection_ratio * 256;
279 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800280 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
281 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200282 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
283
284 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800285 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
286 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200287 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
288
289 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800290 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
291 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200292 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
293
294 // Just enough to enable video again.
minyue78b4d562016-11-30 04:47:39 -0800295 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
296 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200297 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
298
299 // Remove all protection and make sure video is not paused as earlier.
300 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800301 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200302 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
303
minyue78b4d562016-11-30 04:47:39 -0800304 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200305 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
306
307 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
308 allocator_->RemoveObserver(&bitrate_observer);
309}
310
311TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
312 TestBitrateObserver bitrate_observer_1;
313 TestBitrateObserver bitrate_observer_2;
314
315 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
316 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
317 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
318 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
319 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
320
321 // Enough bitrate for both.
322 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800323 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200324 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
325 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
326
327 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800328 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200329 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
330 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
331
minyue78b4d562016-11-30 04:47:39 -0800332 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200333 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
334 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
335
minyue78b4d562016-11-30 04:47:39 -0800336 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200337 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
338 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
339
minyue78b4d562016-11-30 04:47:39 -0800340 allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200341 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
342 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
343
minyue78b4d562016-11-30 04:47:39 -0800344 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200345 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
346 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
347
348 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800349 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200350 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
351 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
352
minyue78b4d562016-11-30 04:47:39 -0800353 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200354 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
355 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
356
357 allocator_->RemoveObserver(&bitrate_observer_1);
358 allocator_->RemoveObserver(&bitrate_observer_2);
359}
360
mflodman101f2502016-06-09 17:21:19 +0200361TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000362 TestBitrateObserver bitrate_observer_1;
363 TestBitrateObserver bitrate_observer_2;
364 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100365
perkj57c21f92016-06-17 07:27:16 -0700366 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true);
367 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
368
369 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true);
370 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200371 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100372
mflodman48a4beb2016-07-01 13:03:59 +0200373 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true);
374 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
375 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
376 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000377
mflodman48a4beb2016-07-01 13:03:59 +0200378 // Low BWE. Verify that all observers still get their respective min
379 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800380 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200381 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
382 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
383 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000384
mflodman48a4beb2016-07-01 13:03:59 +0200385 allocator_->RemoveObserver(&bitrate_observer_1);
386 allocator_->RemoveObserver(&bitrate_observer_2);
387 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000388}
perkjfea93092016-05-14 00:58:48 -0700389
390TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
391 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700392 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700393
394 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true);
395 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700396
397 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800398 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700399
mflodman101f2502016-06-09 17:21:19 +0200400 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700401
402 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700403 // Adding an observer while the network is down should not affect the limits.
404 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700405 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true);
perkjfea93092016-05-14 00:58:48 -0700406
407 // Expect the start_bitrate to be set as if the network was still up but that
408 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700409 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200410 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
411 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700412
413 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800414 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200415 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
416 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
417}
418
419TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
420 TestBitrateObserver enforced_observer;
mflodman48a4beb2016-07-01 13:03:59 +0200421 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true);
422 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200423
mflodman48a4beb2016-07-01 13:03:59 +0200424 TestBitrateObserver not_enforced_observer;
425 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false);
426 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
427 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200428
minyue78b4d562016-11-30 04:47:39 -0800429 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200430 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
431 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200432
minyue78b4d562016-11-30 04:47:39 -0800433 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200434 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
435 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200436
minyue78b4d562016-11-30 04:47:39 -0800437 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200438 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
439 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200440
minyue78b4d562016-11-30 04:47:39 -0800441 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200442 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
443 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200444
minyue78b4d562016-11-30 04:47:39 -0800445 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200446 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
447 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200448
minyue78b4d562016-11-30 04:47:39 -0800449 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200450 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
451 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200452
minyue78b4d562016-11-30 04:47:39 -0800453 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200454 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
455 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200456
mflodman48a4beb2016-07-01 13:03:59 +0200457 allocator_->RemoveObserver(&enforced_observer);
458 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200459}
460
461TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
462 TestBitrateObserver observer;
mflodman48a4beb2016-07-01 13:03:59 +0200463 allocator_->AddObserver(&observer, 30000, 300000, 0, false);
464 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200465
minyue78b4d562016-11-30 04:47:39 -0800466 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200467 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200468
minyue78b4d562016-11-30 04:47:39 -0800469 allocator_->OnNetworkChanged(20000, 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(30000, 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(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200476 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200477
minyue78b4d562016-11-30 04:47:39 -0800478 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200479 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200480
minyue78b4d562016-11-30 04:47:39 -0800481 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200482 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200483
mflodman48a4beb2016-07-01 13:03:59 +0200484 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200485}
486
487TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
488 TestBitrateObserver observer;
mflodman48a4beb2016-07-01 13:03:59 +0200489 allocator_->AddObserver(&observer, 300000, 600000, 0, false);
490 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200491
minyue78b4d562016-11-30 04:47:39 -0800492 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200493 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200494
minyue78b4d562016-11-30 04:47:39 -0800495 allocator_->OnNetworkChanged(200000, 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(300000, 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(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200502 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200503
minyue78b4d562016-11-30 04:47:39 -0800504 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200505 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200506
minyue78b4d562016-11-30 04:47:39 -0800507 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200508 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200509
mflodman48a4beb2016-07-01 13:03:59 +0200510 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700511}
512
minyue78b4d562016-11-30 04:47:39 -0800513TEST_F(BitrateAllocatorTest, PassProbingInterval) {
514 TestBitrateObserver observer;
515 allocator_->AddObserver(&observer, 300000, 600000, 0, false);
516 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
517
518 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
519 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
520
521 allocator_->RemoveObserver(&observer);
522}
523
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000524} // namespace webrtc