blob: 3477c87a26f2f29313f2f49b2673002b2d13182a [file] [log] [blame]
Irfan Sheriffb2540bb2016-09-12 12:28:54 -07001/*
2 * Copyright (c) 2016 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#include <memory>
11
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "modules/congestion_controller/probe_controller.h"
13#include "modules/pacing/mock/mock_paced_sender.h"
14#include "rtc_base/logging.h"
15#include "system_wrappers/include/clock.h"
16#include "test/gmock.h"
17#include "test/gtest.h"
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070018
19using testing::_;
20using testing::AtLeast;
21using testing::NiceMock;
sergeyu80ed35e2016-11-28 13:11:13 -080022using testing::Return;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070023
24namespace webrtc {
25namespace test {
26
27namespace {
28
29constexpr int kMinBitrateBps = 100;
30constexpr int kStartBitrateBps = 300;
sergeyu07c147d2016-11-03 11:59:50 -070031constexpr int kMaxBitrateBps = 10000;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070032
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070033constexpr int kExponentialProbingTimeoutMs = 5000;
34
sergeyu80ed35e2016-11-28 13:11:13 -080035constexpr int kAlrProbeInterval = 5000;
terelius3376c842017-07-31 04:23:25 -070036constexpr int kAlrEndedTimeoutMs = 3000;
37constexpr int kBitrateDropTimeoutMs = 5000;
sergeyu80ed35e2016-11-28 13:11:13 -080038
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070039} // namespace
40
41class ProbeControllerTest : public ::testing::Test {
42 protected:
sergeyu80ed35e2016-11-28 13:11:13 -080043 ProbeControllerTest() : clock_(100000000L) {
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070044 probe_controller_.reset(new ProbeController(&pacer_, &clock_));
45 }
46 ~ProbeControllerTest() override {}
47
48 SimulatedClock clock_;
49 NiceMock<MockPacedSender> pacer_;
50 std::unique_ptr<ProbeController> probe_controller_;
51};
52
53TEST_F(ProbeControllerTest, InitiatesProbingAtStart) {
philipelfd58b612017-01-04 07:05:25 -080054 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070055 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
56 kMaxBitrateBps);
57}
58
Sergey Ulanove2b15012016-11-22 16:08:30 -080059TEST_F(ProbeControllerTest, ProbeOnlyWhenNetworkIsUp) {
60 probe_controller_->OnNetworkStateChanged(kNetworkDown);
philipelfd58b612017-01-04 07:05:25 -080061 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
Sergey Ulanove2b15012016-11-22 16:08:30 -080062 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
63 kMaxBitrateBps);
64
65 testing::Mock::VerifyAndClearExpectations(&pacer_);
philipelfd58b612017-01-04 07:05:25 -080066 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
Sergey Ulanove2b15012016-11-22 16:08:30 -080067 probe_controller_->OnNetworkStateChanged(kNetworkUp);
68}
69
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070070TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncrease) {
philipelfd58b612017-01-04 07:05:25 -080071 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070072 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
73 kMaxBitrateBps);
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070074 // Long enough to time out exponential probing.
75 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070076 probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
sergeyu9cef11b2016-12-02 11:03:01 -080077 probe_controller_->Process();
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070078
philipelfd58b612017-01-04 07:05:25 -080079 EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070080 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
81 kMaxBitrateBps + 100);
82}
83
philipelda5e9d02017-01-17 02:08:28 -080084TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncreaseAtMaxBitrate) {
85 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
86 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
87 kMaxBitrateBps);
88 // Long enough to time out exponential probing.
89 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
90 probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
91 probe_controller_->Process();
92
93 probe_controller_->SetEstimatedBitrate(kMaxBitrateBps);
94 EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
95 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
96 kMaxBitrateBps + 100);
97}
98
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070099TEST_F(ProbeControllerTest, TestExponentialProbing) {
100 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
101 kMaxBitrateBps);
sergeyu07c147d2016-11-03 11:59:50 -0700102
sergeyu5bc39452016-12-15 10:42:09 -0800103 // Repeated probe should only be sent when estimated bitrate climbs above
104 // 0.7 * 6 * kStartBitrateBps = 1260.
philipelfd58b612017-01-04 07:05:25 -0800105 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
sergeyu9cef11b2016-12-02 11:03:01 -0800106 probe_controller_->SetEstimatedBitrate(1000);
107 testing::Mock::VerifyAndClearExpectations(&pacer_);
108
philipelfd58b612017-01-04 07:05:25 -0800109 EXPECT_CALL(pacer_, CreateProbeCluster(2 * 1800));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700110 probe_controller_->SetEstimatedBitrate(1800);
111}
112
113TEST_F(ProbeControllerTest, TestExponentialProbingTimeout) {
114 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
115 kMaxBitrateBps);
116
117 // Advance far enough to cause a time out in waiting for probing result.
Irfan Sheriff9b7b7532016-09-16 11:30:44 -0700118 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
sergeyu9cef11b2016-12-02 11:03:01 -0800119 probe_controller_->Process();
120
philipelfd58b612017-01-04 07:05:25 -0800121 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700122 probe_controller_->SetEstimatedBitrate(1800);
123}
124
terelius3376c842017-07-31 04:23:25 -0700125TEST_F(ProbeControllerTest, RequestProbeInAlr) {
philipelfd58b612017-01-04 07:05:25 -0800126 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800127 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
128 kMaxBitrateBps);
129 probe_controller_->SetEstimatedBitrate(500);
130 testing::Mock::VerifyAndClearExpectations(&pacer_);
terelius3376c842017-07-31 04:23:25 -0700131 EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
sergeyu80ed35e2016-11-28 13:11:13 -0800132 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100133 .WillRepeatedly(Return(clock_.TimeInMilliseconds()));
sergeyu80ed35e2016-11-28 13:11:13 -0800134 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
sergeyu9cef11b2016-12-02 11:03:01 -0800135 probe_controller_->Process();
terelius3376c842017-07-31 04:23:25 -0700136 probe_controller_->SetEstimatedBitrate(250);
137 probe_controller_->RequestProbe();
138}
139
140TEST_F(ProbeControllerTest, RequestProbeWhenAlrEndedRecently) {
141 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
142 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
143 kMaxBitrateBps);
144 probe_controller_->SetEstimatedBitrate(500);
145 testing::Mock::VerifyAndClearExpectations(&pacer_);
146 EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
147 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100148 .WillRepeatedly(Return(rtc::nullopt));
terelius3376c842017-07-31 04:23:25 -0700149 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
150 probe_controller_->Process();
151 probe_controller_->SetEstimatedBitrate(250);
152 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
153 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs - 1);
154 probe_controller_->RequestProbe();
155}
156
157TEST_F(ProbeControllerTest, RequestProbeWhenAlrNotEndedRecently) {
158 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
159 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
160 kMaxBitrateBps);
161 probe_controller_->SetEstimatedBitrate(500);
162 testing::Mock::VerifyAndClearExpectations(&pacer_);
163 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
164 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100165 .WillRepeatedly(Return(rtc::nullopt));
terelius3376c842017-07-31 04:23:25 -0700166 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
167 probe_controller_->Process();
168 probe_controller_->SetEstimatedBitrate(250);
169 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
170 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs + 1);
171 probe_controller_->RequestProbe();
172}
173
174TEST_F(ProbeControllerTest, RequestProbeWhenBweDropNotRecent) {
175 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
176 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
177 kMaxBitrateBps);
178 probe_controller_->SetEstimatedBitrate(500);
179 testing::Mock::VerifyAndClearExpectations(&pacer_);
180 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
181 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100182 .WillRepeatedly(Return(clock_.TimeInMilliseconds()));
terelius3376c842017-07-31 04:23:25 -0700183 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
184 probe_controller_->Process();
185 probe_controller_->SetEstimatedBitrate(250);
186 clock_.AdvanceTimeMilliseconds(kBitrateDropTimeoutMs + 1);
187 probe_controller_->RequestProbe();
sergeyu80ed35e2016-11-28 13:11:13 -0800188}
189
190TEST_F(ProbeControllerTest, PeriodicProbing) {
philipelfd58b612017-01-04 07:05:25 -0800191 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800192 probe_controller_->EnablePeriodicAlrProbing(true);
193 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
194 kMaxBitrateBps);
195 probe_controller_->SetEstimatedBitrate(500);
196 testing::Mock::VerifyAndClearExpectations(&pacer_);
197
198 int64_t start_time = clock_.TimeInMilliseconds();
199
200 // Expect the controller to send a new probe after 5s has passed.
philipelfd58b612017-01-04 07:05:25 -0800201 EXPECT_CALL(pacer_, CreateProbeCluster(1000)).Times(1);
sergeyu80ed35e2016-11-28 13:11:13 -0800202 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100203 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800204 clock_.AdvanceTimeMilliseconds(5000);
205 probe_controller_->Process();
206 probe_controller_->SetEstimatedBitrate(500);
207 testing::Mock::VerifyAndClearExpectations(&pacer_);
208
209 // The following probe should be sent at 10s into ALR.
philipelfd58b612017-01-04 07:05:25 -0800210 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
sergeyu80ed35e2016-11-28 13:11:13 -0800211 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100212 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800213 clock_.AdvanceTimeMilliseconds(4000);
214 probe_controller_->Process();
215 probe_controller_->SetEstimatedBitrate(500);
216 testing::Mock::VerifyAndClearExpectations(&pacer_);
217
philipelfd58b612017-01-04 07:05:25 -0800218 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(1);
sergeyu80ed35e2016-11-28 13:11:13 -0800219 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100220 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800221 clock_.AdvanceTimeMilliseconds(1000);
222 probe_controller_->Process();
223 probe_controller_->SetEstimatedBitrate(500);
224 testing::Mock::VerifyAndClearExpectations(&pacer_);
225}
226
philipeld1d247f2017-05-04 08:35:52 -0700227TEST_F(ProbeControllerTest, PeriodicProbingAfterReset) {
228 testing::StrictMock<MockPacedSender> local_pacer;
229 probe_controller_.reset(new ProbeController(&local_pacer, &clock_));
230 int64_t alr_start_time = clock_.TimeInMilliseconds();
231 EXPECT_CALL(local_pacer, GetApplicationLimitedRegionStartTime())
Oskar Sundbom5b8c0a22017-11-16 10:56:55 +0100232 .WillRepeatedly(Return(alr_start_time));
philipeld1d247f2017-05-04 08:35:52 -0700233
234 EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
235 probe_controller_->EnablePeriodicAlrProbing(true);
236 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
237 kMaxBitrateBps);
238 probe_controller_->Reset();
239
240 clock_.AdvanceTimeMilliseconds(10000);
241 probe_controller_->Process();
242
243 EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
244 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
245 kMaxBitrateBps);
246
247 // Make sure we use |kStartBitrateBps| as the estimated bitrate
248 // until SetEstimatedBitrate is called with an updated estimate.
249 clock_.AdvanceTimeMilliseconds(10000);
250 EXPECT_CALL(local_pacer, CreateProbeCluster(kStartBitrateBps*2));
251 probe_controller_->Process();
252}
253
sergeyu5bc39452016-12-15 10:42:09 -0800254TEST_F(ProbeControllerTest, TestExponentialProbingOverflow) {
255 const int64_t kMbpsMultiplier = 1000000;
256 probe_controller_->SetBitrates(kMinBitrateBps, 10 * kMbpsMultiplier,
257 100 * kMbpsMultiplier);
258
259 // Verify that probe bitrate is capped at the specified max bitrate
philipelfd58b612017-01-04 07:05:25 -0800260 EXPECT_CALL(pacer_, CreateProbeCluster(100 * kMbpsMultiplier));
sergeyu5bc39452016-12-15 10:42:09 -0800261 probe_controller_->SetEstimatedBitrate(60 * kMbpsMultiplier);
262 testing::Mock::VerifyAndClearExpectations(&pacer_);
263
264 // Verify that repeated probes aren't sent.
philipelfd58b612017-01-04 07:05:25 -0800265 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
sergeyu5bc39452016-12-15 10:42:09 -0800266 probe_controller_->SetEstimatedBitrate(100 * kMbpsMultiplier);
267}
268
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700269} // namespace test
270} // namespace webrtc