blob: 154d14e3d7607419e8f64dbf430dfd052bc47c4a [file] [log] [blame]
stefan@webrtc.org792f1a12015-03-04 12:24:26 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <algorithm>
kwibergb25345e2016-03-12 06:10:44 -080012#include <memory>
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000013#include <vector>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "call/bitrate_allocator.h"
16#include "modules/bitrate_controller/include/bitrate_controller.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000019
Seth Hampsonfe73d6a2017-11-14 10:49:06 -080020using ::testing::NiceMock;
21using ::testing::_;
perkj71ee44c2016-06-15 00:47:53 -070022
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000023namespace webrtc {
24
perkj71ee44c2016-06-15 00:47:53 -070025class MockLimitObserver : public BitrateAllocator::LimitObserver {
26 public:
27 MOCK_METHOD2(OnAllocationLimitsChanged,
28 void(uint32_t min_send_bitrate_bps,
29 uint32_t max_padding_bitrate_bps));
30};
31
mflodman86aabb22016-03-11 15:44:32 +010032class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000033 public:
34 TestBitrateObserver()
mflodman48a4beb2016-07-01 13:03:59 +020035 : last_bitrate_bps_(0),
36 last_fraction_loss_(0),
37 last_rtt_ms_(0),
minyue78b4d562016-11-30 04:47:39 -080038 last_probing_interval_ms_(0),
mflodman48a4beb2016-07-01 13:03:59 +020039 protection_ratio_(0.0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000040
mflodman48a4beb2016-07-01 13:03:59 +020041 void SetBitrateProtectionRatio(double protection_ratio) {
42 protection_ratio_ = protection_ratio;
43 }
44
45 uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
46 uint8_t fraction_loss,
minyue78b4d562016-11-30 04:47:39 -080047 int64_t rtt,
48 int64_t probing_interval_ms) override {
mflodman101f2502016-06-09 17:21:19 +020049 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000050 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020051 last_rtt_ms_ = rtt;
minyue78b4d562016-11-30 04:47:39 -080052 last_probing_interval_ms_ = probing_interval_ms;
mflodman48a4beb2016-07-01 13:03:59 +020053 return bitrate_bps * protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000054 }
mflodman101f2502016-06-09 17:21:19 +020055 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000056 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020057 int64_t last_rtt_ms_;
minyue78b4d562016-11-30 04:47:39 -080058 int last_probing_interval_ms_;
mflodman48a4beb2016-07-01 13:03:59 +020059 double protection_ratio_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000060};
61
minyue78b4d562016-11-30 04:47:39 -080062namespace {
63constexpr int64_t kDefaultProbingIntervalMs = 3000;
Seth Hampson24722b32017-12-22 09:36:42 -080064const double kDefaultBitratePriority = 1.0;
minyue78b4d562016-11-30 04:47:39 -080065}
66
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000067class BitrateAllocatorTest : public ::testing::Test {
68 protected:
perkj71ee44c2016-06-15 00:47:53 -070069 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -080070 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
Stefan Holmere5904162015-03-26 11:11:06 +010071 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000072 ~BitrateAllocatorTest() {}
73
perkj71ee44c2016-06-15 00:47:53 -070074 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080075 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000076};
77
78TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
79 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070080 const uint32_t kMinSendBitrateBps = 100000;
81 const uint32_t kPadUpToBitrateBps = 50000;
82
83 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
84 kPadUpToBitrateBps));
perkj57c21f92016-06-17 07:27:16 -070085 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
Seth Hampson24722b32017-12-22 09:36:42 -080086 kPadUpToBitrateBps, true, "",
87 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -070088 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
minyue78b4d562016-11-30 04:47:39 -080089 allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070090 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000091
Peter Boström8e4e8b02015-09-15 15:08:03 +020092 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080093 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
minyue78b4d562016-11-30 04:47:39 -080094 allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
perkj57c21f92016-06-17 07:27:16 -070095 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
perkj71ee44c2016-06-15 00:47:53 -070096
97 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
98 EXPECT_CALL(limit_observer_,
99 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
perkj57c21f92016-06-17 07:27:16 -0700100 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
Seth Hampson24722b32017-12-22 09:36:42 -0800101 true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700102 EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000103
perkj57c21f92016-06-17 07:27:16 -0700104 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
Seth Hampson24722b32017-12-22 09:36:42 -0800105 true, "", kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700106 EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
mflodman101f2502016-06-09 17:21:19 +0200107 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
minyue78b4d562016-11-30 04:47:39 -0800108 allocator_->OnNetworkChanged(1500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200109 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000110}
111
112TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
113 TestBitrateObserver bitrate_observer_1;
114 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700115 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
Seth Hampson24722b32017-12-22 09:36:42 -0800116 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true, "",
117 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200118 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
119 EXPECT_CALL(limit_observer_,
120 OnAllocationLimitsChanged(100000 + 200000, 0));
Seth Hampson24722b32017-12-22 09:36:42 -0800121 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true, "",
122 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200123 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000124
mflodman48a4beb2016-07-01 13:03:59 +0200125 // Test too low start bitrate, hence lower than sum of min. Min bitrates
126 // will
127 // be allocated to all observers.
minyue78b4d562016-11-30 04:47:39 -0800128 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200129 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
130 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
131 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
132 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
133 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
134 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000135
mflodman48a4beb2016-07-01 13:03:59 +0200136 // Test a bitrate which should be distributed equally.
minyue78b4d562016-11-30 04:47:39 -0800137 allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200138 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
139 EXPECT_EQ(100000u + kBitrateToShare / 2,
140 bitrate_observer_1.last_bitrate_bps_);
141 EXPECT_EQ(200000u + kBitrateToShare / 2,
142 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000143
mflodman48a4beb2016-07-01 13:03:59 +0200144 // Limited by 2x max bitrates since we leave room for FEC and
145 // retransmissions.
minyue78b4d562016-11-30 04:47:39 -0800146 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200147 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
148 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700149
mflodman48a4beb2016-07-01 13:03:59 +0200150 // Verify that if the bandwidth estimate is set to zero, the allocated
151 // rate is
152 // zero.
minyue78b4d562016-11-30 04:47:39 -0800153 allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200154 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
155 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000156}
157
perkj71ee44c2016-06-15 00:47:53 -0700158TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
159 TestBitrateObserver bitrate_observer;
160 const uint32_t kMinSendBitrateBps = 100000;
161 const uint32_t kPadUpToBitrateBps = 50000;
162
163 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
164 kPadUpToBitrateBps));
165 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
Seth Hampson24722b32017-12-22 09:36:42 -0800166 kPadUpToBitrateBps, true, "",
167 kDefaultBitratePriority);
perkj71ee44c2016-06-15 00:47:53 -0700168 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
169 allocator_->RemoveObserver(&bitrate_observer);
170}
171
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000172class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
173 protected:
perkj71ee44c2016-06-15 00:47:53 -0700174 BitrateAllocatorTestNoEnforceMin()
175 : allocator_(new BitrateAllocator(&limit_observer_)) {
minyue78b4d562016-11-30 04:47:39 -0800176 allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000177 }
178 ~BitrateAllocatorTestNoEnforceMin() {}
179
perkj71ee44c2016-06-15 00:47:53 -0700180 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800181 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000182};
183
mflodman101f2502016-06-09 17:21:19 +0200184// The following three tests verify enforcing a minimum bitrate works as
185// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000186TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
187 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700188 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
189 // AddObserver is called with |enforce_min_bitrate| = false.
philipel5ef2bc12017-02-21 07:28:31 -0800190 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000));
Seth Hampson24722b32017-12-22 09:36:42 -0800191 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
192 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200193 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000194
mflodman48a4beb2016-07-01 13:03:59 +0200195 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800196 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200197 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000198
mflodman48a4beb2016-07-01 13:03:59 +0200199 // Low BWE.
minyue78b4d562016-11-30 04:47:39 -0800200 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200201 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000202
mflodman48a4beb2016-07-01 13:03:59 +0200203 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
204 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000205}
206
207TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
208 TestBitrateObserver bitrate_observer_1;
209 TestBitrateObserver bitrate_observer_2;
210 TestBitrateObserver bitrate_observer_3;
211 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Seth Hampson24722b32017-12-22 09:36:42 -0800212 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
213 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700214 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Stefan Holmere5904162015-03-26 11:11:06 +0100215
Seth Hampson24722b32017-12-22 09:36:42 -0800216 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
217 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700218 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200219 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100220
Seth Hampson24722b32017-12-22 09:36:42 -0800221 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false, "",
222 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700223 EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
mflodman101f2502016-06-09 17:21:19 +0200224 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
225 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000226
mflodman101f2502016-06-09 17:21:19 +0200227 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
228 // what is left after each controller gets its min rate).
minyue78b4d562016-11-30 04:47:39 -0800229 allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000230 // Verify that each observer gets its min rate (sum of min rates is 600000),
231 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100232 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200233 EXPECT_EQ(100000u + bitrate_to_share / 3,
234 bitrate_observer_1.last_bitrate_bps_);
235 EXPECT_EQ(200000u + bitrate_to_share / 3,
236 bitrate_observer_2.last_bitrate_bps_);
237 EXPECT_EQ(300000u + bitrate_to_share / 3,
238 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000239
mflodman101f2502016-06-09 17:21:19 +0200240 // BWE below the sum of observer's min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800241 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200242 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
243 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
244 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
245
246 // Increased BWE, but still below the sum of configured min bitrates for all
247 // observers and too little for observer 3. 1 and 2 will share the rest.
minyue78b4d562016-11-30 04:47:39 -0800248 allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200249 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
250 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
251 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000252
mflodman101f2502016-06-09 17:21:19 +0200253 // Below min for all.
minyue78b4d562016-11-30 04:47:39 -0800254 allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200255 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
256 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
257 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000258
perkjec81bcd2016-05-11 06:01:13 -0700259 // Verify that zero estimated bandwidth, means that that all gets zero,
260 // regardless of set min bitrate.
minyue78b4d562016-11-30 04:47:39 -0800261 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200262 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
263 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
264 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700265
mflodman86aabb22016-03-11 15:44:32 +0100266 allocator_->RemoveObserver(&bitrate_observer_1);
267 allocator_->RemoveObserver(&bitrate_observer_2);
268 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000269}
270
mflodman48a4beb2016-07-01 13:03:59 +0200271TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
272 TestBitrateObserver bitrate_observer;
273 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
274 // AddObserver is called with |enforce_min_bitrate| = false.
philipel5ef2bc12017-02-21 07:28:31 -0800275 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000));
Seth Hampson24722b32017-12-22 09:36:42 -0800276 allocator_->AddObserver(&bitrate_observer, 100000, 400000, 0, false, "",
277 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200278 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
279
280 // High BWE.
minyue78b4d562016-11-30 04:47:39 -0800281 allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200282 EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
283
284 // Add loss and use a part of the bitrate for protection.
285 double protection_ratio = 0.4;
286 uint8_t fraction_loss = protection_ratio * 256;
287 bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
minyue78b4d562016-11-30 04:47:39 -0800288 allocator_->OnNetworkChanged(200000, 0, fraction_loss,
289 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200290 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
291
292 // Above the min threshold, but not enough given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800293 allocator_->OnNetworkChanged(139000, 0, fraction_loss,
294 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200295 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
296
297 // Verify the hysteresis is added for the protection.
minyue78b4d562016-11-30 04:47:39 -0800298 allocator_->OnNetworkChanged(150000, 0, fraction_loss,
299 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200300 EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
301
302 // Just enough to enable video again.
philipel5ef2bc12017-02-21 07:28:31 -0800303 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
minyue78b4d562016-11-30 04:47:39 -0800304 allocator_->OnNetworkChanged(168000, 0, fraction_loss,
305 kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200306 EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
307
308 // Remove all protection and make sure video is not paused as earlier.
309 bitrate_observer.SetBitrateProtectionRatio(0.0);
minyue78b4d562016-11-30 04:47:39 -0800310 allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200311 EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
312
minyue78b4d562016-11-30 04:47:39 -0800313 allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200314 EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
315
mflodman48a4beb2016-07-01 13:03:59 +0200316 allocator_->RemoveObserver(&bitrate_observer);
317}
318
319TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
320 TestBitrateObserver bitrate_observer_1;
321 TestBitrateObserver bitrate_observer_2;
322
Seth Hampson24722b32017-12-22 09:36:42 -0800323 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false, "",
324 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200325 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
Seth Hampson24722b32017-12-22 09:36:42 -0800326 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false, "",
327 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200328 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
329 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
330
331 // Enough bitrate for both.
332 bitrate_observer_2.SetBitrateProtectionRatio(0.5);
minyue78b4d562016-11-30 04:47:39 -0800333 allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200334 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
335 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
336
337 // Above min for observer 2, but too little given the protection used.
minyue78b4d562016-11-30 04:47:39 -0800338 allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200339 EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
340 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
341
minyue78b4d562016-11-30 04:47:39 -0800342 allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200343 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
344 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
345
minyue78b4d562016-11-30 04:47:39 -0800346 allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200347 EXPECT_EQ(0u, 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(119000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200351 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
352 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
353
minyue78b4d562016-11-30 04:47:39 -0800354 allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200355 EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
356 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
357
358 // Verify the protection is accounted for before resuming observer 2.
minyue78b4d562016-11-30 04:47:39 -0800359 allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200360 EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
361 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
362
minyue78b4d562016-11-30 04:47:39 -0800363 allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200364 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
365 EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
366
367 allocator_->RemoveObserver(&bitrate_observer_1);
368 allocator_->RemoveObserver(&bitrate_observer_2);
369}
370
mflodman101f2502016-06-09 17:21:19 +0200371TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000372 TestBitrateObserver bitrate_observer_1;
373 TestBitrateObserver bitrate_observer_2;
374 TestBitrateObserver bitrate_observer_3;
Stefan Holmere5904162015-03-26 11:11:06 +0100375
Seth Hampson24722b32017-12-22 09:36:42 -0800376 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true, "",
377 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700378 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
379
Seth Hampson24722b32017-12-22 09:36:42 -0800380 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true, "",
381 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700382 EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200383 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100384
Seth Hampson24722b32017-12-22 09:36:42 -0800385 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true, "",
386 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200387 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
388 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
389 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000390
mflodman48a4beb2016-07-01 13:03:59 +0200391 // Low BWE. Verify that all observers still get their respective min
392 // bitrate.
minyue78b4d562016-11-30 04:47:39 -0800393 allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200394 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
395 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
396 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000397
mflodman48a4beb2016-07-01 13:03:59 +0200398 allocator_->RemoveObserver(&bitrate_observer_1);
399 allocator_->RemoveObserver(&bitrate_observer_2);
400 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000401}
perkjfea93092016-05-14 00:58:48 -0700402
403TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
404 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700405 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkj57c21f92016-06-17 07:27:16 -0700406
Seth Hampson24722b32017-12-22 09:36:42 -0800407 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true, "",
408 kDefaultBitratePriority);
perkj57c21f92016-06-17 07:27:16 -0700409 EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
perkjfea93092016-05-14 00:58:48 -0700410
411 // Set network down, ie, no available bitrate.
minyue78b4d562016-11-30 04:47:39 -0800412 allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
perkjfea93092016-05-14 00:58:48 -0700413
mflodman101f2502016-06-09 17:21:19 +0200414 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700415
416 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700417 // Adding an observer while the network is down should not affect the limits.
418 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
Seth Hampson24722b32017-12-22 09:36:42 -0800419 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true, "",
420 kDefaultBitratePriority);
perkjfea93092016-05-14 00:58:48 -0700421
422 // Expect the start_bitrate to be set as if the network was still up but that
423 // the new observer have been notified that the network is down.
perkj57c21f92016-06-17 07:27:16 -0700424 EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
mflodman101f2502016-06-09 17:21:19 +0200425 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
426 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700427
428 // Set network back up.
minyue78b4d562016-11-30 04:47:39 -0800429 allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
mflodman101f2502016-06-09 17:21:19 +0200430 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
431 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
432}
433
434TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
435 TestBitrateObserver enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800436 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true, "",
437 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200438 EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
mflodman101f2502016-06-09 17:21:19 +0200439
mflodman48a4beb2016-07-01 13:03:59 +0200440 TestBitrateObserver not_enforced_observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800441 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false, "",
442 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200443 EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
444 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200445
minyue78b4d562016-11-30 04:47:39 -0800446 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200447 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
448 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200449
minyue78b4d562016-11-30 04:47:39 -0800450 allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200451 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
452 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200453
minyue78b4d562016-11-30 04:47:39 -0800454 allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200455 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
456 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200457
minyue78b4d562016-11-30 04:47:39 -0800458 allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200459 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
460 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200461
minyue78b4d562016-11-30 04:47:39 -0800462 allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200463 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
464 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200465
minyue78b4d562016-11-30 04:47:39 -0800466 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200467 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
468 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200469
minyue78b4d562016-11-30 04:47:39 -0800470 allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200471 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
472 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200473
mflodman48a4beb2016-07-01 13:03:59 +0200474 allocator_->RemoveObserver(&enforced_observer);
475 allocator_->RemoveObserver(&not_enforced_observer);
mflodman101f2502016-06-09 17:21:19 +0200476}
477
478TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
479 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800480 allocator_->AddObserver(&observer, 30000, 300000, 0, false, "",
481 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200482 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200483
minyue78b4d562016-11-30 04:47:39 -0800484 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200485 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200486
minyue78b4d562016-11-30 04:47:39 -0800487 allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200488 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200489
minyue78b4d562016-11-30 04:47:39 -0800490 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200491 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200492
minyue78b4d562016-11-30 04:47:39 -0800493 allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200494 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200495
minyue78b4d562016-11-30 04:47:39 -0800496 allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200497 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200498
minyue78b4d562016-11-30 04:47:39 -0800499 allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200500 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200501
mflodman48a4beb2016-07-01 13:03:59 +0200502 allocator_->RemoveObserver(&observer);
mflodman101f2502016-06-09 17:21:19 +0200503}
504
505TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
506 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800507 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
508 kDefaultBitratePriority);
mflodman48a4beb2016-07-01 13:03:59 +0200509 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
mflodman101f2502016-06-09 17:21:19 +0200510
minyue78b4d562016-11-30 04:47:39 -0800511 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200512 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200513
minyue78b4d562016-11-30 04:47:39 -0800514 allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200515 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200516
minyue78b4d562016-11-30 04:47:39 -0800517 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200518 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200519
minyue78b4d562016-11-30 04:47:39 -0800520 allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200521 EXPECT_EQ(0u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200522
minyue78b4d562016-11-30 04:47:39 -0800523 allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200524 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200525
minyue78b4d562016-11-30 04:47:39 -0800526 allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
mflodman48a4beb2016-07-01 13:03:59 +0200527 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
mflodman101f2502016-06-09 17:21:19 +0200528
mflodman48a4beb2016-07-01 13:03:59 +0200529 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700530}
531
minyue78b4d562016-11-30 04:47:39 -0800532TEST_F(BitrateAllocatorTest, PassProbingInterval) {
533 TestBitrateObserver observer;
Seth Hampson24722b32017-12-22 09:36:42 -0800534 allocator_->AddObserver(&observer, 300000, 600000, 0, false, "",
535 kDefaultBitratePriority);
minyue78b4d562016-11-30 04:47:39 -0800536 EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
537
538 allocator_->OnNetworkChanged(300000, 0, 50, 5000);
539 EXPECT_EQ(5000, observer.last_probing_interval_ms_);
540
541 allocator_->RemoveObserver(&observer);
542}
543
Seth Hampsonfe73d6a2017-11-14 10:49:06 -0800544TEST_F(BitrateAllocatorTest, PriorityRateOneObserverBasic) {
545 TestBitrateObserver observer;
546 const uint32_t kMinSendBitrateBps = 10;
547 const uint32_t kMaxSendBitrateBps = 60;
548 const uint32_t kNetworkBandwidthBps = 30;
549
550 allocator_->AddObserver(&observer, kMinSendBitrateBps, kMaxSendBitrateBps, 0,
551 true, "", 2.0);
552 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
553 kDefaultProbingIntervalMs);
554
555 EXPECT_EQ(kNetworkBandwidthBps, observer.last_bitrate_bps_);
556
557 allocator_->RemoveObserver(&observer);
558}
559
560// Tests that two observers with the same bitrate priority are allocated
561// their bitrate evenly.
562TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasic) {
563 TestBitrateObserver observer_low_1;
564 TestBitrateObserver observer_low_2;
565 const uint32_t kMinSendBitrateBps = 10;
566 const uint32_t kMaxSendBitrateBps = 60;
567 const uint32_t kNetworkBandwidthBps = 60;
568 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
569 kMaxSendBitrateBps, 0, false, "low1", 2.0);
570 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
571 kMaxSendBitrateBps, 0, false, "low2", 2.0);
572 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
573 kDefaultProbingIntervalMs);
574
575 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
576 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
577
578 allocator_->RemoveObserver(&observer_low_1);
579 allocator_->RemoveObserver(&observer_low_2);
580}
581
582// Tests that there is no difference in functionality when the min bitrate is
583// enforced.
584TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBasicMinEnforced) {
585 TestBitrateObserver observer_low_1;
586 TestBitrateObserver observer_low_2;
587 const uint32_t kMinSendBitrateBps = 0;
588 const uint32_t kMaxSendBitrateBps = 60;
589 const uint32_t kNetworkBandwidthBps = 60;
590 allocator_->AddObserver(&observer_low_1, kMinSendBitrateBps,
591 kMaxSendBitrateBps, 0, true, "low1", 2.0);
592 allocator_->AddObserver(&observer_low_2, kMinSendBitrateBps,
593 kMaxSendBitrateBps, 0, true, "low2", 2.0);
594 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
595 kDefaultProbingIntervalMs);
596
597 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_1.last_bitrate_bps_);
598 EXPECT_EQ(kNetworkBandwidthBps / 2, observer_low_2.last_bitrate_bps_);
599
600 allocator_->RemoveObserver(&observer_low_1);
601 allocator_->RemoveObserver(&observer_low_2);
602}
603
604// Tests that if the available bandwidth is the sum of the max bitrate
605// of all observers, they will be allocated their max.
606TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversBothAllocatedMax) {
607 TestBitrateObserver observer_low;
608 TestBitrateObserver observer_mid;
609 const uint32_t kMinSendBitrateBps = 0;
610 const uint32_t kMaxSendBitrateBps = 60;
611 const uint32_t kNetworkBandwidthBps = kMaxSendBitrateBps * 2;
612 allocator_->AddObserver(&observer_low, kMinSendBitrateBps, kMaxSendBitrateBps,
613 0, true, "low", 2.0);
614 allocator_->AddObserver(&observer_mid, kMinSendBitrateBps, kMaxSendBitrateBps,
615 0, true, "mid", 4.0);
616 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
617 kDefaultProbingIntervalMs);
618
619 EXPECT_EQ(kMaxSendBitrateBps, observer_low.last_bitrate_bps_);
620 EXPECT_EQ(kMaxSendBitrateBps, observer_mid.last_bitrate_bps_);
621
622 allocator_->RemoveObserver(&observer_low);
623 allocator_->RemoveObserver(&observer_mid);
624}
625
626// Tests that after a higher bitrate priority observer has been allocated its
627// max bitrate the lower priority observer will then be allocated the remaining
628// bitrate.
629TEST_F(BitrateAllocatorTest, PriorityRateTwoObserversOneAllocatedToMax) {
630 TestBitrateObserver observer_low;
631 TestBitrateObserver observer_mid;
632 allocator_->AddObserver(&observer_low, 10, 50, 0, false, "low", 2.0);
633 allocator_->AddObserver(&observer_mid, 10, 50, 0, false, "mid", 4.0);
634 allocator_->OnNetworkChanged(90, 0, 0, kDefaultProbingIntervalMs);
635
636 EXPECT_EQ(40u, observer_low.last_bitrate_bps_);
637 EXPECT_EQ(50u, observer_mid.last_bitrate_bps_);
638
639 allocator_->RemoveObserver(&observer_low);
640 allocator_->RemoveObserver(&observer_mid);
641}
642
643// Tests that three observers with three different bitrate priorities will all
644// be allocated bitrate according to their relative bitrate priority.
645TEST_F(BitrateAllocatorTest,
646 PriorityRateThreeObserversAllocatedRelativeAmounts) {
647 TestBitrateObserver observer_low;
648 TestBitrateObserver observer_mid;
649 TestBitrateObserver observer_high;
650 const uint32_t kMaxBitrate = 100;
651 // Not enough bandwidth to fill any observer's max bitrate.
652 const uint32_t kNetworkBandwidthBps = 70;
653 const double kLowBitratePriority = 2.0;
654 const double kMidBitratePriority = 4.0;
655 const double kHighBitratePriority = 8.0;
656 const double kTotalBitratePriority =
657 kLowBitratePriority + kMidBitratePriority + kHighBitratePriority;
658 allocator_->AddObserver(&observer_low, 0, kMaxBitrate, 0, false, "low",
659 kLowBitratePriority);
660 allocator_->AddObserver(&observer_mid, 0, kMaxBitrate, 0, false, "mid",
661 kMidBitratePriority);
662 allocator_->AddObserver(&observer_high, 0, kMaxBitrate, 0, false, "high",
663 kHighBitratePriority);
664 allocator_->OnNetworkChanged(kNetworkBandwidthBps, 0, 0,
665 kDefaultProbingIntervalMs);
666
667 const double kLowFractionAllocated =
668 kLowBitratePriority / kTotalBitratePriority;
669 const double kMidFractionAllocated =
670 kMidBitratePriority / kTotalBitratePriority;
671 const double kHighFractionAllocated =
672 kHighBitratePriority / kTotalBitratePriority;
673 EXPECT_EQ(kLowFractionAllocated * kNetworkBandwidthBps,
674 observer_low.last_bitrate_bps_);
675 EXPECT_EQ(kMidFractionAllocated * kNetworkBandwidthBps,
676 observer_mid.last_bitrate_bps_);
677 EXPECT_EQ(kHighFractionAllocated * kNetworkBandwidthBps,
678 observer_high.last_bitrate_bps_);
679
680 allocator_->RemoveObserver(&observer_low);
681 allocator_->RemoveObserver(&observer_mid);
682 allocator_->RemoveObserver(&observer_high);
683}
684
685// Tests that after the high priority observer has been allocated its maximum
686// bitrate, the other two observers are still allocated bitrate according to
687// their relative bitrate priority.
688TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversHighAllocatedToMax) {
689 TestBitrateObserver observer_low;
690 const double kLowBitratePriority = 2.0;
691 TestBitrateObserver observer_mid;
692 const double kMidBitratePriority = 4.0;
693 TestBitrateObserver observer_high;
694 const double kHighBitratePriority = 8.0;
695
696 const uint32_t kAvailableBitrate = 90;
697 const uint32_t kMaxBitrate = 40;
698 const uint32_t kMinBitrate = 10;
699 // Remaining bitrate after allocating to all mins and knowing that the high
700 // priority observer will have its max bitrate allocated.
701 const uint32_t kRemainingBitrate =
702 kAvailableBitrate - kMaxBitrate - (2 * kMinBitrate);
703
704 allocator_->AddObserver(&observer_low, kMinBitrate, kMaxBitrate, 0, false,
705 "low", kLowBitratePriority);
706 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
707 "mid", kMidBitratePriority);
708 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
709 "high", kHighBitratePriority);
710 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
711 kDefaultProbingIntervalMs);
712
713 const double kLowFractionAllocated =
714 kLowBitratePriority / (kLowBitratePriority + kMidBitratePriority);
715 const double kMidFractionAllocated =
716 kMidBitratePriority / (kLowBitratePriority + kMidBitratePriority);
717 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kLowFractionAllocated),
718 observer_low.last_bitrate_bps_);
719 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
720 observer_mid.last_bitrate_bps_);
721 EXPECT_EQ(40u, observer_high.last_bitrate_bps_);
722
723 allocator_->RemoveObserver(&observer_low);
724 allocator_->RemoveObserver(&observer_mid);
725 allocator_->RemoveObserver(&observer_high);
726}
727
728// Tests that after the low priority observer has been allocated its maximum
729// bitrate, the other two observers are still allocated bitrate according to
730// their relative bitrate priority.
731TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversLowAllocatedToMax) {
732 TestBitrateObserver observer_low;
733 const double kLowBitratePriority = 2.0;
734 const uint32_t kLowMaxBitrate = 10;
735 TestBitrateObserver observer_mid;
736 const double kMidBitratePriority = 4.0;
737 TestBitrateObserver observer_high;
738 const double kHighBitratePriority = 8.0;
739
740 const uint32_t kMinBitrate = 0;
741 const uint32_t kMaxBitrate = 60;
742 const uint32_t kAvailableBitrate = 100;
743 // Remaining bitrate knowing that the low priority observer is allocated its
744 // max bitrate. We know this because it is allocated 2.0/14.0 (1/7) of the
745 // available bitrate, so 70 bps would be sufficient network bandwidth.
746 const uint32_t kRemainingBitrate = kAvailableBitrate - kLowMaxBitrate;
747
748 allocator_->AddObserver(&observer_low, kMinBitrate, kLowMaxBitrate, 0, false,
749 "low", kLowBitratePriority);
750 allocator_->AddObserver(&observer_mid, kMinBitrate, kMaxBitrate, 0, false,
751 "mid", kMidBitratePriority);
752 allocator_->AddObserver(&observer_high, kMinBitrate, kMaxBitrate, 0, false,
753 "high", kHighBitratePriority);
754 allocator_->OnNetworkChanged(kAvailableBitrate, 0, 0,
755 kDefaultProbingIntervalMs);
756
757 const double kMidFractionAllocated =
758 kMidBitratePriority / (kMidBitratePriority + kHighBitratePriority);
759 const double kHighFractionAllocated =
760 kHighBitratePriority / (kMidBitratePriority + kHighBitratePriority);
761 EXPECT_EQ(kLowMaxBitrate, observer_low.last_bitrate_bps_);
762 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kMidFractionAllocated),
763 observer_mid.last_bitrate_bps_);
764 EXPECT_EQ(kMinBitrate + (kRemainingBitrate * kHighFractionAllocated),
765 observer_high.last_bitrate_bps_);
766
767 allocator_->RemoveObserver(&observer_low);
768 allocator_->RemoveObserver(&observer_mid);
769 allocator_->RemoveObserver(&observer_high);
770}
771
772// Tests that after two observers are allocated bitrate to their max, the
773// the remaining observer is allocated what's left appropriately. This test
774// handles an edge case where the medium and high observer reach their
775// "relative" max allocation at the same time. The high has 40 to allocate
776// above its min, and the mid has 20 to allocate above its min, which scaled
777// by their bitrate priority is the same for each.
778TEST_F(BitrateAllocatorTest, PriorityRateThreeObserversTwoAllocatedToMax) {
779 TestBitrateObserver observer_low;
780 TestBitrateObserver observer_mid;
781 TestBitrateObserver observer_high;
782 allocator_->AddObserver(&observer_low, 10, 40, 0, false, "low", 2.0);
783 // Scaled allocation above the min allocation is the same for these two,
784 // meaning they will get allocated their max at the same time.
785 // Scaled (target allocation) = (max - min) / bitrate priority
786 allocator_->AddObserver(&observer_mid, 10, 30, 0, false, "mid", 4.0);
787 allocator_->AddObserver(&observer_high, 10, 50, 0, false, "high", 8.0);
788 allocator_->OnNetworkChanged(110, 0, 0, kDefaultProbingIntervalMs);
789
790 EXPECT_EQ(30u, observer_low.last_bitrate_bps_);
791 EXPECT_EQ(30u, observer_mid.last_bitrate_bps_);
792 EXPECT_EQ(50u, observer_high.last_bitrate_bps_);
793
794 allocator_->RemoveObserver(&observer_low);
795 allocator_->RemoveObserver(&observer_mid);
796 allocator_->RemoveObserver(&observer_high);
797}
798
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000799} // namespace webrtc