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();