blob: da333d3c1d8599c5e57611dcb683e7f0944b8af1 [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
Danil Chapovalovbda50682018-02-14 09:08:28 +000012#include "modules/congestion_controller/probe_controller.h"
Sebastian Janssonea86bb72018-02-14 16:53:38 +000013#include "modules/pacing/mock/mock_paced_sender.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#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
Sebastian Jansson56da2f72018-02-28 13:07:28 +010041class LegacyProbeControllerTest : public ::testing::Test {
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070042 protected:
Sebastian Jansson56da2f72018-02-28 13:07:28 +010043 LegacyProbeControllerTest() : clock_(100000000L) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000044 probe_controller_.reset(new ProbeController(&pacer_, &clock_));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070045 }
Sebastian Jansson56da2f72018-02-28 13:07:28 +010046 ~LegacyProbeControllerTest() override {}
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070047
48 SimulatedClock clock_;
Sebastian Janssonea86bb72018-02-14 16:53:38 +000049 NiceMock<MockPacedSender> pacer_;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070050 std::unique_ptr<ProbeController> probe_controller_;
51};
52
Sebastian Jansson56da2f72018-02-28 13:07:28 +010053TEST_F(LegacyProbeControllerTest, InitiatesProbingAtStart) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000054 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070055 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000056 kMaxBitrateBps);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070057}
58
Sebastian Jansson56da2f72018-02-28 13:07:28 +010059TEST_F(LegacyProbeControllerTest, ProbeOnlyWhenNetworkIsUp) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000060 probe_controller_->OnNetworkStateChanged(kNetworkDown);
61 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
Sergey Ulanove2b15012016-11-22 16:08:30 -080062 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000063 kMaxBitrateBps);
Sergey Ulanove2b15012016-11-22 16:08:30 -080064
Sebastian Janssonea86bb72018-02-14 16:53:38 +000065 testing::Mock::VerifyAndClearExpectations(&pacer_);
66 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
67 probe_controller_->OnNetworkStateChanged(kNetworkUp);
Sergey Ulanove2b15012016-11-22 16:08:30 -080068}
69
Sebastian Jansson56da2f72018-02-28 13:07:28 +010070TEST_F(LegacyProbeControllerTest, InitiatesProbingOnMaxBitrateIncrease) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000071 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070072 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000073 kMaxBitrateBps);
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070074 // Long enough to time out exponential probing.
75 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Janssonea86bb72018-02-14 16:53:38 +000076 probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
77 probe_controller_->Process();
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070078
Sebastian Janssonea86bb72018-02-14 16:53:38 +000079 EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070080 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000081 kMaxBitrateBps + 100);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070082}
83
Sebastian Jansson56da2f72018-02-28 13:07:28 +010084TEST_F(LegacyProbeControllerTest,
85 InitiatesProbingOnMaxBitrateIncreaseAtMaxBitrate) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +000086 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
philipelda5e9d02017-01-17 02:08:28 -080087 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000088 kMaxBitrateBps);
philipelda5e9d02017-01-17 02:08:28 -080089 // Long enough to time out exponential probing.
90 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Janssonea86bb72018-02-14 16:53:38 +000091 probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
92 probe_controller_->Process();
philipelda5e9d02017-01-17 02:08:28 -080093
Sebastian Janssonea86bb72018-02-14 16:53:38 +000094 probe_controller_->SetEstimatedBitrate(kMaxBitrateBps);
95 EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
philipelda5e9d02017-01-17 02:08:28 -080096 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +000097 kMaxBitrateBps + 100);
philipelda5e9d02017-01-17 02:08:28 -080098}
99
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100100TEST_F(LegacyProbeControllerTest, TestExponentialProbing) {
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700101 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000102 kMaxBitrateBps);
sergeyu07c147d2016-11-03 11:59:50 -0700103
sergeyu5bc39452016-12-15 10:42:09 -0800104 // Repeated probe should only be sent when estimated bitrate climbs above
105 // 0.7 * 6 * kStartBitrateBps = 1260.
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000106 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
107 probe_controller_->SetEstimatedBitrate(1000);
108 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu9cef11b2016-12-02 11:03:01 -0800109
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000110 EXPECT_CALL(pacer_, CreateProbeCluster(2 * 1800));
111 probe_controller_->SetEstimatedBitrate(1800);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700112}
113
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100114TEST_F(LegacyProbeControllerTest, TestExponentialProbingTimeout) {
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700115 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000116 kMaxBitrateBps);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700117
118 // Advance far enough to cause a time out in waiting for probing result.
Irfan Sheriff9b7b7532016-09-16 11:30:44 -0700119 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000120 probe_controller_->Process();
sergeyu9cef11b2016-12-02 11:03:01 -0800121
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000122 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
123 probe_controller_->SetEstimatedBitrate(1800);
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700124}
125
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100126TEST_F(LegacyProbeControllerTest, RequestProbeInAlr) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000127 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800128 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000129 kMaxBitrateBps);
130 probe_controller_->SetEstimatedBitrate(500);
131 testing::Mock::VerifyAndClearExpectations(&pacer_);
132 EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
133 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
134 .WillRepeatedly(Return(clock_.TimeInMilliseconds()));
sergeyu80ed35e2016-11-28 13:11:13 -0800135 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000136 probe_controller_->Process();
137 probe_controller_->SetEstimatedBitrate(250);
138 probe_controller_->RequestProbe();
terelius3376c842017-07-31 04:23:25 -0700139}
140
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100141TEST_F(LegacyProbeControllerTest, RequestProbeWhenAlrEndedRecently) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000142 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700143 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000144 kMaxBitrateBps);
145 probe_controller_->SetEstimatedBitrate(500);
146 testing::Mock::VerifyAndClearExpectations(&pacer_);
147 EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
148 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
149 .WillRepeatedly(Return(rtc::nullopt));
terelius3376c842017-07-31 04:23:25 -0700150 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000151 probe_controller_->Process();
152 probe_controller_->SetEstimatedBitrate(250);
terelius3376c842017-07-31 04:23:25 -0700153 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
154 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs - 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000155 probe_controller_->RequestProbe();
terelius3376c842017-07-31 04:23:25 -0700156}
157
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100158TEST_F(LegacyProbeControllerTest, RequestProbeWhenAlrNotEndedRecently) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000159 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700160 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000161 kMaxBitrateBps);
162 probe_controller_->SetEstimatedBitrate(500);
163 testing::Mock::VerifyAndClearExpectations(&pacer_);
164 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
165 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
166 .WillRepeatedly(Return(rtc::nullopt));
terelius3376c842017-07-31 04:23:25 -0700167 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000168 probe_controller_->Process();
169 probe_controller_->SetEstimatedBitrate(250);
terelius3376c842017-07-31 04:23:25 -0700170 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
171 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000172 probe_controller_->RequestProbe();
terelius3376c842017-07-31 04:23:25 -0700173}
174
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100175TEST_F(LegacyProbeControllerTest, RequestProbeWhenBweDropNotRecent) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000176 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700177 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000178 kMaxBitrateBps);
179 probe_controller_->SetEstimatedBitrate(500);
180 testing::Mock::VerifyAndClearExpectations(&pacer_);
181 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
182 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
183 .WillRepeatedly(Return(clock_.TimeInMilliseconds()));
terelius3376c842017-07-31 04:23:25 -0700184 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000185 probe_controller_->Process();
186 probe_controller_->SetEstimatedBitrate(250);
terelius3376c842017-07-31 04:23:25 -0700187 clock_.AdvanceTimeMilliseconds(kBitrateDropTimeoutMs + 1);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000188 probe_controller_->RequestProbe();
sergeyu80ed35e2016-11-28 13:11:13 -0800189}
190
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100191TEST_F(LegacyProbeControllerTest, PeriodicProbing) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000192 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800193 probe_controller_->EnablePeriodicAlrProbing(true);
194 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000195 kMaxBitrateBps);
196 probe_controller_->SetEstimatedBitrate(500);
197 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu80ed35e2016-11-28 13:11:13 -0800198
199 int64_t start_time = clock_.TimeInMilliseconds();
200
201 // Expect the controller to send a new probe after 5s has passed.
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000202 EXPECT_CALL(pacer_, CreateProbeCluster(1000)).Times(1);
203 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
204 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800205 clock_.AdvanceTimeMilliseconds(5000);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000206 probe_controller_->Process();
207 probe_controller_->SetEstimatedBitrate(500);
208 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu80ed35e2016-11-28 13:11:13 -0800209
210 // The following probe should be sent at 10s into ALR.
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000211 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
212 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
213 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800214 clock_.AdvanceTimeMilliseconds(4000);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000215 probe_controller_->Process();
216 probe_controller_->SetEstimatedBitrate(500);
217 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu80ed35e2016-11-28 13:11:13 -0800218
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000219 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(1);
220 EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
221 .WillRepeatedly(Return(start_time));
sergeyu80ed35e2016-11-28 13:11:13 -0800222 clock_.AdvanceTimeMilliseconds(1000);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000223 probe_controller_->Process();
224 probe_controller_->SetEstimatedBitrate(500);
225 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu80ed35e2016-11-28 13:11:13 -0800226}
227
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100228TEST_F(LegacyProbeControllerTest, PeriodicProbingAfterReset) {
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000229 testing::StrictMock<MockPacedSender> local_pacer;
230 probe_controller_.reset(new ProbeController(&local_pacer, &clock_));
philipeld1d247f2017-05-04 08:35:52 -0700231 int64_t alr_start_time = clock_.TimeInMilliseconds();
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000232 EXPECT_CALL(local_pacer, GetApplicationLimitedRegionStartTime())
233 .WillRepeatedly(Return(alr_start_time));
philipeld1d247f2017-05-04 08:35:52 -0700234
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000235 EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
philipeld1d247f2017-05-04 08:35:52 -0700236 probe_controller_->EnablePeriodicAlrProbing(true);
237 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000238 kMaxBitrateBps);
239 probe_controller_->Reset();
philipeld1d247f2017-05-04 08:35:52 -0700240
241 clock_.AdvanceTimeMilliseconds(10000);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000242 probe_controller_->Process();
philipeld1d247f2017-05-04 08:35:52 -0700243
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000244 EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
philipeld1d247f2017-05-04 08:35:52 -0700245 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000246 kMaxBitrateBps);
philipeld1d247f2017-05-04 08:35:52 -0700247
248 // Make sure we use |kStartBitrateBps| as the estimated bitrate
249 // until SetEstimatedBitrate is called with an updated estimate.
250 clock_.AdvanceTimeMilliseconds(10000);
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000251 EXPECT_CALL(local_pacer, CreateProbeCluster(kStartBitrateBps*2));
252 probe_controller_->Process();
philipeld1d247f2017-05-04 08:35:52 -0700253}
254
Sebastian Jansson56da2f72018-02-28 13:07:28 +0100255TEST_F(LegacyProbeControllerTest, TestExponentialProbingOverflow) {
sergeyu5bc39452016-12-15 10:42:09 -0800256 const int64_t kMbpsMultiplier = 1000000;
257 probe_controller_->SetBitrates(kMinBitrateBps, 10 * kMbpsMultiplier,
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000258 100 * kMbpsMultiplier);
sergeyu5bc39452016-12-15 10:42:09 -0800259
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000260 // Verify that probe bitrate is capped at the specified max bitrate
261 EXPECT_CALL(pacer_, CreateProbeCluster(100 * kMbpsMultiplier));
262 probe_controller_->SetEstimatedBitrate(60 * kMbpsMultiplier);
263 testing::Mock::VerifyAndClearExpectations(&pacer_);
sergeyu5bc39452016-12-15 10:42:09 -0800264
265 // Verify that repeated probes aren't sent.
Sebastian Janssonea86bb72018-02-14 16:53:38 +0000266 EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
267 probe_controller_->SetEstimatedBitrate(100 * kMbpsMultiplier);
sergeyu5bc39452016-12-15 10:42:09 -0800268}
269
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700270} // namespace test
271} // namespace webrtc