Fix rtc_unittests for force-test-env flag

Update unittests to use CreateTestEnvironment and
CreateTestFieldTrials instead of production versions,
and add bypasses to low-level implementation tests,
allowing rtc_unittests to pass with the
--force-test-environment flag.

Bug: webrtc:521534686
Change-Id: I2c70d254a6950db86bdd129ea690c9fc7b4901ef
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/480221
Auto-Submit: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#47962}
diff --git a/api/audio_codecs/opus/audio_decoder_opus_unittest.cc b/api/audio_codecs/opus/audio_decoder_opus_unittest.cc
index 9343419..a1eb5b8 100644
--- a/api/audio_codecs/opus/audio_decoder_opus_unittest.cc
+++ b/api/audio_codecs/opus/audio_decoder_opus_unittest.cc
@@ -16,9 +16,7 @@
 
 #include "api/audio_codecs/audio_format.h"
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
 #include "test/create_test_environment.h"
-#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -88,8 +86,8 @@
 }
 
 TEST(AudioDecoderOpusTest, MakeAudioDecoderForcesStereo) {
-  const Environment env = CreateEnvironment(CreateTestFieldTrialsPtr(
-      "WebRTC-Audio-OpusDecodeStereoByDefault/Enabled/"));
+  const Environment env = CreateTestEnvironment(
+      {.field_trials = "WebRTC-Audio-OpusDecodeStereoByDefault/Enabled/"});
   auto decoder = AudioDecoderOpus::MakeAudioDecoder(
       env,
       /*config=*/{.num_channels = std::nullopt});
@@ -98,8 +96,8 @@
 }
 
 TEST(AudioDecoderOpusTest, MakeAudioDecoderCannotForceStereo) {
-  const Environment env = CreateEnvironment(CreateTestFieldTrialsPtr(
-      "WebRTC-Audio-OpusDecodeStereoByDefault/Enabled/"));
+  const Environment env = CreateTestEnvironment(
+      {.field_trials = "WebRTC-Audio-OpusDecodeStereoByDefault/Enabled/"});
   auto decoder =
       AudioDecoderOpus::MakeAudioDecoder(env, /*config=*/{.num_channels = 1});
 
diff --git a/api/environment/environment_factory.cc b/api/environment/environment_factory.cc
index 1f2f31d..53773dc 100644
--- a/api/environment/environment_factory.cc
+++ b/api/environment/environment_factory.cc
@@ -100,7 +100,8 @@
 }
 
 Environment EnvironmentFactory::CreateWithDefaults() && {
-  RTC_CHECK(!IsForceTestEnvironmentEnabled() ||
+  RTC_CHECK((field_trials_ != nullptr && field_trials_->IsTest()) ||
+            !IsForceTestEnvironmentEnabled() ||
             IsTestEnvironmentCheckBypassed())
       << "Production Environment creation is not allowed in tests. Use "
          "CreateTestEnvironment.";
diff --git a/api/environment/environment_unittest.cc b/api/environment/environment_unittest.cc
index 314283a..df975ad 100644
--- a/api/environment/environment_unittest.cc
+++ b/api/environment/environment_unittest.cc
@@ -39,6 +39,12 @@
 using ::testing::Not;
 using ::testing::NotNull;
 using ::testing::Ref;
+using ::testing::Test;
+
+class EnvironmentTest : public Test {
+ private:
+  AutoBypassTestEnvironmentCheck bypass_;
+};
 
 class FakeEvent : public RtcEvent {
  public:
@@ -89,7 +95,7 @@
   absl::AnyInvocable<void() &&> on_destroyed_;
 };
 
-TEST(EnvironmentTest, DefaultEnvironmentHasAllUtilities) {
+TEST_F(EnvironmentTest, DefaultEnvironmentHasAllUtilities) {
   Environment env = EnvironmentFactory().Create();
 
   // Try to use each utility, expect no crashes.
@@ -101,7 +107,7 @@
   env.field_trials().Lookup("WebRTC-Debugging-RtpDump");
 }
 
-TEST(EnvironmentTest, UsesProvidedUtilitiesWithOwnership) {
+TEST_F(EnvironmentTest, UsesProvidedUtilitiesWithOwnership) {
   auto owned_field_trials = std::make_unique<FakeFieldTrials>();
   auto owned_task_queue_factory = std::make_unique<FakeTaskQueueFactory>();
   auto owned_clock = std::make_unique<SimulatedClock>(Timestamp::Zero());
@@ -122,7 +128,7 @@
   EXPECT_THAT(env.event_log(), Ref(event_log));
 }
 
-TEST(EnvironmentTest, UsesProvidedUtilitiesWithoutOwnership) {
+TEST_F(EnvironmentTest, UsesProvidedUtilitiesWithoutOwnership) {
   FakeFieldTrials field_trials;
   FakeTaskQueueFactory task_queue_factory;
   SimulatedClock clock(Timestamp::Zero());
@@ -137,7 +143,7 @@
   EXPECT_THAT(env.event_log(), Ref(event_log));
 }
 
-TEST(EnvironmentTest, UsesLastProvidedUtility) {
+TEST_F(EnvironmentTest, UsesLastProvidedUtility) {
   auto owned_field_trials1 = std::make_unique<FakeFieldTrials>();
   auto owned_field_trials2 = std::make_unique<FakeFieldTrials>();
   FieldTrialsView& field_trials2 = *owned_field_trials2;
@@ -159,7 +165,7 @@
 // That would use pc_deps.trials when not nullptr, pcf_deps.trials when
 // pc_deps.trials is nullptr, but pcf_deps.trials is not, and default field
 // trials when both are nullptr.
-TEST(EnvironmentTest, IgnoresProvidedNullptrUtility) {
+TEST_F(EnvironmentTest, IgnoresProvidedNullptrUtility) {
   auto owned_field_trials = std::make_unique<FakeFieldTrials>();
   std::unique_ptr<FieldTrialsView> null_field_trials = nullptr;
   FieldTrialsView& field_trials = *owned_field_trials;
@@ -170,7 +176,7 @@
   EXPECT_THAT(env.field_trials(), Ref(field_trials));
 }
 
-TEST(EnvironmentTest, KeepsUtilityAliveWhileEnvironmentIsAlive) {
+TEST_F(EnvironmentTest, KeepsUtilityAliveWhileEnvironmentIsAlive) {
   bool utility_destroyed = false;
   auto field_trials = std::make_unique<FakeFieldTrials>(
       /*on_destroyed=*/[&] { utility_destroyed = true; });
@@ -183,7 +189,7 @@
   EXPECT_TRUE(utility_destroyed);
 }
 
-TEST(EnvironmentTest, KeepsUtilityAliveWhileCopyOfEnvironmentIsAlive) {
+TEST_F(EnvironmentTest, KeepsUtilityAliveWhileCopyOfEnvironmentIsAlive) {
   bool utility_destroyed = false;
   auto field_trials = std::make_unique<FakeFieldTrials>(
       /*on_destroyed=*/[&] { utility_destroyed = true; });
@@ -198,7 +204,7 @@
   EXPECT_TRUE(utility_destroyed);
 }
 
-TEST(EnvironmentTest, FactoryCanBeReusedToCreateDifferentEnvironments) {
+TEST_F(EnvironmentTest, FactoryCanBeReusedToCreateDifferentEnvironments) {
   auto owned_task_queue_factory = std::make_unique<FakeTaskQueueFactory>();
   auto owned_field_trials1 = std::make_unique<FakeFieldTrials>();
   auto owned_field_trials2 = std::make_unique<FakeFieldTrials>();
@@ -222,7 +228,7 @@
   EXPECT_THAT(env2.field_trials(), Ref(field_trials2));
 }
 
-TEST(EnvironmentTest, FactoryCanCreateNewEnvironmentFromExistingOne) {
+TEST_F(EnvironmentTest, FactoryCanCreateNewEnvironmentFromExistingOne) {
   Environment env1 =
       CreateEnvironment(std::make_unique<FakeTaskQueueFactory>());
   EnvironmentFactory factory(env1);
@@ -239,7 +245,8 @@
   EXPECT_THAT(env2.field_trials(), Not(Ref(env1.field_trials())));
 }
 
-TEST(EnvironmentTest, KeepsOwnershipsWhenCreateNewEnvironmentFromExistingOne) {
+TEST_F(EnvironmentTest,
+       KeepsOwnershipsWhenCreateNewEnvironmentFromExistingOne) {
   bool utility1_destroyed = false;
   bool utility2_destroyed = false;
   std::optional<Environment> env1 =
@@ -267,7 +274,7 @@
   EXPECT_TRUE(utility2_destroyed);
 }
 
-TEST(EnvironmentTest, DestroysUtilitiesInReverseProvidedOrder) {
+TEST_F(EnvironmentTest, DestroysUtilitiesInReverseProvidedOrder) {
   std::vector<std::string> destroyed;
   auto field_trials = std::make_unique<FakeFieldTrials>(
       /*on_destroyed=*/[&] { destroyed.push_back("field_trials"); });
@@ -282,7 +289,7 @@
   EXPECT_THAT(destroyed, ElementsAre("task_queue_factory", "field_trials"));
 }
 
-TEST(EnvironmentTest, CreateTestEnvironmentWorksWhenForced) {
+TEST_F(EnvironmentTest, CreateTestEnvironmentWorksWhenForced) {
   struct ScopedForce {
     ScopedForce() {
       old_value = IsForceTestEnvironmentEnabled();
@@ -308,8 +315,7 @@
         SetForceTestEnvironment(true);
         CreateEnvironment();
       },
-      "Production Environment creation is not allowed in tests. Use "
-      "CreateTestEnvironment.");
+      "is not allowed in tests.");
 }
 #endif
 
diff --git a/api/field_trials.cc b/api/field_trials.cc
index c243598..0f86319 100644
--- a/api/field_trials.cc
+++ b/api/field_trials.cc
@@ -70,7 +70,8 @@
   return absl::WrapUnique(new FieldTrials(std::move(key_value_map)));
 }
 
-FieldTrials::FieldTrials(absl::string_view s) {
+FieldTrials::FieldTrials(absl::string_view s, bool is_test)
+    : is_test_(is_test) {
   RTC_CHECK(!IsForceTestEnvironmentEnabled() ||
             IsTestEnvironmentCheckBypassed())
       << "FieldTrials constructor is not allowed in tests. Use "
@@ -79,11 +80,12 @@
 }
 
 FieldTrials::FieldTrials(const FieldTrials& other)
-    : FieldTrialsRegistry(other) {
+    : FieldTrialsRegistry(other), is_test_(other.is_test_) {
   key_value_map_ = other.key_value_map_;
 }
 
-FieldTrials::FieldTrials(FieldTrials&& other) : FieldTrialsRegistry(other) {
+FieldTrials::FieldTrials(FieldTrials&& other)
+    : FieldTrialsRegistry(other), is_test_(other.is_test_) {
   key_value_map_ = std::move(other.key_value_map_);
 }
 
@@ -92,6 +94,7 @@
     AssertGetValueNotCalled();
     FieldTrialsRegistry::operator=(other);
     key_value_map_ = other.key_value_map_;
+    is_test_ = other.is_test_;
   }
   return *this;
 }
@@ -101,6 +104,7 @@
     AssertGetValueNotCalled();
     FieldTrialsRegistry::operator=(other);
     key_value_map_ = std::move(other.key_value_map_);
+    is_test_ = other.is_test_;
   }
   return *this;
 }
diff --git a/api/field_trials.h b/api/field_trials.h
index 696aeee..0818572 100644
--- a/api/field_trials.h
+++ b/api/field_trials.h
@@ -50,7 +50,10 @@
 
   // Creates field trials from a string.
   // It is an error to call the constructor with an invalid field trial string.
-  explicit FieldTrials(absl::string_view s);
+  explicit FieldTrials(absl::string_view s) : FieldTrials(s, false) {}
+  // Setting is_test to true is only intended to be used by
+  // CreateTestFieldTrials.
+  FieldTrials(absl::string_view s, bool is_test);
 
   FieldTrials(const FieldTrials&);
   FieldTrials(FieldTrials&&);
@@ -87,6 +90,8 @@
 #endif
   }
 
+  bool IsTest() const override { return is_test_; }
+
  private:
   explicit FieldTrials(flat_map<std::string, std::string> key_value_map)
       : key_value_map_(std::move(key_value_map)) {}
@@ -102,6 +107,9 @@
 #endif
 
   flat_map<std::string, std::string> key_value_map_;
+  // True if these field trials were created with CreateTestFieldTrials,
+  // which include trials set on the command line.
+  bool is_test_ = false;
 };
 
 template <typename Sink>
@@ -114,6 +122,9 @@
     // Stringification is intended only for human readable logs, and is not
     // intended for reusing as `FieldTrials` construction parameter.
     sink.Append("//");
+    if (self.is_test_) {
+      sink.Append("Test");
+    }
   }
 }
 
diff --git a/api/field_trials_unittest.cc b/api/field_trials_unittest.cc
index d86451d..03882ec 100644
--- a/api/field_trials_unittest.cc
+++ b/api/field_trials_unittest.cc
@@ -28,8 +28,14 @@
 using ::testing::IsNull;
 using ::testing::Not;
 using ::testing::NotNull;
+using ::testing::Test;
 
-TEST(FieldTrialsTest, EmptyStringHasNoEffect) {
+class FieldTrialsTest : public Test {
+ private:
+  AutoBypassTestEnvironmentCheck bypass_;
+};
+
+TEST_F(FieldTrialsTest, EmptyStringHasNoEffect) {
   FieldTrials f("");
   f.RegisterKeysForTesting({"MyCoolTrial"});
 
@@ -37,7 +43,7 @@
   EXPECT_FALSE(f.IsDisabled("MyCoolTrial"));
 }
 
-TEST(FieldTrialsTest, EnabledDisabledMustBeFirstInValue) {
+TEST_F(FieldTrialsTest, EnabledDisabledMustBeFirstInValue) {
   FieldTrials f(
       "MyCoolTrial/EnabledFoo/"
       "MyUncoolTrial/DisabledBar/"
@@ -49,7 +55,7 @@
   EXPECT_FALSE(f.IsEnabled("AnotherTrial"));
 }
 
-TEST(FieldTrialsTest, FieldTrialsSupportSimultaneousInstances) {
+TEST_F(FieldTrialsTest, FieldTrialsSupportSimultaneousInstances) {
   FieldTrials f1("SomeString/Enabled/");
   FieldTrials f2("SomeOtherString/Enabled/");
   f1.RegisterKeysForTesting({"SomeString", "SomeOtherString"});
@@ -62,7 +68,7 @@
   EXPECT_TRUE(f2.IsEnabled("SomeOtherString"));
 }
 
-TEST(FieldTrialsTest, CreateAcceptsValidInputs) {
+TEST_F(FieldTrialsTest, CreateAcceptsValidInputs) {
   EXPECT_THAT(FieldTrials::Create(""), NotNull());
   EXPECT_THAT(FieldTrials::Create("Audio/Enabled/"), NotNull());
   EXPECT_THAT(FieldTrials::Create("Audio/Enabled/Video/Disabled/"), NotNull());
@@ -73,7 +79,7 @@
               NotNull());
 }
 
-TEST(FieldTrialsTest, CreateRejectsBadInputs) {
+TEST_F(FieldTrialsTest, CreateRejectsBadInputs) {
   // Bad delimiters
   EXPECT_THAT(FieldTrials::Create("Audio/EnabledVideo/Disabled/"), IsNull());
   EXPECT_THAT(FieldTrials::Create("Audio/Enabled//Video/Disabled/"), IsNull());
@@ -97,14 +103,14 @@
               IsNull());
 }
 
-TEST(FieldTrialsTest, StringfiyMentionsKeysAndValues) {
+TEST_F(FieldTrialsTest, StringfiyMentionsKeysAndValues) {
   // Exact format of the stringification is undefined.
   EXPECT_THAT(absl::StrCat(FieldTrials("Audio/Enabled/Video/Value/")),
               AllOf(HasSubstr("Audio"), HasSubstr("Enabled"),
                     HasSubstr("Video"), HasSubstr("Value")));
 }
 
-TEST(FieldTrialsTest, MergeCombinesFieldTrials) {
+TEST_F(FieldTrialsTest, MergeCombinesFieldTrials) {
   FieldTrials f("Video/Value1/");
   FieldTrials other("Audio/Value2/");
 
@@ -115,7 +121,7 @@
   EXPECT_EQ(f.Lookup("Audio"), "Value2");
 }
 
-TEST(FieldTrialsTest, MergeGivesPrecedenceToOther) {
+TEST_F(FieldTrialsTest, MergeGivesPrecedenceToOther) {
   FieldTrials f("Audio/Disabled/Video/Enabled/");
   FieldTrials other("Audio/Enabled/");
 
@@ -125,7 +131,7 @@
   EXPECT_EQ(f.Lookup("Audio"), "Enabled");
 }
 
-TEST(FieldTrialsTest, MergeDoesntChangeTrialAbsentInOther) {
+TEST_F(FieldTrialsTest, MergeDoesntChangeTrialAbsentInOther) {
   FieldTrials f("Audio/Enabled/Video/Enabled/");
   FieldTrials other("Audio/Enabled/");
 
@@ -135,7 +141,7 @@
   EXPECT_EQ(f.Lookup("Video"), "Enabled");
 }
 
-TEST(FieldTrialsTest, SetUpdatesTrial) {
+TEST_F(FieldTrialsTest, SetUpdatesTrial) {
   FieldTrials f("Audio/Enabled/Video/Enabled/");
 
   f.Set("Audio", "Disabled");
@@ -144,7 +150,7 @@
   EXPECT_EQ(f.Lookup("Audio"), "Disabled");
 }
 
-TEST(FieldTrialsTest, SettingEmptyValueRemovesFieldTrial) {
+TEST_F(FieldTrialsTest, SettingEmptyValueRemovesFieldTrial) {
   FieldTrials f("Audio/Enabled/Video/Enabled/");
 
   f.Set("Audio", "");
@@ -160,7 +166,7 @@
   EXPECT_EQ(f2.Lookup("Audio"), "Disabled");
 }
 
-TEST(FieldTrialsTest, CreateCopy) {
+TEST_F(FieldTrialsTest, CreateCopy) {
   auto f = std::make_unique<FieldTrials>("Audio/Enabled/");
   f->RegisterKeysForTesting({"Audio"});
 
@@ -170,7 +176,7 @@
   EXPECT_EQ(copy->Lookup("Audio"), "Enabled");
 }
 
-TEST(FieldTrials, Immutable) {
+TEST_F(FieldTrialsTest, Immutable) {
   FieldTrials f("Audio/Enabled/");
   f.RegisterKeysForTesting({"Audio"});
 
diff --git a/api/field_trials_view.h b/api/field_trials_view.h
index fef2d75..6c03553 100644
--- a/api/field_trials_view.h
+++ b/api/field_trials_view.h
@@ -44,6 +44,10 @@
     return absl::StartsWith(Lookup(key), "Disabled");
   }
 
+  // Returns true if this view is of a registry that is suitable for use
+  // in a test environment.
+  virtual bool IsTest() const { return false; }
+
   // Create a copy of this view.
   //
   // This method can't be pure virtual, due to downstream projects
diff --git a/api/video_codecs/test/BUILD.gn b/api/video_codecs/test/BUILD.gn
index 389a38d..94326b2 100644
--- a/api/video_codecs/test/BUILD.gn
+++ b/api/video_codecs/test/BUILD.gn
@@ -74,6 +74,7 @@
       "..:video_encoder_factory_template_libvpx_vp9_adapter",
       "..:video_encoder_factory_template_open_h264_adapter",
       "../..:mock_video_encoder",
+      "../../../test:create_test_environment",
       "../../../test:test_support",
       "../../environment",
       "../../environment:environment_factory",
@@ -93,6 +94,7 @@
       "..:video_decoder_factory_template_libvpx_vp9_adapter",
       "..:video_decoder_factory_template_open_h264_adapter",
       "../..:mock_video_decoder",
+      "../../../test:create_test_environment",
       "../../../test:test_support",
       "../../environment",
       "../../environment:environment_factory",
diff --git a/api/video_codecs/test/video_decoder_factory_template_tests.cc b/api/video_codecs/test/video_decoder_factory_template_tests.cc
index 8cae8be..8f427a7 100644
--- a/api/video_codecs/test/video_decoder_factory_template_tests.cc
+++ b/api/video_codecs/test/video_decoder_factory_template_tests.cc
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
 #include "api/test/mock_video_decoder.h"
 #include "api/video_codecs/sdp_video_format.h"
 #include "api/video_codecs/video_decoder.h"
@@ -21,6 +20,7 @@
 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp8_adapter.h"
 #include "api/video_codecs/video_decoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_decoder_factory_template_open_h264_adapter.h"
+#include "test/create_test_environment.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -65,7 +65,7 @@
 };
 
 TEST(VideoDecoderFactoryTemplate, OneTemplateAdapterCreateDecoder) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<FooDecoderTemplateAdapter> factory;
   EXPECT_THAT(factory.GetSupportedFormats(), UnorderedElementsAre(kFooSdp));
   EXPECT_THAT(factory.Create(env, kFooSdp), NotNull());
@@ -80,7 +80,7 @@
 }
 
 TEST(VideoDecoderFactoryTemplate, TwoTemplateAdaptersCreateDecoders) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<FooDecoderTemplateAdapter,
                               BarDecoderTemplateAdapter>
       factory;
@@ -94,7 +94,7 @@
 }
 
 TEST(VideoDecoderFactoryTemplate, LibvpxVp8) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<LibvpxVp8DecoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   ASSERT_THAT(formats,
@@ -103,7 +103,7 @@
 }
 
 TEST(VideoDecoderFactoryTemplate, LibvpxVp9) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<LibvpxVp9DecoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats, Not(IsEmpty()));
@@ -115,7 +115,7 @@
 //                              target remove this #ifdef.
 #if defined(WEBRTC_USE_H264)
 TEST(VideoDecoderFactoryTemplate, OpenH264) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<OpenH264DecoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats, Not(IsEmpty()));
@@ -125,7 +125,7 @@
 #endif  // defined(WEBRTC_USE_H264)
 
 TEST(VideoDecoderFactoryTemplate, Dav1d) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoDecoderFactoryTemplate<Dav1dDecoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats, Not(IsEmpty()));
diff --git a/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc b/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc
index e786291..bcbea0e 100644
--- a/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc
+++ b/api/video_codecs/test/video_decoder_software_fallback_wrapper_unittest.cc
@@ -15,9 +15,8 @@
 #include <optional>
 #include <string>
 
+#include "absl/strings/string_view.h"
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
-#include "api/field_trials.h"
 #include "api/video/encoded_image.h"
 #include "api/video/video_frame.h"
 #include "api/video/video_frame_type.h"
@@ -25,7 +24,7 @@
 #include "modules/video_coding/codecs/vp8/include/vp8.h"
 #include "modules/video_coding/include/video_error_codes.h"
 #include "rtc_base/checks.h"
-#include "test/create_test_field_trials.h"
+#include "test/create_test_environment.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -35,9 +34,8 @@
   VideoDecoderSoftwareFallbackWrapperTest()
       : VideoDecoderSoftwareFallbackWrapperTest("") {}
   explicit VideoDecoderSoftwareFallbackWrapperTest(
-      const std::string& field_trials)
-      : field_trials_(CreateTestFieldTrials(field_trials)),
-        env_(CreateEnvironment(&field_trials_)),
+      absl::string_view field_trials)
+      : env_(CreateTestEnvironment({.field_trials = field_trials})),
         fake_decoder_(new CountingFakeDecoder()),
         fallback_wrapper_(CreateVideoDecoderSoftwareFallbackWrapper(
             env_,
@@ -78,7 +76,6 @@
     int release_count_ = 0;
     int reset_count_ = 0;
   };
-  FieldTrials field_trials_;
   const Environment env_;
   // `fake_decoder_` is owned and released by `fallback_wrapper_`.
   CountingFakeDecoder* fake_decoder_;
diff --git a/api/video_codecs/test/video_encoder_factory_template_tests.cc b/api/video_codecs/test/video_encoder_factory_template_tests.cc
index 733ef30..55bfa94 100644
--- a/api/video_codecs/test/video_encoder_factory_template_tests.cc
+++ b/api/video_codecs/test/video_encoder_factory_template_tests.cc
@@ -13,7 +13,6 @@
 #include <vector>
 
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
 #include "api/test/mock_video_encoder.h"
 #include "api/video_codecs/scalability_mode.h"
 #include "api/video_codecs/sdp_video_format.h"
@@ -24,6 +23,7 @@
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp8_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_libvpx_vp9_adapter.h"
 #include "api/video_codecs/video_encoder_factory_template_open_h264_adapter.h"
+#include "test/create_test_environment.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -81,7 +81,7 @@
 };
 
 TEST(VideoEncoderFactoryTemplate, OneTemplateAdapterCreateEncoder) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<FooEncoderTemplateAdapter> factory;
   EXPECT_THAT(factory.GetSupportedFormats(), UnorderedElementsAre(kFooSdp));
   EXPECT_THAT(factory.Create(env, kFooSdp), NotNull());
@@ -109,7 +109,7 @@
 }
 
 TEST(VideoEncoderFactoryTemplate, TwoTemplateAdaptersCreateEncoders) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<FooEncoderTemplateAdapter,
                               BarEncoderTemplateAdapter>
       factory;
@@ -144,7 +144,7 @@
 }
 
 TEST(VideoEncoderFactoryTemplate, LibvpxVp8) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<LibvpxVp8EncoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats.size(), 1);
@@ -155,7 +155,7 @@
 }
 
 TEST(VideoEncoderFactoryTemplate, LibvpxVp9) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<LibvpxVp9EncoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats, Not(IsEmpty()));
@@ -169,7 +169,7 @@
 //                              target remove this #ifdef.
 #if defined(WEBRTC_USE_H264)
 TEST(VideoEncoderFactoryTemplate, OpenH264) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<OpenH264EncoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats, Not(IsEmpty()));
@@ -181,7 +181,7 @@
 #endif  // defined(WEBRTC_USE_H264)
 
 TEST(VideoEncoderFactoryTemplate, LibaomAv1) {
-  const Environment env = CreateEnvironment();
+  const Environment env = CreateTestEnvironment();
   VideoEncoderFactoryTemplate<LibaomAv1EncoderTemplateAdapter> factory;
   auto formats = factory.GetSupportedFormats();
   EXPECT_THAT(formats.size(), 1);
diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn
index 8b9eb62..dd59219 100644
--- a/rtc_base/experiments/BUILD.gn
+++ b/rtc_base/experiments/BUILD.gn
@@ -236,6 +236,7 @@
       "../../api/units:time_delta",
       "../../api/video:video_frame",
       "../../api/video_codecs:video_codecs_api",
+      "../../test:create_test_field_trials",
       "../../test:test_support",
       "//third_party/abseil-cpp/absl/strings:string_view",
     ]
diff --git a/rtc_base/experiments/balanced_degradation_settings_unittest.cc b/rtc_base/experiments/balanced_degradation_settings_unittest.cc
index 9c16174..dbf3778 100644
--- a/rtc_base/experiments/balanced_degradation_settings_unittest.cc
+++ b/rtc_base/experiments/balanced_degradation_settings_unittest.cc
@@ -15,6 +15,7 @@
 
 #include "api/field_trials.h"
 #include "api/video/video_codec_type.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -60,7 +61,7 @@
 }  // namespace
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfNoList) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   BalancedDegradationSettings settings(field_trials);
   VerifyIsDefault(settings.GetConfigs());
   EXPECT_TRUE(settings.CanAdaptUp(kVideoCodecVP8, 1, /*bitrate_bps*/ 1));
@@ -75,7 +76,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsConfig) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:11|22|33,fps:5|15|25,other:4|5|6/");
   BalancedDegradationSettings settings(field_trials);
@@ -117,7 +118,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroFpsValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:0|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -125,7 +126,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfPixelsDecreases) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|999|3000,fps:5|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -133,7 +134,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfFramerateDecreases) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|4|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -141,7 +142,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsConfigWithSpecificFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|8|9,vp9_fps:9|10|11,"
       "h264_fps:11|12|13,av1_fps:1|2|3,generic_fps:13|14|15/");
@@ -184,7 +185,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroVp8FpsValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:7|15|25,vp8_fps:0|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -192,7 +193,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigForInvalidFpsValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:7|15|25,vp8_fps:10|15|2000/");
   BalancedDegradationSettings settings(field_trials);
@@ -200,7 +201,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfVp8FramerateDecreases) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:4|5|25,vp8_fps:5|4|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -208,7 +209,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsMinFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -223,7 +224,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsVp8MinFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|10|12/");
   BalancedDegradationSettings settings(field_trials);
@@ -238,7 +239,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsMaxFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -251,7 +252,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsVp8MaxFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_fps:7|10|12/");
   BalancedDegradationSettings settings(field_trials);
@@ -264,7 +265,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsVp9Fps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp9_fps:7|10|12/");
   BalancedDegradationSettings settings(field_trials);
@@ -273,7 +274,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsH264Fps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,h264_fps:8|11|13/");
   BalancedDegradationSettings settings(field_trials);
@@ -282,7 +283,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsGenericFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,generic_fps:9|12|14/");
   BalancedDegradationSettings settings(field_trials);
@@ -292,7 +293,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsUnlimitedForMaxValidFps) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|100,vp8_fps:30|100|100/");
   const int kUnlimitedFps = std::numeric_limits<int>::max();
@@ -304,7 +305,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsConfigWithBitrate) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:11|22|33,fps:5|15|25,kbps:44|88|99,kbps_res:55|111|222,"
       "vp8_kbps:11|12|13,vp8_kbps_res:14|15|16,"
@@ -351,7 +352,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfBitrateDecreases) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:11|22|33,fps:5|15|25,kbps:44|43|99/");
   BalancedDegradationSettings settings(field_trials);
@@ -360,7 +361,7 @@
 
 TEST(BalancedDegradationSettings,
      GetsDefaultConfigIfBitrateDecreasesWithUnsetValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:11|22|33,fps:5|15|25,kbps:44|0|43/");
   BalancedDegradationSettings settings(field_trials);
@@ -369,7 +370,7 @@
 
 TEST(BalancedDegradationSettings, CanAdaptUp) {
   VideoCodecType vp8 = kVideoCodecVP8;
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000|4000,fps:5|15|25|30,kbps:0|80|0|90,"
       "vp9_kbps:40|50|60|70/");
@@ -384,7 +385,7 @@
 }
 
 TEST(BalancedDegradationSettings, CanAdaptUpWithCodecType) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000|4000,fps:5|15|25|30,vp8_kbps:0|30|40|50,"
       "vp9_kbps:0|60|70|80,h264_kbps:0|55|65|75,av1_kbps:0|77|88|99,"
@@ -404,7 +405,7 @@
 
 TEST(BalancedDegradationSettings, CanAdaptUpResolution) {
   VideoCodecType vp8 = kVideoCodecVP8;
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000|4000,fps:5|15|25|30,kbps_res:0|80|0|90,"
       "vp9_kbps_res:40|50|60|70/");
@@ -419,7 +420,7 @@
 }
 
 TEST(BalancedDegradationSettings, CanAdaptUpResolutionWithCodecType) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000|4000,fps:5|15|25|30,vp8_kbps_res:0|30|40|50,"
       "vp9_kbps_res:0|60|70|80,h264_kbps_res:0|55|65|75,"
@@ -438,7 +439,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsFpsDiff) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,fps_diff:0|-2|3/");
   BalancedDegradationSettings settings(field_trials);
@@ -452,7 +453,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsNoFpsDiffIfValueBelowMinSetting) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,fps_diff:-100|-99|-101/");
   // Min valid fps_diff setting: -99.
@@ -463,7 +464,7 @@
 }
 
 TEST(BalancedDegradationSettings, QpThresholdsNotSetByDefault) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25/");
   BalancedDegradationSettings settings(field_trials);
@@ -475,7 +476,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsConfigWithQpThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_low:89|90|88,"
       "vp8_qp_high:90|91|92,vp9_qp_low:27|28|29,vp9_qp_high:120|130|140,"
@@ -520,7 +521,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfOnlyHasLowThreshold) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_low:89|90|88/");
   BalancedDegradationSettings settings(field_trials);
@@ -528,7 +529,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfOnlyHasHighThreshold) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,vp8_qp_high:90|91|92/");
   BalancedDegradationSettings settings(field_trials);
@@ -536,7 +537,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfLowEqualsHigh) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|88/");
@@ -545,7 +546,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigIfLowGreaterThanHigh) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|87/");
@@ -554,7 +555,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsDefaultConfigForZeroQpValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "vp8_qp_low:89|0|88,vp8_qp_high:90|91|92/");
@@ -563,7 +564,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsVp8QpThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "vp8_qp_low:89|90|88,vp8_qp_high:90|91|92/");
@@ -579,7 +580,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsVp9QpThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "vp9_qp_low:55|56|57,vp9_qp_high:155|156|157/");
@@ -591,7 +592,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsH264QpThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "h264_qp_low:21|22|23,h264_qp_high:41|43|42/");
@@ -603,7 +604,7 @@
 }
 
 TEST(BalancedDegradationSettings, GetsGenericQpThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-BalancedDegradationSettings/"
       "pixels:1000|2000|3000,fps:5|15|25,"
       "generic_qp_low:2|3|4,generic_qp_high:22|23|24/");
diff --git a/rtc_base/experiments/corruption_detection_frame_selector_settings_unittest.cc b/rtc_base/experiments/corruption_detection_frame_selector_settings_unittest.cc
index 75e6752..5417893 100644
--- a/rtc_base/experiments/corruption_detection_frame_selector_settings_unittest.cc
+++ b/rtc_base/experiments/corruption_detection_frame_selector_settings_unittest.cc
@@ -12,19 +12,21 @@
 
 #include "api/field_trials.h"
 #include "api/units/time_delta.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest, DisabledByDefault) {
-  FieldTrials trials("");
+  FieldTrials trials = CreateTestFieldTrials("");
   CorruptionDetectionFrameSelectorSettings settings(trials);
   EXPECT_FALSE(settings.is_enabled());
 }
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest, EnabledWithDefaults) {
-  FieldTrials trials("WebRTC-CorruptionDetectionFrameSelector/enabled:true/");
+  FieldTrials trials = CreateTestFieldTrials(
+      "WebRTC-CorruptionDetectionFrameSelector/enabled:true/");
   CorruptionDetectionFrameSelectorSettings settings(trials);
   EXPECT_TRUE(settings.is_enabled());
   EXPECT_EQ(settings.low_overhead_lower_bound(), TimeDelta::Millis(1));
@@ -35,7 +37,7 @@
 }
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest, ParsesValues) {
-  FieldTrials trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-CorruptionDetectionFrameSelector/enabled:true,"
       "low_overhead_lower_bound:10ms,low_overhead_upper_bound:100ms,"
       "high_overhead_lower_bound:20ms,high_overhead_upper_bound:200ms/");
@@ -48,7 +50,7 @@
 }
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest, ValidationLowOverhead) {
-  FieldTrials trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-CorruptionDetectionFrameSelector/enabled:true,"
       "low_overhead_lower_bound:100ms,low_overhead_upper_bound:10ms/");
   CorruptionDetectionFrameSelectorSettings settings(trials);
@@ -56,7 +58,7 @@
 }
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest, ValidationHighOverhead) {
-  FieldTrials trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-CorruptionDetectionFrameSelector/enabled:true,"
       "high_overhead_lower_bound:100ms,high_overhead_upper_bound:10ms/");
   CorruptionDetectionFrameSelectorSettings settings(trials);
@@ -65,7 +67,7 @@
 
 TEST(CorruptionDetectionFrameSelectorSettingsTest,
      ParsesAsynchronousEvaluation) {
-  FieldTrials trials(
+  FieldTrials trials = CreateTestFieldTrials(
       "WebRTC-CorruptionDetectionFrameSelector/asynchronous_evaluation:true/");
   CorruptionDetectionFrameSelectorSettings settings(trials);
   EXPECT_TRUE(settings.use_asynchronous_evaluation());
diff --git a/rtc_base/experiments/encoder_info_settings_unittest.cc b/rtc_base/experiments/encoder_info_settings_unittest.cc
index 2fa3a98..ecacfef 100644
--- a/rtc_base/experiments/encoder_info_settings_unittest.cc
+++ b/rtc_base/experiments/encoder_info_settings_unittest.cc
@@ -15,6 +15,7 @@
 
 #include "api/field_trials.h"
 #include "api/video_codecs/video_encoder.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -22,7 +23,7 @@
 
 
 TEST(SimulcastEncoderAdapterSettingsTest, NoValuesWithoutFieldTrial) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
 
   SimulcastEncoderAdapterEncoderInfoSettings settings(field_trials);
   EXPECT_EQ(std::nullopt, settings.requested_resolution_alignment());
@@ -31,7 +32,7 @@
 }
 
 TEST(SimulcastEncoderAdapterSettingsTest, NoValueForInvalidAlignment) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
       "requested_resolution_alignment:0/");
 
@@ -40,7 +41,7 @@
 }
 
 TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionAlignment) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
       "requested_resolution_alignment:2/");
 
@@ -51,7 +52,7 @@
 }
 
 TEST(SimulcastEncoderAdapterSettingsTest, GetApplyAlignment) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
       "requested_resolution_alignment:3,"
       "apply_alignment_to_all_simulcast_layers/");
@@ -63,7 +64,7 @@
 }
 
 TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimits) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
       "frame_size_pixels:123,"
       "min_start_bitrate_bps:11000,"
@@ -79,7 +80,7 @@
 }
 
 TEST(SimulcastEncoderAdapterSettingsTest, GetResolutionBitrateLimitsWithList) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-SimulcastEncoderAdapter-GetEncoderInfoOverride/"
       "frame_size_pixels:123|456|789,"
       "min_start_bitrate_bps:11000|22000|33000,"
@@ -96,7 +97,7 @@
 }
 
 TEST(EncoderSettingsTest, CommonSettingsUsedIfEncoderNameUnspecified) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-VP8-GetEncoderInfoOverride/requested_resolution_alignment:2/"
       "WebRTC-GetEncoderInfoOverride/requested_resolution_alignment:3/");
 
diff --git a/rtc_base/experiments/encoder_speed_experiment_unittest.cc b/rtc_base/experiments/encoder_speed_experiment_unittest.cc
index ed0edb0..373e9df 100644
--- a/rtc_base/experiments/encoder_speed_experiment_unittest.cc
+++ b/rtc_base/experiments/encoder_speed_experiment_unittest.cc
@@ -13,31 +13,34 @@
 #include "api/field_trials.h"
 #include "api/video/video_codec_type.h"
 #include "api/video_codecs/video_codec.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 TEST(EncoderSpeedExperimentTest, EnabledByDefault) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   EncoderSpeedExperiment config(field_trials);
   EXPECT_TRUE(config.IsDynamicSpeedEnabled());
 }
 
 TEST(EncoderSpeedExperimentTest, DynamicSpeedEnabled) {
-  FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:true/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-EncoderSpeed/dynamic_speed:true/");
   EncoderSpeedExperiment config(field_trials);
   EXPECT_TRUE(config.IsDynamicSpeedEnabled());
 }
 
 TEST(EncoderSpeedExperimentTest, DynamicSpeedExplicitlyDisabled) {
-  FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:false/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-EncoderSpeed/dynamic_speed:false/");
   EncoderSpeedExperiment config(field_trials);
   EXPECT_FALSE(config.IsDynamicSpeedEnabled());
 }
 
 TEST(EncoderSpeedExperimentTest, DefaultComplexity) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   EncoderSpeedExperiment config(field_trials);
 
   // New defaults for AV1.
@@ -57,7 +60,7 @@
 }
 
 TEST(EncoderSpeedExperimentTest, PerCodecComplexity) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-EncoderSpeed/"
       "dynamic_speed:true,av1_camera:high,av1_screenshare:low,vp8_camera:max/");
 
@@ -84,7 +87,7 @@
 }
 
 TEST(EncoderSpeedExperimentTest, PerCodecComplexityDynamicSpeedDisabled) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-EncoderSpeed/"
       "dynamic_speed:false,av1_camera:high,av1_screenshare:low/");
 
@@ -99,7 +102,7 @@
 }
 
 TEST(EncoderSpeedExperimentTest, InvalidCodecComplexityValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-EncoderSpeed/"
       "dynamic_speed:true,vp8_camera:invalid,vp8_screenshare:max/");
 
@@ -112,7 +115,8 @@
 }
 
 TEST(EncoderSpeedExperimentTest, InvalidDynamicSpeedValue) {
-  FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:invalid/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-EncoderSpeed/dynamic_speed:invalid/");
   EncoderSpeedExperiment config(field_trials);
   EXPECT_TRUE(config.IsDynamicSpeedEnabled());  // Should default to true
 }
@@ -120,7 +124,7 @@
 TEST(EncoderSpeedExperimentTest, Vp9LowComplexityFallbackEnabled) {
   for (std::string trial : {"WebRTC-EncoderSpeed/dynamic_speed:true/",
                             "WebRTC-EncoderSpeed/dynamic_speed:false/"}) {
-    FieldTrials field_trials(trial);
+    FieldTrials field_trials = CreateTestFieldTrials(trial);
     EncoderSpeedExperiment config(field_trials,
                                   /*use_low_complexity_for_vp9=*/true);
 
@@ -145,7 +149,7 @@
         "dynamic_speed:false,vp9_camera:high,vp9_screenshare:max/",
         "WebRTC-EncoderSpeed/"
         "dynamic_speed:true,vp9_camera:high,vp9_screenshare:max/"}) {
-    FieldTrials field_trials(trial);
+    FieldTrials field_trials = CreateTestFieldTrials(trial);
     EncoderSpeedExperiment config(field_trials,
                                   /*use_low_complexity_for_vp9=*/true);
 
@@ -158,7 +162,8 @@
 }
 
 TEST(EncoderSpeedExperimentTest, Vp9LowComplexityFallbackDisabled) {
-  FieldTrials field_trials("WebRTC-EncoderSpeed/dynamic_speed:true/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-EncoderSpeed/dynamic_speed:true/");
   EncoderSpeedExperiment config(field_trials,
                                 /*use_low_complexity_for_vp9=*/false);
 
diff --git a/rtc_base/experiments/field_trial_parser_unittest.cc b/rtc_base/experiments/field_trial_parser_unittest.cc
index 0fc4882..c188615 100644
--- a/rtc_base/experiments/field_trial_parser_unittest.cc
+++ b/rtc_base/experiments/field_trial_parser_unittest.cc
@@ -15,6 +15,7 @@
 #include "absl/strings/string_view.h"
 #include "api/field_trials.h"
 #include "api/field_trials_view.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -59,7 +60,7 @@
 }
 
 TEST(FieldTrialParserTest, InitializesFromFieldTrial) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-OtherExperiment/Disabled/"
       "WebRTC-DummyExperiment/Enabled,f:-1.7,r:2,s:10,p:1,h:x7c/"
       "WebRTC-AnotherExperiment/Enabled,f:-3.1,otherstuff:beef/");
diff --git a/rtc_base/experiments/keyframe_interval_settings_unittest.cc b/rtc_base/experiments/keyframe_interval_settings_unittest.cc
index 4bef351..150d655 100644
--- a/rtc_base/experiments/keyframe_interval_settings_unittest.cc
+++ b/rtc_base/experiments/keyframe_interval_settings_unittest.cc
@@ -11,6 +11,7 @@
 #include "rtc_base/experiments/keyframe_interval_settings.h"
 
 #include "api/field_trials.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -18,17 +19,17 @@
 
 
 TEST(KeyframeIntervalSettingsTest, ParsesMinKeyframeSendIntervalMs) {
-  EXPECT_FALSE(
-      KeyframeIntervalSettings(FieldTrials("")).MinKeyframeSendIntervalMs());
+  EXPECT_FALSE(KeyframeIntervalSettings(CreateTestFieldTrials(""))
+                   .MinKeyframeSendIntervalMs());
 
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:100/");
   EXPECT_EQ(KeyframeIntervalSettings(field_trials).MinKeyframeSendIntervalMs(),
             100);
 }
 
 TEST(KeyframeIntervalSettingsTest, DoesNotParseIncorrectValues) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-KeyframeInterval/min_keyframe_send_interval_ms:a/");
   EXPECT_FALSE(
       KeyframeIntervalSettings(field_trials).MinKeyframeSendIntervalMs());
diff --git a/rtc_base/experiments/min_video_bitrate_experiment_unittest.cc b/rtc_base/experiments/min_video_bitrate_experiment_unittest.cc
index d9cb770..a624f79 100644
--- a/rtc_base/experiments/min_video_bitrate_experiment_unittest.cc
+++ b/rtc_base/experiments/min_video_bitrate_experiment_unittest.cc
@@ -15,6 +15,7 @@
 #include "api/field_trials.h"
 #include "api/units/data_rate.h"
 #include "api/video/video_codec_type.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -22,7 +23,7 @@
 
 TEST(GetExperimentalMinVideoBitrateTest,
      NulloptForAllCodecsIfFieldTrialUndefined) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
 
   EXPECT_EQ(GetExperimentalMinVideoBitrate(field_trials, kVideoCodecGeneric),
             std::nullopt);
@@ -36,7 +37,8 @@
 
 TEST(GetExperimentalMinVideoBitrateTest,
      NulloptForAllCodecsIfFieldTrialDisabled) {
-  FieldTrials field_trials("WebRTC-Video-MinVideoBitrate/Disabled,br:123kbps/");
+  FieldTrials field_trials = CreateTestFieldTrials(
+      "WebRTC-Video-MinVideoBitrate/Disabled,br:123kbps/");
 
   EXPECT_EQ(GetExperimentalMinVideoBitrate(field_trials, kVideoCodecGeneric),
             std::nullopt);
@@ -49,7 +51,8 @@
 }
 
 TEST(GetExperimentalMinVideoBitrateTest, BrForAllCodecsIfDefined) {
-  FieldTrials field_trials("WebRTC-Video-MinVideoBitrate/Enabled,br:123kbps/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-MinVideoBitrate/Enabled,br:123kbps/");
 
   EXPECT_EQ(GetExperimentalMinVideoBitrate(field_trials, kVideoCodecGeneric),
             DataRate::KilobitsPerSec(123));
@@ -62,7 +65,7 @@
 }
 
 TEST(GetExperimentalMinVideoBitrateTest, BrTrumpsSpecificCodecConfigs) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-MinVideoBitrate/"
       "Enabled,br:123kbps,vp8_br:100kbps,vp9_br:200kbps,h264_br:300kbps/");
 
@@ -78,7 +81,7 @@
 
 TEST(GetExperimentalMinVideoBitrateTest,
      SpecificCodecConfigsIgnoredIfExpDisabled) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-MinVideoBitrate/"
       "Disabled,vp8_br:100kbps,vp9_br:200kbps,h264_br:300kbps/");
 
@@ -93,7 +96,7 @@
 }
 
 TEST(GetExperimentalMinVideoBitrateTest, SpecificCodecConfigsUsedIfExpEnabled) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-MinVideoBitrate/"
       "Enabled,vp8_br:100kbps,vp9_br:200kbps,h264_br:300kbps/");
 
@@ -109,7 +112,7 @@
 
 TEST(GetExperimentalMinVideoBitrateTest,
      Vp8BitrateValueTakenFromFallbackIfAvailable) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-MinVideoBitrate/"
       "Enabled,vp8_br:100kbps,vp9_br:200kbps,h264_br:300kbps/"
       "WebRTC-VP8-Forced-Fallback-Encoder-v2/"
@@ -121,7 +124,7 @@
 
 TEST(GetExperimentalMinVideoBitrateTest,
      NonVp8BitrateValuesTakenFromMinVideoBitrate) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-MinVideoBitrate/"
       "Enabled,vp8_br:100kbps,vp9_br:200kbps,h264_br:300kbps/"
       "WebRTC-VP8-Forced-Fallback-Encoder-v2/"
diff --git a/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc b/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc
index 65f8fbd..f9d650f 100644
--- a/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc
+++ b/rtc_base/experiments/normalize_simulcast_size_experiment_unittest.cc
@@ -11,31 +11,35 @@
 #include "rtc_base/experiments/normalize_simulcast_size_experiment.h"
 
 #include "api/field_trials.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 
 TEST(NormalizeSimulcastSizeExperimentTest, GetExponent) {
-  FieldTrials field_trials("WebRTC-NormalizeSimulcastResolution/Enabled-2/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-NormalizeSimulcastResolution/Enabled-2/");
   EXPECT_EQ(2,
             NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
 }
 
 TEST(NormalizeSimulcastSizeExperimentTest, GetExponentWithTwoParameters) {
-  FieldTrials field_trials("WebRTC-NormalizeSimulcastResolution/Enabled-3-4/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-NormalizeSimulcastResolution/Enabled-3-4/");
   EXPECT_EQ(3,
             NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
 }
 
 TEST(NormalizeSimulcastSizeExperimentTest, GetExponentFailsIfNotEnabled) {
-  FieldTrials field_trials("WebRTC-NormalizeSimulcastResolution/Disabled/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-NormalizeSimulcastResolution/Disabled/");
   EXPECT_FALSE(
       NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
 }
 
 TEST(NormalizeSimulcastSizeExperimentTest,
      GetExponentFailsForInvalidFieldTrial) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-NormalizeSimulcastResolution/Enabled-invalid/");
   EXPECT_FALSE(
       NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
@@ -44,7 +48,8 @@
 TEST(NormalizeSimulcastSizeExperimentTest,
      GetExponentFailsForNegativeOutOfBoundValue) {
   // Supported range: [0, 5].
-  FieldTrials field_trials("WebRTC-NormalizeSimulcastResolution/Enabled--1/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-NormalizeSimulcastResolution/Enabled--1/");
   EXPECT_FALSE(
       NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
 }
@@ -52,7 +57,8 @@
 TEST(NormalizeSimulcastSizeExperimentTest,
      GetExponentFailsForPositiveOutOfBoundValue) {
   // Supported range: [0, 5].
-  FieldTrials field_trials("WebRTC-NormalizeSimulcastResolution/Enabled-6/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-NormalizeSimulcastResolution/Enabled-6/");
   EXPECT_FALSE(
       NormalizeSimulcastSizeExperiment::GetBase2Exponent(field_trials));
 }
diff --git a/rtc_base/experiments/psnr_experiment_unittest.cc b/rtc_base/experiments/psnr_experiment_unittest.cc
index 4e278b9..c84b962 100644
--- a/rtc_base/experiments/psnr_experiment_unittest.cc
+++ b/rtc_base/experiments/psnr_experiment_unittest.cc
@@ -10,26 +10,28 @@
 
 #include "api/field_trials.h"
 #include "api/units/time_delta.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 TEST(PsnrExperimentTest, DisabledByDefault) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   PsnrExperiment config(field_trials);
   EXPECT_FALSE(config.IsEnabled());
 }
 
 TEST(PsnrExperimentTest, Enabled) {
-  FieldTrials field_trials("WebRTC-Video-CalculatePsnr/Enabled/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-CalculatePsnr/Enabled/");
   PsnrExperiment config(field_trials);
   EXPECT_TRUE(config.IsEnabled());
   EXPECT_EQ(config.SamplingInterval(), TimeDelta::Millis(1000));
 }
 
 TEST(PsnrExperimentTest, EnabledWithCustomSampling) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-CalculatePsnr/Enabled,sampling_interval:2500ms/");
   PsnrExperiment config(field_trials);
   EXPECT_TRUE(config.IsEnabled());
@@ -37,7 +39,7 @@
 }
 
 TEST(PsnrExperimentTest, EnabledWithInvalidSampling) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-CalculatePsnr/Enabled,sampling_interval:0ms/");
   PsnrExperiment config(field_trials);
   EXPECT_TRUE(config.IsEnabled());
@@ -45,14 +47,14 @@
 }
 
 TEST(PsnrExperimentTest, DisabledWithParams) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-CalculatePsnr/Disabled,sampling_interval:500ms/");
   PsnrExperiment config(field_trials);
   EXPECT_FALSE(config.IsEnabled());
 }
 
 TEST(PsnrExperimentTest, EnabledWithNegativeSampling) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-CalculatePsnr/Enabled,sampling_interval:-100ms/");
   PsnrExperiment config(field_trials);
   EXPECT_TRUE(config.IsEnabled());
@@ -60,7 +62,8 @@
 }
 
 TEST(PsnrExperimentTest, ExplicitlyDisabled) {
-  FieldTrials field_trials("WebRTC-Video-CalculatePsnr/Disabled/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-CalculatePsnr/Disabled/");
   PsnrExperiment config(field_trials);
   EXPECT_FALSE(config.IsEnabled());
 }
diff --git a/rtc_base/experiments/quality_scaler_settings_unittest.cc b/rtc_base/experiments/quality_scaler_settings_unittest.cc
index 3963308..3aa8ca1 100644
--- a/rtc_base/experiments/quality_scaler_settings_unittest.cc
+++ b/rtc_base/experiments/quality_scaler_settings_unittest.cc
@@ -11,13 +11,14 @@
 #include "rtc_base/experiments/quality_scaler_settings.h"
 
 #include "api/field_trials.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
 namespace {
 
 TEST(QualityScalerSettingsTest, ValuesNotSetByDefault) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   const auto settings = QualityScalerSettings(field_trials);
   EXPECT_FALSE(settings.MinFrames());
   EXPECT_FALSE(settings.InitialScaleFactor());
@@ -27,38 +28,38 @@
 }
 
 TEST(QualityScalerSettingsTest, ParseMinFrames) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/min_frames:100/");
   EXPECT_EQ(100, QualityScalerSettings(field_trials).MinFrames());
 }
 
 TEST(QualityScalerSettingsTest, ParseInitialScaleFactor) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/initial_scale_factor:1.5/");
   EXPECT_EQ(1.5, QualityScalerSettings(field_trials).InitialScaleFactor());
 }
 
 TEST(QualityScalerSettingsTest, ParseScaleFactor) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/scale_factor:1.1/");
   EXPECT_EQ(1.1, QualityScalerSettings(field_trials).ScaleFactor());
 }
 
 TEST(QualityScalerSettingsTest, ParseInitialBitrateInterval) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/initial_bitrate_interval_ms:1000/");
   EXPECT_EQ(1000,
             QualityScalerSettings(field_trials).InitialBitrateIntervalMs());
 }
 
 TEST(QualityScalerSettingsTest, ParseInitialBitrateFactor) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/initial_bitrate_factor:0.75/");
   EXPECT_EQ(0.75, QualityScalerSettings(field_trials).InitialBitrateFactor());
 }
 
 TEST(QualityScalerSettingsTest, ParseAll) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/"
       "min_frames:100,initial_scale_factor:1.5,scale_factor:0.9,"
       "initial_bitrate_interval_ms:5500,initial_bitrate_factor:0.7/");
@@ -71,7 +72,7 @@
 }
 
 TEST(QualityScalerSettingsTest, DoesNotParseIncorrectValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/"
       "min_frames:a,initial_scale_factor:b,scale_factor:c,"
       "initial_bitrate_interval_ms:d,initial_bitrate_factor:e/");
@@ -84,7 +85,7 @@
 }
 
 TEST(QualityScalerSettingsTest, DoesNotReturnTooSmallValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScalerSettings/"
       "min_frames:0,initial_scale_factor:0.0,scale_factor:0.0,"
       "initial_bitrate_interval_ms:-1,initial_bitrate_factor:0.0/");
diff --git a/rtc_base/experiments/quality_scaling_experiment_unittest.cc b/rtc_base/experiments/quality_scaling_experiment_unittest.cc
index acd7d00..0c7ee9f 100644
--- a/rtc_base/experiments/quality_scaling_experiment_unittest.cc
+++ b/rtc_base/experiments/quality_scaling_experiment_unittest.cc
@@ -12,6 +12,7 @@
 
 #include "api/field_trials.h"
 #include "api/video/video_codec_type.h"
+#include "test/create_test_field_trials.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -42,18 +43,19 @@
 #if !defined(WEBRTC_IOS)
 // TODO(bugs.webrtc.org/12401): investigate why QualityScaler kicks in on iOS.
 TEST(QualityScalingExperimentTest, DefaultEnabledWithoutFieldTrial) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   EXPECT_TRUE(QualityScalingExperiment::Enabled(field_trials));
 }
 #else
 TEST(QualityScalingExperimentTest, DefaultDisabledWithoutFieldTrialIOS) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   EXPECT_FALSE(QualityScalingExperiment::Enabled(field_trials));
 }
 #endif
 
 TEST(QualityScalingExperimentTest, EnabledWithFieldTrial) {
-  FieldTrials field_trials("WebRTC-Video-QualityScaling/Enabled/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-QualityScaling/Enabled/");
   EXPECT_TRUE(QualityScalingExperiment::Enabled(field_trials));
 }
 
@@ -69,7 +71,7 @@
                                                         .alpha_high = 0.9f,
                                                         .alpha_low = 0.99f,
                                                         .drop = 1};
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,1/");
   const auto settings = QualityScalingExperiment::ParseSettings(field_trials);
   EXPECT_TRUE(settings);
@@ -79,24 +81,25 @@
 #if !defined(WEBRTC_IOS)
 // TODO(bugs.webrtc.org/12401): investigate why QualityScaler kicks in on iOS.
 TEST(QualityScalingExperimentTest, ParseSettingsUsesDefaultsWithoutFieldTrial) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   // Uses some default hard coded values.
   EXPECT_TRUE(QualityScalingExperiment::ParseSettings(field_trials));
 }
 #else
 TEST(QualityScalingExperimentTest, ParseSettingsFailsWithoutFieldTrial) {
-  FieldTrials field_trials("");
+  FieldTrials field_trials = CreateTestFieldTrials("");
   EXPECT_FALSE(QualityScalingExperiment::ParseSettings(field_trials));
 }
 #endif
 
 TEST(QualityScalingExperimentTest, ParseSettingsFailsWithInvalidFieldTrial) {
-  FieldTrials field_trials("WebRTC-Video-QualityScaling/Enabled-invalid/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-QualityScaling/Enabled-invalid/");
   EXPECT_FALSE(QualityScalingExperiment::ParseSettings(field_trials));
 }
 
 TEST(QualityScalingExperimentTest, GetConfig) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.9,0.99,0/");
   const auto config = QualityScalingExperiment::GetConfig(field_trials);
   EXPECT_EQ(0.9f, config.alpha_high);
@@ -105,7 +108,8 @@
 }
 
 TEST(QualityScalingExperimentTest, GetsDefaultConfigForInvalidFieldTrial) {
-  FieldTrials field_trials("WebRTC-Video-QualityScaling/Enabled-invalid/");
+  FieldTrials field_trials =
+      CreateTestFieldTrials("WebRTC-Video-QualityScaling/Enabled-invalid/");
   const auto config = QualityScalingExperiment::GetConfig(field_trials);
   ExpectEqualConfig(config, QualityScalingExperiment::Config());
 }
@@ -113,14 +117,14 @@
 TEST(QualityScalingExperimentTest, GetsDefaultAlphaForInvalidValue) {
   QualityScalingExperiment::Config expected_config;
   expected_config.use_all_drop_reasons = true;
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,7,8,0.99,0.9,1/");
   const auto config = QualityScalingExperiment::GetConfig(field_trials);
   ExpectEqualConfig(config, expected_config);
 }
 
 TEST(QualityScalingExperimentTest, GetVp8Thresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8, field_trials);
@@ -130,7 +134,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp8Value) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-0,0,3,4,5,6,7,8,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecVP8, field_trials);
@@ -138,7 +142,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetVp9Thresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9, field_trials);
@@ -148,7 +152,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidVp9Value) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,0,0,5,6,7,8,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecVP9, field_trials);
@@ -156,7 +160,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetH264Thresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecH264, field_trials);
@@ -166,7 +170,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidH264Value) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/");
   const auto thresholds =
       QualityScalingExperiment::GetQpThresholds(kVideoCodecH264, field_trials);
@@ -174,7 +178,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetGenericThresholds) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,0,0,7,8,0.9,0.99,1/");
   const auto thresholds = QualityScalingExperiment::GetQpThresholds(
       kVideoCodecGeneric, field_trials);
@@ -184,7 +188,7 @@
 }
 
 TEST(QualityScalingExperimentTest, GetThresholdsFailsForInvalidGenericValue) {
-  FieldTrials field_trials(
+  FieldTrials field_trials = CreateTestFieldTrials(
       "WebRTC-Video-QualityScaling/Enabled-1,2,3,4,5,6,0,0,0.9,0.99,1/");
   const auto thresholds = QualityScalingExperiment::GetQpThresholds(
       kVideoCodecGeneric, field_trials);
diff --git a/rtc_base/experiments/rate_control_settings_unittest.cc b/rtc_base/experiments/rate_control_settings_unittest.cc
index 5f730b4..0b11249 100644
--- a/rtc_base/experiments/rate_control_settings_unittest.cc
+++ b/rtc_base/experiments/rate_control_settings_unittest.cc
@@ -11,7 +11,7 @@
 #include "rtc_base/experiments/rate_control_settings.h"
 
 #include "absl/strings/string_view.h"
-#include "api/field_trials.h"
+#include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 
@@ -23,7 +23,7 @@
 using ::testing::Optional;
 
 RateControlSettings ParseFrom(absl::string_view field_trials) {
-  return RateControlSettings(FieldTrials(field_trials));
+  return RateControlSettings(CreateTestFieldTrials(field_trials));
 }
 
 TEST(RateControlSettingsTest, CongestionWindow) {
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index 66db0ae..bd997a8 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -24,7 +24,6 @@
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
 #include "api/field_trials.h"
 #include "api/sequence_checker.h"
 #include "rtc_base/checks.h"
@@ -37,6 +36,7 @@
 #include "rtc_base/network_monitor_factory.h"
 #include "rtc_base/physical_socket_server.h"
 #include "rtc_base/socket_address.h"
+#include "test/create_test_environment.h"
 #include "test/create_test_field_trials.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -329,8 +329,7 @@
 #endif  // defined(WEBRTC_POSIX)
 
  protected:
-  const FieldTrials field_trials_ = CreateTestFieldTrials();
-  const Environment env_ = CreateEnvironment(&field_trials_);
+  const Environment env_ = CreateTestEnvironment();
   test::RunLoop main_thread_;
   bool callback_called_ = false;
 };
@@ -1421,7 +1420,8 @@
   std::string ipv6_address = "2607:fc20:f340:1dc8:214:22ff:fe01:2345";
   std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF";
   PhysicalSocketServer socket_server;
-  BasicNetworkManager manager(CreateEnvironment(&field_trials), &socket_server);
+  BasicNetworkManager manager(
+      CreateTestEnvironment({.field_trials = &field_trials}), &socket_server);
   manager.StartUpdating();
 
   // IPSec interface; name is in form "ipsec<index>".
diff --git a/test/create_test_field_trials.cc b/test/create_test_field_trials.cc
index 59524ca..e0341cf 100644
--- a/test/create_test_field_trials.cc
+++ b/test/create_test_field_trials.cc
@@ -28,7 +28,8 @@
 
 FieldTrials CreateTestFieldTrials(absl::string_view s) {
   AutoBypassTestEnvironmentCheck bypass;
-  FieldTrials result(absl::GetFlag(FLAGS_force_fieldtrials));
+  FieldTrials result(absl::GetFlag(FLAGS_force_fieldtrials),
+                     /* is_test= */ true);
   result.Merge(FieldTrials(s));
   return result;
 }
diff --git a/test/network/BUILD.gn b/test/network/BUILD.gn
index 5705b73..e991dc4 100644
--- a/test/network/BUILD.gn
+++ b/test/network/BUILD.gn
@@ -185,6 +185,7 @@
     deps = [
       ":emulated_network",
       ":simulated_network",
+      "../:create_test_environment",
       "../../api:create_network_emulation_manager",
       "../../api:network_emulation_manager_api",
       "../../api:rtp_header_extension_id",
diff --git a/test/network/feedback_generator.cc b/test/network/feedback_generator.cc
index ee7a97b..f2190be 100644
--- a/test/network/feedback_generator.cc
+++ b/test/network/feedback_generator.cc
@@ -16,7 +16,6 @@
 
 #include "absl/memory/memory.h"
 #include "api/environment/environment.h"
-#include "api/environment/environment_factory.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/rtc_event_log/rtc_event_log_factory.h"
 #include "api/rtp_header_extension_id.h"
@@ -37,6 +36,7 @@
 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
 #include "rtc_base/checks.h"
+#include "test/create_test_environment.h"
 #include "test/network/network_emulation.h"
 #include "test/network/simulated_network.h"
 namespace webrtc {
@@ -44,10 +44,9 @@
 
 namespace {
 Environment GetEnvironment(NetworkEmulationManager& net) {
-  EnvironmentFactory factory;
-  factory.Set(net.time_controller()->GetClock());
-  factory.Set(net.time_controller()->GetTaskQueueFactory());
-  return factory.Create();
+  return CreateTestEnvironment({
+      .time = net.time_controller(),
+  });
 }
 
 EmulatedRoute* CreateRoute(NetworkEmulationManager& net,