blob: 74c635d0c53d54496f874bc310e8766e2505558f [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
perkj71ee44c2016-06-15 00:47:53 -070015#include "testing/gmock/include/gmock/gmock.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000016#include "testing/gtest/include/gtest/gtest.h"
mflodman0e7e2592015-11-12 21:02:42 -080017#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000018#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
19
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()
mflodman101f2502016-06-09 17:21:19 +020034 : last_bitrate_bps_(0), last_fraction_loss_(0), last_rtt_ms_(0) {}
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000035
mflodman101f2502016-06-09 17:21:19 +020036 void OnBitrateUpdated(uint32_t bitrate_bps,
37 uint8_t fraction_loss,
38 int64_t rtt) override {
39 last_bitrate_bps_ = bitrate_bps;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000040 last_fraction_loss_ = fraction_loss;
mflodman101f2502016-06-09 17:21:19 +020041 last_rtt_ms_ = rtt;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000042 }
mflodman101f2502016-06-09 17:21:19 +020043 uint32_t last_bitrate_bps_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000044 uint8_t last_fraction_loss_;
mflodman101f2502016-06-09 17:21:19 +020045 int64_t last_rtt_ms_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000046};
47
48class BitrateAllocatorTest : public ::testing::Test {
49 protected:
perkj71ee44c2016-06-15 00:47:53 -070050 BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +010051 allocator_->OnNetworkChanged(300000u, 0, 0);
52 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 ~BitrateAllocatorTest() {}
54
perkj71ee44c2016-06-15 00:47:53 -070055 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -080056 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000057};
58
59TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
60 TestBitrateObserver bitrate_observer;
perkj71ee44c2016-06-15 00:47:53 -070061 const uint32_t kMinSendBitrateBps = 100000;
62 const uint32_t kPadUpToBitrateBps = 50000;
63
64 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
65 kPadUpToBitrateBps));
66 int start_bitrate = allocator_->AddObserver(
67 &bitrate_observer, kMinSendBitrateBps, 1500000, kPadUpToBitrateBps, true);
Stefan Holmere5904162015-03-26 11:11:06 +010068 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000069 allocator_->OnNetworkChanged(200000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020070 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000071
Peter Boström8e4e8b02015-09-15 15:08:03 +020072 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080073 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020074 allocator_->OnNetworkChanged(4000000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020075 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
perkj71ee44c2016-06-15 00:47:53 -070076
77 // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
78 EXPECT_CALL(limit_observer_,
79 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
80 start_bitrate = allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps,
81 4000000, 0, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020082 EXPECT_EQ(4000000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000083
perkj71ee44c2016-06-15 00:47:53 -070084 EXPECT_CALL(limit_observer_,
85 OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
86 start_bitrate = allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps,
87 1500000, 0, true);
Peter Boström8e4e8b02015-09-15 15:08:03 +020088 EXPECT_EQ(3000000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +020089 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000090 allocator_->OnNetworkChanged(1500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +020091 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000092}
93
94TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
95 TestBitrateObserver bitrate_observer_1;
96 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -070097 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
Peter Boström8e4e8b02015-09-15 15:08:03 +020098 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -070099 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100100 EXPECT_EQ(300000, start_bitrate);
perkj71ee44c2016-06-15 00:47:53 -0700101 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000 + 200000, 0));
mflodman2ebe5b12016-05-13 01:43:51 -0700102 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700103 allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100104 EXPECT_EQ(200000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000105
106 // Test too low start bitrate, hence lower than sum of min. Min bitrates will
107 // be allocated to all observers.
108 allocator_->OnNetworkChanged(200000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200109 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000110 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
mflodman101f2502016-06-09 17:21:19 +0200111 EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
112 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000113 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
mflodman101f2502016-06-09 17:21:19 +0200114 EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000115
116 // Test a bitrate which should be distributed equally.
117 allocator_->OnNetworkChanged(500000, 0, 50);
118 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
mflodman101f2502016-06-09 17:21:19 +0200119 EXPECT_EQ(100000u + kBitrateToShare / 2,
120 bitrate_observer_1.last_bitrate_bps_);
121 EXPECT_EQ(200000u + kBitrateToShare / 2,
122 bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000123
Stefan Holmere5904162015-03-26 11:11:06 +0100124 // Limited by 2x max bitrates since we leave room for FEC and retransmissions.
125 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200126 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
127 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700128
129 // Verify that if the bandwidth estimate is set to zero, the allocated rate is
130 // zero.
131 allocator_->OnNetworkChanged(0, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200132 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
133 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000134}
135
perkj71ee44c2016-06-15 00:47:53 -0700136TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
137 TestBitrateObserver bitrate_observer;
138 const uint32_t kMinSendBitrateBps = 100000;
139 const uint32_t kPadUpToBitrateBps = 50000;
140
141 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
142 kPadUpToBitrateBps));
143 allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
144 kPadUpToBitrateBps, true);
145 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
146 allocator_->RemoveObserver(&bitrate_observer);
147}
148
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000149class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
150 protected:
perkj71ee44c2016-06-15 00:47:53 -0700151 BitrateAllocatorTestNoEnforceMin()
152 : allocator_(new BitrateAllocator(&limit_observer_)) {
Stefan Holmere5904162015-03-26 11:11:06 +0100153 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000154 }
155 ~BitrateAllocatorTestNoEnforceMin() {}
156
perkj71ee44c2016-06-15 00:47:53 -0700157 NiceMock<MockLimitObserver> limit_observer_;
kwibergb25345e2016-03-12 06:10:44 -0800158 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000159};
160
mflodman101f2502016-06-09 17:21:19 +0200161// The following three tests verify enforcing a minimum bitrate works as
162// intended.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000163TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
164 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700165 // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
166 // AddObserver is called with |enforce_min_bitrate| = false.
167 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
Peter Boström8e4e8b02015-09-15 15:08:03 +0200168 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700169 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100170 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000171
mflodman101f2502016-06-09 17:21:19 +0200172 // High BWE.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000173 allocator_->OnNetworkChanged(150000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200174 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000175
mflodman101f2502016-06-09 17:21:19 +0200176 // Low BWE.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000177 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200178 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000179
perkj71ee44c2016-06-15 00:47:53 -0700180 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
mflodman86aabb22016-03-11 15:44:32 +0100181 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000182}
183
184TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
185 TestBitrateObserver bitrate_observer_1;
186 TestBitrateObserver bitrate_observer_2;
187 TestBitrateObserver bitrate_observer_3;
188 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Peter Boström8e4e8b02015-09-15 15:08:03 +0200189 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700190 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100191 EXPECT_EQ(300000, start_bitrate);
192
mflodman2ebe5b12016-05-13 01:43:51 -0700193 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700194 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100195 EXPECT_EQ(200000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200196 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100197
mflodman2ebe5b12016-05-13 01:43:51 -0700198 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700199 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false);
Stefan Holmere5904162015-03-26 11:11:06 +0100200 EXPECT_EQ(0, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200201 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
202 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000203
mflodman101f2502016-06-09 17:21:19 +0200204 // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
205 // what is left after each controller gets its min rate).
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000206 allocator_->OnNetworkChanged(690000, 0, 0);
207 // Verify that each observer gets its min rate (sum of min rates is 600000),
208 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100209 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
mflodman101f2502016-06-09 17:21:19 +0200210 EXPECT_EQ(100000u + bitrate_to_share / 3,
211 bitrate_observer_1.last_bitrate_bps_);
212 EXPECT_EQ(200000u + bitrate_to_share / 3,
213 bitrate_observer_2.last_bitrate_bps_);
214 EXPECT_EQ(300000u + bitrate_to_share / 3,
215 bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000216
mflodman101f2502016-06-09 17:21:19 +0200217 // BWE below the sum of observer's min bitrate.
218 allocator_->OnNetworkChanged(300000, 0, 0);
219 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min bitrate.
220 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min bitrate.
221 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
222
223 // Increased BWE, but still below the sum of configured min bitrates for all
224 // observers and too little for observer 3. 1 and 2 will share the rest.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000225 allocator_->OnNetworkChanged(500000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200226 EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_); // Min + split.
227 EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_); // Min + split.
228 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_); // Nothing.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000229
mflodman101f2502016-06-09 17:21:19 +0200230 // Below min for all.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000231 allocator_->OnNetworkChanged(10000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200232 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
233 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
234 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000235
perkjec81bcd2016-05-11 06:01:13 -0700236 // Verify that zero estimated bandwidth, means that that all gets zero,
237 // regardless of set min bitrate.
mflodman101f2502016-06-09 17:21:19 +0200238 allocator_->OnNetworkChanged(0, 0, 0);
239 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
240 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
241 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
perkjec81bcd2016-05-11 06:01:13 -0700242
mflodman86aabb22016-03-11 15:44:32 +0100243 allocator_->RemoveObserver(&bitrate_observer_1);
244 allocator_->RemoveObserver(&bitrate_observer_2);
245 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000246}
247
mflodman101f2502016-06-09 17:21:19 +0200248TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000249 TestBitrateObserver bitrate_observer_1;
250 TestBitrateObserver bitrate_observer_2;
251 TestBitrateObserver bitrate_observer_3;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200252 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700253 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100254 EXPECT_EQ(300000, start_bitrate);
255
mflodman2ebe5b12016-05-13 01:43:51 -0700256 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700257 allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100258 EXPECT_EQ(200000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200259 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
Stefan Holmere5904162015-03-26 11:11:06 +0100260
mflodman2ebe5b12016-05-13 01:43:51 -0700261 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700262 allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true);
Stefan Holmere5904162015-03-26 11:11:06 +0100263 EXPECT_EQ(300000, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200264 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
265 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000266
mflodman101f2502016-06-09 17:21:19 +0200267 // Low BWE. Verify that all observers still get their respective min bitrate.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000268 allocator_->OnNetworkChanged(1000, 0, 0);
mflodman101f2502016-06-09 17:21:19 +0200269 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_); // Min cap.
270 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_); // Min cap.
271 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_); // Min cap.
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000272
mflodman86aabb22016-03-11 15:44:32 +0100273 allocator_->RemoveObserver(&bitrate_observer_1);
274 allocator_->RemoveObserver(&bitrate_observer_2);
275 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000276}
perkjfea93092016-05-14 00:58:48 -0700277
278TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
279 TestBitrateObserver bitrate_observer_1;
perkj71ee44c2016-06-15 00:47:53 -0700280 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
perkjfea93092016-05-14 00:58:48 -0700281 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700282 allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true);
perkjfea93092016-05-14 00:58:48 -0700283 EXPECT_EQ(300000, start_bitrate);
284
285 // Set network down, ie, no available bitrate.
286 allocator_->OnNetworkChanged(0, 0, 0);
287
mflodman101f2502016-06-09 17:21:19 +0200288 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700289
290 TestBitrateObserver bitrate_observer_2;
perkj71ee44c2016-06-15 00:47:53 -0700291 // Adding an observer while the network is down should not affect the limits.
292 EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
perkjfea93092016-05-14 00:58:48 -0700293 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700294 allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true);
perkjfea93092016-05-14 00:58:48 -0700295
296 // Expect the start_bitrate to be set as if the network was still up but that
297 // the new observer have been notified that the network is down.
298 EXPECT_EQ(300000 / 2, start_bitrate);
mflodman101f2502016-06-09 17:21:19 +0200299 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
300 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
perkjfea93092016-05-14 00:58:48 -0700301
302 // Set network back up.
303 allocator_->OnNetworkChanged(1500000, 0, 50);
mflodman101f2502016-06-09 17:21:19 +0200304 EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
305 EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
306}
307
308TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
309 TestBitrateObserver enforced_observer;
310 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700311 allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true);
mflodman101f2502016-06-09 17:21:19 +0200312 EXPECT_EQ(60000, start_bitrate);
313
314 TestBitrateObserver not_enforced_observer;
315 start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700316 allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false);
mflodman101f2502016-06-09 17:21:19 +0200317 EXPECT_EQ(270000, start_bitrate);
318 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
319
320 allocator_->OnNetworkChanged(36000, 0, 50);
321 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
322 EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
323
324 allocator_->OnNetworkChanged(35000, 0, 50);
325 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
326 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
327
328 allocator_->OnNetworkChanged(5000, 0, 50);
329 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
330 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
331
332 allocator_->OnNetworkChanged(36000, 0, 50);
333 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
334 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
335
336 allocator_->OnNetworkChanged(55000, 0, 50);
337 EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
338 EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
339
340 allocator_->OnNetworkChanged(56000, 0, 50);
341 EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
342 EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
343
344 allocator_->OnNetworkChanged(56000, 0, 50);
345 EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
346 EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
347
348 allocator_->RemoveObserver(&enforced_observer);
349 allocator_->RemoveObserver(&not_enforced_observer);
350}
351
352TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
353 TestBitrateObserver observer;
354 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700355 allocator_->AddObserver(&observer, 30000, 300000, 0, false);
mflodman101f2502016-06-09 17:21:19 +0200356 EXPECT_EQ(300000, start_bitrate);
357
358 allocator_->OnNetworkChanged(30000, 0, 50);
359 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
360
361 allocator_->OnNetworkChanged(20000, 0, 50);
362 EXPECT_EQ(0u, observer.last_bitrate_bps_);
363
364 allocator_->OnNetworkChanged(30000, 0, 50);
365 EXPECT_EQ(0u, observer.last_bitrate_bps_);
366
367 allocator_->OnNetworkChanged(49000, 0, 50);
368 EXPECT_EQ(0u, observer.last_bitrate_bps_);
369
370 allocator_->OnNetworkChanged(50000, 0, 50);
371 EXPECT_EQ(50000u, observer.last_bitrate_bps_);
372
373 allocator_->OnNetworkChanged(30000, 0, 50);
374 EXPECT_EQ(30000u, observer.last_bitrate_bps_);
375
376 allocator_->RemoveObserver(&observer);
377}
378
379TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
380 TestBitrateObserver observer;
381 int start_bitrate =
perkj71ee44c2016-06-15 00:47:53 -0700382 allocator_->AddObserver(&observer, 300000, 600000, 0, false);
mflodman101f2502016-06-09 17:21:19 +0200383 EXPECT_EQ(300000, start_bitrate);
384
385 allocator_->OnNetworkChanged(300000, 0, 50);
386 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
387
388 allocator_->OnNetworkChanged(200000, 0, 50);
389 EXPECT_EQ(0u, observer.last_bitrate_bps_);
390
391 allocator_->OnNetworkChanged(300000, 0, 50);
392 EXPECT_EQ(0u, observer.last_bitrate_bps_);
393
394 allocator_->OnNetworkChanged(329000, 0, 50);
395 EXPECT_EQ(0u, observer.last_bitrate_bps_);
396
397 allocator_->OnNetworkChanged(330000, 0, 50);
398 EXPECT_EQ(330000u, observer.last_bitrate_bps_);
399
400 allocator_->OnNetworkChanged(300000, 0, 50);
401 EXPECT_EQ(300000u, observer.last_bitrate_bps_);
402
403 allocator_->RemoveObserver(&observer);
perkjfea93092016-05-14 00:58:48 -0700404}
405
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000406} // namespace webrtc