Add a new PeerConnectionE2EQualityTestFixture::AddPeer method.

Change-Id: Ic5879613db51a00e3e958931f5eda19fda1ae94a
Bug: webrtc:14627
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/282640
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Commit-Queue: Jeremy Leconte <jleconte@google.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38608}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index d6745c9..56e9237 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -547,6 +547,7 @@
     "video_codecs:video_codecs_api",
   ]
   absl_deps = [
+    "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/strings",
     "//third_party/abseil-cpp/absl/types:optional",
diff --git a/api/test/peerconnection_quality_test_fixture.h b/api/test/peerconnection_quality_test_fixture.h
index d031bcd..9db2093 100644
--- a/api/test/peerconnection_quality_test_fixture.h
+++ b/api/test/peerconnection_quality_test_fixture.h
@@ -20,6 +20,7 @@
 #include <utility>
 #include <vector>
 
+#include "absl/base/macros.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
@@ -132,9 +133,18 @@
   // `network_dependencies` are used to provide networking for peer's peer
   // connection. Members must be non-null.
   // `configurer` function will be used to configure peer in the call.
-  virtual PeerHandle* AddPeer(
+  [[deprecated("bugs.webrtc.org/14627")]] virtual PeerHandle* AddPeer(
       const PeerNetworkDependencies& network_dependencies,
-      rtc::FunctionView<void(PeerConfigurer*)> configurer) = 0;
+      rtc::FunctionView<void(PeerConfigurer*)> configurer) {
+    RTC_CHECK_NOTREACHED();
+    return nullptr;
+  }
+  // TODO(bugs.webrtc.org/14627): make pure virtual once all subclasses
+  // implement it.
+  virtual PeerHandle* AddPeer(std::unique_ptr<PeerConfigurer> configurer) {
+    RTC_CHECK_NOTREACHED();
+    return nullptr;
+  }
 
   // Runs the media quality test, which includes setting up the call with
   // configured participants, running it according to provided `run_params` and
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index 33cacf8..91d66d4 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -233,6 +233,9 @@
         "../api/test/metrics:global_metrics_logger_and_exporter",
         "../api/test/metrics:metrics_exporter",
         "../api/test/metrics:stdout_metrics_exporter",
+        "../api/test/pclf:media_configuration",
+        "../api/test/pclf:media_quality_test_params",
+        "../api/test/pclf:peer_configurer",
         "../call:simulated_network",
         "../common_audio",
         "../system_wrappers",
diff --git a/audio/test/pc_low_bandwidth_audio_test.cc b/audio/test/pc_low_bandwidth_audio_test.cc
index 4fab15b..8b733d5 100644
--- a/audio/test/pc_low_bandwidth_audio_test.cc
+++ b/audio/test/pc_low_bandwidth_audio_test.cc
@@ -20,6 +20,9 @@
 #include "api/test/metrics/metrics_exporter.h"
 #include "api/test/metrics/stdout_metrics_exporter.h"
 #include "api/test/network_emulation_manager.h"
+#include "api/test/pclf/media_configuration.h"
+#include "api/test/pclf/media_quality_test_params.h"
+#include "api/test/pclf/peer_configurer.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "api/test/simulated_network.h"
 #include "api/test/time_controller.h"
@@ -35,11 +38,9 @@
 namespace webrtc {
 namespace test {
 
-using PeerConfigurer =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::PeerConfigurer;
-using RunParams = webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::RunParams;
-using AudioConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::AudioConfig;
+using ::webrtc::webrtc_pc_e2e::AudioConfig;
+using ::webrtc::webrtc_pc_e2e::PeerConfigurer;
+using ::webrtc::webrtc_pc_e2e::RunParams;
 
 namespace {
 
@@ -67,10 +68,14 @@
       std::string(test_case_name), time_controller,
       /*audio_quality_analyzer=*/nullptr,
       /*video_quality_analyzer=*/nullptr);
-  fixture->AddPeer(network_links.first->network_dependencies(),
-                   alice_configurer);
-  fixture->AddPeer(network_links.second->network_dependencies(),
-                   bob_configurer);
+  auto alice = std::make_unique<PeerConfigurer>(
+      network_links.first->network_dependencies());
+  auto bob = std::make_unique<PeerConfigurer>(
+      network_links.second->network_dependencies());
+  alice_configurer(alice.get());
+  bob_configurer(bob.get());
+  fixture->AddPeer(std::move(alice));
+  fixture->AddPeer(std::move(bob));
   fixture->AddQualityMetricsReporter(
       std::make_unique<webrtc_pc_e2e::NetworkQualityMetricsReporter>(
           network_links.first, network_links.second,
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 2621d57..8126fed 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -2714,6 +2714,9 @@
       "../api:simulated_network_api",
       "../api:time_controller",
       "../api/test/metrics:global_metrics_logger_and_exporter",
+      "../api/test/pclf:media_configuration",
+      "../api/test/pclf:media_quality_test_params",
+      "../api/test/pclf:peer_configurer",
       "../api/video_codecs:video_codecs_api",
       "../call:simulated_network",
       "../modules/video_coding:webrtc_vp9",
diff --git a/pc/test/svc_e2e_tests.cc b/pc/test/svc_e2e_tests.cc
index 264b990..5d98f73 100644
--- a/pc/test/svc_e2e_tests.cc
+++ b/pc/test/svc_e2e_tests.cc
@@ -19,6 +19,9 @@
 #include "api/test/frame_generator_interface.h"
 #include "api/test/metrics/global_metrics_logger_and_exporter.h"
 #include "api/test/network_emulation_manager.h"
+#include "api/test/pclf/media_configuration.h"
+#include "api/test/pclf/media_quality_test_params.h"
+#include "api/test/pclf/peer_configurer.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "api/test/simulated_network.h"
 #include "api/test/time_controller.h"
@@ -38,18 +41,6 @@
 namespace webrtc {
 namespace {
 
-using PeerConfigurer = ::webrtc::webrtc_pc_e2e::
-    PeerConnectionE2EQualityTestFixture::PeerConfigurer;
-using RunParams =
-    ::webrtc::webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::RunParams;
-using VideoConfig =
-    ::webrtc::webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoConfig;
-using ScreenShareConfig = ::webrtc::webrtc_pc_e2e::
-    PeerConnectionE2EQualityTestFixture::ScreenShareConfig;
-using VideoCodecConfig = ::webrtc::webrtc_pc_e2e::
-    PeerConnectionE2EQualityTestFixture::VideoCodecConfig;
-using EmulatedSFUConfig = ::webrtc::webrtc_pc_e2e::
-    PeerConnectionE2EQualityTestFixture::EmulatedSFUConfig;
 using ::cricket::kAv1CodecName;
 using ::cricket::kH264CodecName;
 using ::cricket::kVp8CodecName;
@@ -58,6 +49,12 @@
 using ::testing::UnitTest;
 using ::testing::Values;
 using ::testing::ValuesIn;
+using ::webrtc::webrtc_pc_e2e::EmulatedSFUConfig;
+using ::webrtc::webrtc_pc_e2e::PeerConfigurer;
+using ::webrtc::webrtc_pc_e2e::RunParams;
+using ::webrtc::webrtc_pc_e2e::ScreenShareConfig;
+using ::webrtc::webrtc_pc_e2e::VideoCodecConfig;
+using ::webrtc::webrtc_pc_e2e::VideoConfig;
 
 std::unique_ptr<webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture>
 CreateTestFixture(absl::string_view test_case_name,
@@ -71,10 +68,14 @@
   auto fixture = webrtc_pc_e2e::CreatePeerConnectionE2EQualityTestFixture(
       std::string(test_case_name), time_controller, nullptr,
       std::move(video_quality_analyzer));
-  fixture->AddPeer(network_links.first->network_dependencies(),
-                   alice_configurer);
-  fixture->AddPeer(network_links.second->network_dependencies(),
-                   bob_configurer);
+  auto alice = std::make_unique<PeerConfigurer>(
+      network_links.first->network_dependencies());
+  auto bob = std::make_unique<PeerConfigurer>(
+      network_links.second->network_dependencies());
+  alice_configurer(alice.get());
+  bob_configurer(bob.get());
+  fixture->AddPeer(std::move(alice));
+  fixture->AddPeer(std::move(bob));
   return fixture;
 }
 
diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn
index 27e1e71..8075999 100644
--- a/test/pc/e2e/BUILD.gn
+++ b/test/pc/e2e/BUILD.gn
@@ -613,6 +613,7 @@
         "../../../api/test/metrics:global_metrics_logger_and_exporter",
         "../../../api/test/pclf:media_configuration",
         "../../../api/test/pclf:media_quality_test_params",
+        "../../../api/test/pclf:peer_configurer",
         "../../../api/video_codecs:builtin_video_decoder_factory",
         "../../../api/video_codecs:builtin_video_encoder_factory",
         "../../../call:simulated_network",
@@ -655,6 +656,7 @@
         "../../../api/test/metrics:stdout_metrics_exporter",
         "../../../api/test/pclf:media_configuration",
         "../../../api/test/pclf:media_quality_test_params",
+        "../../../api/test/pclf:peer_configurer",
         "../../../api/units:time_delta",
       ]
     }
diff --git a/test/pc/e2e/peer_connection_e2e_smoke_test.cc b/test/pc/e2e/peer_connection_e2e_smoke_test.cc
index 52c525f..0e7993e 100644
--- a/test/pc/e2e/peer_connection_e2e_smoke_test.cc
+++ b/test/pc/e2e/peer_connection_e2e_smoke_test.cc
@@ -20,6 +20,7 @@
 #include "api/test/network_emulation_manager.h"
 #include "api/test/pclf/media_configuration.h"
 #include "api/test/pclf/media_quality_test_params.h"
+#include "api/test/pclf/peer_configurer.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "call/simulated_network.h"
 #include "system_wrappers/include/field_trial.h"
@@ -41,8 +42,6 @@
 
 class PeerConnectionE2EQualityTestSmokeTest : public ::testing::Test {
  public:
-  using PeerConfigurer = PeerConnectionE2EQualityTestFixture::PeerConfigurer;
-
   void SetUp() override {
     network_emulation_ = CreateNetworkEmulationManager();
     auto video_quality_analyzer = std::make_unique<DefaultVideoQualityAnalyzer>(
@@ -81,8 +80,11 @@
   }
 
   void AddPeer(EmulatedNetworkManagerInterface* network,
-               rtc::FunctionView<void(PeerConfigurer*)> configurer) {
-    fixture_->AddPeer(network->network_dependencies(), configurer);
+               rtc::FunctionView<void(PeerConfigurer*)> update_configurer) {
+    auto configurer =
+        std::make_unique<PeerConfigurer>(network->network_dependencies());
+    update_configurer(configurer.get());
+    fixture_->AddPeer(std::move(configurer));
   }
 
   void RunAndCheckEachVideoStreamReceivedFrames(const RunParams& run_params) {
diff --git a/test/pc/e2e/peer_connection_quality_test.cc b/test/pc/e2e/peer_connection_quality_test.cc
index 90bc5c2..fe4114c 100644
--- a/test/pc/e2e/peer_connection_quality_test.cc
+++ b/test/pc/e2e/peer_connection_quality_test.cc
@@ -205,6 +205,13 @@
   return &peer_handles_.back();
 }
 
+PeerConnectionE2EQualityTest::PeerHandle* PeerConnectionE2EQualityTest::AddPeer(
+    std::unique_ptr<PeerConfigurer> configurer) {
+  peer_configurations_.push_back(std::move(configurer));
+  peer_handles_.push_back(PeerHandleImpl());
+  return &peer_handles_.back();
+}
+
 void PeerConnectionE2EQualityTest::Run(RunParams run_params) {
   webrtc::webrtc_pc_e2e::PeerParamsPreprocessor params_preprocessor;
   for (auto& peer_configuration : peer_configurations_) {
diff --git a/test/pc/e2e/peer_connection_quality_test.h b/test/pc/e2e/peer_connection_quality_test.h
index 9ee59b7..e077673 100644
--- a/test/pc/e2e/peer_connection_quality_test.h
+++ b/test/pc/e2e/peer_connection_quality_test.h
@@ -74,6 +74,7 @@
   PeerHandle* AddPeer(
       const PeerNetworkDependencies& network_dependencies,
       rtc::FunctionView<void(PeerConfigurer*)> configurer) override;
+  PeerHandle* AddPeer(std::unique_ptr<PeerConfigurer> configurer) override;
   void Run(RunParams run_params) override;
 
   TimeDelta GetRealTestDuration() const override {
diff --git a/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc b/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc
index 195cbc8..cf35944 100644
--- a/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc
+++ b/test/pc/e2e/peer_connection_quality_test_metric_names_test.cc
@@ -19,6 +19,7 @@
 #include "api/test/network_emulation_manager.h"
 #include "api/test/pclf/media_configuration.h"
 #include "api/test/pclf/media_quality_test_params.h"
+#include "api/test/pclf/peer_configurer.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "api/units/time_delta.h"
 #include "test/gmock.h"
@@ -39,8 +40,7 @@
 using ::webrtc::test::MetricsExporter;
 using ::webrtc::test::StdoutMetricsExporter;
 using ::webrtc::test::Unit;
-using PeerConfigurer = ::webrtc::webrtc_pc_e2e::
-    PeerConnectionE2EQualityTestFixture::PeerConfigurer;
+using ::webrtc::webrtc_pc_e2e::PeerConfigurer;
 
 // Adds a peer with some audio and video (the client should not care about
 // details about audio and video configs).
@@ -50,16 +50,16 @@
     absl::string_view video_stream_label,
     const PeerNetworkDependencies& network_dependencies,
     PeerConnectionE2EQualityTestFixture& fixture) {
-  fixture.AddPeer(network_dependencies, [&](PeerConfigurer* peer) {
-    peer->SetName(peer_name);
-    AudioConfig audio{std::string(audio_stream_label)};
-    audio.sync_group = std::string(peer_name);
-    peer->SetAudioConfig(std::move(audio));
-    VideoConfig video(std::string(video_stream_label), 320, 180, 15);
-    video.sync_group = std::string(peer_name);
-    peer->AddVideoConfig(std::move(video));
-    peer->SetVideoCodecs({VideoCodecConfig(cricket::kVp8CodecName)});
-  });
+  AudioConfig audio{std::string(audio_stream_label)};
+  audio.sync_group = std::string(peer_name);
+  VideoConfig video(std::string(video_stream_label), 320, 180, 15);
+  video.sync_group = std::string(peer_name);
+  auto peer = std::make_unique<PeerConfigurer>(network_dependencies);
+  peer->SetName(peer_name);
+  peer->SetAudioConfig(std::move(audio));
+  peer->AddVideoConfig(std::move(video));
+  peer->SetVideoCodecs({VideoCodecConfig(cricket::kVp8CodecName)});
+  fixture.AddPeer(std::move(peer));
 }
 
 // Metric fields to assert on
diff --git a/test/pc/e2e/peer_connection_quality_test_test.cc b/test/pc/e2e/peer_connection_quality_test_test.cc
index 2511bd2..f39b4f5 100644
--- a/test/pc/e2e/peer_connection_quality_test_test.cc
+++ b/test/pc/e2e/peer_connection_quality_test_test.cc
@@ -114,15 +114,16 @@
   EmulatedNetworkManagerInterface* bob_network =
       network_emulation->CreateEmulatedNetworkManagerInterface({bob_endpoint});
 
-  fixture.AddPeer(
-      alice_network->network_dependencies(), [&](PeerConfigurer* peer) {
-        peer->SetName("alice");
-        VideoConfig video("alice_video", 320, 180, 15);
-        video.output_dump_options = VideoDumpOptions(test_directory_);
-        peer->AddVideoConfig(std::move(video));
-      });
-  fixture.AddPeer(bob_network->network_dependencies(),
-                  [&](PeerConfigurer* peer) { peer->SetName("bob"); });
+  VideoConfig alice_video("alice_video", 320, 180, 15);
+  alice_video.output_dump_options = VideoDumpOptions(test_directory_);
+  PeerConfigurer alice(alice_network->network_dependencies());
+  alice.SetName("alice");
+  alice.AddVideoConfig(std::move(alice_video));
+  fixture.AddPeer(std::make_unique<PeerConfigurer>(std::move(alice)));
+
+  PeerConfigurer bob(bob_network->network_dependencies());
+  bob.SetName("bob");
+  fixture.AddPeer(std::make_unique<PeerConfigurer>(std::move(bob)));
 
   fixture.Run(RunParams(TimeDelta::Seconds(2)));
 
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 169b485..7990d20 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -625,6 +625,9 @@
         "../api:simulated_network_api",
         "../api:time_controller",
         "../api/test/metrics:global_metrics_logger_and_exporter",
+        "../api/test/pclf:media_configuration",
+        "../api/test/pclf:media_quality_test_params",
+        "../api/test/pclf:peer_configurer",
         "../api/video_codecs:video_codecs_api",
         "../call:simulated_network",
         "../modules/video_coding:webrtc_vp9",
diff --git a/video/pc_full_stack_tests.cc b/video/pc_full_stack_tests.cc
index d1a1ff6..83b0683 100644
--- a/video/pc_full_stack_tests.cc
+++ b/video/pc_full_stack_tests.cc
@@ -19,6 +19,9 @@
 #include "api/test/frame_generator_interface.h"
 #include "api/test/metrics/global_metrics_logger_and_exporter.h"
 #include "api/test/network_emulation_manager.h"
+#include "api/test/pclf/media_configuration.h"
+#include "api/test/pclf/media_quality_test_params.h"
+#include "api/test/pclf/peer_configurer.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "api/test/simulated_network.h"
 #include "api/test/time_controller.h"
@@ -33,21 +36,14 @@
 
 namespace webrtc {
 
-using EmulatedSFUConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::EmulatedSFUConfig;
-using PeerConfigurer =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::PeerConfigurer;
-using RunParams = webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::RunParams;
-using VideoConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoConfig;
-using AudioConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::AudioConfig;
-using ScreenShareConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::ScreenShareConfig;
-using VideoSimulcastConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoSimulcastConfig;
-using VideoCodecConfig =
-    webrtc_pc_e2e::PeerConnectionE2EQualityTestFixture::VideoCodecConfig;
+using ::webrtc::webrtc_pc_e2e::AudioConfig;
+using ::webrtc::webrtc_pc_e2e::EmulatedSFUConfig;
+using ::webrtc::webrtc_pc_e2e::PeerConfigurer;
+using ::webrtc::webrtc_pc_e2e::RunParams;
+using ::webrtc::webrtc_pc_e2e::ScreenShareConfig;
+using ::webrtc::webrtc_pc_e2e::VideoCodecConfig;
+using ::webrtc::webrtc_pc_e2e::VideoConfig;
+using ::webrtc::webrtc_pc_e2e::VideoSimulcastConfig;
 
 namespace {
 
@@ -63,10 +59,14 @@
   auto fixture = webrtc_pc_e2e::CreatePeerConnectionE2EQualityTestFixture(
       test_case_name, time_controller, /*audio_quality_analyzer=*/nullptr,
       /*video_quality_analyzer=*/nullptr);
-  fixture->AddPeer(network_links.first->network_dependencies(),
-                   alice_configurer);
-  fixture->AddPeer(network_links.second->network_dependencies(),
-                   bob_configurer);
+  auto alice = std::make_unique<PeerConfigurer>(
+      network_links.first->network_dependencies());
+  auto bob = std::make_unique<PeerConfigurer>(
+      network_links.second->network_dependencies());
+  alice_configurer(alice.get());
+  bob_configurer(bob.get());
+  fixture->AddPeer(std::move(alice));
+  fixture->AddPeer(std::move(bob));
   fixture->AddQualityMetricsReporter(
       std::make_unique<webrtc_pc_e2e::NetworkQualityMetricsReporter>(
           network_links.first, network_links.second,