Update tests in congestion_controller/ not to use global field trials

Bug: webrtc:419453427
Change-Id: I7fba1c142f70f527ab5d00911a2fc8f4643d9352
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/393980
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44794}
diff --git a/modules/congestion_controller/BUILD.gn b/modules/congestion_controller/BUILD.gn
index 64dbdcd..b82bbf7 100644
--- a/modules/congestion_controller/BUILD.gn
+++ b/modules/congestion_controller/BUILD.gn
@@ -52,6 +52,7 @@
     ]
     deps = [
       ":congestion_controller",
+      "../../api:field_trials",
       "../../api:rtp_parameters",
       "../../api/environment:environment_factory",
       "../../api/test/network_emulation",
@@ -62,7 +63,7 @@
       "../../api/units:timestamp",
       "../../rtc_base:buffer",
       "../../system_wrappers",
-      "../../test:explicit_key_value_config",
+      "../../test:create_test_field_trials",
       "../../test:test_support",
       "../../test/scenario",
       "../pacing",
diff --git a/modules/congestion_controller/goog_cc/BUILD.gn b/modules/congestion_controller/goog_cc/BUILD.gn
index f970a33..5e0931a 100644
--- a/modules/congestion_controller/goog_cc/BUILD.gn
+++ b/modules/congestion_controller/goog_cc/BUILD.gn
@@ -118,13 +118,8 @@
     "../../../logging:rtc_event_bwe",
     "../../../rtc_base:checks",
     "../../../rtc_base:logging",
-    "../../../rtc_base:macromagic",
-    "../../../rtc_base:rtc_numerics",
-    "../../../rtc_base:safe_conversions",
     "../../../rtc_base:safe_minmax",
     "../../../rtc_base/experiments:field_trial_parser",
-    "../../remote_bitrate_estimator",
-    "//third_party/abseil-cpp/absl/strings",
   ]
 }
 
@@ -303,6 +298,7 @@
         ":probe_controller",
         ":pushback_controller",
         ":send_side_bwe",
+        "../../../api:field_trials",
         "../../../api:field_trials_view",
         "../../../api:network_state_predictor_api",
         "../../../api/environment",
@@ -328,7 +324,7 @@
         "../../../rtc_base:stringutils",
         "../../../rtc_base/experiments:alr_experiment",
         "../../../system_wrappers",
-        "../../../test:explicit_key_value_config",
+        "../../../test:create_test_field_trials",
         "../../../test:field_trial",
         "../../../test:test_support",
         "../../../test/network:emulated_network",
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
index cc6e4a0..7d5a736 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
@@ -17,12 +17,13 @@
 #include <utility>
 #include <vector>
 
-#include "api/transport/field_trial_based_config.h"
+#include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/timestamp.h"
 #include "modules/congestion_controller/goog_cc/bitrate_estimator.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -50,7 +51,7 @@
 };
 
 struct AcknowledgedBitrateEstimatorTestStates {
-  FieldTrialBasedConfig field_trial_config;
+  FieldTrials field_trial_config = CreateTestFieldTrials();
   std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator;
   MockBitrateEstimator* mock_bitrate_estimator;
 };
diff --git a/modules/congestion_controller/goog_cc/alr_detector_unittest.cc b/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
index 725bd34..2fdba71 100644
--- a/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
+++ b/modules/congestion_controller/goog_cc/alr_detector_unittest.cc
@@ -13,10 +13,10 @@
 #include <cstdint>
 #include <optional>
 
-#include "api/transport/field_trial_based_config.h"
+#include "api/field_trials.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/experiments/alr_experiment.h"
-#include "test/field_trial.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace {
@@ -74,7 +74,7 @@
 }  // namespace
 
 TEST(AlrDetectorTest, AlrDetection) {
-  FieldTrialBasedConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   int64_t timestamp_ms = 1000;
   AlrDetector alr_detector(&field_trials);
   alr_detector.SetEstimatedBitrate(kEstimatedBitrateBps);
@@ -102,7 +102,7 @@
 }
 
 TEST(AlrDetectorTest, ShortSpike) {
-  FieldTrialBasedConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   int64_t timestamp_ms = 1000;
   AlrDetector alr_detector(&field_trials);
   alr_detector.SetEstimatedBitrate(kEstimatedBitrateBps);
@@ -129,7 +129,7 @@
 }
 
 TEST(AlrDetectorTest, BandwidthEstimateChanges) {
-  FieldTrialBasedConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   int64_t timestamp_ms = 1000;
   AlrDetector alr_detector(&field_trials);
   alr_detector.SetEstimatedBitrate(kEstimatedBitrateBps);
@@ -156,20 +156,20 @@
 }
 
 TEST(AlrDetectorTest, ParseControlFieldTrial) {
-  test::ScopedFieldTrials scoped_field_trial(
-      "WebRTC-ProbingScreenshareBwe/Control/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-ProbingScreenshareBwe/Control/");
   std::optional<AlrExperimentSettings> parsed_params =
       AlrExperimentSettings::CreateFromFieldTrial(
-          FieldTrialBasedConfig(), "WebRTC-ProbingScreenshareBwe");
+          field_trials, "WebRTC-ProbingScreenshareBwe");
   EXPECT_FALSE(static_cast<bool>(parsed_params));
 }
 
 TEST(AlrDetectorTest, ParseActiveFieldTrial) {
-  test::ScopedFieldTrials scoped_field_trial(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-ProbingScreenshareBwe/1.1,2875,85,20,-20,1/");
   std::optional<AlrExperimentSettings> parsed_params =
       AlrExperimentSettings::CreateFromFieldTrial(
-          FieldTrialBasedConfig(), "WebRTC-ProbingScreenshareBwe");
+          field_trials, "WebRTC-ProbingScreenshareBwe");
   ASSERT_TRUE(static_cast<bool>(parsed_params));
   EXPECT_EQ(1.1f, parsed_params->pacing_factor);
   EXPECT_EQ(2875, parsed_params->max_paced_queue_time);
@@ -180,10 +180,9 @@
 }
 
 TEST(AlrDetectorTest, ParseAlrSpecificFieldTrial) {
-  test::ScopedFieldTrials scoped_field_trial(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-AlrDetectorParameters/"
       "bw_usage:90%,start:0%,stop:-10%/");
-  FieldTrialBasedConfig field_trials;
   AlrDetector alr_detector(&field_trials);
   int64_t timestamp_ms = 1000;
   alr_detector.SetEstimatedBitrate(kEstimatedBitrateBps);
diff --git a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller_unittest.cc b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller_unittest.cc
index 6f85c4c..76db80e 100644
--- a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller_unittest.cc
+++ b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller_unittest.cc
@@ -13,15 +13,14 @@
 #include <cstdint>
 
 #include "api/units/data_size.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace test {
 
 TEST(CongestionWindowPushbackControllerTest, FullCongestionWindow) {
-  CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig(""));
+  CongestionWindowPushbackController cwnd_controller(CreateTestFieldTrials());
 
   cwnd_controller.UpdateOutstandingData(100000);
   cwnd_controller.SetDataWindow(DataSize::Bytes(50000));
@@ -36,8 +35,7 @@
 }
 
 TEST(CongestionWindowPushbackControllerTest, NormalCongestionWindow) {
-  CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig(""));
+  CongestionWindowPushbackController cwnd_controller(CreateTestFieldTrials());
 
   cwnd_controller.UpdateOutstandingData(199999);
   cwnd_controller.SetDataWindow(DataSize::Bytes(200000));
@@ -48,8 +46,7 @@
 }
 
 TEST(CongestionWindowPushbackControllerTest, LowBitrate) {
-  CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig(""));
+  CongestionWindowPushbackController cwnd_controller(CreateTestFieldTrials());
 
   cwnd_controller.UpdateOutstandingData(100000);
   cwnd_controller.SetDataWindow(DataSize::Bytes(50000));
@@ -64,8 +61,7 @@
 }
 
 TEST(CongestionWindowPushbackControllerTest, NoPushbackOnDataWindowUnset) {
-  CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig(""));
+  CongestionWindowPushbackController cwnd_controller(CreateTestFieldTrials());
 
   cwnd_controller.UpdateOutstandingData(1e8);  // Large number
 
@@ -76,7 +72,7 @@
 
 TEST(CongestionWindowPushbackControllerTest, PushbackOnInititialDataWindow) {
   CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig("WebRTC-CongestionWindow/InitWin:100000/"));
+      CreateTestFieldTrials("WebRTC-CongestionWindow/InitWin:100000/"));
 
   cwnd_controller.UpdateOutstandingData(1e8);  // Large number
 
@@ -87,7 +83,7 @@
 
 TEST(CongestionWindowPushbackControllerTest, PushbackDropFrame) {
   CongestionWindowPushbackController cwnd_controller(
-      ExplicitKeyValueConfig("WebRTC-CongestionWindow/DropFrame:true/"));
+      CreateTestFieldTrials("WebRTC-CongestionWindow/DropFrame:true/"));
 
   cwnd_controller.UpdateOutstandingData(1e8);  // Large number
   cwnd_controller.SetDataWindow(DataSize::Bytes(50000));
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.cc b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
index 9769792..079ce22 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
@@ -80,9 +80,9 @@
       last_video_packet_recv_time_(Timestamp::MinusInfinity()),
       network_state_predictor_(network_state_predictor),
       video_delay_detector_(
-          new TrendlineEstimator(key_value_config_, network_state_predictor_)),
+          new TrendlineEstimator(*key_value_config_, network_state_predictor_)),
       audio_delay_detector_(
-          new TrendlineEstimator(key_value_config_, network_state_predictor_)),
+          new TrendlineEstimator(*key_value_config_, network_state_predictor_)),
       active_delay_detector_(video_delay_detector_.get()),
       last_seen_packet_(Timestamp::MinusInfinity()),
       uma_recorded_(false),
@@ -155,9 +155,9 @@
         std::make_unique<InterArrivalDelta>(kSendTimeGroupLength);
 
     video_delay_detector_.reset(
-        new TrendlineEstimator(key_value_config_, network_state_predictor_));
+        new TrendlineEstimator(*key_value_config_, network_state_predictor_));
     audio_delay_detector_.reset(
-        new TrendlineEstimator(key_value_config_, network_state_predictor_));
+        new TrendlineEstimator(*key_value_config_, network_state_predictor_));
     active_delay_detector_ = video_delay_detector_.get();
   }
   last_seen_packet_ = at_time;
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
index 9e22ae8..c6e44a0 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
@@ -25,7 +25,7 @@
 #include "modules/congestion_controller/goog_cc/delay_based_bwe.h"
 #include "modules/congestion_controller/goog_cc/probe_bitrate_estimator.h"
 #include "rtc_base/checks.h"
-#include "test/field_trial.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -159,14 +159,13 @@
 }  // namespace test
 
 DelayBasedBweTest::DelayBasedBweTest()
-    : field_trial(std::make_unique<test::ScopedFieldTrials>(
+    : field_trials_(CreateTestFieldTrials(
           "WebRTC-Bwe-RobustThroughputEstimatorSettings/enabled:true/")),
       clock_(100000000),
       acknowledged_bitrate_estimator_(
-          AcknowledgedBitrateEstimatorInterface::Create(&field_trial_config_)),
+          AcknowledgedBitrateEstimatorInterface::Create(&field_trials_)),
       probe_bitrate_estimator_(new ProbeBitrateEstimator(nullptr)),
-      bitrate_estimator_(
-          new DelayBasedBwe(&field_trial_config_, nullptr, nullptr)),
+      bitrate_estimator_(new DelayBasedBwe(&field_trials_, nullptr, nullptr)),
       stream_generator_(new test::StreamGenerator(1e6,  // Capacity.
                                                   clock_.TimeInMicroseconds())),
       arrival_time_offset_ms_(0),
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
index b885ef2..78850c3 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
@@ -17,14 +17,13 @@
 #include <memory>
 #include <vector>
 
-#include "api/transport/field_trial_based_config.h"
+#include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/timestamp.h"
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h"
 #include "modules/congestion_controller/goog_cc/delay_based_bwe.h"
 #include "modules/congestion_controller/goog_cc/probe_bitrate_estimator.h"
 #include "system_wrappers/include/clock.h"
-#include "test/field_trial.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -170,10 +169,7 @@
                               int64_t receiver_clock_offset_change_ms);
 
   static const uint32_t kDefaultSsrc;
-  FieldTrialBasedConfig field_trial_config_;
-
-  std::unique_ptr<test::ScopedFieldTrials>
-      field_trial;        // Must be initialized first.
+  FieldTrials field_trials_;
   SimulatedClock clock_;  // Time at the receiver.
   test::TestBitrateObserver bitrate_observer_;
   std::unique_ptr<AcknowledgedBitrateEstimatorInterface>
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
index abe9a9b..12c4a98 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
@@ -21,6 +21,7 @@
 #include "absl/strings/string_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
+#include "api/field_trials.h"
 #include "api/test/network_emulation/create_cross_traffic.h"
 #include "api/test/network_emulation/cross_traffic.h"
 #include "api/transport/goog_cc_factory.h"
@@ -31,7 +32,7 @@
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "call/video_receive_stream.h"
-#include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
+#include "test/create_test_field_trials.h"
 #include "test/field_trial.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -262,7 +263,8 @@
 
 class NetworkControllerTestFixture {
  public:
-  NetworkControllerTestFixture() : factory_() {}
+  explicit NetworkControllerTestFixture(absl::string_view field_trials = "")
+      : field_trials_(CreateTestFieldTrials(field_trials)) {}
   explicit NetworkControllerTestFixture(GoogCcFactoryConfig googcc_config)
       : factory_(std::move(googcc_config)) {}
 
@@ -289,8 +291,8 @@
     return config;
   }
 
-  NiceMock<MockRtcEventLog> event_log_;
-  const Environment env_ = CreateEnvironment(&event_log_);
+  FieldTrials field_trials_ = CreateTestFieldTrials();
+  const Environment env_ = CreateEnvironment(&field_trials_);
   GoogCcNetworkControllerFactory factory_;
 };
 
@@ -439,9 +441,9 @@
 }
 
 TEST(GoogCcNetworkControllerTest, LimitPacingFactorToUpperLinkCapacity) {
-  ScopedFieldTrials trial(
+  NetworkControllerTestFixture fixture(
+      /*field_trials=*/
       "WebRTC-Bwe-LimitPacingFactorByUpperLinkCapacityEstimate/Enabled/");
-  NetworkControllerTestFixture fixture;
   std::unique_ptr<NetworkControllerInterface> controller =
       fixture.CreateController();
   Timestamp current_time = Timestamp::Millis(123);
diff --git a/modules/congestion_controller/goog_cc/loss_based_bwe_v2_test.cc b/modules/congestion_controller/goog_cc/loss_based_bwe_v2_test.cc
index e308ff8..a9c8506 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bwe_v2_test.cc
+++ b/modules/congestion_controller/goog_cc/loss_based_bwe_v2_test.cc
@@ -14,21 +14,20 @@
 #include <string>
 #include <vector>
 
+#include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/strings/string_builder.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 
 namespace {
 
-using test::ExplicitKeyValueConfig;
-
 constexpr TimeDelta kObservationDurationLowerBound = TimeDelta::Millis(250);
 constexpr TimeDelta kDelayedIncreaseWindow = TimeDelta::Millis(300);
 constexpr double kMaxIncreaseFactor = 1.5;
@@ -36,7 +35,7 @@
 
 class LossBasedBweV2Test : public ::testing::TestWithParam<bool> {
  protected:
-  std::string Config(bool enabled, bool valid) {
+  FieldTrials Config(bool enabled, bool valid) {
     char buffer[1024];
     SimpleStringBuilder config_string(buffer);
 
@@ -74,10 +73,10 @@
 
     config_string << "/";
 
-    return config_string.str();
+    return CreateTestFieldTrials(config_string.str());
   }
 
-  std::string ShortObservationConfig(std::string custom_config) {
+  FieldTrials ShortObservationConfig(std::string custom_config) {
     char buffer[1024];
     SimpleStringBuilder config_string(buffer);
 
@@ -86,7 +85,7 @@
     config_string << custom_config;
     config_string << "/";
 
-    return config_string.str();
+    return CreateTestFieldTrials(config_string.str());
   }
 
   std::vector<PacketResult> CreatePacketResultsWithReceivedPackets(
@@ -173,37 +172,35 @@
 };
 
 TEST_F(LossBasedBweV2Test, EnabledWhenGivenValidConfigurationValues) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   EXPECT_TRUE(loss_based_bandwidth_estimator.IsEnabled());
 }
 
 TEST_F(LossBasedBweV2Test, DisabledWhenGivenDisabledConfiguration) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/false, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/false, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   EXPECT_FALSE(loss_based_bandwidth_estimator.IsEnabled());
 }
 
 TEST_F(LossBasedBweV2Test, DisabledWhenGivenNonValidConfigurationValues) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/false));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/false);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   EXPECT_FALSE(loss_based_bandwidth_estimator.IsEnabled());
 }
 
 TEST_F(LossBasedBweV2Test, DisabledWhenGivenNonPositiveCandidateFactor) {
-  ExplicitKeyValueConfig key_value_config_negative_candidate_factor(
-      "WebRTC-Bwe-LossBasedBweV2/CandidateFactors:-1.3|1.1/");
+  FieldTrials key_value_config_negative_candidate_factor =
+      CreateTestFieldTrials(
+          "WebRTC-Bwe-LossBasedBweV2/CandidateFactors:-1.3|1.1/");
   LossBasedBweV2 loss_based_bandwidth_estimator_1(
       &key_value_config_negative_candidate_factor);
   EXPECT_FALSE(loss_based_bandwidth_estimator_1.IsEnabled());
 
-  ExplicitKeyValueConfig key_value_config_zero_candidate_factor(
+  FieldTrials key_value_config_zero_candidate_factor = CreateTestFieldTrials(
       "WebRTC-Bwe-LossBasedBweV2/CandidateFactors:0.0|1.1/");
   LossBasedBweV2 loss_based_bandwidth_estimator_2(
       &key_value_config_zero_candidate_factor);
@@ -212,7 +209,7 @@
 
 TEST_F(LossBasedBweV2Test,
        DisabledWhenGivenConfigurationThatDoesNotAllowGeneratingCandidates) {
-  ExplicitKeyValueConfig key_value_config(
+  FieldTrials key_value_config = CreateTestFieldTrials(
       "WebRTC-Bwe-LossBasedBweV2/"
       "CandidateFactors:1.0,AckedRateCandidate:false,"
       "DelayBasedCandidate:false/");
@@ -221,8 +218,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, ReturnsDelayBasedEstimateWhenDisabled) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/false, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/false, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.UpdateBandwidthEstimate(
       /*packet_results=*/{},
@@ -236,13 +232,11 @@
 
 TEST_F(LossBasedBweV2Test,
        ReturnsDelayBasedEstimateWhenWhenGivenNonValidConfigurationValues) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/false));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/false);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.UpdateBandwidthEstimate(
       /*packet_results=*/{},
       /*delay_based_estimate=*/DataRate::KilobitsPerSec(100),
-
       /*in_alr=*/false);
   EXPECT_EQ(
       loss_based_bandwidth_estimator.GetLossBasedResult().bandwidth_estimate,
@@ -255,15 +249,13 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero());
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(600));
   loss_based_bandwidth_estimator.UpdateBandwidthEstimate(
       enough_feedback, /*delay_based_estimate=*/DataRate::PlusInfinity(),
-
       /*in_alr=*/false);
 
   EXPECT_TRUE(loss_based_bandwidth_estimator.IsReady());
@@ -275,8 +267,7 @@
   std::vector<PacketResult> enough_feedback =
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero());
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.UpdateBandwidthEstimate(
@@ -303,8 +294,7 @@
   not_enough_feedback[1].receive_time =
       Timestamp::Zero() + kObservationDurationLowerBound;
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -334,8 +324,7 @@
           /*first_packet_timestamp=*/Timestamp::Zero() +
           2 * kObservationDurationLowerBound);
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -376,8 +365,7 @@
           /*first_packet_timestamp=*/Timestamp::Zero() +
           2 * kObservationDurationLowerBound);
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator_1(&key_value_config);
   LossBasedBweV2 loss_based_bandwidth_estimator_2(&key_value_config);
 
@@ -425,8 +413,7 @@
       CreatePacketResultsWith100pLossRate(
           /*first_packet_timestamp=*/Timestamp::Zero());
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -454,8 +441,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           2 * kObservationDurationLowerBound);
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -493,8 +479,7 @@
           /*first_packet_timestamp=*/Timestamp::Zero() +
           2 * kObservationDurationLowerBound);
 
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -522,8 +507,7 @@
   std::vector<PacketResult> enough_feedback_1 =
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero());
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(600));
@@ -559,8 +543,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           kObservationDurationLowerBound - TimeDelta::Millis(1));
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(600));
@@ -592,8 +575,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           kObservationDurationLowerBound - TimeDelta::Millis(1));
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(600));
@@ -621,8 +603,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           2 * kObservationDurationLowerBound);
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -643,7 +624,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, IncreaseByHoldFactorAfterLossBasedBweBacksOff) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(""));
+  FieldTrials key_value_config = ShortObservationConfig("");
 
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
@@ -684,11 +665,11 @@
 
 TEST_F(LossBasedBweV2Test,
        LossBasedStateIsDelayBasedEstimateAfterNetworkRecovering) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "CandidateFactors:100|1|0.5,"
       "InstantUpperBoundBwBalance:10000kbps,"
       "MaxIncreaseFactor:100,"
-      "NotIncreaseIfInherentLossLessThanAverageLoss:false"));
+      "NotIncreaseIfInherentLossLessThanAverageLoss:false");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(600);
   DataRate acked_rate = DataRate::KilobitsPerSec(300);
@@ -735,10 +716,10 @@
 
 TEST_F(LossBasedBweV2Test,
        LossBasedStateIsNotDelayBasedEstimateIfDelayBasedEstimateInfinite) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("CandidateFactors:100|1|0.5,"
-                             "InstantUpperBoundBwBalance:10000kbps,"
-                             "MaxIncreaseFactor:100"));
+  FieldTrials key_value_config = ShortObservationConfig(
+      "CandidateFactors:100|1|0.5,"
+      "InstantUpperBoundBwBalance:10000kbps,"
+      "MaxIncreaseFactor:100");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(600));
@@ -773,11 +754,11 @@
 // a factor of acked bitrate.
 TEST_F(LossBasedBweV2Test,
        IncreaseByFactorOfAckedBitrateAfterLossBasedBweBacksOff) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "LossThresholdOfHighBandwidthPreference:0.99,"
       "BwRampupUpperBoundFactor:1.2,"
       // Set InstantUpperBoundBwBalance high to disable InstantUpperBound cap.
-      "InstantUpperBoundBwBalance:10000kbps,"));
+      "InstantUpperBoundBwBalance:10000kbps,");
   std::vector<PacketResult> enough_feedback_1 =
       CreatePacketResultsWith100pLossRate(
           /*first_packet_timestamp=*/Timestamp::Zero());
@@ -832,11 +813,11 @@
 // Ensure that the state can switch to kIncrease even when the bandwidth is
 // bounded by acked bitrate.
 TEST_F(LossBasedBweV2Test, EnsureIncreaseEvenIfAckedBitrateBound) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "LossThresholdOfHighBandwidthPreference:0.99,"
       "BwRampupUpperBoundFactor:1.2,"
       // Set InstantUpperBoundBwBalance high to disable InstantUpperBound cap.
-      "InstantUpperBoundBwBalance:10000kbps,"));
+      "InstantUpperBoundBwBalance:10000kbps,");
   std::vector<PacketResult> enough_feedback_1 =
       CreatePacketResultsWith100pLossRate(
           /*first_packet_timestamp=*/Timestamp::Zero());
@@ -891,8 +872,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           kDelayedIncreaseWindow - TimeDelta::Millis(1));
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
 
@@ -939,8 +919,7 @@
       CreatePacketResultsWithReceivedPackets(
           /*first_packet_timestamp=*/Timestamp::Zero() +
           kDelayedIncreaseWindow + TimeDelta::Millis(1));
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
 
@@ -974,9 +953,9 @@
 }
 
 TEST_F(LossBasedBweV2Test, NotIncreaseIfInherentLossLessThanAverageLoss) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "CandidateFactors:1.2,"
-      "NotIncreaseIfInherentLossLessThanAverageLoss:true"));
+      "NotIncreaseIfInherentLossLessThanAverageLoss:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
 
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
@@ -1007,9 +986,9 @@
 
 TEST_F(LossBasedBweV2Test,
        SelectHighBandwidthCandidateIfLossRateIsLessThanThreshold) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "LossThresholdOfHighBandwidthPreference:0.20,"
-      "NotIncreaseIfInherentLossLessThanAverageLoss:false"));
+      "NotIncreaseIfInherentLossLessThanAverageLoss:false");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
 
@@ -1042,8 +1021,8 @@
 
 TEST_F(LossBasedBweV2Test,
        SelectLowBandwidthCandidateIfLossRateIsIsHigherThanThreshold) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("LossThresholdOfHighBandwidthPreference:0.05"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("LossThresholdOfHighBandwidthPreference:0.05");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   DataRate delay_based_estimate = DataRate::KilobitsPerSec(5000);
 
@@ -1075,8 +1054,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, EstimateIsNotHigherThanMaxBitrate) {
-  ExplicitKeyValueConfig key_value_config(
-      Config(/*enabled=*/true, /*valid=*/true));
+  FieldTrials key_value_config = Config(/*enabled=*/true, /*valid=*/true);
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1097,8 +1075,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, NotBackOffToAckedRateInAlr) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("InstantUpperBoundBwBalance:100kbps"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("InstantUpperBoundBwBalance:100kbps");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1127,8 +1105,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, BackOffToAckedRateIfNotInAlr) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("InstantUpperBoundBwBalance:100kbps"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("InstantUpperBoundBwBalance:100kbps");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1154,8 +1132,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, NotReadyToUseInStartPhase) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("UseInStartPhase:true"));
+  FieldTrials key_value_config = ShortObservationConfig("UseInStartPhase:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   // Make sure that the estimator is not ready to use in start phase because of
   // lacking TWCC feedback.
@@ -1163,8 +1140,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, ReadyToUseInStartPhase) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("UseInStartPhase:true"));
+  FieldTrials key_value_config = ShortObservationConfig("UseInStartPhase:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   std::vector<PacketResult> enough_feedback =
       CreatePacketResultsWithReceivedPackets(
@@ -1177,8 +1153,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, BoundEstimateByAckedRate) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("LowerBoundByAckedRateFactor:1.0"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("LowerBoundByAckedRateFactor:1.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1202,8 +1178,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, NotBoundEstimateByAckedRate) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("LowerBoundByAckedRateFactor:0.0"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("LowerBoundByAckedRateFactor:0.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1227,8 +1203,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, HasDecreaseStateBecauseOfUpperBound) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
-      "CandidateFactors:1.0,InstantUpperBoundBwBalance:10kbps"));
+  FieldTrials key_value_config = ShortObservationConfig(
+      "CandidateFactors:1.0,InstantUpperBoundBwBalance:10kbps");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1256,8 +1232,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, HasIncreaseStateBecauseOfLowerBound) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
-      "CandidateFactors:1.0,LowerBoundByAckedRateFactor:10.0"));
+  FieldTrials key_value_config = ShortObservationConfig(
+      "CandidateFactors:1.0,LowerBoundByAckedRateFactor:10.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1302,8 +1278,8 @@
 
 TEST_F(LossBasedBweV2Test,
        EstimateIncreaseSlowlyFromInstantUpperBoundInAlrIfFieldTrial) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("UpperBoundCandidateInAlr:true"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("UpperBoundCandidateInAlr:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(1000));
@@ -1333,7 +1309,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, HasDelayBasedStateIfLossBasedBweIsMax) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(""));
+  FieldTrials key_value_config = ShortObservationConfig("");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetMinMaxBitrate(
       /*min_bitrate=*/DataRate::KilobitsPerSec(10),
@@ -1379,8 +1355,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, IncreaseUsingPaddingStateIfFieldTrial) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("PaddingDuration:1000ms"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("PaddingDuration:1000ms");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1407,8 +1383,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, BestCandidateResetsToUpperBoundInFieldTrial) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("PaddingDuration:1000ms,BoundBestCandidate:true"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("PaddingDuration:1000ms,BoundBestCandidate:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1443,10 +1419,10 @@
 }
 
 TEST_F(LossBasedBweV2Test, DecreaseToAckedCandidateIfPaddingInAlr) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
+  FieldTrials key_value_config = ShortObservationConfig(
       "PaddingDuration:1000ms,"
       // Set InstantUpperBoundBwBalance high to disable InstantUpperBound cap.
-      "InstantUpperBoundBwBalance:10000kbps"));
+      "InstantUpperBoundBwBalance:10000kbps");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(1000));
@@ -1493,8 +1469,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, DecreaseAfterPadding) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
-      "PaddingDuration:1000ms,BwRampupUpperBoundFactor:2.0"));
+  FieldTrials key_value_config = ShortObservationConfig(
+      "PaddingDuration:1000ms,BwRampupUpperBoundFactor:2.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1549,8 +1525,8 @@
 
 
 TEST_F(LossBasedBweV2Test, HoldRateNotLowerThanAckedRate) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(
-      "HoldDurationFactor:10,LowerBoundByAckedRateFactor:1.0"));
+  FieldTrials key_value_config = ShortObservationConfig(
+      "HoldDurationFactor:10,LowerBoundByAckedRateFactor:1.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1579,8 +1555,8 @@
 }
 
 TEST_F(LossBasedBweV2Test, EstimateNotLowerThanAckedRate) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("LowerBoundByAckedRateFactor:1.0"));
+  FieldTrials key_value_config =
+      ShortObservationConfig("LowerBoundByAckedRateFactor:1.0");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1625,7 +1601,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, EndHoldDurationIfDelayBasedEstimateWorks) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(""));
+  FieldTrials key_value_config = ShortObservationConfig("");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(2500));
@@ -1659,8 +1635,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, UseByteLossRate) {
-  ExplicitKeyValueConfig key_value_config(
-      ShortObservationConfig("UseByteLossRate:true"));
+  FieldTrials key_value_config = ShortObservationConfig("UseByteLossRate:true");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(
       DataRate::KilobitsPerSec(500));
@@ -1680,7 +1655,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, UseByteLossRateIgnoreLossSpike) {
-  ExplicitKeyValueConfig key_value_config(
+  FieldTrials key_value_config = CreateTestFieldTrials(
       "WebRTC-Bwe-LossBasedBweV2/"
       "UseByteLossRate:true,ObservationWindowSize:5/");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
@@ -1729,7 +1704,7 @@
 }
 
 TEST_F(LossBasedBweV2Test, UseByteLossRateDoesNotIgnoreLossSpikeOnSendBurst) {
-  ExplicitKeyValueConfig key_value_config(
+  FieldTrials key_value_config = CreateTestFieldTrials(
       "WebRTC-Bwe-LossBasedBweV2/"
       "UseByteLossRate:true,ObservationWindowSize:5/");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
@@ -1764,7 +1739,7 @@
 
 TEST_F(LossBasedBweV2Test,
        EstimateDoesNotBackOffDueToPacketReorderingBetweenFeedback) {
-  ExplicitKeyValueConfig key_value_config(ShortObservationConfig(""));
+  FieldTrials key_value_config = ShortObservationConfig("");
   LossBasedBweV2 loss_based_bandwidth_estimator(&key_value_config);
   const DataRate kStartBitrate = DataRate::KilobitsPerSec(2500);
   loss_based_bandwidth_estimator.SetBandwidthEstimate(kStartBitrate);
diff --git a/modules/congestion_controller/goog_cc/probe_controller_unittest.cc b/modules/congestion_controller/goog_cc/probe_controller_unittest.cc
index 39712ad..7b6267d 100644
--- a/modules/congestion_controller/goog_cc/probe_controller_unittest.cc
+++ b/modules/congestion_controller/goog_cc/probe_controller_unittest.cc
@@ -14,13 +14,14 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
 #include "system_wrappers/include/clock.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -49,7 +50,8 @@
 class ProbeControllerFixture {
  public:
   explicit ProbeControllerFixture(absl::string_view field_trials = "")
-      : field_trial_config_(field_trials), clock_(100000000L) {}
+      : field_trial_config_(CreateTestFieldTrials(field_trials)),
+        clock_(100000000L) {}
 
   std::unique_ptr<ProbeController> CreateController() {
     return std::make_unique<ProbeController>(&field_trial_config_,
@@ -59,7 +61,7 @@
   Timestamp CurrentTime() { return clock_.CurrentTime(); }
   void AdvanceTime(TimeDelta delta) { clock_.AdvanceTime(delta); }
 
-  ExplicitKeyValueConfig field_trial_config_;
+  FieldTrials field_trial_config_;
   SimulatedClock clock_;
   NiceMock<MockRtcEventLog> mock_rtc_event_log;
 };
diff --git a/modules/congestion_controller/goog_cc/robust_throughput_estimator_unittest.cc b/modules/congestion_controller/goog_cc/robust_throughput_estimator_unittest.cc
index ef58263..6d5a742 100644
--- a/modules/congestion_controller/goog_cc/robust_throughput_estimator_unittest.cc
+++ b/modules/congestion_controller/goog_cc/robust_throughput_estimator_unittest.cc
@@ -17,20 +17,21 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/field_trials.h"
 #include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 
 RobustThroughputEstimatorSettings CreateRobustThroughputEstimatorSettings(
     absl::string_view field_trial_string) {
-  test::ExplicitKeyValueConfig trials(field_trial_string);
+  FieldTrials trials = CreateTestFieldTrials(field_trial_string);
   RobustThroughputEstimatorSettings settings(&trials);
   return settings;
 }
diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
index c42e015..eccad2b 100644
--- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
+++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
@@ -152,7 +152,7 @@
   return DataRate::BitsPerSec(capacity_estimate_bps_);
 }
 
-RttBasedBackoff::RttBasedBackoff(const FieldTrialsView* key_value_config)
+RttBasedBackoff::RttBasedBackoff(const FieldTrialsView& key_value_config)
     : disabled_("Disabled"),
       configured_limit_("limit", TimeDelta::Seconds(3)),
       drop_fraction_("fraction", 0.8),
@@ -166,7 +166,7 @@
       last_packet_sent_(Timestamp::MinusInfinity()) {
   ParseFieldTrial({&disabled_, &configured_limit_, &drop_fraction_,
                    &drop_interval_, &bandwidth_floor_},
-                  key_value_config->Lookup("WebRTC-Bwe-MaxRttLimit"));
+                  key_value_config.Lookup("WebRTC-Bwe-MaxRttLimit"));
   if (!disabled_) {
     rtt_limit_ = configured_limit_.Get();
   }
@@ -195,7 +195,7 @@
     const FieldTrialsView* key_value_config,
     RtcEventLog* event_log)
     : key_value_config_(key_value_config),
-      rtt_backoff_(key_value_config),
+      rtt_backoff_(*key_value_config),
       lost_packets_since_last_loss_update_(0),
       expected_packets_since_last_loss_update_(0),
       current_target_(DataRate::Zero()),
diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
index 72123a7..5fa8ae9 100644
--- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
+++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
@@ -57,7 +57,7 @@
 
 class RttBasedBackoff {
  public:
-  explicit RttBasedBackoff(const FieldTrialsView* key_value_config);
+  explicit RttBasedBackoff(const FieldTrialsView& key_value_config);
   ~RttBasedBackoff();
   void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
   bool IsRttAboveLimit() const;
diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc
index 866700b..5efd337 100644
--- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc
+++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation_unittest.cc
@@ -12,13 +12,14 @@
 
 #include <cstdint>
 
+#include "api/field_trials.h"
 #include "api/rtc_event_log/rtc_event.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
 #include "logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h"
 #include "logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -42,7 +43,7 @@
 
 void TestProbing(bool use_delay_based) {
   ::testing::NiceMock<MockRtcEventLog> event_log;
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   int64_t now_ms = 0;
   bwe.SetMinMaxBitrate(DataRate::BitsPerSec(100000),
@@ -95,7 +96,7 @@
   EXPECT_CALL(event_log,
               LogProxy(LossBasedBweUpdateWithBitrateAndLossFraction()))
       .Times(1);
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   static const int kMinBitrateBps = 100000;
   static const int kInitialBitrateBps = 1000000;
@@ -146,7 +147,7 @@
 
 TEST(SendSideBweTest, SettingSendBitrateOverridesDelayBasedEstimate) {
   ::testing::NiceMock<MockRtcEventLog> event_log;
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   static const int kMinBitrateBps = 10000;
   static const int kMaxBitrateBps = 10000000;
@@ -173,21 +174,20 @@
 }
 
 TEST(RttBasedBackoff, DefaultEnabled) {
-  test::ExplicitKeyValueConfig key_value_config("");
-  RttBasedBackoff rtt_backoff(&key_value_config);
+  RttBasedBackoff rtt_backoff(CreateTestFieldTrials());
   EXPECT_TRUE(rtt_backoff.rtt_limit_.IsFinite());
 }
 
 TEST(RttBasedBackoff, CanBeDisabled) {
-  test::ExplicitKeyValueConfig key_value_config(
-      "WebRTC-Bwe-MaxRttLimit/Disabled/");
-  RttBasedBackoff rtt_backoff(&key_value_config);
+  FieldTrials key_value_config =
+      CreateTestFieldTrials("WebRTC-Bwe-MaxRttLimit/Disabled/");
+  RttBasedBackoff rtt_backoff(key_value_config);
   EXPECT_TRUE(rtt_backoff.rtt_limit_.IsPlusInfinity());
 }
 
 TEST(SendSideBweTest, FractionLossIsNotOverflowed) {
   MockRtcEventLog event_log;
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   static const int kMinBitrateBps = 100000;
   static const int kInitialBitrateBps = 1000000;
@@ -210,7 +210,7 @@
 
 TEST(SendSideBweTest, RttIsAboveLimitIfRttGreaterThanLimit) {
   ::testing::NiceMock<MockRtcEventLog> event_log;
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   static const int kMinBitrateBps = 10000;
   static const int kMaxBitrateBps = 10000000;
@@ -227,7 +227,7 @@
 
 TEST(SendSideBweTest, RttIsBelowLimitIfRttLessThanLimit) {
   ::testing::NiceMock<MockRtcEventLog> event_log;
-  test::ExplicitKeyValueConfig key_value_config("");
+  FieldTrials key_value_config = CreateTestFieldTrials();
   SendSideBandwidthEstimation bwe(&key_value_config, &event_log);
   static const int kMinBitrateBps = 10000;
   static const int kMaxBitrateBps = 10000000;
diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.cc b/modules/congestion_controller/goog_cc/trendline_estimator.cc
index 2f8835a..35ec139 100644
--- a/modules/congestion_controller/goog_cc/trendline_estimator.cc
+++ b/modules/congestion_controller/goog_cc/trendline_estimator.cc
@@ -22,7 +22,6 @@
 #include <string>
 #include <utility>
 
-#include "absl/strings/match.h"
 #include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/transport/bandwidth_usage.h"
@@ -41,9 +40,9 @@
 const char kBweWindowSizeInPacketsExperiment[] =
     "WebRTC-BweWindowSizeInPackets";
 
-size_t ReadTrendlineFilterWindowSize(const FieldTrialsView* key_value_config) {
+size_t ReadTrendlineFilterWindowSize(const FieldTrialsView& key_value_config) {
   std::string experiment_string =
-      key_value_config->Lookup(kBweWindowSizeInPacketsExperiment);
+      key_value_config.Lookup(kBweWindowSizeInPacketsExperiment);
   size_t window_size;
   int parsed_values =
       sscanf(experiment_string.c_str(), "Enabled-%zu", &window_size);
@@ -121,13 +120,11 @@
 constexpr char TrendlineEstimatorSettings::kKey[];
 
 TrendlineEstimatorSettings::TrendlineEstimatorSettings(
-    const FieldTrialsView* key_value_config) {
-  if (absl::StartsWith(
-          key_value_config->Lookup(kBweWindowSizeInPacketsExperiment),
-          "Enabled")) {
+    const FieldTrialsView& key_value_config) {
+  if (key_value_config.IsEnabled(kBweWindowSizeInPacketsExperiment)) {
     window_size = ReadTrendlineFilterWindowSize(key_value_config);
   }
-  Parser()->Parse(key_value_config->Lookup(TrendlineEstimatorSettings::kKey));
+  Parser()->Parse(key_value_config.Lookup(TrendlineEstimatorSettings::kKey));
   if (window_size < 10 || 200 < window_size) {
     RTC_LOG(LS_WARNING) << "Window size must be between 10 and 200 packets";
     window_size = kDefaultTrendlineWindowSize;
@@ -166,7 +163,7 @@
 }
 
 TrendlineEstimator::TrendlineEstimator(
-    const FieldTrialsView* key_value_config,
+    const FieldTrialsView& key_value_config,
     NetworkStatePredictor* network_state_predictor)
     : settings_(key_value_config),
       smoothing_coef_(kDefaultTrendlineSmoothingCoeff),
diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.h b/modules/congestion_controller/goog_cc/trendline_estimator.h
index 70336ea..5fc55ac 100644
--- a/modules/congestion_controller/goog_cc/trendline_estimator.h
+++ b/modules/congestion_controller/goog_cc/trendline_estimator.h
@@ -29,7 +29,7 @@
   static constexpr unsigned kDefaultTrendlineWindowSize = 20;
 
   TrendlineEstimatorSettings() = delete;
-  explicit TrendlineEstimatorSettings(const FieldTrialsView* key_value_config);
+  explicit TrendlineEstimatorSettings(const FieldTrialsView& key_value_config);
 
   // Sort the packets in the window. Should be redundant,
   // but then almost no cost.
@@ -50,7 +50,7 @@
 
 class TrendlineEstimator : public DelayIncreaseDetectorInterface {
  public:
-  TrendlineEstimator(const FieldTrialsView* key_value_config,
+  TrendlineEstimator(const FieldTrialsView& key_value_config,
                      NetworkStatePredictor* network_state_predictor);
 
   ~TrendlineEstimator() override;
diff --git a/modules/congestion_controller/goog_cc/trendline_estimator_unittest.cc b/modules/congestion_controller/goog_cc/trendline_estimator_unittest.cc
index 2c52d7d..3e4368c 100644
--- a/modules/congestion_controller/goog_cc/trendline_estimator_unittest.cc
+++ b/modules/congestion_controller/goog_cc/trendline_estimator_unittest.cc
@@ -16,8 +16,8 @@
 #include <vector>
 
 #include "api/transport/bandwidth_usage.h"
-#include "api/transport/field_trial_based_config.h"
 #include "rtc_base/checks.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -45,8 +45,7 @@
       : send_times(kPacketCount),
         recv_times(kPacketCount),
         packet_sizes(kPacketCount),
-        config(),
-        estimator(&config, nullptr),
+        estimator(CreateTestFieldTrials(), nullptr),
         count(1) {
     std::fill(packet_sizes.begin(), packet_sizes.end(), kPacketSizeBytes);
   }
@@ -76,7 +75,6 @@
   std::vector<int64_t> send_times;
   std::vector<int64_t> recv_times;
   std::vector<size_t> packet_sizes;
-  const FieldTrialBasedConfig config;
   TrendlineEstimator estimator;
   size_t count;
 };
diff --git a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
index 0fb5914..405d3b7 100644
--- a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
+++ b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "api/environment/environment_factory.h"
+#include "api/field_trials.h"
 #include "api/media_types.h"
 #include "api/test/network_emulation/create_cross_traffic.h"
 #include "api/test/network_emulation/cross_traffic.h"
@@ -30,7 +31,7 @@
 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
 #include "rtc_base/buffer.h"
 #include "system_wrappers/include/clock.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/scenario/scenario.h"
@@ -104,7 +105,7 @@
 }
 
 TEST(ReceiveSideCongestionControllerTest, SendsRfc8888FeedbackIfForced) {
-  test::ExplicitKeyValueConfig field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-RFC8888CongestionControlFeedback/force_send:true/");
   MockFunction<void(std::vector<std::unique_ptr<rtcp::RtcpPacket>>)>
       rtcp_sender;
diff --git a/modules/congestion_controller/rtp/BUILD.gn b/modules/congestion_controller/rtp/BUILD.gn
index f9e230e..3f66157 100644
--- a/modules/congestion_controller/rtp/BUILD.gn
+++ b/modules/congestion_controller/rtp/BUILD.gn
@@ -85,7 +85,6 @@
       "../../../rtc_base:safe_conversions",
       "../../../rtc_base/network:sent_packet",
       "../../../system_wrappers",
-      "../../../test:field_trial",
       "../../../test:test_support",
       "../../pacing",
       "../../remote_bitrate_estimator",