blob: 63149acbe317786239c792d81158ee26cd488e0c [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
15#include "testing/gtest/include/gtest/gtest.h"
mflodman0e7e2592015-11-12 21:02:42 -080016#include "webrtc/call/bitrate_allocator.h"
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000017#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
18
19namespace webrtc {
20
mflodman86aabb22016-03-11 15:44:32 +010021class TestBitrateObserver : public BitrateAllocatorObserver {
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000022 public:
23 TestBitrateObserver()
24 : last_bitrate_(0), last_fraction_loss_(0), last_rtt_(0) {}
25
mflodman86aabb22016-03-11 15:44:32 +010026 virtual void OnBitrateUpdated(uint32_t bitrate,
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000027 uint8_t fraction_loss,
28 int64_t rtt) {
29 last_bitrate_ = bitrate;
30 last_fraction_loss_ = fraction_loss;
31 last_rtt_ = rtt;
32 }
33 uint32_t last_bitrate_;
34 uint8_t last_fraction_loss_;
35 int64_t last_rtt_;
36};
37
38class BitrateAllocatorTest : public ::testing::Test {
39 protected:
Stefan Holmere5904162015-03-26 11:11:06 +010040 BitrateAllocatorTest() : allocator_(new BitrateAllocator()) {
41 allocator_->OnNetworkChanged(300000u, 0, 0);
42 }
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000043 ~BitrateAllocatorTest() {}
44
kwibergb25345e2016-03-12 06:10:44 -080045 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000046};
47
48TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
49 TestBitrateObserver bitrate_observer;
Peter Boström8e4e8b02015-09-15 15:08:03 +020050 int start_bitrate =
mflodman86aabb22016-03-11 15:44:32 +010051 allocator_->AddObserver(&bitrate_observer, 100000, 1500000);
Stefan Holmere5904162015-03-26 11:11:06 +010052 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000053 allocator_->OnNetworkChanged(200000, 0, 0);
54 EXPECT_EQ(200000u, bitrate_observer.last_bitrate_);
55
Peter Boström8e4e8b02015-09-15 15:08:03 +020056 // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
mflodman0e7e2592015-11-12 21:02:42 -080057 // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
Peter Boström8e4e8b02015-09-15 15:08:03 +020058 allocator_->OnNetworkChanged(4000000, 0, 0);
59 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_);
mflodman86aabb22016-03-11 15:44:32 +010060 start_bitrate = allocator_->AddObserver(&bitrate_observer, 100000, 4000000);
Peter Boström8e4e8b02015-09-15 15:08:03 +020061 EXPECT_EQ(4000000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000062
mflodman86aabb22016-03-11 15:44:32 +010063 start_bitrate = allocator_->AddObserver(&bitrate_observer, 100000, 1500000);
Peter Boström8e4e8b02015-09-15 15:08:03 +020064 EXPECT_EQ(3000000, start_bitrate);
65 EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000066 allocator_->OnNetworkChanged(1500000, 0, 0);
67 EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_);
68}
69
70TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
71 TestBitrateObserver bitrate_observer_1;
72 TestBitrateObserver bitrate_observer_2;
Peter Boström8e4e8b02015-09-15 15:08:03 +020073 int start_bitrate =
mflodman86aabb22016-03-11 15:44:32 +010074 allocator_->AddObserver(&bitrate_observer_1, 100000, 300000);
Stefan Holmere5904162015-03-26 11:11:06 +010075 EXPECT_EQ(300000, start_bitrate);
mflodman86aabb22016-03-11 15:44:32 +010076 start_bitrate = allocator_->AddObserver(&bitrate_observer_2, 200000, 300000);
Stefan Holmere5904162015-03-26 11:11:06 +010077 EXPECT_EQ(200000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +000078
79 // Test too low start bitrate, hence lower than sum of min. Min bitrates will
80 // be allocated to all observers.
81 allocator_->OnNetworkChanged(200000, 0, 50);
82 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
83 EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
84 EXPECT_EQ(50, bitrate_observer_1.last_rtt_);
85 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
86 EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
87 EXPECT_EQ(50, bitrate_observer_2.last_rtt_);
88
89 // Test a bitrate which should be distributed equally.
90 allocator_->OnNetworkChanged(500000, 0, 50);
91 const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
92 EXPECT_EQ(100000u + kBitrateToShare / 2, bitrate_observer_1.last_bitrate_);
93 EXPECT_EQ(200000u + kBitrateToShare / 2, bitrate_observer_2.last_bitrate_);
94
Stefan Holmere5904162015-03-26 11:11:06 +010095 // Limited by 2x max bitrates since we leave room for FEC and retransmissions.
96 allocator_->OnNetworkChanged(1500000, 0, 50);
97 EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_);
98 EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_);
perkjec81bcd2016-05-11 06:01:13 -070099
100 // Verify that if the bandwidth estimate is set to zero, the allocated rate is
101 // zero.
102 allocator_->OnNetworkChanged(0, 0, 50);
103 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_);
104 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000105}
106
107class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
108 protected:
109 BitrateAllocatorTestNoEnforceMin() : allocator_(new BitrateAllocator()) {
110 allocator_->EnforceMinBitrate(false);
Stefan Holmere5904162015-03-26 11:11:06 +0100111 allocator_->OnNetworkChanged(300000u, 0, 0);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000112 }
113 ~BitrateAllocatorTestNoEnforceMin() {}
114
kwibergb25345e2016-03-12 06:10:44 -0800115 std::unique_ptr<BitrateAllocator> allocator_;
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000116};
117
118// The following three tests verify that the EnforceMinBitrate() method works
119// as intended.
120TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
121 TestBitrateObserver bitrate_observer_1;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200122 int start_bitrate =
mflodman86aabb22016-03-11 15:44:32 +0100123 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100124 EXPECT_EQ(300000, start_bitrate);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000125
126 // High REMB.
127 allocator_->OnNetworkChanged(150000, 0, 0);
128 EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_);
129
130 // Low REMB.
131 allocator_->OnNetworkChanged(10000, 0, 0);
132 EXPECT_EQ(10000u, bitrate_observer_1.last_bitrate_);
133
mflodman86aabb22016-03-11 15:44:32 +0100134 allocator_->RemoveObserver(&bitrate_observer_1);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000135}
136
137TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
138 TestBitrateObserver bitrate_observer_1;
139 TestBitrateObserver bitrate_observer_2;
140 TestBitrateObserver bitrate_observer_3;
141 // Set up the observers with min bitrates at 100000, 200000, and 300000.
Peter Boström8e4e8b02015-09-15 15:08:03 +0200142 int start_bitrate =
mflodman86aabb22016-03-11 15:44:32 +0100143 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100144 EXPECT_EQ(300000, start_bitrate);
145
mflodman86aabb22016-03-11 15:44:32 +0100146 start_bitrate = allocator_->AddObserver(&bitrate_observer_2, 200000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100147 EXPECT_EQ(200000, start_bitrate);
148 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
149
mflodman86aabb22016-03-11 15:44:32 +0100150 start_bitrate = allocator_->AddObserver(&bitrate_observer_3, 300000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100151 EXPECT_EQ(0, start_bitrate);
152 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
153 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000154
155 // High REMB. Make sure the controllers get a fair share of the surplus
156 // (i.e., what is left after each controller gets its min rate).
157 allocator_->OnNetworkChanged(690000, 0, 0);
158 // Verify that each observer gets its min rate (sum of min rates is 600000),
159 // and that the remaining 90000 is divided equally among the three.
Stefan Holmere5904162015-03-26 11:11:06 +0100160 uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
161 EXPECT_EQ(100000u + bitrate_to_share / 3, bitrate_observer_1.last_bitrate_);
162 EXPECT_EQ(200000u + bitrate_to_share / 3, bitrate_observer_2.last_bitrate_);
163 EXPECT_EQ(300000u + bitrate_to_share / 3, bitrate_observer_3.last_bitrate_);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000164
165 // High REMB, but below the sum of min bitrates.
166 allocator_->OnNetworkChanged(500000, 0, 0);
167 // Verify that the first and second observers get their min bitrates, and the
168 // third gets the remainder.
169 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min bitrate.
170 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min bitrate.
171 EXPECT_EQ(200000u, bitrate_observer_3.last_bitrate_); // Remainder.
172
173 // Low REMB.
174 allocator_->OnNetworkChanged(10000, 0, 0);
175 // Verify that the first observer gets all the rate, and the rest get zero.
176 EXPECT_EQ(10000u, bitrate_observer_1.last_bitrate_);
177 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
178 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_);
179
perkjec81bcd2016-05-11 06:01:13 -0700180 allocator_->OnNetworkChanged(0, 0, 0);
181 // Verify that zero estimated bandwidth, means that that all gets zero,
182 // regardless of set min bitrate.
183 EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_);
184 EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_);
185 EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_);
186
mflodman86aabb22016-03-11 15:44:32 +0100187 allocator_->RemoveObserver(&bitrate_observer_1);
188 allocator_->RemoveObserver(&bitrate_observer_2);
189 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000190}
191
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000192TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowRembEnforceMin) {
193 TestBitrateObserver bitrate_observer_1;
194 TestBitrateObserver bitrate_observer_2;
195 TestBitrateObserver bitrate_observer_3;
Peter Boström8e4e8b02015-09-15 15:08:03 +0200196 int start_bitrate =
mflodman86aabb22016-03-11 15:44:32 +0100197 allocator_->AddObserver(&bitrate_observer_1, 100000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100198 EXPECT_EQ(300000, start_bitrate);
199
mflodman86aabb22016-03-11 15:44:32 +0100200 start_bitrate = allocator_->AddObserver(&bitrate_observer_2, 200000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100201 EXPECT_EQ(200000, start_bitrate);
202 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_);
203
mflodman86aabb22016-03-11 15:44:32 +0100204 start_bitrate = allocator_->AddObserver(&bitrate_observer_3, 300000, 400000);
Stefan Holmere5904162015-03-26 11:11:06 +0100205 EXPECT_EQ(300000, start_bitrate);
206 EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_));
207 EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_));
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000208
209 // Low REMB. Verify that all observers still get their respective min bitrate.
210 allocator_->OnNetworkChanged(1000, 0, 0);
211 EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_); // Min cap.
212 EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_); // Min cap.
213 EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_); // Min cap.
214
mflodman86aabb22016-03-11 15:44:32 +0100215 allocator_->RemoveObserver(&bitrate_observer_1);
216 allocator_->RemoveObserver(&bitrate_observer_2);
217 allocator_->RemoveObserver(&bitrate_observer_3);
stefan@webrtc.org792f1a12015-03-04 12:24:26 +0000218}
219} // namespace webrtc