Previously ProbeController was starting probing as soon as SetBitrates() is called. As result these probes would often timeout while connection is being established. Now ProbeController receives notifications about network route changes. This allows to start probing only when transport is connected. This also makes it possible to restart probing whenever transport route changes (will be done in a separate change). BUG=webrtc:6332 R=honghaiz@webrtc.org, philipel@webrtc.org, stefan@webrtc.org Review URL: https://codereview.webrtc.org/2458863002 . Committed: https://crrev.com/5c99c76255ee7bface3c742c25fb5617748ac86e Cr-Original-Commit-Position: refs/heads/master@{#15094} Cr-Commit-Position: refs/heads/master@{#15204}
100 lines
3.3 KiB
C++
100 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
#include <memory>
|
|
|
|
#include "webrtc/base/logging.h"
|
|
#include "webrtc/modules/congestion_controller/probe_controller.h"
|
|
#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
|
|
#include "webrtc/system_wrappers/include/clock.h"
|
|
#include "webrtc/test/gmock.h"
|
|
#include "webrtc/test/gtest.h"
|
|
|
|
using testing::_;
|
|
using testing::AtLeast;
|
|
using testing::NiceMock;
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
namespace {
|
|
|
|
constexpr int kMinBitrateBps = 100;
|
|
constexpr int kStartBitrateBps = 300;
|
|
constexpr int kMaxBitrateBps = 10000;
|
|
|
|
constexpr int kExponentialProbingTimeoutMs = 5000;
|
|
|
|
} // namespace
|
|
|
|
class ProbeControllerTest : public ::testing::Test {
|
|
protected:
|
|
ProbeControllerTest() : clock_(0) {
|
|
probe_controller_.reset(new ProbeController(&pacer_, &clock_));
|
|
}
|
|
~ProbeControllerTest() override {}
|
|
|
|
SimulatedClock clock_;
|
|
NiceMock<MockPacedSender> pacer_;
|
|
std::unique_ptr<ProbeController> probe_controller_;
|
|
};
|
|
|
|
TEST_F(ProbeControllerTest, InitiatesProbingAtStart) {
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(_, _)).Times(AtLeast(2));
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps);
|
|
}
|
|
|
|
TEST_F(ProbeControllerTest, ProbeOnlyWhenNetworkIsUp) {
|
|
probe_controller_->OnNetworkStateChanged(kNetworkDown);
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(_, _)).Times(0);
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps);
|
|
|
|
testing::Mock::VerifyAndClearExpectations(&pacer_);
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(_, _)).Times(AtLeast(2));
|
|
probe_controller_->OnNetworkStateChanged(kNetworkUp);
|
|
}
|
|
|
|
TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncrease) {
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(_, _)).Times(AtLeast(2));
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps);
|
|
// Long enough to time out exponential probing.
|
|
clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
|
|
probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
|
|
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100, _));
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps + 100);
|
|
}
|
|
|
|
TEST_F(ProbeControllerTest, TestExponentialProbing) {
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps);
|
|
|
|
|
|
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(2 * 1800, _));
|
|
probe_controller_->SetEstimatedBitrate(1800);
|
|
}
|
|
|
|
TEST_F(ProbeControllerTest, TestExponentialProbingTimeout) {
|
|
probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
|
|
kMaxBitrateBps);
|
|
|
|
// Advance far enough to cause a time out in waiting for probing result.
|
|
clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
|
|
EXPECT_CALL(pacer_, CreateProbeCluster(2 * 1800, _)).Times(0);
|
|
probe_controller_->SetEstimatedBitrate(1800);
|
|
}
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|