blob: ac889dcd7cdff33ca0ed0f9d8f676f1b38a63ebe [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
Sebastian Jansson57daeb72018-02-05 17:15:09 +010012#include "modules/congestion_controller/network_control/include/network_types.h"
Danil Chapovalovbda50682018-02-14 09:08:28 +000013#include "modules/congestion_controller/probe_controller.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;
Sebastian Jansson57daeb72018-02-05 17:15:09 +010021using testing::Field;
22using testing::Matcher;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070023using testing::NiceMock;
sergeyu80ed35e2016-11-28 13:11:13 -080024using testing::Return;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070025
Sebastian Jansson57daeb72018-02-05 17:15:09 +010026using webrtc::ProbeClusterConfig;
27
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070028namespace webrtc {
29namespace test {
30
31namespace {
32
33constexpr int kMinBitrateBps = 100;
34constexpr int kStartBitrateBps = 300;
sergeyu07c147d2016-11-03 11:59:50 -070035constexpr int kMaxBitrateBps = 10000;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070036
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070037constexpr int kExponentialProbingTimeoutMs = 5000;
38
sergeyu80ed35e2016-11-28 13:11:13 -080039constexpr int kAlrProbeInterval = 5000;
terelius3376c842017-07-31 04:23:25 -070040constexpr int kAlrEndedTimeoutMs = 3000;
41constexpr int kBitrateDropTimeoutMs = 5000;
sergeyu80ed35e2016-11-28 13:11:13 -080042
Sebastian Jansson57daeb72018-02-05 17:15:09 +010043inline Matcher<ProbeClusterConfig> DataRateEqBps(int bps) {
44 return Field(&ProbeClusterConfig::target_data_rate, DataRate::bps(bps));
45}
46class MockNetworkControllerObserver : public NetworkControllerObserver {
47 public:
48 MOCK_METHOD1(OnCongestionWindow, void(CongestionWindow));
49 MOCK_METHOD1(OnPacerConfig, void(PacerConfig));
50 MOCK_METHOD1(OnProbeClusterConfig, void(ProbeClusterConfig));
51 MOCK_METHOD1(OnTargetTransferRate, void(TargetTransferRate));
52};
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070053} // namespace
54
55class ProbeControllerTest : public ::testing::Test {
56 protected:
sergeyu80ed35e2016-11-28 13:11:13 -080057 ProbeControllerTest() : clock_(100000000L) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +010058 probe_controller_.reset(new ProbeController(&cluster_handler_));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070059 }
60 ~ProbeControllerTest() override {}
61
Sebastian Jansson57daeb72018-02-05 17:15:09 +010062 void SetNetworkAvailable(bool available) {
63 NetworkAvailability msg;
64 msg.at_time = Timestamp::ms(NowMs());
65 msg.network_available = available;
66 probe_controller_->OnNetworkAvailability(msg);
67 }
68
69 int64_t NowMs() { return clock_.TimeInMilliseconds(); }
70
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070071 SimulatedClock clock_;
Sebastian Jansson57daeb72018-02-05 17:15:09 +010072 NiceMock<MockNetworkControllerObserver> cluster_handler_;
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070073 std::unique_ptr<ProbeController> probe_controller_;
74};
75
76TEST_F(ProbeControllerTest, InitiatesProbingAtStart) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +010077 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070078 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +010079 kMaxBitrateBps, NowMs());
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070080}
81
Sergey Ulanove2b15012016-11-22 16:08:30 -080082TEST_F(ProbeControllerTest, ProbeOnlyWhenNetworkIsUp) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +010083 SetNetworkAvailable(false);
84 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
Sergey Ulanove2b15012016-11-22 16:08:30 -080085 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +010086 kMaxBitrateBps, NowMs());
Sergey Ulanove2b15012016-11-22 16:08:30 -080087
Sebastian Jansson57daeb72018-02-05 17:15:09 +010088 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
89 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(AtLeast(2));
90 SetNetworkAvailable(true);
Sergey Ulanove2b15012016-11-22 16:08:30 -080091}
92
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070093TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncrease) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +010094 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(AtLeast(2));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -070095 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +010096 kMaxBitrateBps, NowMs());
Irfan Sheriff9b7b7532016-09-16 11:30:44 -070097 // Long enough to time out exponential probing.
98 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Jansson57daeb72018-02-05 17:15:09 +010099 probe_controller_->SetEstimatedBitrate(kStartBitrateBps, NowMs());
100 probe_controller_->Process(NowMs());
Irfan Sheriff9b7b7532016-09-16 11:30:44 -0700101
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100102 EXPECT_CALL(cluster_handler_,
103 OnProbeClusterConfig(DataRateEqBps(kMaxBitrateBps + 100)));
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700104 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100105 kMaxBitrateBps + 100, NowMs());
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700106}
107
philipelda5e9d02017-01-17 02:08:28 -0800108TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncreaseAtMaxBitrate) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100109 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(AtLeast(2));
philipelda5e9d02017-01-17 02:08:28 -0800110 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100111 kMaxBitrateBps, NowMs());
philipelda5e9d02017-01-17 02:08:28 -0800112 // Long enough to time out exponential probing.
113 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100114 probe_controller_->SetEstimatedBitrate(kStartBitrateBps, NowMs());
115 probe_controller_->Process(NowMs());
philipelda5e9d02017-01-17 02:08:28 -0800116
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100117 probe_controller_->SetEstimatedBitrate(kMaxBitrateBps, NowMs());
118 EXPECT_CALL(cluster_handler_,
119 OnProbeClusterConfig(DataRateEqBps(kMaxBitrateBps + 100)));
philipelda5e9d02017-01-17 02:08:28 -0800120 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100121 kMaxBitrateBps + 100, NowMs());
philipelda5e9d02017-01-17 02:08:28 -0800122}
123
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700124TEST_F(ProbeControllerTest, TestExponentialProbing) {
125 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100126 kMaxBitrateBps, NowMs());
sergeyu07c147d2016-11-03 11:59:50 -0700127
sergeyu5bc39452016-12-15 10:42:09 -0800128 // Repeated probe should only be sent when estimated bitrate climbs above
129 // 0.7 * 6 * kStartBitrateBps = 1260.
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100130 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
131 probe_controller_->SetEstimatedBitrate(1000, NowMs());
132 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu9cef11b2016-12-02 11:03:01 -0800133
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100134 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(DataRateEqBps(2 * 1800)));
135 probe_controller_->SetEstimatedBitrate(1800, NowMs());
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700136}
137
138TEST_F(ProbeControllerTest, TestExponentialProbingTimeout) {
139 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100140 kMaxBitrateBps, NowMs());
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700141
142 // Advance far enough to cause a time out in waiting for probing result.
Irfan Sheriff9b7b7532016-09-16 11:30:44 -0700143 clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100144 probe_controller_->Process(NowMs());
sergeyu9cef11b2016-12-02 11:03:01 -0800145
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100146 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
147 probe_controller_->SetEstimatedBitrate(1800, NowMs());
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700148}
149
terelius3376c842017-07-31 04:23:25 -0700150TEST_F(ProbeControllerTest, RequestProbeInAlr) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100151 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800152 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100153 kMaxBitrateBps, NowMs());
154 probe_controller_->SetEstimatedBitrate(500, NowMs());
155 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
156 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(DataRateEqBps(0.85 * 500)))
157 .Times(1);
158 probe_controller_->SetAlrStartTimeMs(clock_.TimeInMilliseconds());
sergeyu80ed35e2016-11-28 13:11:13 -0800159 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100160 probe_controller_->Process(NowMs());
161 probe_controller_->SetEstimatedBitrate(250, NowMs());
162 probe_controller_->RequestProbe(NowMs());
terelius3376c842017-07-31 04:23:25 -0700163}
164
165TEST_F(ProbeControllerTest, RequestProbeWhenAlrEndedRecently) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100166 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700167 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100168 kMaxBitrateBps, NowMs());
169 probe_controller_->SetEstimatedBitrate(500, NowMs());
170 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
171 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(DataRateEqBps(0.85 * 500)))
172 .Times(1);
173 probe_controller_->SetAlrStartTimeMs(rtc::nullopt);
terelius3376c842017-07-31 04:23:25 -0700174 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100175 probe_controller_->Process(NowMs());
176 probe_controller_->SetEstimatedBitrate(250, NowMs());
terelius3376c842017-07-31 04:23:25 -0700177 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
178 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs - 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100179 probe_controller_->RequestProbe(NowMs());
terelius3376c842017-07-31 04:23:25 -0700180}
181
182TEST_F(ProbeControllerTest, RequestProbeWhenAlrNotEndedRecently) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100183 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700184 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100185 kMaxBitrateBps, NowMs());
186 probe_controller_->SetEstimatedBitrate(500, NowMs());
187 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
188 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
189 probe_controller_->SetAlrStartTimeMs(rtc::nullopt);
terelius3376c842017-07-31 04:23:25 -0700190 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100191 probe_controller_->Process(NowMs());
192 probe_controller_->SetEstimatedBitrate(250, NowMs());
terelius3376c842017-07-31 04:23:25 -0700193 probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
194 clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100195 probe_controller_->RequestProbe(NowMs());
terelius3376c842017-07-31 04:23:25 -0700196}
197
198TEST_F(ProbeControllerTest, RequestProbeWhenBweDropNotRecent) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100199 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(2);
terelius3376c842017-07-31 04:23:25 -0700200 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100201 kMaxBitrateBps, NowMs());
202 probe_controller_->SetEstimatedBitrate(500, NowMs());
203 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
204 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
205 probe_controller_->SetAlrStartTimeMs(clock_.TimeInMilliseconds());
terelius3376c842017-07-31 04:23:25 -0700206 clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100207 probe_controller_->Process(NowMs());
208 probe_controller_->SetEstimatedBitrate(250, NowMs());
terelius3376c842017-07-31 04:23:25 -0700209 clock_.AdvanceTimeMilliseconds(kBitrateDropTimeoutMs + 1);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100210 probe_controller_->RequestProbe(NowMs());
sergeyu80ed35e2016-11-28 13:11:13 -0800211}
212
213TEST_F(ProbeControllerTest, PeriodicProbing) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100214 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(2);
sergeyu80ed35e2016-11-28 13:11:13 -0800215 probe_controller_->EnablePeriodicAlrProbing(true);
216 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100217 kMaxBitrateBps, NowMs());
218 probe_controller_->SetEstimatedBitrate(500, NowMs());
219 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu80ed35e2016-11-28 13:11:13 -0800220
221 int64_t start_time = clock_.TimeInMilliseconds();
222
223 // Expect the controller to send a new probe after 5s has passed.
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100224 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(DataRateEqBps(1000)))
225 .Times(1);
226 probe_controller_->SetAlrStartTimeMs(start_time);
sergeyu80ed35e2016-11-28 13:11:13 -0800227 clock_.AdvanceTimeMilliseconds(5000);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100228 probe_controller_->Process(NowMs());
229 probe_controller_->SetEstimatedBitrate(500, NowMs());
230 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu80ed35e2016-11-28 13:11:13 -0800231
232 // The following probe should be sent at 10s into ALR.
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100233 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
234 probe_controller_->SetAlrStartTimeMs(start_time);
sergeyu80ed35e2016-11-28 13:11:13 -0800235 clock_.AdvanceTimeMilliseconds(4000);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100236 probe_controller_->Process(NowMs());
237 probe_controller_->SetEstimatedBitrate(500, NowMs());
238 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu80ed35e2016-11-28 13:11:13 -0800239
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100240 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(1);
241 probe_controller_->SetAlrStartTimeMs(start_time);
sergeyu80ed35e2016-11-28 13:11:13 -0800242 clock_.AdvanceTimeMilliseconds(1000);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100243 probe_controller_->Process(NowMs());
244 probe_controller_->SetEstimatedBitrate(500, NowMs());
245 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu80ed35e2016-11-28 13:11:13 -0800246}
247
philipeld1d247f2017-05-04 08:35:52 -0700248TEST_F(ProbeControllerTest, PeriodicProbingAfterReset) {
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100249 NiceMock<MockNetworkControllerObserver> local_handler;
250 probe_controller_.reset(new ProbeController(&local_handler));
philipeld1d247f2017-05-04 08:35:52 -0700251 int64_t alr_start_time = clock_.TimeInMilliseconds();
philipeld1d247f2017-05-04 08:35:52 -0700252
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100253 probe_controller_->SetAlrStartTimeMs(alr_start_time);
254 EXPECT_CALL(local_handler, OnProbeClusterConfig(_)).Times(2);
philipeld1d247f2017-05-04 08:35:52 -0700255 probe_controller_->EnablePeriodicAlrProbing(true);
256 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100257 kMaxBitrateBps, NowMs());
258 probe_controller_->Reset(NowMs());
philipeld1d247f2017-05-04 08:35:52 -0700259
260 clock_.AdvanceTimeMilliseconds(10000);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100261 probe_controller_->Process(NowMs());
philipeld1d247f2017-05-04 08:35:52 -0700262
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100263 EXPECT_CALL(local_handler, OnProbeClusterConfig(_)).Times(2);
philipeld1d247f2017-05-04 08:35:52 -0700264 probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100265 kMaxBitrateBps, NowMs());
philipeld1d247f2017-05-04 08:35:52 -0700266
267 // Make sure we use |kStartBitrateBps| as the estimated bitrate
268 // until SetEstimatedBitrate is called with an updated estimate.
269 clock_.AdvanceTimeMilliseconds(10000);
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100270 EXPECT_CALL(local_handler,
271 OnProbeClusterConfig(DataRateEqBps(kStartBitrateBps * 2)));
272 probe_controller_->Process(NowMs());
philipeld1d247f2017-05-04 08:35:52 -0700273}
274
sergeyu5bc39452016-12-15 10:42:09 -0800275TEST_F(ProbeControllerTest, TestExponentialProbingOverflow) {
276 const int64_t kMbpsMultiplier = 1000000;
277 probe_controller_->SetBitrates(kMinBitrateBps, 10 * kMbpsMultiplier,
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100278 100 * kMbpsMultiplier, NowMs());
sergeyu5bc39452016-12-15 10:42:09 -0800279
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100280 // Verify that probe bitrate is capped at the specified max bitrate.
281 EXPECT_CALL(cluster_handler_,
282 OnProbeClusterConfig(DataRateEqBps(100 * kMbpsMultiplier)));
283 probe_controller_->SetEstimatedBitrate(60 * kMbpsMultiplier, NowMs());
284 testing::Mock::VerifyAndClearExpectations(&cluster_handler_);
sergeyu5bc39452016-12-15 10:42:09 -0800285
286 // Verify that repeated probes aren't sent.
Sebastian Jansson57daeb72018-02-05 17:15:09 +0100287 EXPECT_CALL(cluster_handler_, OnProbeClusterConfig(_)).Times(0);
288 probe_controller_->SetEstimatedBitrate(100 * kMbpsMultiplier, NowMs());
sergeyu5bc39452016-12-15 10:42:09 -0800289}
290
Irfan Sheriffb2540bb2016-09-12 12:28:54 -0700291} // namespace test
292} // namespace webrtc