Adds TCP fairness test to receive side congestion controller.
Bug: webrtc:9883
Change-Id: I3697491285e4f70b8f7857198e4e1ccb0097da5b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/140883
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28196}
diff --git a/modules/congestion_controller/BUILD.gn b/modules/congestion_controller/BUILD.gn
index abb2584..ac720ff 100644
--- a/modules/congestion_controller/BUILD.gn
+++ b/modules/congestion_controller/BUILD.gn
@@ -101,6 +101,7 @@
"../../system_wrappers",
"../../test:field_trial",
"../../test:test_support",
+ "../../test/scenario",
"../bitrate_controller",
"../pacing",
"../pacing:mock_paced_sender",
diff --git a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
index 632b762..d6d7390 100644
--- a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
+++ b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
@@ -13,6 +13,7 @@
#include "system_wrappers/include/clock.h"
#include "test/gmock.h"
#include "test/gtest.h"
+#include "test/scenario/scenario.h"
using ::testing::_;
using ::testing::AtLeast;
@@ -71,5 +72,47 @@
EXPECT_EQ(header.ssrc, ssrcs[0]);
}
+TEST(ReceiveSideCongestionControllerTest, ConvergesToCapacity) {
+ Scenario s("recieve_cc_unit/converge");
+ NetworkSimulationConfig net_conf;
+ net_conf.bandwidth = DataRate::kbps(1000);
+ net_conf.delay = TimeDelta::ms(50);
+ auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
+ c->transport.rates.start_rate = DataRate::kbps(300);
+ });
+
+ auto* route = s.CreateRoutes(client, {s.CreateSimulationNode(net_conf)},
+ s.CreateClient("return", CallClientConfig()),
+ {s.CreateSimulationNode(net_conf)});
+ VideoStreamConfig video;
+ video.stream.packet_feedback = false;
+ s.CreateVideoStream(route->forward(), video);
+ s.RunFor(TimeDelta::seconds(30));
+ EXPECT_NEAR(client->send_bandwidth().kbps(), 900, 150);
+}
+
+TEST(ReceiveSideCongestionControllerTest, IsFairToTCP) {
+ Scenario s("recieve_cc_unit/tcp_fairness");
+ NetworkSimulationConfig net_conf;
+ net_conf.bandwidth = DataRate::kbps(1000);
+ net_conf.delay = TimeDelta::ms(50);
+ auto* client = s.CreateClient("send", [&](CallClientConfig* c) {
+ c->transport.rates.start_rate = DataRate::kbps(1000);
+ });
+ auto send_net = {s.CreateSimulationNode(net_conf)};
+ auto ret_net = {s.CreateSimulationNode(net_conf)};
+ auto* route = s.CreateRoutes(
+ client, send_net, s.CreateClient("return", CallClientConfig()), ret_net);
+ VideoStreamConfig video;
+ video.stream.packet_feedback = false;
+ s.CreateVideoStream(route->forward(), video);
+ s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net),
+ s.net()->CreateRoute(ret_net),
+ FakeTcpConfig());
+ s.RunFor(TimeDelta::seconds(30));
+ // For some reason we get outcompeted by TCP here, this should probably be
+ // fixed and a lower bound should be added to the test.
+ EXPECT_LT(client->send_bandwidth().kbps(), 750);
+}
} // namespace test
} // namespace webrtc
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index 46852d8..00521ea 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -88,12 +88,16 @@
}
std::vector<RtpExtension> GetVideoRtpExtensions(
const VideoStreamConfig config) {
- return {RtpExtension(RtpExtension::kTransportSequenceNumberUri,
- kTransportSequenceNumberExtensionId),
- RtpExtension(RtpExtension::kVideoContentTypeUri,
- kVideoContentTypeExtensionId),
- RtpExtension(RtpExtension::kVideoRotationUri,
- kVideoRotationRtpExtensionId)};
+ std::vector<RtpExtension> res = {
+ RtpExtension(RtpExtension::kVideoContentTypeUri,
+ kVideoContentTypeExtensionId),
+ RtpExtension(RtpExtension::kVideoRotationUri,
+ kVideoRotationRtpExtensionId)};
+ if (config.stream.packet_feedback) {
+ res.push_back(RtpExtension(RtpExtension::kTransportSequenceNumberUri,
+ kTransportSequenceNumberExtensionId));
+ }
+ return res;
}
std::string TransformFilePath(std::string path) {
@@ -311,6 +315,7 @@
recv.rtp.transport_cc = config.stream.packet_feedback;
recv.rtp.local_ssrc = local_ssrc;
recv.rtp.extensions = GetVideoRtpExtensions(config);
+
RTC_DCHECK(!config.stream.use_rtx ||
config.stream.nack_history_time > TimeDelta::Zero());
recv.rtp.nack.rtp_history_ms = config.stream.nack_history_time.ms();