Add test combination and test adaptation of peers supporting RFC8888

Bug: webrtc:436463596
Change-Id: I63b00c268dc796b37ddff3e354607f0674677acc
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/403280
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45291}
diff --git a/test/peer_scenario/tests/l4s_test.cc b/test/peer_scenario/tests/l4s_test.cc
index a706a78..0cd0315 100644
--- a/test/peer_scenario/tests/l4s_test.cc
+++ b/test/peer_scenario/tests/l4s_test.cc
@@ -45,6 +45,7 @@
 using test::PeerScenario;
 using test::PeerScenarioClient;
 using ::testing::HasSubstr;
+using ::testing::TestWithParam;
 
 // Helper class used for counting RTCP feedback messages.
 class RtcpFeedbackCounter {
@@ -203,20 +204,51 @@
   EXPECT_EQ(ret_node_feedback_counter.FeedbackAccordingToTransportCc(), 0);
 }
 
-TEST(L4STest, CallerAdaptToLinkCapacityOnNetworkWithoutEcn) {
-  PeerScenario s(*test_info_);
+struct SupportRfc8888Params {
+  bool caller_supports_rfc8888 = false;
+  bool callee_supports_rfc8888 = false;
+  std::string test_suffix;
+};
 
-  PeerScenarioClient::Config config;
-  config.field_trials.Set("WebRTC-RFC8888CongestionControlFeedback", "Enabled");
-  PeerScenarioClient* caller = s.CreateClient(config);
-  PeerScenarioClient* callee = s.CreateClient(config);
+class FeedbackFormatTest : public TestWithParam<SupportRfc8888Params> {};
+
+TEST_P(FeedbackFormatTest, AdaptToLinkCapacityWithoutEcn) {
+  const SupportRfc8888Params& params = GetParam();
+  PeerScenario s(*testing::UnitTest::GetInstance()->current_test_info());
+
+  PeerScenarioClient::Config caller_config;
+  caller_config.disable_encryption = true;
+  caller_config.field_trials.Set(
+      "WebRTC-RFC8888CongestionControlFeedback",
+      params.caller_supports_rfc8888 ? "Enabled" : "Disabled");
+  PeerScenarioClient* caller = s.CreateClient(caller_config);
+
+  PeerScenarioClient::Config callee_config;
+  callee_config.disable_encryption = true;
+  callee_config.field_trials.Set(
+      "WebRTC-RFC8888CongestionControlFeedback",
+      params.callee_supports_rfc8888 ? "Enabled" : "Disabled");
+  PeerScenarioClient* callee = s.CreateClient(callee_config);
 
   auto caller_to_callee = s.net()
                               ->NodeBuilder()
                               .capacity(DataRate::KilobitsPerSec(600))
                               .Build()
                               .node;
-  auto callee_to_caller = s.net()->NodeBuilder().Build().node;
+  auto callee_to_caller = s.net()
+                              ->NodeBuilder()
+                              .capacity(DataRate::KilobitsPerSec(600))
+                              .Build()
+                              .node;
+  RtcpFeedbackCounter callee_feedback_counter;
+  caller_to_callee->router()->SetWatcher([&](const EmulatedIpPacket& packet) {
+    callee_feedback_counter.Count(packet);
+  });
+  RtcpFeedbackCounter caller_feedback_counter;
+  callee_to_caller->router()->SetWatcher([&](const EmulatedIpPacket& packet) {
+    caller_feedback_counter.Count(packet);
+  });
+
   s.net()->CreateRoute(caller->endpoint(), {caller_to_callee},
                        callee->endpoint());
   s.net()->CreateRoute(callee->endpoint(), {callee_to_caller},
@@ -228,7 +260,8 @@
   video_conf.generator.squares_video->framerate = 30;
   video_conf.generator.squares_video->width = 640;
   video_conf.generator.squares_video->height = 360;
-  caller->CreateVideo("VIDEO_1", video_conf);
+  caller->CreateVideo("FROM_CALLER", video_conf);
+  callee->CreateVideo("FROM_CALLEE", video_conf);
 
   signaling.StartIceSignaling();
   std::atomic<bool> offer_exchange_done(false);
@@ -236,13 +269,46 @@
     offer_exchange_done = true;
   });
   s.WaitAndProcess(&offer_exchange_done);
-  s.ProcessMessages(TimeDelta::Seconds(3));
-  DataRate available_bwe =
+  s.ProcessMessages(TimeDelta::Seconds(5));
+
+  DataRate caller_available_bwe =
       GetAvailableSendBitrate(GetStatsAndProcess(s, caller));
-  EXPECT_GT(available_bwe.kbps(), 450);
-  EXPECT_LT(available_bwe.kbps(), 610);
+  EXPECT_GT(caller_available_bwe.kbps(), 450);
+  EXPECT_LT(caller_available_bwe.kbps(), 610);
+
+  DataRate callee_available_bwe =
+      GetAvailableSendBitrate(GetStatsAndProcess(s, callee));
+  EXPECT_GT(callee_available_bwe.kbps(), 450);
+  EXPECT_LT(callee_available_bwe.kbps(), 610);
+
+  if (params.caller_supports_rfc8888 && params.callee_supports_rfc8888) {
+    EXPECT_GT(caller_feedback_counter.FeedbackAccordingToRfc8888(), 0);
+    EXPECT_GT(callee_feedback_counter.FeedbackAccordingToRfc8888(), 0);
+    EXPECT_EQ(caller_feedback_counter.FeedbackAccordingToTransportCc(), 0);
+    EXPECT_EQ(callee_feedback_counter.FeedbackAccordingToTransportCc(), 0);
+  } else {
+    EXPECT_EQ(caller_feedback_counter.FeedbackAccordingToRfc8888(), 0);
+    EXPECT_EQ(callee_feedback_counter.FeedbackAccordingToRfc8888(), 0);
+    EXPECT_GT(caller_feedback_counter.FeedbackAccordingToTransportCc(), 0);
+    EXPECT_GT(callee_feedback_counter.FeedbackAccordingToTransportCc(), 0);
+  }
 }
 
+INSTANTIATE_TEST_SUITE_P(
+    L4STest,
+    FeedbackFormatTest,
+    testing::Values(
+        SupportRfc8888Params{.caller_supports_rfc8888 = true,
+                             .test_suffix = "OnlyCallerSupportsRfc8888"},
+        SupportRfc8888Params{.callee_supports_rfc8888 = true,
+                             .test_suffix = "OnlyCalleeSupportsRfc8888"},
+        SupportRfc8888Params{.caller_supports_rfc8888 = true,
+                             .callee_supports_rfc8888 = true,
+                             .test_suffix = "SupportsRfc8888"}),
+    [](const testing::TestParamInfo<SupportRfc8888Params>& info) {
+      return info.param.test_suffix;
+    });
+
 // Note - this test only test that the
 // caller adapt to the link capacity. It does not test that the caller uses ECN
 // to adapt even though the network can mark packets with CE.