R=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/14729004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6600 4adac7df-926f-26a2-2b94-8c16560cd09d
193 lines
6.1 KiB
C++
193 lines
6.1 KiB
C++
/*
|
|
* Copyright (c) 2014 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 "gtest/gtest.h"
|
|
#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
|
|
#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
|
|
#include "webrtc/test/testsupport/fileutils.h"
|
|
|
|
using std::string;
|
|
|
|
namespace webrtc {
|
|
namespace testing {
|
|
namespace bwe {
|
|
#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
|
|
BweTestConfig::EstimatorConfig CreateEstimatorConfig(
|
|
int flow_id, bool plot_delay, bool plot_estimate) {
|
|
static const AbsoluteSendTimeRemoteBitrateEstimatorFactory factory =
|
|
AbsoluteSendTimeRemoteBitrateEstimatorFactory();
|
|
|
|
return BweTestConfig::EstimatorConfig("AST", flow_id, &factory, kAimdControl,
|
|
plot_delay, plot_estimate);
|
|
}
|
|
|
|
BweTestConfig MakeAdaptiveBweTestConfig() {
|
|
BweTestConfig result;
|
|
result.estimator_configs.push_back(CreateEstimatorConfig(0, true, true));
|
|
return result;
|
|
}
|
|
|
|
BweTestConfig MakeMultiFlowBweTestConfig(int flow_count) {
|
|
BweTestConfig result;
|
|
for (int i = 0; i < flow_count; ++i) {
|
|
result.estimator_configs.push_back(CreateEstimatorConfig(i, false, true));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// This test fixture is used to instantiate tests running with adaptive video
|
|
// senders.
|
|
class BweSimulation : public BweTest,
|
|
public ::testing::TestWithParam<BweTestConfig> {
|
|
public:
|
|
BweSimulation() : BweTest() {}
|
|
virtual ~BweSimulation() {}
|
|
|
|
virtual void SetUp() {
|
|
const BweTestConfig& config = GetParam();
|
|
SetupTestFromConfig(config);
|
|
}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(BweSimulation);
|
|
};
|
|
|
|
INSTANTIATE_TEST_CASE_P(VideoSendersTest, BweSimulation,
|
|
::testing::Values(MakeAdaptiveBweTestConfig()));
|
|
|
|
TEST_P(BweSimulation, SprintUplinkTest) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
|
|
RateCounterFilter counter1(this, "sender_output");
|
|
TraceBasedDeliveryFilter filter(this, "link_capacity");
|
|
RateCounterFilter counter2(this, "receiver_input");
|
|
ASSERT_TRUE(filter.Init(test::ResourcePath("sprint-uplink", "rx")));
|
|
RunFor(60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, Verizon4gDownlinkTest) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
|
|
RateCounterFilter counter1(this, "sender_output");
|
|
TraceBasedDeliveryFilter filter(this, "link_capacity");
|
|
RateCounterFilter counter2(this, "receiver_input");
|
|
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
|
|
RunFor(22 * 60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, Choke1000kbps500kbps1000kbps) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
|
|
ChokeFilter filter(this);
|
|
RateCounterFilter counter(this, "receiver_input");
|
|
filter.SetCapacity(1000);
|
|
filter.SetMaxDelay(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(1000);
|
|
RunFor(60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, PacerChoke1000kbps500kbps1000kbps) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender source(0, NULL, 30, 300, 0, 0);
|
|
PacedVideoSender sender(this, 300, &source);
|
|
ChokeFilter filter(this);
|
|
RateCounterFilter counter(this, "receiver_input");
|
|
filter.SetCapacity(1000);
|
|
filter.SetMaxDelay(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(1000);
|
|
RunFor(60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, PacerChoke200kbps30kbps200kbps) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender source(0, NULL, 30, 300, 0, 0);
|
|
PacedVideoSender sender(this, 300, &source);
|
|
ChokeFilter filter(this);
|
|
RateCounterFilter counter(this, "receiver_input");
|
|
filter.SetCapacity(200);
|
|
filter.SetMaxDelay(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(30);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(200);
|
|
RunFor(60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
|
|
ChokeFilter filter(this);
|
|
RateCounterFilter counter(this, "receiver_input");
|
|
filter.SetCapacity(200);
|
|
filter.SetMaxDelay(500);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(30);
|
|
RunFor(60 * 1000);
|
|
filter.SetCapacity(200);
|
|
RunFor(60 * 1000);
|
|
}
|
|
|
|
TEST_P(BweSimulation, GoogleWifiTrace3Mbps) {
|
|
VerboseLogging(true);
|
|
AdaptiveVideoSender sender(0, this, 30, 300, 0, 0);
|
|
RateCounterFilter counter1(this, "sender_output");
|
|
TraceBasedDeliveryFilter filter(this, "link_capacity");
|
|
filter.SetMaxDelay(500);
|
|
RateCounterFilter counter2(this, "receiver_input");
|
|
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
|
RunFor(300 * 1000);
|
|
}
|
|
|
|
class MultiFlowBweSimulation : public BweSimulation {
|
|
public:
|
|
MultiFlowBweSimulation() : BweSimulation() {}
|
|
virtual ~MultiFlowBweSimulation() {}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(MultiFlowBweSimulation);
|
|
};
|
|
|
|
INSTANTIATE_TEST_CASE_P(VideoSendersTest, MultiFlowBweSimulation,
|
|
::testing::Values(MakeMultiFlowBweTestConfig(3)));
|
|
|
|
TEST_P(MultiFlowBweSimulation, SelfFairnessTest) {
|
|
VerboseLogging(true);
|
|
const int kAllFlowIds[] = {0, 1, 2};
|
|
const size_t kNumFlows = sizeof(kAllFlowIds) / sizeof(kAllFlowIds[0]);
|
|
scoped_ptr<AdaptiveVideoSender> senders[kNumFlows];
|
|
for (size_t i = 0; i < kNumFlows; ++i) {
|
|
senders[i].reset(new AdaptiveVideoSender(kAllFlowIds[i], this, 30, 300, 0,
|
|
0));
|
|
}
|
|
// Second and third flow.
|
|
ChokeFilter choke(this, CreateFlowIds(&kAllFlowIds[1], 2));
|
|
choke.SetCapacity(1500);
|
|
// First flow.
|
|
ChokeFilter choke2(this, CreateFlowIds(&kAllFlowIds[0], 1));
|
|
choke2.SetCapacity(1000);
|
|
|
|
scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
|
|
for (size_t i = 0; i < kNumFlows; ++i) {
|
|
rate_counters[i].reset(new RateCounterFilter(
|
|
this, CreateFlowIds(&kAllFlowIds[i], 1), "receiver_input"));
|
|
}
|
|
RunFor(30 * 60 * 1000);
|
|
}
|
|
#endif // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
|
|
} // namespace bwe
|
|
} // namespace testing
|
|
} // namespace webrtc
|