Add a BWE fairness test.
Also moves the BWE perf tests to webrtc_perf_tests for tracking. BUG=4548 R=pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/45189004 Cr-Commit-Position: refs/heads/master@{#9022}
This commit is contained in:
parent
3795937920
commit
09bdc1e5f5
@ -60,6 +60,7 @@
|
|||||||
'audio_device' ,
|
'audio_device' ,
|
||||||
'audio_processing',
|
'audio_processing',
|
||||||
'bitrate_controller',
|
'bitrate_controller',
|
||||||
|
'bwe_simulator',
|
||||||
'CNG',
|
'CNG',
|
||||||
'desktop_capture',
|
'desktop_capture',
|
||||||
'iSACFix',
|
'iSACFix',
|
||||||
@ -216,33 +217,6 @@
|
|||||||
'remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc',
|
'remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc',
|
||||||
'remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc',
|
'remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc',
|
||||||
'remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h',
|
'remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h',
|
||||||
'remote_bitrate_estimator/remote_bitrate_estimators_test.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe.h',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test.h',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_baselinefile.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_baselinefile.h',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_fileutils.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_fileutils.h',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_framework.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_framework.h',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_framework_unittest.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_logging.cc',
|
|
||||||
'remote_bitrate_estimator/test/bwe_test_logging.h',
|
|
||||||
'remote_bitrate_estimator/test/packet_receiver.cc',
|
|
||||||
'remote_bitrate_estimator/test/packet_receiver.h',
|
|
||||||
'remote_bitrate_estimator/test/packet_sender.cc',
|
|
||||||
'remote_bitrate_estimator/test/packet_sender.h',
|
|
||||||
'remote_bitrate_estimator/test/packet.h',
|
|
||||||
'remote_bitrate_estimator/test/estimators/nada.cc',
|
|
||||||
'remote_bitrate_estimator/test/estimators/nada.h',
|
|
||||||
'remote_bitrate_estimator/test/estimators/remb.cc',
|
|
||||||
'remote_bitrate_estimator/test/estimators/remb.h',
|
|
||||||
'remote_bitrate_estimator/test/estimators/send_side.cc',
|
|
||||||
'remote_bitrate_estimator/test/estimators/send_side.h',
|
|
||||||
'remote_bitrate_estimator/test/estimators/tcp.cc',
|
|
||||||
'remote_bitrate_estimator/test/estimators/tcp.h',
|
|
||||||
'rtp_rtcp/source/mock/mock_rtp_payload_strategy.h',
|
'rtp_rtcp/source/mock/mock_rtp_payload_strategy.h',
|
||||||
'rtp_rtcp/source/byte_io_unittest.cc',
|
'rtp_rtcp/source/byte_io_unittest.cc',
|
||||||
'rtp_rtcp/source/fec_receiver_unittest.cc',
|
'rtp_rtcp/source/fec_receiver_unittest.cc',
|
||||||
|
@ -55,6 +55,41 @@
|
|||||||
'conditions': [
|
'conditions': [
|
||||||
['include_tests==1', {
|
['include_tests==1', {
|
||||||
'targets': [
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'bwe_simulator',
|
||||||
|
'type': 'static_library',
|
||||||
|
'dependencies': [
|
||||||
|
'<(DEPTH)/testing/gtest.gyp:gtest',
|
||||||
|
],
|
||||||
|
'sources': [
|
||||||
|
'test/bwe.cc',
|
||||||
|
'test/bwe.h',
|
||||||
|
'test/bwe_test.cc',
|
||||||
|
'test/bwe_test.h',
|
||||||
|
'test/bwe_test_baselinefile.cc',
|
||||||
|
'test/bwe_test_baselinefile.h',
|
||||||
|
'test/bwe_test_fileutils.cc',
|
||||||
|
'test/bwe_test_fileutils.h',
|
||||||
|
'test/bwe_test_framework.cc',
|
||||||
|
'test/bwe_test_framework.h',
|
||||||
|
'test/bwe_test_framework_unittest.cc',
|
||||||
|
'test/bwe_test_logging.cc',
|
||||||
|
'test/bwe_test_logging.h',
|
||||||
|
'test/packet_receiver.cc',
|
||||||
|
'test/packet_receiver.h',
|
||||||
|
'test/packet_sender.cc',
|
||||||
|
'test/packet_sender.h',
|
||||||
|
'test/packet.h',
|
||||||
|
'test/estimators/nada.cc',
|
||||||
|
'test/estimators/nada.h',
|
||||||
|
'test/estimators/remb.cc',
|
||||||
|
'test/estimators/remb.h',
|
||||||
|
'test/estimators/send_side.cc',
|
||||||
|
'test/estimators/send_side.h',
|
||||||
|
'test/estimators/tcp.cc',
|
||||||
|
'test/estimators/tcp.h',
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'target_name': 'bwe_tools_util',
|
'target_name': 'bwe_tools_util',
|
||||||
'type': 'static_library',
|
'type': 'static_library',
|
||||||
|
@ -241,8 +241,10 @@ class BweFeedbackTest
|
|||||||
BweFeedbackTest() : BweTest() {}
|
BweFeedbackTest() : BweTest() {}
|
||||||
virtual ~BweFeedbackTest() {}
|
virtual ~BweFeedbackTest() {}
|
||||||
|
|
||||||
void PrintResults(double max_throughput_kbps, Stats<double> throughput_kbps,
|
void PrintResults(double max_throughput_kbps,
|
||||||
Stats<double> delay_ms) {
|
Stats<double> throughput_kbps,
|
||||||
|
Stats<double> delay_ms,
|
||||||
|
std::vector<Stats<double>> flow_throughput_kbps) {
|
||||||
double utilization = throughput_kbps.GetMean() / max_throughput_kbps;
|
double utilization = throughput_kbps.GetMean() / max_throughput_kbps;
|
||||||
webrtc::test::PrintResult("BwePerformance",
|
webrtc::test::PrintResult("BwePerformance",
|
||||||
GetTestName(),
|
GetTestName(),
|
||||||
@ -264,6 +266,16 @@ class BweFeedbackTest
|
|||||||
delay_ms.AsString(),
|
delay_ms.AsString(),
|
||||||
"ms",
|
"ms",
|
||||||
false);
|
false);
|
||||||
|
double fairness_index = 0.0;
|
||||||
|
double squared_bitrate_sum = 0.0;
|
||||||
|
for (Stats<double> flow : flow_throughput_kbps) {
|
||||||
|
squared_bitrate_sum += flow.GetMean() * flow.GetMean();
|
||||||
|
fairness_index += flow.GetMean();
|
||||||
|
}
|
||||||
|
fairness_index *= fairness_index;
|
||||||
|
fairness_index /= flow_throughput_kbps.size() * squared_bitrate_sum;
|
||||||
|
webrtc::test::PrintResult("BwePerformance", GetTestName(), "Fairness",
|
||||||
|
fairness_index * 100, "%", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -294,7 +306,8 @@ TEST_P(BweFeedbackTest, Choke1000kbps500kbps1000kbps) {
|
|||||||
filter.SetCapacity(kHighCapacityKbps);
|
filter.SetCapacity(kHighCapacityKbps);
|
||||||
RunFor(60 * 1000);
|
RunFor(60 * 1000);
|
||||||
PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
|
PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
|
||||||
counter.GetBitrateStats(), filter.GetDelayStats());
|
counter.GetBitrateStats(), filter.GetDelayStats(),
|
||||||
|
std::vector<Stats<double>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
|
TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
|
||||||
@ -314,7 +327,8 @@ TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
|
|||||||
RunFor(60 * 1000);
|
RunFor(60 * 1000);
|
||||||
|
|
||||||
PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
|
PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
|
||||||
counter.GetBitrateStats(), filter.GetDelayStats());
|
counter.GetBitrateStats(), filter.GetDelayStats(),
|
||||||
|
std::vector<Stats<double>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
|
TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
|
||||||
@ -327,7 +341,7 @@ TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
|
|||||||
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
|
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
|
||||||
RunFor(22 * 60 * 1000);
|
RunFor(22 * 60 * 1000);
|
||||||
PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
|
PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
|
||||||
filter.GetDelayStats());
|
filter.GetDelayStats(), std::vector<Stats<double>>());
|
||||||
}
|
}
|
||||||
|
|
||||||
// webrtc:3277
|
// webrtc:3277
|
||||||
@ -342,7 +356,50 @@ TEST_P(BweFeedbackTest, DISABLED_GoogleWifiTrace3Mbps) {
|
|||||||
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
||||||
RunFor(300 * 1000);
|
RunFor(300 * 1000);
|
||||||
PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
|
PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
|
||||||
filter.GetDelayStats());
|
filter.GetDelayStats(), std::vector<Stats<double>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(BweFeedbackTest, PacedSelfFairnessTest) {
|
||||||
|
srand(Clock::GetRealTimeClock()->TimeInMicroseconds());
|
||||||
|
const int kAllFlowIds[] = {0, 1, 2, 3};
|
||||||
|
const size_t kNumFlows = sizeof(kAllFlowIds) / sizeof(kAllFlowIds[0]);
|
||||||
|
rtc::scoped_ptr<VideoSource> sources[kNumFlows];
|
||||||
|
rtc::scoped_ptr<PacketSender> senders[kNumFlows];
|
||||||
|
|
||||||
|
for (size_t i = 0; i < kNumFlows; ++i) {
|
||||||
|
// Streams started woth ramdp, pffsets tp give them different advantage when
|
||||||
|
// competing for the bandwidth.
|
||||||
|
sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
|
||||||
|
i * (rand() % 40000)));
|
||||||
|
senders[i].reset(
|
||||||
|
new PacedVideoSender(&uplink_, sources[i].get(), GetParam()));
|
||||||
|
}
|
||||||
|
|
||||||
|
ChokeFilter choke(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
|
||||||
|
choke.SetCapacity(3000);
|
||||||
|
choke.SetMaxDelay(1000);
|
||||||
|
|
||||||
|
rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
|
||||||
|
for (size_t i = 0; i < kNumFlows; ++i) {
|
||||||
|
rate_counters[i].reset(new RateCounterFilter(
|
||||||
|
&uplink_, CreateFlowIds(&kAllFlowIds[i], 1), "receiver_input"));
|
||||||
|
}
|
||||||
|
|
||||||
|
RateCounterFilter total_utilization(
|
||||||
|
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization");
|
||||||
|
|
||||||
|
rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
|
||||||
|
for (size_t i = 0; i < kNumFlows; ++i) {
|
||||||
|
receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], GetParam(),
|
||||||
|
i == 0, false));
|
||||||
|
}
|
||||||
|
RunFor(15 * 60 * 1000);
|
||||||
|
|
||||||
|
std::vector<Stats<double>> flow_throughput_kbps;
|
||||||
|
for (size_t i = 0; i < kNumFlows; ++i)
|
||||||
|
flow_throughput_kbps.push_back(rate_counters[i]->GetBitrateStats());
|
||||||
|
PrintResults(3000, total_utilization.GetBitrateStats(), choke.GetDelayStats(),
|
||||||
|
flow_throughput_kbps);
|
||||||
}
|
}
|
||||||
} // namespace bwe
|
} // namespace bwe
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
|
@ -615,7 +615,7 @@ class BweTestFramework_ChokeFilterTest : public ::testing::Test {
|
|||||||
void TestChoke(PacketProcessor* filter,
|
void TestChoke(PacketProcessor* filter,
|
||||||
int64_t run_for_ms,
|
int64_t run_for_ms,
|
||||||
uint32_t packets_to_generate,
|
uint32_t packets_to_generate,
|
||||||
uint32_t expected_kbit_transmitted) {
|
size_t expected_kbit_transmitted) {
|
||||||
// Generate a bunch of packets, apply choke, verify output is ordered.
|
// Generate a bunch of packets, apply choke, verify output is ordered.
|
||||||
Packets packets;
|
Packets packets;
|
||||||
RTPHeader header;
|
RTPHeader header;
|
||||||
@ -634,7 +634,7 @@ class BweTestFramework_ChokeFilterTest : public ::testing::Test {
|
|||||||
ASSERT_TRUE(IsSequenceNumberSorted(output_packets_));
|
ASSERT_TRUE(IsSequenceNumberSorted(output_packets_));
|
||||||
|
|
||||||
// Sum up the transmitted bytes up until the current time.
|
// Sum up the transmitted bytes up until the current time.
|
||||||
uint32_t bytes_transmitted = 0;
|
size_t bytes_transmitted = 0;
|
||||||
while (!output_packets_.empty()) {
|
while (!output_packets_.empty()) {
|
||||||
const Packet* packet = output_packets_.front();
|
const Packet* packet = output_packets_.front();
|
||||||
if (packet->send_time_us() > now_ms_ * 1000) {
|
if (packet->send_time_us() > now_ms_ * 1000) {
|
||||||
@ -769,7 +769,7 @@ void TestVideoSender(VideoSender* sender,
|
|||||||
int64_t run_for_ms,
|
int64_t run_for_ms,
|
||||||
uint32_t expected_packets,
|
uint32_t expected_packets,
|
||||||
uint32_t expected_payload_size,
|
uint32_t expected_payload_size,
|
||||||
uint32_t expected_total_payload_size) {
|
size_t expected_total_payload_size) {
|
||||||
assert(sender);
|
assert(sender);
|
||||||
Packets packets;
|
Packets packets;
|
||||||
sender->RunFor(run_for_ms, &packets);
|
sender->RunFor(run_for_ms, &packets);
|
||||||
@ -777,7 +777,7 @@ void TestVideoSender(VideoSender* sender,
|
|||||||
ASSERT_TRUE(IsSequenceNumberSorted(packets));
|
ASSERT_TRUE(IsSequenceNumberSorted(packets));
|
||||||
EXPECT_EQ(expected_packets, packets.size());
|
EXPECT_EQ(expected_packets, packets.size());
|
||||||
int64_t send_time_us = -1;
|
int64_t send_time_us = -1;
|
||||||
uint32_t total_payload_size = 0;
|
size_t total_payload_size = 0;
|
||||||
uint32_t absolute_send_time = 0;
|
uint32_t absolute_send_time = 0;
|
||||||
uint32_t absolute_send_time_wraps = 0;
|
uint32_t absolute_send_time_wraps = 0;
|
||||||
uint32_t rtp_timestamp = 0;
|
uint32_t rtp_timestamp = 0;
|
||||||
|
@ -178,6 +178,8 @@
|
|||||||
'type': '<(gtest_target_type)',
|
'type': '<(gtest_target_type)',
|
||||||
'sources': [
|
'sources': [
|
||||||
'modules/audio_coding/neteq/test/neteq_performance_unittest.cc',
|
'modules/audio_coding/neteq/test/neteq_performance_unittest.cc',
|
||||||
|
'modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc',
|
||||||
|
|
||||||
'tools/agc/agc_manager_integrationtest.cc',
|
'tools/agc/agc_manager_integrationtest.cc',
|
||||||
'video/call_perf_tests.cc',
|
'video/call_perf_tests.cc',
|
||||||
'video/full_stack.cc',
|
'video/full_stack.cc',
|
||||||
@ -190,7 +192,8 @@
|
|||||||
'<(webrtc_root)/modules/modules.gyp:video_capture',
|
'<(webrtc_root)/modules/modules.gyp:video_capture',
|
||||||
'<(webrtc_root)/test/test.gyp:channel_transport',
|
'<(webrtc_root)/test/test.gyp:channel_transport',
|
||||||
'<(webrtc_root)/voice_engine/voice_engine.gyp:voice_engine',
|
'<(webrtc_root)/voice_engine/voice_engine.gyp:voice_engine',
|
||||||
'modules/modules.gyp:neteq_test_support', # Needed by neteq_performance_unittest.
|
'modules/modules.gyp:neteq_test_support',
|
||||||
|
'modules/modules.gyp:bwe_simulator',
|
||||||
'modules/modules.gyp:rtp_rtcp',
|
'modules/modules.gyp:rtp_rtcp',
|
||||||
'test/test.gyp:test_main',
|
'test/test.gyp:test_main',
|
||||||
'test/webrtc_test_common.gyp:webrtc_test_common',
|
'test/webrtc_test_common.gyp:webrtc_test_common',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user