Propagate field trials in video unittests

Bug: webrtc:419453427
Change-Id: I85586c277ceee01b1f5e11f6797fc2ce5de90b0a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/398321
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45042}
diff --git a/video/BUILD.gn b/video/BUILD.gn
index f484d75..044a89e 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -1027,19 +1027,17 @@
       "../rtc_base/synchronization:mutex",
       "../system_wrappers",
       "../system_wrappers:metrics",
+      "../test:create_test_field_trials",
       "../test:direct_transport",
       "../test:encoder_settings",
-      "../test:explicit_key_value_config",
       "../test:fake_encoded_frame",
       "../test:fake_video_codecs",
-      "../test:field_trial",
       "../test:frame_generator_capturer",
       "../test:frame_utils",
       "../test:mock_transport",
       "../test:null_transport",
       "../test:rtp_test_utils",
       "../test:run_loop",
-      "../test:scoped_key_value_config",
       "../test:test_common",
       "../test:test_support",
       "../test:video_test_common",
diff --git a/video/buffered_frame_decryptor_unittest.cc b/video/buffered_frame_decryptor_unittest.cc
index f037d62..bbe975f 100644
--- a/video/buffered_frame_decryptor_unittest.cc
+++ b/video/buffered_frame_decryptor_unittest.cc
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include "api/crypto/frame_decryptor_interface.h"
+#include "api/field_trials.h"
 #include "api/make_ref_counted.h"
 #include "api/rtp_packet_infos.h"
 #include "api/scoped_refptr.h"
@@ -28,9 +29,9 @@
 #include "api/video/video_timing.h"
 #include "modules/rtp_rtcp/source/frame_object.h"
 #include "modules/rtp_rtcp/source/rtp_video_header.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 
 using ::testing::Return;
 
@@ -107,7 +108,7 @@
 
   static const size_t kMaxStashedFrames;
 
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_ = CreateTestFieldTrials();
   std::vector<uint8_t> fake_packet_data_;
   scoped_refptr<MockFrameDecryptor> mock_frame_decryptor_;
   std::unique_ptr<BufferedFrameDecryptor> buffered_frame_decryptor_;
diff --git a/video/config/BUILD.gn b/video/config/BUILD.gn
index d48bb49..4305e28 100644
--- a/video/config/BUILD.gn
+++ b/video/config/BUILD.gn
@@ -74,6 +74,7 @@
     deps = [
       ":encoder_config",
       ":streams_config",
+      "../../api:field_trials",
       "../../api:field_trials_view",
       "../../api:make_ref_counted",
       "../../api/units:data_rate",
@@ -85,7 +86,7 @@
       "../../media:media_constants",
       "../../rtc_base:safe_conversions",
       "../../rtc_base/experiments:min_video_bitrate_experiment",
-      "../../test:explicit_key_value_config",
+      "../../test:create_test_field_trials",
       "../../test:test_support",
       "//third_party/abseil-cpp/absl/strings:string_view",
     ]
diff --git a/video/config/encoder_stream_factory_unittest.cc b/video/config/encoder_stream_factory_unittest.cc
index 5c93527..9b44930 100644
--- a/video/config/encoder_stream_factory_unittest.cc
+++ b/video/config/encoder_stream_factory_unittest.cc
@@ -17,6 +17,7 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/field_trials.h"
 #include "api/field_trials_view.h"
 #include "api/make_ref_counted.h"
 #include "api/video/resolution.h"
@@ -27,14 +28,13 @@
 #include "call/adaptation/video_source_restrictions.h"
 #include "rtc_base/experiments/min_video_bitrate_experiment.h"
 #include "rtc_base/numerics/safe_conversions.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
-using test::ExplicitKeyValueConfig;
 using ::testing::Combine;
 using ::testing::ElementsAre;
 using ::testing::IsEmpty;
@@ -92,7 +92,7 @@
 }  // namespace
 
 TEST(EncoderStreamFactory, SinglecastScaleResolutionDownTo) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoEncoderConfig encoder_config;
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(1);
@@ -108,7 +108,7 @@
 }
 
 TEST(EncoderStreamFactory, SinglecastScaleResolutionDownToWithAdaptation) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoSourceRestrictions restrictions(
       /* max_pixels_per_frame= */ (320 * 320),
       /* target_pixels_per_frame= */ std::nullopt,
@@ -129,7 +129,7 @@
 }
 
 TEST(EncoderStreamFactory, SimulcastScaleResolutionDownToUnrestricted) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoEncoderConfig encoder_config;
   encoder_config.number_of_streams = 3;
   encoder_config.simulcast_layers.resize(3);
@@ -149,7 +149,7 @@
 }
 
 TEST(EncoderStreamFactory, SimulcastScaleResolutionDownToWith360pRestriction) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoSourceRestrictions restrictions(
       /* max_pixels_per_frame= */ (640 * 360),
       /* target_pixels_per_frame= */ std::nullopt,
@@ -174,7 +174,7 @@
 }
 
 TEST(EncoderStreamFactory, SimulcastScaleResolutionDownToWith90pRestriction) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoSourceRestrictions restrictions(
       /* max_pixels_per_frame= */ (160 * 90),
       /* target_pixels_per_frame= */ std::nullopt,
@@ -200,7 +200,7 @@
 
 TEST(EncoderStreamFactory,
      ReverseSimulcastScaleResolutionDownToWithRestriction) {
-  ExplicitKeyValueConfig field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials();
   VideoSourceRestrictions restrictions(
       /* max_pixels_per_frame= */ (640 * 360),
       /* target_pixels_per_frame= */ std::nullopt,
@@ -235,8 +235,8 @@
   encoder_config.simulcast_layers.resize(encoder_config.number_of_streams);
   encoder_config.bitrate_priority = kBitratePriority;
   auto streams = CreateEncoderStreams(
-      /*field_trials=*/ExplicitKeyValueConfig(""),
-      {.width = 640, .height = 360}, encoder_config);
+      /*field_trials=*/CreateTestFieldTrials(), {.width = 640, .height = 360},
+      encoder_config);
   ASSERT_THAT(streams, SizeIs(2));
   EXPECT_EQ(streams[0].bitrate_priority, kBitratePriority);
   EXPECT_FALSE(streams[1].bitrate_priority);
@@ -248,7 +248,7 @@
   VideoEncoderConfig encoder_config;
   encoder_config.number_of_streams = 2;
   encoder_config.simulcast_layers.resize(encoder_config.number_of_streams);
-  auto streams = factory->CreateEncoderStreams(ExplicitKeyValueConfig(""), 1920,
+  auto streams = factory->CreateEncoderStreams(CreateTestFieldTrials(), 1920,
                                                1080, encoder_config);
   ASSERT_THAT(streams, Not(IsEmpty()));
   EXPECT_EQ(streams[0].min_bitrate_bps, kDefaultMinVideoBitrateBps);
@@ -261,7 +261,7 @@
   encoder_config.number_of_streams = 2;
   encoder_config.simulcast_layers.resize(encoder_config.number_of_streams);
   auto streams = factory->CreateEncoderStreams(
-      ExplicitKeyValueConfig("WebRTC-Video-MinVideoBitrate/Enabled,br:1kbps/"),
+      CreateTestFieldTrials("WebRTC-Video-MinVideoBitrate/Enabled,br:1kbps/"),
       1920, 1080, encoder_config);
   ASSERT_THAT(streams, Not(IsEmpty()));
   EXPECT_NE(streams[0].min_bitrate_bps, kDefaultMinVideoBitrateBps);
@@ -291,7 +291,7 @@
     encoder_config.legacy_conference_mode = true;
   }
   return GetStreamResolutions(
-      CreateEncoderStreams(ExplicitKeyValueConfig(test_params.field_trials),
+      CreateEncoderStreams(CreateTestFieldTrials(test_params.field_trials),
                            test_params.resolution, encoder_config));
 }
 
@@ -392,7 +392,7 @@
   encoder_config.simulcast_layers = test_params.requested_streams;
   encoder_config.content_type = test_params.content_type;
   auto streams =
-      CreateEncoderStreams(ExplicitKeyValueConfig(test_params.field_trials),
+      CreateEncoderStreams(CreateTestFieldTrials(test_params.field_trials),
                            test_params.input_resolution, encoder_config);
   ASSERT_EQ(streams.size(), test_params.expected_streams.size());
   for (size_t i = 0; i < streams.size(); ++i) {
@@ -496,7 +496,7 @@
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(1);
   encoder_config.simulcast_layers[0].num_temporal_layers = 3;
-  auto streams = CreateEncoderStreams(ExplicitKeyValueConfig(""), {1280, 720},
+  auto streams = CreateEncoderStreams(CreateTestFieldTrials(), {1280, 720},
                                       encoder_config);
   ASSERT_THAT(streams, SizeIs(1));
   EXPECT_EQ(streams[0].num_temporal_layers, 3);
@@ -508,7 +508,7 @@
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(1);
   encoder_config.simulcast_layers[0].num_temporal_layers = 3;
-  auto streams = CreateEncoderStreams(ExplicitKeyValueConfig(""), {1280, 720},
+  auto streams = CreateEncoderStreams(CreateTestFieldTrials(), {1280, 720},
                                       encoder_config);
   ASSERT_THAT(streams, SizeIs(1));
   EXPECT_EQ(streams[0].num_temporal_layers, 3);
@@ -520,7 +520,7 @@
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(1);
   encoder_config.simulcast_layers[0].num_temporal_layers = 3;
-  auto streams = CreateEncoderStreams(ExplicitKeyValueConfig(""), {1280, 720},
+  auto streams = CreateEncoderStreams(CreateTestFieldTrials(), {1280, 720},
                                       encoder_config);
   ASSERT_THAT(streams, SizeIs(1));
   EXPECT_EQ(streams[0].num_temporal_layers, std::nullopt);
@@ -533,7 +533,7 @@
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(1);
   encoder_config.simulcast_layers[0].num_temporal_layers = 3;
-  auto streams = CreateEncoderStreams(ExplicitKeyValueConfig(""), {1280, 720},
+  auto streams = CreateEncoderStreams(CreateTestFieldTrials(), {1280, 720},
                                       encoder_config);
   ASSERT_THAT(streams, SizeIs(1));
   EXPECT_EQ(streams[0].num_temporal_layers, 3);
@@ -550,7 +550,7 @@
   encoder_config.number_of_streams = 1;
   encoder_config.simulcast_layers.resize(3);
   encoder_config.simulcast_layers[0].max_bitrate_bps = 5000000;
-  auto streams = CreateEncoderStreams(ExplicitKeyValueConfig(""), {1280, 720},
+  auto streams = CreateEncoderStreams(CreateTestFieldTrials(), {1280, 720},
                                       encoder_config);
   ASSERT_THAT(streams, SizeIs(1));
   EXPECT_EQ(streams[0].max_bitrate_bps, 5000000);
diff --git a/video/config/simulcast_unittest.cc b/video/config/simulcast_unittest.cc
index 628e4ea..6d8a15f 100644
--- a/video/config/simulcast_unittest.cc
+++ b/video/config/simulcast_unittest.cc
@@ -15,19 +15,19 @@
 #include <tuple>
 #include <vector>
 
+#include "api/field_trials.h"
 #include "api/units/data_rate.h"
 #include "api/video/resolution.h"
 #include "api/video/video_codec_type.h"
 #include "api/video_codecs/video_codec.h"
 #include "media/base/media_constants.h"
-#include "test/explicit_key_value_config.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "video/config/video_encoder_config.h"
 
 namespace webrtc {
 namespace {
-using test::ExplicitKeyValueConfig;
 using ::testing::Combine;
 using ::testing::SizeIs;
 using ::testing::TestParamInfo;
@@ -122,7 +122,7 @@
 }
 
 TEST(SimulcastTest, GetConfig) {
-  const ExplicitKeyValueConfig trials("");
+  const FieldTrials trials = CreateTestFieldTrials();
 
   const std::vector<VideoStream> kExpected = GetSimulcastBitrates720p();
 
@@ -151,7 +151,7 @@
 }
 
 TEST(SimulcastTest, GetConfigH265) {
-  const ExplicitKeyValueConfig trials("");
+  const FieldTrials trials = CreateTestFieldTrials();
   const std::vector<VideoStream> kExpected = GetH265SimulcastBitrates720p();
 
   const size_t kMaxLayers = 3;
@@ -180,8 +180,8 @@
 }
 
 TEST(SimulcastTest, GetConfigWithBaseHeavyVP8TL3RateAllocation) {
-  ExplicitKeyValueConfig trials(
-      "WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/");
+  FieldTrials trials =
+      CreateTestFieldTrials("WebRTC-UseBaseHeavyVP8TL3RateAllocation/Enabled/");
 
   const std::vector<VideoStream> kExpected = GetSimulcastBitrates720p();
 
@@ -204,7 +204,7 @@
 }
 
 TEST(SimulcastTest, GetConfigWithLimitedMaxLayers) {
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
 
   const size_t kMaxLayers = 2;
   std::vector<VideoStream> streams =
@@ -219,7 +219,7 @@
 }
 
 TEST(SimulcastTest, GetConfigForScreenshareSimulcast) {
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
   std::vector<VideoStream> streams = GetSimulcastConfig(
       std::vector<Resolution>{{.width = 1400, .height = 800},
                               {.width = 1400, .height = 800},
@@ -241,7 +241,7 @@
 }
 
 TEST(SimulcastTest, GetConfigForScreenshareSimulcastWithLimitedMaxLayers) {
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
   std::vector<VideoStream> streams = GetSimulcastConfig(
       std::vector<Resolution>{{.width = 1400, .height = 800}}, kScreenshare,
       true, trials, kVideoCodecVP8);
@@ -249,7 +249,7 @@
 }
 
 TEST(SimulcastTest, AveragesBitratesForNonStandardResolution) {
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
   std::vector<VideoStream> streams =
       GetSimulcastConfig(std::vector<Resolution>{{.width = 900, .height = 800}},
                          !kScreenshare, true, trials, kVideoCodecVP8);
@@ -263,7 +263,7 @@
 }
 
 TEST(SimulcastTest, BitratesForCloseToStandardResolution) {
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
 
   const size_t kMaxLayers = 3;
   // Resolution very close to 720p in number of pixels
@@ -289,8 +289,8 @@
 }
 
 TEST(SimulcastTest, MaxLayersWithRoundUpDisabled) {
-  ExplicitKeyValueConfig trials(
-      "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.0/");
+  FieldTrials trials =
+      CreateTestFieldTrials("WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.0/");
 
   const size_t kMinLayers = 1;
   const int kMaxLayers = 3;
@@ -313,7 +313,7 @@
 
 TEST(SimulcastTest, MaxLayersWithDefaultRoundUpRatio) {
   // Default: "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.1/"
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
   const size_t kMinLayers = 1;
   const int kMaxLayers = 3;
 
@@ -340,7 +340,7 @@
 }
 
 TEST(SimulcastTest, MaxLayersWithRoundUpRatio) {
-  ExplicitKeyValueConfig trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-SimulcastLayerLimitRoundUp/max_ratio:0.13/");
 
   const size_t kMinLayers = 1;
@@ -360,7 +360,7 @@
 
 TEST(SimulcastTest, BitratesInterpolatedForResBelow180p) {
   // TODO(webrtc:12415): Remove when feature launches.
-  ExplicitKeyValueConfig trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-LowresSimulcastBitrateInterpolation/Enabled/");
 
   const size_t kMaxLayers = 3;
@@ -378,7 +378,7 @@
 
 TEST(SimulcastTest, BitratesConsistentForVerySmallRes) {
   // TODO(webrtc:12415): Remove when feature launches.
-  ExplicitKeyValueConfig trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-LowresSimulcastBitrateInterpolation/Enabled/");
 
   std::vector<VideoStream> streams =
@@ -395,7 +395,7 @@
 
 TEST(SimulcastTest,
      BitratesNotInterpolatedForResBelow180pWhenDisabledTrialSet) {
-  ExplicitKeyValueConfig trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-LowresSimulcastBitrateInterpolation/Disabled/");
 
   const size_t kMaxLayers = 3;
@@ -424,7 +424,7 @@
 TEST_P(BitrateLimitsTest, VerifyBitrateLimits) {
   const auto codec_type = std::get<VideoCodecType>(GetParam());
   const auto test_params = std::get<BitrateLimitsTestParams>(GetParam());
-  ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
   std::vector<VideoStream> streams = GetSimulcastConfig(
       CreateResolutions(test_params.width, test_params.height,
                         /*num_streams=*/3),
@@ -499,7 +499,7 @@
 // Test that for H.265, the simulcast layers are created with the correct
 // default temporal layers, before that is overrided by application settings.
 TEST(SimulcastTest, GetConfigForH265) {
-  const ExplicitKeyValueConfig trials("");
+  FieldTrials trials = CreateTestFieldTrials();
 
   const size_t kMaxLayers = 3;
   std::vector<VideoStream> streams =
diff --git a/video/encoder_bitrate_adjuster_unittest.cc b/video/encoder_bitrate_adjuster_unittest.cc
index 642664a..8f93590 100644
--- a/video/encoder_bitrate_adjuster_unittest.cc
+++ b/video/encoder_bitrate_adjuster_unittest.cc
@@ -17,6 +17,7 @@
 #include <string>
 #include <vector>
 
+#include "api/field_trials.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
@@ -29,8 +30,8 @@
 #include "api/video_codecs/video_encoder.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/time_utils.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 
 namespace webrtc {
@@ -58,7 +59,7 @@
         target_framerate_fps_(kDefaultFrameRateFps),
         tl_pattern_idx_{},
         sequence_idx_{},
-        scoped_field_trial_(GetParam()) {}
+        field_trials_(CreateTestFieldTrials(GetParam())) {}
 
  protected:
   void SetUpAdjusterWithCodec(size_t num_spatial_layers,
@@ -76,7 +77,7 @@
     }
 
     adjuster_ = std::make_unique<EncoderBitrateAdjuster>(
-        codec_, scoped_field_trial_, *time_controller_.GetClock());
+        codec_, field_trials_, *time_controller_.GetClock());
     adjuster_->OnEncoderInfo(encoder_info_);
     current_adjusted_allocation_ =
         adjuster_->AdjustRateAllocation(VideoEncoder::RateControlParameters(
@@ -263,7 +264,7 @@
   double target_framerate_fps_;
   int tl_pattern_idx_[kMaxSpatialLayers];
   int sequence_idx_[kMaxSpatialLayers][kMaxTemporalStreams];
-  test::ScopedKeyValueConfig scoped_field_trial_;
+  FieldTrials field_trials_;
 
   const std::vector<int> kTlPatterns[kMaxTemporalStreams] = {
       {0},
diff --git a/video/frame_cadence_adapter_unittest.cc b/video/frame_cadence_adapter_unittest.cc
index 4bee519..af97b7b 100644
--- a/video/frame_cadence_adapter_unittest.cc
+++ b/video/frame_cadence_adapter_unittest.cc
@@ -18,6 +18,7 @@
 #include <utility>
 
 #include "absl/functional/any_invocable.h"
+#include "api/field_trials.h"
 #include "api/field_trials_view.h"
 #include "api/make_ref_counted.h"
 #include "api/metronome/test/fake_metronome.h"
@@ -38,9 +39,9 @@
 #include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/metrics.h"
 #include "system_wrappers/include/ntp_time.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 
 namespace webrtc {
@@ -89,7 +90,7 @@
 };
 
 TEST(FrameCadenceAdapterTest, CountsOutstandingFramesToProcess) {
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   GlobalSimulatedTimeController time_controller(Timestamp::Millis(1));
   MockCallback callback;
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
@@ -106,7 +107,7 @@
 }
 
 TEST(FrameCadenceAdapterTest, FrameRateFollowsRateStatisticsByDefault) {
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
@@ -132,7 +133,7 @@
 
 TEST(FrameCadenceAdapterTest, FrameRateFollowsMaxFpsWhenZeroHertzActivated) {
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
   adapter->Initialize(&callback);
@@ -150,7 +151,7 @@
 
 TEST(FrameCadenceAdapterTest, ZeroHertzAdapterSupportsMaxFpsChange) {
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
   adapter->Initialize(&callback);
@@ -174,7 +175,7 @@
 TEST(FrameCadenceAdapterTest,
      FrameRateFollowsRateStatisticsAfterZeroHertzDeactivated) {
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
   adapter->Initialize(&callback);
@@ -205,7 +206,7 @@
 TEST(FrameCadenceAdapterTest, ForwardsFramesDelayed) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -234,7 +235,7 @@
 
 TEST(FrameCadenceAdapterTest, DelayedProcessingUnderSlightContention) {
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
   adapter->Initialize(&callback);
@@ -256,7 +257,7 @@
 
 TEST(FrameCadenceAdapterTest, DelayedProcessingUnderHeavyContention) {
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   MockCallback callback;
   adapter->Initialize(&callback);
@@ -285,7 +286,7 @@
   // not 0.
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Millis(47892223));
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -339,7 +340,7 @@
   // time.
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Millis(4711));
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -372,7 +373,7 @@
   // At 3.5s, we receive this frame.
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -400,7 +401,7 @@
 TEST(FrameCadenceAdapterTest, RequestsRefreshFrameOnKeyFrameRequestWhenNew) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -418,7 +419,7 @@
 TEST(FrameCadenceAdapterTest, IgnoresKeyFrameRequestShortlyAfterFrame) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -433,7 +434,7 @@
 TEST(FrameCadenceAdapterTest, RequestsRefreshFramesUntilArrival) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -459,7 +460,7 @@
 TEST(FrameCadenceAdapterTest, RequestsRefreshAfterFrameDrop) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -500,7 +501,7 @@
 TEST(FrameCadenceAdapterTest, OmitsRefreshAfterFrameDropWithTimelyFrameEntry) {
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -539,7 +540,7 @@
   // This is a regression test for bugs.webrtc.org/14417.
   MockCallback callback;
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = CreateAdapter(no_field_trials, time_controller.GetClock());
   adapter->Initialize(&callback);
   adapter->SetZeroHertzModeEnabled(
@@ -558,7 +559,7 @@
   GlobalSimulatedTimeController time_controller(Timestamp::Zero());
   auto queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
       "queue", TaskQueueFactory::Priority::NORMAL);
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = FrameCadenceAdapterInterface::Create(
       time_controller.GetClock(), queue.get(), /*metronome=*/nullptr,
       /*worker_queue=*/nullptr, no_field_trials);
@@ -587,7 +588,7 @@
   auto worker_queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
       "work_queue", TaskQueueFactory::Priority::NORMAL);
   test::FakeMetronome metronome(kTickPeriod);
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = FrameCadenceAdapterInterface::Create(
       time_controller.GetClock(), queue.get(), &metronome, worker_queue.get(),
       no_field_trials);
@@ -661,7 +662,7 @@
   auto queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
       "queue", TaskQueueFactory::Priority::NORMAL);
   test::FakeMetronome metronome(kTickPeriod);
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   auto adapter = FrameCadenceAdapterInterface::Create(
       time_controller.GetClock(), queue.get(), &metronome,
       TaskQueueBase::Current(), no_field_trials);
@@ -704,7 +705,7 @@
   int NumSpatialLayers() const { return GetParam(); }
 
  protected:
-  test::ScopedKeyValueConfig no_field_trials_;
+  FieldTrials no_field_trials_ = CreateTestFieldTrials();
   MockCallback callback_;
   GlobalSimulatedTimeController time_controller_{Timestamp::Zero()};
   const std::unique_ptr<FrameCadenceAdapterInterface> adapter_{
@@ -833,7 +834,7 @@
   }
 
  protected:
-  test::ScopedKeyValueConfig no_field_trials_;
+  FieldTrials no_field_trials_ = CreateTestFieldTrials();
   MockCallback callback_;
   GlobalSimulatedTimeController time_controller_{Timestamp::Zero()};
   std::unique_ptr<FrameCadenceAdapterInterface> adapter_{
@@ -1029,7 +1030,7 @@
   int64_t original_ntp_time_ms;
   int64_t original_timestamp_us;
   Event event;
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   queue->PostTask([&] {
     adapter = CreateAdapter(no_field_trials, clock);
     adapter->Initialize(&callback);
@@ -1084,7 +1085,7 @@
   int frame_counter = 0;
   Event event;
   std::optional<Timestamp> start_time;
-  test::ScopedKeyValueConfig no_field_trials;
+  FieldTrials no_field_trials = CreateTestFieldTrials();
   queue->PostTask([&] {
     adapter = CreateAdapter(no_field_trials, clock);
     adapter->Initialize(&callback);
diff --git a/video/frame_decode_timing_unittest.cc b/video/frame_decode_timing_unittest.cc
index da7a098..b9be828 100644
--- a/video/frame_decode_timing_unittest.cc
+++ b/video/frame_decode_timing_unittest.cc
@@ -14,6 +14,7 @@
 
 #include <optional>
 
+#include "api/field_trials.h"
 #include "api/field_trials_view.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -21,9 +22,9 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/containers/flat_map.h"
 #include "system_wrappers/include/clock.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "video/video_receive_stream2.h"
 
 namespace webrtc {
@@ -70,12 +71,13 @@
 class FrameDecodeTimingTest : public ::testing::Test {
  public:
   FrameDecodeTimingTest()
-      : clock_(Timestamp::Millis(1000)),
+      : field_trials_(CreateTestFieldTrials()),
+        clock_(Timestamp::Millis(1000)),
         timing_(&clock_, field_trials_),
         frame_decode_scheduler_(&clock_, &timing_) {}
 
  protected:
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_;
   SimulatedClock clock_;
   FakeVCMTiming timing_;
   FrameDecodeTiming frame_decode_scheduler_;
diff --git a/video/quality_convergence_controller_unittest.cc b/video/quality_convergence_controller_unittest.cc
index 4f7cf63..73b9a0c 100644
--- a/video/quality_convergence_controller_unittest.cc
+++ b/video/quality_convergence_controller_unittest.cc
@@ -12,16 +12,17 @@
 
 #include <optional>
 
+#include "api/field_trials.h"
 #include "api/video/video_codec_type.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 
 namespace webrtc {
 namespace {
 constexpr int kVp8DefaultStaticQpThreshold = 15;
 
 TEST(QualityConvergenceController, Singlecast) {
-  test::ScopedKeyValueConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   QualityConvergenceController controller;
   controller.Initialize(1, /*encoder_min_qp=*/std::nullopt, kVideoCodecVP8,
                         field_trials);
@@ -35,7 +36,7 @@
 }
 
 TEST(QualityConvergenceController, Simulcast) {
-  test::ScopedKeyValueConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   QualityConvergenceController controller;
   controller.Initialize(2, /*encoder_min_qp=*/std::nullopt, kVideoCodecVP8,
                         field_trials);
@@ -65,7 +66,7 @@
 }
 
 TEST(QualityConvergenceController, InvalidLayerIndex) {
-  test::ScopedKeyValueConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   QualityConvergenceController controller;
   controller.Initialize(2, /*encoder_min_qp=*/std::nullopt, kVideoCodecVP8,
                         field_trials);
@@ -79,7 +80,7 @@
 }
 
 TEST(QualityConvergenceController, UseMaxOfEncoderMinAndDefaultQpThresholds) {
-  test::ScopedKeyValueConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   QualityConvergenceController controller;
   controller.Initialize(1, kVp8DefaultStaticQpThreshold + 1, kVideoCodecVP8,
                         field_trials);
@@ -93,8 +94,8 @@
 }
 
 TEST(QualityConvergenceController, OverrideVp8StaticThreshold) {
-  test::ScopedKeyValueConfig field_trials(
-      "WebRTC-QCM-Static-VP8/static_qp_threshold:22/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-QCM-Static-VP8/static_qp_threshold:22/");
   QualityConvergenceController controller;
   controller.Initialize(1, /*encoder_min_qp=*/std::nullopt, kVideoCodecVP8,
                         field_trials);
@@ -106,8 +107,8 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, OverrideVp9StaticThreshold) {
-  test::ScopedKeyValueConfig field_trials(
-      "WebRTC-QCM-Static-VP9/static_qp_threshold:44/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-QCM-Static-VP9/static_qp_threshold:44/");
   QualityConvergenceController controller;
   controller.Initialize(1, /*encoder_min_qp=*/std::nullopt, kVideoCodecVP9,
                         field_trials);
@@ -119,8 +120,8 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, OverrideAv1StaticThreshold) {
-  test::ScopedKeyValueConfig field_trials(
-      "WebRTC-QCM-Static-AV1/static_qp_threshold:46/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-QCM-Static-AV1/static_qp_threshold:46/");
   QualityConvergenceController controller;
   controller.Initialize(1, /*encoder_min_qp=*/std::nullopt, kVideoCodecAV1,
                         field_trials);
diff --git a/video/quality_convergence_monitor_unittest.cc b/video/quality_convergence_monitor_unittest.cc
index c8da0a7..069b201 100644
--- a/video/quality_convergence_monitor_unittest.cc
+++ b/video/quality_convergence_monitor_unittest.cc
@@ -13,9 +13,10 @@
 #include <cstddef>
 #include <memory>
 
+#include "api/field_trials.h"
 #include "api/video/video_codec_type.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 
 namespace webrtc {
 namespace {
@@ -201,7 +202,7 @@
 // Test default values and that they can be overridden with field trials.
 
 TEST(QualityConvergenceMonitorSetup, DefaultParameters) {
-  test::ScopedKeyValueConfig field_trials;
+  FieldTrials field_trials = CreateTestFieldTrials();
   auto monitor = QualityConvergenceMonitor::Create(
       kStaticQpThreshold, kVideoCodecVP8, field_trials);
   ASSERT_TRUE(monitor);
@@ -237,7 +238,7 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, OverrideVp8Parameters) {
-  test::ScopedKeyValueConfig field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-QCM-Dynamic-VP8/"
       "enabled:1,alpha:0.08,recent_length:6,past_length:4/");
 
@@ -253,7 +254,7 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, OverrideVp9Parameters) {
-  test::ScopedKeyValueConfig field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-QCM-Dynamic-VP9/"
       "enabled:1,alpha:0.08,recent_length:6,past_length:4/");
 
@@ -269,7 +270,7 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, OverrideAv1Parameters) {
-  test::ScopedKeyValueConfig field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-QCM-Dynamic-AV1/"
       "enabled:1,alpha:0.10,recent_length:8,past_length:8/");
 
@@ -285,7 +286,8 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, DisableVp9Dynamic) {
-  test::ScopedKeyValueConfig field_trials("WebRTC-QCM-Dynamic-VP9/enabled:0/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-QCM-Dynamic-VP9/enabled:0/");
 
   auto monitor = QualityConvergenceMonitor::Create(
       kStaticQpThreshold, kVideoCodecVP9, field_trials);
@@ -295,7 +297,8 @@
 }
 
 TEST(QualityConvergenceMonitorSetup, DisableAv1Dynamic) {
-  test::ScopedKeyValueConfig field_trials("WebRTC-QCM-Dynamic-AV1/enabled:0/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-QCM-Dynamic-AV1/enabled:0/");
 
   auto monitor = QualityConvergenceMonitor::Create(
       kStaticQpThreshold, kVideoCodecAV1, field_trials);
diff --git a/video/receive_statistics_proxy_unittest.cc b/video/receive_statistics_proxy_unittest.cc
index 5e06231..101b745 100644
--- a/video/receive_statistics_proxy_unittest.cc
+++ b/video/receive_statistics_proxy_unittest.cc
@@ -40,7 +40,6 @@
 #include "system_wrappers/include/metrics.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 #include "video/video_quality_observer2.h"
 #include "video/video_receive_stream2.h"
@@ -121,7 +120,6 @@
     return VideoFrameMetaData(frame, Now());
   }
 
-  test::ScopedKeyValueConfig field_trials_;
   GlobalSimulatedTimeController time_controller_;
   std::unique_ptr<ReceiveStatisticsProxy> statistics_proxy_;
 };
diff --git a/video/rtp_video_stream_receiver2_unittest.cc b/video/rtp_video_stream_receiver2_unittest.cc
index 3440601..db5e0cc 100644
--- a/video/rtp_video_stream_receiver2_unittest.cc
+++ b/video/rtp_video_stream_receiver2_unittest.cc
@@ -63,7 +63,7 @@
 #include "rtc_base/byte_buffer.h"
 #include "rtc_base/copy_on_write_buffer.h"
 #include "system_wrappers/include/ntp_time.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/mock_transport.h"
@@ -74,7 +74,6 @@
 
 namespace {
 
-using test::ExplicitKeyValueConfig;
 using ::testing::_;
 using ::testing::DoubleNear;
 using ::testing::ElementsAre;
@@ -187,10 +186,9 @@
   RtpVideoStreamReceiver2Test() : RtpVideoStreamReceiver2Test("") {}
   explicit RtpVideoStreamReceiver2Test(std::string field_trials)
       : time_controller_(Timestamp::Millis(100)),
-        env_(CreateEnvironment(
-            std::make_unique<ExplicitKeyValueConfig>(field_trials),
-            time_controller_.GetClock(),
-            time_controller_.GetTaskQueueFactory())),
+        env_(CreateEnvironment(CreateTestFieldTrialsPtr(field_trials),
+                               time_controller_.GetClock(),
+                               time_controller_.GetTaskQueueFactory())),
         task_queue_(time_controller_.GetTaskQueueFactory()->CreateTaskQueue(
             "RtpVideoStreamReceiver2Test",
             TaskQueueFactory::Priority::NORMAL)),
diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc
index 07ef0fe..0ef5aba 100644
--- a/video/send_statistics_proxy_unittest.cc
+++ b/video/send_statistics_proxy_unittest.cc
@@ -20,6 +20,7 @@
 #include <vector>
 
 #include "absl/algorithm/container.h"
+#include "api/field_trials.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -41,9 +42,9 @@
 #include "rtc_base/fake_clock.h"
 #include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/metrics.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "video/config/video_encoder_config.h"
 #include "video/video_stream_encoder_observer.h"
 
@@ -84,7 +85,7 @@
  public:
   SendStatisticsProxyTest() : SendStatisticsProxyTest("") {}
   explicit SendStatisticsProxyTest(const std::string& field_trials)
-      : override_field_trials_(field_trials),
+      : field_trials_(CreateTestFieldTrials(field_trials)),
         fake_clock_(Timestamp::Seconds(1234)),
         config_(GetTestConfig()) {}
   ~SendStatisticsProxyTest() override {}
@@ -92,10 +93,9 @@
  protected:
   void SetUp() override {
     metrics::Reset();
-    statistics_proxy_.reset(
-        new SendStatisticsProxy(&fake_clock_, GetTestConfig(),
-                                VideoEncoderConfig::ContentType::kRealtimeVideo,
-                                override_field_trials_));
+    statistics_proxy_.reset(new SendStatisticsProxy(
+        &fake_clock_, GetTestConfig(),
+        VideoEncoderConfig::ContentType::kRealtimeVideo, field_trials_));
     expected_ = VideoSendStream::Stats();
     for (const auto& ssrc : config_.rtp.ssrcs) {
       expected_.substreams[ssrc].type =
@@ -196,7 +196,7 @@
     }
   }
 
-  test::ScopedKeyValueConfig override_field_trials_;
+  FieldTrials field_trials_;
   SimulatedClock fake_clock_;
   std::unique_ptr<SendStatisticsProxy> statistics_proxy_;
   VideoSendStream::Config config_;
@@ -2006,12 +2006,11 @@
 }
 
 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) {
-  test::ScopedKeyValueConfig field_trials;
   VideoSendStream::Config config(nullptr);
   config.rtp.ssrcs.push_back(kFirstSsrc);
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo,
-      field_trials));
+      field_trials_));
 
   EncodedImage encoded_image;
   CodecSpecificInfo codec_info;
@@ -2052,12 +2051,11 @@
 }
 
 TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) {
-  test::ScopedKeyValueConfig field_trials;
   VideoSendStream::Config config(nullptr);
   config.rtp.ssrcs.push_back(kFirstSsrc);
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo,
-      field_trials));
+      field_trials_));
 
   EncodedImage encoded_image;
   CodecSpecificInfo codec_info;
@@ -2589,10 +2587,9 @@
 }
 
 TEST_F(SendStatisticsProxyTest, GetStatsReportsIsFlexFec) {
-  test::ScopedKeyValueConfig field_trials;
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, GetTestConfigWithFlexFec(),
-      VideoEncoderConfig::ContentType::kRealtimeVideo, field_trials));
+      VideoEncoderConfig::ContentType::kRealtimeVideo, field_trials_));
 
   StreamDataCountersCallback* proxy =
       static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
@@ -2609,10 +2606,9 @@
 }
 
 TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) {
-  test::ScopedKeyValueConfig field_trials;
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, GetTestConfigWithFlexFec(),
-      VideoEncoderConfig::ContentType::kRealtimeVideo, field_trials));
+      VideoEncoderConfig::ContentType::kRealtimeVideo, field_trials_));
 
   StreamDataCountersCallback* proxy =
       static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
@@ -2818,12 +2814,11 @@
 }
 
 TEST_F(SendStatisticsProxyTest, RtxBitrateNotReportedWhenNotEnabled) {
-  test::ScopedKeyValueConfig field_trials;
   VideoSendStream::Config config(nullptr);
   config.rtp.ssrcs.push_back(kFirstSsrc);  // RTX not configured.
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo,
-      field_trials));
+      field_trials_));
 
   StreamDataCountersCallback* proxy =
       static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
@@ -2871,12 +2866,11 @@
 }
 
 TEST_F(SendStatisticsProxyTest, FecBitrateNotReportedWhenNotEnabled) {
-  test::ScopedKeyValueConfig field_trials;
   VideoSendStream::Config config(nullptr);
   config.rtp.ssrcs.push_back(kFirstSsrc);  // FEC not configured.
   statistics_proxy_.reset(new SendStatisticsProxy(
       &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo,
-      field_trials));
+      field_trials_));
 
   StreamDataCountersCallback* proxy =
       static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
diff --git a/video/video_send_stream_impl_unittest.cc b/video/video_send_stream_impl_unittest.cc
index 216907d..72ef458 100644
--- a/video/video_send_stream_impl_unittest.cc
+++ b/video/video_send_stream_impl_unittest.cc
@@ -20,9 +20,11 @@
 #include <utility>
 #include <vector>
 
+#include "absl/strings/string_view.h"
 #include "api/array_view.h"
 #include "api/call/bitrate_allocation.h"
 #include "api/environment/environment_factory.h"
+#include "api/field_trials.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/rtp_parameters.h"
 #include "api/task_queue/task_queue_base.h"
@@ -45,11 +47,10 @@
 #include "modules/rtp_rtcp/source/rtp_sequence_number_map.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "rtc_base/experiments/alr_experiment.h"
-#include "test/field_trial.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mock_transport.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 #include "video/config/video_encoder_config.h"
 #include "video/send_delay_stats.h"
@@ -83,14 +84,11 @@
 using ::testing::SizeIs;
 
 constexpr int64_t kDefaultInitialBitrateBps = 333000;
-const double kDefaultBitratePriority = 0.5;
+constexpr double kDefaultBitratePriority = 0.5;
 
-const float kAlrProbingExperimentPaceMultiplier = 1.0f;
-std::string GetAlrProbingExperimentString() {
-  return std::string(
-             AlrExperimentSettings::kScreenshareProbingBweExperimentName) +
-         "/1.0,2875,80,40,-60,3/";
-}
+constexpr float kAlrProbingExperimentPaceMultiplier = 1.0f;
+constexpr absl::string_view kAlrProbingExperimentValue = "1.0,2875,80,40,-60,3";
+
 class MockRtpVideoSender : public RtpVideoSenderInterface {
  public:
   MOCK_METHOD(void, SetSending, (bool sending), (override));
@@ -148,6 +146,7 @@
  protected:
   VideoSendStreamImplTest()
       : time_controller_(Timestamp::Seconds(1000)),
+        field_trials_(CreateTestFieldTrials()),
         config_(&transport_),
         send_delay_stats_(time_controller_.GetClock()),
         encoder_queue_(time_controller_.GetTaskQueueFactory()->CreateTaskQueue(
@@ -218,7 +217,7 @@
 
  protected:
   GlobalSimulatedTimeController time_controller_;
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_;
   NiceMock<MockTransport> transport_;
   NiceMock<MockRtpTransportControllerSend> transport_controller_;
   NiceMock<MockBitrateAllocator> bitrate_allocator_;
@@ -510,8 +509,7 @@
 
 TEST_F(VideoSendStreamImplTest,
        UpdatesObserverOnConfigurationChangeWithSimulcastVideoHysteresis) {
-  test::ScopedKeyValueConfig hysteresis_experiment(
-      field_trials_, "WebRTC-VideoRateControl/video_hysteresis:1.25/");
+  field_trials_.Set("WebRTC-VideoRateControl", "video_hysteresis:1.25");
   config_.rtp.ssrcs.emplace_back(1);
   config_.rtp.ssrcs.emplace_back(2);
 
@@ -567,7 +565,8 @@
 }
 
 TEST_F(VideoSendStreamImplTest, SetsScreensharePacingFactorWithFeedback) {
-  test::ScopedFieldTrials alr_experiment(GetAlrProbingExperimentString());
+  field_trials_.Set(AlrExperimentSettings::kScreenshareProbingBweExperimentName,
+                    kAlrProbingExperimentValue);
 
   constexpr int kId = 1;
   config_.rtp.extensions.emplace_back(RtpExtension::kTransportSequenceNumberUri,
@@ -582,7 +581,8 @@
 }
 
 TEST_F(VideoSendStreamImplTest, DoesNotSetPacingFactorWithoutFeedback) {
-  test::ScopedFieldTrials alr_experiment(GetAlrProbingExperimentString());
+  field_trials_.Set(AlrExperimentSettings::kScreenshareProbingBweExperimentName,
+                    kAlrProbingExperimentValue);
   auto vss_impl = CreateVideoSendStreamImpl(
       TestVideoEncoderConfig(VideoEncoderConfig::ContentType::kScreen));
   EXPECT_CALL(transport_controller_, SetPacingFactor(_)).Times(0);
@@ -851,8 +851,7 @@
 }
 
 TEST_F(VideoSendStreamImplTest, PriorityBitrateConfigAffectsAV1) {
-  test::ScopedFieldTrials override_priority_bitrate(
-      "WebRTC-AV1-OverridePriorityBitrate/bitrate:20000/");
+  field_trials_.Set("WebRTC-AV1-OverridePriorityBitrate", "bitrate:20000");
   config_.rtp.payload_name = "AV1";
   auto vss_impl = CreateVideoSendStreamImpl(TestVideoEncoderConfig());
   EXPECT_CALL(
@@ -879,8 +878,7 @@
 
   int min_transmit_bitrate_bps = 30000;
 
-  test::ScopedFieldTrials override_priority_bitrate(
-      "WebRTC-AV1-OverridePriorityBitrate/bitrate:20000/");
+  field_trials_.Set("WebRTC-AV1-OverridePriorityBitrate", "bitrate:20000");
   config_.rtp.payload_name = "AV1";
   auto vss_impl = CreateVideoSendStreamImpl(TestVideoEncoderConfig());
   EXPECT_CALL(
diff --git a/video/video_stream_buffer_controller_unittest.cc b/video/video_stream_buffer_controller_unittest.cc
index 681c934..aab2732 100644
--- a/video/video_stream_buffer_controller_unittest.cc
+++ b/video/video_stream_buffer_controller_unittest.cc
@@ -22,6 +22,7 @@
 #include <variant>
 #include <vector>
 
+#include "api/field_trials.h"
 #include "api/metronome/test/fake_metronome.h"
 #include "api/units/frequency.h"
 #include "api/units/time_delta.h"
@@ -32,10 +33,10 @@
 #include "modules/video_coding/timing/timing.h"
 #include "rtc_base/checks.h"
 #include "system_wrappers/include/clock.h"
+#include "test/create_test_field_trials.h"
 #include "test/fake_encoded_frame.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 #include "video/decode_synchronizer.h"
 #include "video/task_queue_frame_decode_scheduler.h"
@@ -139,7 +140,7 @@
  public:
   VideoStreamBufferControllerFixture()
       : sync_decoding_(std::get<0>(GetParam())),
-        field_trials_(std::get<1>(GetParam())),
+        field_trials_(CreateTestFieldTrials(std::get<1>(GetParam()))),
         time_controller_(kClockStart),
         clock_(time_controller_.GetClock()),
         fake_metronome_(TimeDelta::Millis(16)),
@@ -228,7 +229,7 @@
 
  protected:
   const bool sync_decoding_;
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_;
   GlobalSimulatedTimeController time_controller_;
   Clock* const clock_;
   test::FakeMetronome fake_metronome_;
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index d5c2634..99f1275 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -28,6 +28,7 @@
 #include "api/array_view.h"
 #include "api/environment/environment.h"
 #include "api/environment/environment_factory.h"
+#include "api/field_trials.h"
 #include "api/field_trials_view.h"
 #include "api/location.h"
 #include "api/make_ref_counted.h"
@@ -102,13 +103,13 @@
 #include "rtc_base/time_utils.h"
 #include "system_wrappers/include/clock.h"
 #include "system_wrappers/include/metrics.h"
+#include "test/create_test_field_trials.h"
 #include "test/encoder_settings.h"
 #include "test/fake_encoder.h"
 #include "test/frame_forwarder.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mappable_native_buffer.h"
-#include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 #include "test/video_encoder_nullable_proxy_factory.h"
 #include "test/video_encoder_proxy_factory.h"
@@ -753,15 +754,12 @@
 
   std::unique_ptr<AdaptedVideoStreamEncoder> CreateWithEncoderQueue(
       std::unique_ptr<FrameCadenceAdapterInterface> zero_hertz_adapter,
-      std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue,
-      const FieldTrialsView* field_trials = nullptr) {
-    Environment env = CreateEnvironment(&field_trials_, field_trials,
-                                        time_controller_.GetClock());
+      std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue) {
     auto result = std::make_unique<AdaptedVideoStreamEncoder>(
-        env,
+        env_,
         /*number_of_cores=*/1,
         /*stats_proxy=*/stats_proxy_.get(), encoder_settings_,
-        std::make_unique<CpuOveruseDetectorProxy>(env,
+        std::make_unique<CpuOveruseDetectorProxy>(env_,
                                                   /*stats_proxy=*/nullptr),
         std::move(zero_hertz_adapter), std::move(encoder_queue),
         VideoStreamEncoder::BitrateAllocationCallbackType::
@@ -789,6 +787,8 @@
     return &time_controller_;
   }
 
+  const Environment& env() { return env_; }
+
  private:
   class NullEncoderSink : public VideoStreamEncoderInterface::EncoderSink {
    public:
@@ -809,7 +809,7 @@
     }
   };
 
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_ = CreateTestFieldTrials();
   GlobalSimulatedTimeController time_controller_{Timestamp::Zero()};
   Environment env_ =
       CreateEnvironment(&field_trials_,
@@ -1694,7 +1694,7 @@
   int64_t CurrentTimeMs() { return clock()->CurrentTime().ms(); }
 
  protected:
-  test::ScopedKeyValueConfig field_trials_;
+  FieldTrials field_trials_ = CreateTestFieldTrials();
   GlobalSimulatedTimeController time_controller_{Timestamp::Micros(1234)};
   const Environment env_ =
       CreateEnvironment(&field_trials_,
@@ -4589,10 +4589,8 @@
 };
 
 TEST_F(BalancedDegradationTest, AdaptDownTwiceIfMinFpsDiffLtThreshold) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1");
   SetupTest();
 
   // Force input frame rate.
@@ -4614,10 +4612,8 @@
 }
 
 TEST_F(BalancedDegradationTest, AdaptDownOnceIfFpsDiffGeThreshold) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|10|24,fps_diff:1|1|1");
   SetupTest();
 
   // Force input frame rate.
@@ -4638,10 +4634,8 @@
 }
 
 TEST_F(BalancedDegradationTest, AdaptDownUsesCodecSpecificFps) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|24,vp8_fps:8|11|22/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|10|24,vp8_fps:8|11|22");
   SetupTest();
 
   EXPECT_EQ(kVideoCodecVP8, video_encoder_config_.codec_type);
@@ -4657,10 +4651,8 @@
 }
 
 TEST_F(BalancedDegradationTest, NoAdaptUpIfBwEstimateIsLessThanMinBitrate) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425");
   SetupTest();
 
   const DataRate kMinBitrate = DataRate::KilobitsPerSec(425);
@@ -4707,10 +4699,8 @@
 
 TEST_F(BalancedDegradationTest,
        InitialFrameDropAdaptsFpsAndResolutionInOneStep) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|24|24/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|24|24");
   SetupTest();
   OnBitrateUpdated(kLowTargetBitrate);
 
@@ -4739,10 +4729,8 @@
 
 TEST_F(BalancedDegradationTest,
        NoAdaptUpInResolutionIfBwEstimateIsLessThanMinBitrate) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|14,kbps_res:0|0|435/");
+  field_trials_.Set("WebRTC-Video-BalancedDegradationSettings",
+                    "pixels:57600|129600|230400,fps:7|10|14,kbps_res:0|0|435");
   SetupTest();
 
   const DataRate kResolutionMinBitrate = DataRate::KilobitsPerSec(435);
@@ -4794,10 +4782,9 @@
 
 TEST_F(BalancedDegradationTest,
        NoAdaptUpInFpsAndResolutionIfBwEstimateIsLessThanMinBitrate) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-BalancedDegradationSettings/"
-      "pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425,kbps_res:0|0|435/");
+  field_trials_.Set(
+      "WebRTC-Video-BalancedDegradationSettings",
+      "pixels:57600|129600|230400,fps:7|10|14,kbps:0|0|425,kbps_res:0|0|435");
   SetupTest();
 
   const DataRate kMinBitrate = DataRate::KilobitsPerSec(425);
@@ -5693,10 +5680,9 @@
 }
 
 TEST_F(VideoStreamEncoderTest, VerifyBitrateAllocationForTwoStreams) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-QualityScalerSettings/"
-      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2/");
+  field_trials_.Set(
+      "WebRTC-Video-QualityScalerSettings",
+      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2");
   // Reset encoder for field trials to take effect.
   ConfigureEncoder(video_encoder_config_.Copy());
 
@@ -6000,10 +5986,9 @@
 }
 
 TEST_F(VideoStreamEncoderTest, InitialFrameDropActivatesWhenBweDrops) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-QualityScalerSettings/"
-      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2/");
+  field_trials_.Set(
+      "WebRTC-Video-QualityScalerSettings",
+      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2");
   // Reset encoder for field trials to take effect.
   ConfigureEncoder(video_encoder_config_.Copy());
   const int kNotTooLowBitrateForFrameSizeBps = kTargetBitrate.bps() * 0.2;
@@ -6041,10 +6026,9 @@
 
 TEST_F(VideoStreamEncoderTest,
        InitialFrameDropNotReactivatedWhenBweDropsWhenScalingDisabled) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_,
-      "WebRTC-Video-QualityScalerSettings/"
-      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2/");
+  field_trials_.Set(
+      "WebRTC-Video-QualityScalerSettings",
+      "initial_bitrate_interval_ms:1000,initial_bitrate_factor:0.2");
   fake_encoder_.SetQualityScaling(false);
   ConfigureEncoder(video_encoder_config_.Copy());
   const int kNotTooLowBitrateForFrameSizeBps = kTargetBitrate.bps() * 0.2;
@@ -6370,8 +6354,7 @@
 }
 
 TEST_F(VideoStreamEncoderTest, DefaultMaxAndMinBitratesNotUsedIfDisabled) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-DefaultBitrateLimitsKillSwitch/Enabled/");
+  field_trials_.Set("WebRTC-DefaultBitrateLimitsKillSwitch", "Enabled");
   VideoEncoderConfig video_encoder_config;
   test::FillEncoderConfiguration(PayloadStringToCodecType("VP9"), 1,
                                  &video_encoder_config);
@@ -6733,8 +6716,7 @@
 
 TEST_F(VideoStreamEncoderTest,
        QualityScalerAdaptationsRemovedWhenQualityScalingDisabled) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-Video-QualityScaling/Disabled/");
+  field_trials_.Set("WebRTC-Video-QualityScaling", "Disabled");
   AdaptingFrameForwarder source(&time_controller_);
   source.set_adaptation_enabled(true);
   video_stream_encoder_->SetSource(&source,
@@ -8347,8 +8329,8 @@
   constexpr int kDontCare = 100;
   constexpr int kNumFrames = 8;
 
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-SwitchEncoderFollowCodecPreferenceOrder/Enabled/");
+  field_trials_.Set("WebRTC-SwitchEncoderFollowCodecPreferenceOrder",
+                    "Enabled");
 
   NiceMock<MockVideoEncoder> video_encoder;
   StrictMock<MockEncoderSwitchRequestCallback> switch_callback;
@@ -8408,8 +8390,8 @@
   constexpr int kDontCare = 100;
   constexpr int kNumFrames = 8;
 
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-SwitchEncoderFollowCodecPreferenceOrder/Enabled/");
+  field_trials_.Set("WebRTC-SwitchEncoderFollowCodecPreferenceOrder",
+                    "Enabled");
 
   NiceMock<MockVideoEncoder> video_encoder;
   StrictMock<MockEncoderSwitchRequestCallback> switch_callback;
@@ -8847,8 +8829,7 @@
 }
 
 TEST_F(VideoStreamEncoderTest, QpAbsentParsingDisabled_QpAbsent) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-QpParsingKillSwitch/Enabled/");
+  field_trials_.Set("WebRTC-QpParsingKillSwitch", "Enabled");
 
   ResetEncoder("VP8", 1, 1, 1, false);
 
@@ -9127,8 +9108,7 @@
 
 TEST_F(VideoStreamEncoderTest,
        NormalComplexityWhenLowTierOptimizationsAreDisabled) {
-  test::ScopedKeyValueConfig field_trials(
-      field_trials_, "WebRTC-VP9-LowTierOptimizations/Disabled/");
+  field_trials_.Set("WebRTC-VP9-LowTierOptimizations", "Disabled");
 
   ResetEncoder("VP9", /*num_streams=*/1, /*num_temporal_layers=*/1,
                /*num_spatial_layers=*/1,
@@ -9408,20 +9388,19 @@
 
   void SetUp() override {
     VideoStreamEncoderTest::SetUp();
-    Environment env = CreateEnvironment(&field_trials_);
     std::unique_ptr<VideoEncoder> encoder;
     switch (codec_type_) {
       case kVideoCodecVP8:
-        encoder = CreateVp8Encoder(env);
+        encoder = CreateVp8Encoder(env_);
         break;
       case kVideoCodecVP9:
-        encoder = CreateVp9Encoder(env);
+        encoder = CreateVp9Encoder(env_);
         break;
       case kVideoCodecAV1:
-        encoder = CreateLibaomAv1Encoder(env);
+        encoder = CreateLibaomAv1Encoder(env_);
         break;
       case kVideoCodecH264:
-        encoder = CreateH264Encoder(env);
+        encoder = CreateH264Encoder(env_);
         break;
       case kVideoCodecH265:
         // TODO(bugs.webrtc.org/13485): Use a fake encoder
@@ -10158,19 +10137,18 @@
 TEST(VideoStreamEncoderFrameCadenceTest,
      RequestsRefreshFrameForEarlyZeroHertzKeyFrameRequest) {
   SimpleVideoStreamEncoderFactory factory;
-  auto encoder_queue =
-      factory.GetTimeController()->GetTaskQueueFactory()->CreateTaskQueue(
-          "EncoderQueue", TaskQueueFactory::Priority::NORMAL);
+  auto encoder_queue = factory.env().task_queue_factory().CreateTaskQueue(
+      "EncoderQueue", TaskQueueFactory::Priority::NORMAL);
 
-  test::ScopedKeyValueConfig field_trials;
   auto adapter = FrameCadenceAdapterInterface::Create(
-      factory.GetTimeController()->GetClock(), encoder_queue.get(),
-      /*metronome=*/nullptr, /*worker_queue=*/nullptr, field_trials);
+      &factory.env().clock(), encoder_queue.get(),
+      /*metronome=*/nullptr, /*worker_queue=*/nullptr,
+      factory.env().field_trials());
   FrameCadenceAdapterInterface* adapter_ptr = adapter.get();
 
   MockVideoSourceInterface mock_source;
   auto video_stream_encoder = factory.CreateWithEncoderQueue(
-      std::move(adapter), std::move(encoder_queue), &field_trials);
+      std::move(adapter), std::move(encoder_queue));
 
   video_stream_encoder->SetSource(&mock_source,
                                   DegradationPreference::MAINTAIN_FRAMERATE);