Trials should always be populated in call config.

The trials are always set when a Call instead is created by a
CallFactory, but a lot of unit tests creates instances directly.
This CL updates those call site. There is still a fallback in place
in RtpTransportControllerSend, since there are down-stream usages that
need to be clean up. After that, we'll remove the fallback.

Bug: webrtc:10809
Change-Id: I0aacf0473317bcd64252dd43d93c42de730e2ffa
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/160408
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29978}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 81afe55..76e1b45 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -388,6 +388,7 @@
       "../api/audio_codecs:builtin_audio_decoder_factory",
       "../api/rtc_event_log",
       "../api/task_queue:default_task_queue_factory",
+      "../api/transport:field_trial_based_config",
       "../api/video:video_frame",
       "../api/video:video_rtp_headers",
       "../audio",
diff --git a/call/call_unittest.cc b/call/call_unittest.cc
index 754be81..a8cf534 100644
--- a/call/call_unittest.cc
+++ b/call/call_unittest.cc
@@ -20,6 +20,7 @@
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/test/mock_audio_mixer.h"
+#include "api/transport/field_trial_based_config.h"
 #include "audio/audio_receive_stream.h"
 #include "audio/audio_send_stream.h"
 #include "call/audio_state.h"
@@ -46,6 +47,7 @@
     webrtc::Call::Config config(&event_log_);
     config.audio_state = webrtc::AudioState::Create(audio_state_config);
     config.task_queue_factory = task_queue_factory_.get();
+    config.trials = &field_trials_;
     call_.reset(webrtc::Call::Create(config));
   }
 
@@ -53,6 +55,7 @@
 
  private:
   webrtc::RtcEventLogNull event_log_;
+  webrtc::FieldTrialBasedConfig field_trials_;
   std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
   std::unique_ptr<webrtc::Call> call_;
 };
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
index a44b534..bd8e2d0 100644
--- a/call/rtp_transport_controller_send.cc
+++ b/call/rtp_transport_controller_send.cc
@@ -56,7 +56,8 @@
 }
 
 bool IsEnabled(const WebRtcKeyValueConfig* trials, absl::string_view key) {
-  return trials && trials->Lookup(key).find("Enabled") == 0;
+  RTC_DCHECK(trials != nullptr);
+  return trials->Lookup(key).find("Enabled") == 0;
 }
 
 }  // namespace
@@ -72,22 +73,21 @@
     const WebRtcKeyValueConfig* trials)
     : clock_(clock),
       event_log_(event_log),
-      field_trials_(trials ? trials : &fallback_field_trials_),
       bitrate_configurator_(bitrate_config),
       process_thread_(std::move(process_thread)),
-      use_task_queue_pacer_(IsEnabled(field_trials_, "WebRTC-TaskQueuePacer")),
+      use_task_queue_pacer_(IsEnabled(trials, "WebRTC-TaskQueuePacer")),
       process_thread_pacer_(use_task_queue_pacer_
                                 ? nullptr
                                 : new PacedSender(clock,
                                                   &packet_router_,
                                                   event_log,
-                                                  field_trials_,
+                                                  trials,
                                                   process_thread_.get())),
       task_queue_pacer_(use_task_queue_pacer_
                             ? new TaskQueuePacedSender(clock,
                                                        &packet_router_,
                                                        event_log,
-                                                       field_trials_,
+                                                       trials,
                                                        task_queue_factory)
                             : nullptr),
       observer_(nullptr),
@@ -97,12 +97,11 @@
       process_interval_(controller_factory_fallback_->GetProcessInterval()),
       last_report_block_time_(Timestamp::ms(clock_->TimeInMilliseconds())),
       reset_feedback_on_route_change_(
-          !IsEnabled(field_trials_, "WebRTC-Bwe-NoFeedbackReset")),
+          !IsEnabled(trials, "WebRTC-Bwe-NoFeedbackReset")),
       send_side_bwe_with_overhead_(
-          IsEnabled(field_trials_, "WebRTC-SendSideBwe-WithOverhead")),
+          IsEnabled(trials, "WebRTC-SendSideBwe-WithOverhead")),
       add_pacing_to_cwin_(
-          IsEnabled(field_trials_,
-                    "WebRTC-AddPacingToCongestionWindowPushback")),
+          IsEnabled(trials, "WebRTC-AddPacingToCongestionWindowPushback")),
       transport_overhead_bytes_per_packet_(0),
       network_available_(false),
       retransmission_rate_limiter_(clock, kRetransmitWindowSizeMs),
@@ -111,7 +110,7 @@
           TaskQueueFactory::Priority::NORMAL)) {
   initial_config_.constraints = ConvertConstraints(bitrate_config, clock_);
   initial_config_.event_log = event_log;
-  initial_config_.key_value_config = field_trials_;
+  initial_config_.key_value_config = trials;
   RTC_DCHECK(bitrate_config.start_bitrate_bps > 0);
 
   pacer()->SetPacingRates(DataRate::bps(bitrate_config.start_bitrate_bps),
diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h
index 32c762b..b5a53d7 100644
--- a/call/rtp_transport_controller_send.h
+++ b/call/rtp_transport_controller_send.h
@@ -139,9 +139,6 @@
 
   Clock* const clock_;
   RtcEventLog* const event_log_;
-  // TODO(sprang): Remove fallback field-trials.
-  const FieldTrialBasedConfig fallback_field_trials_;
-  const WebRtcKeyValueConfig* field_trials_;
   PacketRouter packet_router_;
   std::vector<std::unique_ptr<RtpVideoSenderInterface>> video_rtp_senders_;
   RtpBitrateConfigurator bitrate_configurator_;
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 9912d29..7d4056a 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -537,6 +537,7 @@
       "../api/task_queue",
       "../api/task_queue:default_task_queue_factory",
       "../api/test/video:function_video_factory",
+      "../api/transport:field_trial_based_config",
       "../api/transport/media:media_transport_interface",
       "../api/units:time_delta",
       "../api/video:builtin_video_bitrate_allocator_factory",
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 8870cd6..2c49c87 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -26,6 +26,7 @@
 #include "api/test/mock_video_bitrate_allocator_factory.h"
 #include "api/test/mock_video_decoder_factory.h"
 #include "api/test/mock_video_encoder_factory.h"
+#include "api/transport/field_trial_based_config.h"
 #include "api/transport/media/media_transport_config.h"
 #include "api/units/time_delta.h"
 #include "api/video/builtin_video_bitrate_allocator_factory.h"
@@ -237,6 +238,7 @@
         call_(webrtc::Call::Create([&] {
           webrtc::Call::Config call_config(&event_log_);
           call_config.task_queue_factory = task_queue_factory_.get();
+          call_config.trials = &field_trials_;
           return call_config;
         }())),
         encoder_factory_(new cricket::FakeWebRtcVideoEncoderFactory),
@@ -275,6 +277,7 @@
   // race condition in the clock access.
   rtc::ScopedFakeClock fake_clock_;
   std::unique_ptr<webrtc::test::ScopedFieldTrials> override_field_trials_;
+  webrtc::FieldTrialBasedConfig field_trials_;
   webrtc::RtcEventLogNull event_log_;
   std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
   // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly
@@ -1152,6 +1155,8 @@
   webrtc::RtcEventLogNull event_log;
   auto task_queue_factory = webrtc::CreateDefaultTaskQueueFactory();
   webrtc::Call::Config call_config(&event_log);
+  webrtc::FieldTrialBasedConfig field_trials;
+  call_config.trials = &field_trials;
   call_config.task_queue_factory = task_queue_factory.get();
   const auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
 
@@ -1222,6 +1227,8 @@
   webrtc::RtcEventLogNull event_log;
   auto task_queue_factory = webrtc::CreateDefaultTaskQueueFactory();
   webrtc::Call::Config call_config(&event_log);
+  webrtc::FieldTrialBasedConfig field_trials;
+  call_config.trials = &field_trials;
   call_config.task_queue_factory = task_queue_factory.get();
   const auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
 
@@ -1314,6 +1321,7 @@
     if (!call_) {
       webrtc::Call::Config call_config(&event_log_);
       call_config.task_queue_factory = task_queue_factory_.get();
+      call_config.trials = &field_trials_;
       call_.reset(webrtc::Call::Create(call_config));
     }
     cricket::MediaConfig media_config;
@@ -1495,6 +1503,7 @@
   }
 
   webrtc::RtcEventLogNull event_log_;
+  webrtc::FieldTrialBasedConfig field_trials_;
   std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
   std::unique_ptr<webrtc::Call> call_;
   std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
diff --git a/media/engine/webrtc_voice_engine_unittest.cc b/media/engine/webrtc_voice_engine_unittest.cc
index f72fad7..775d586 100644
--- a/media/engine/webrtc_voice_engine_unittest.cc
+++ b/media/engine/webrtc_voice_engine_unittest.cc
@@ -21,6 +21,7 @@
 #include "api/rtp_parameters.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/default_task_queue_factory.h"
+#include "api/transport/field_trial_based_config.h"
 #include "call/call.h"
 #include "media/base/fake_media_engine.h"
 #include "media/base/fake_network_interface.h"
@@ -3465,6 +3466,8 @@
   engine.Init();
   webrtc::RtcEventLogNull event_log;
   webrtc::Call::Config call_config(&event_log);
+  webrtc::FieldTrialBasedConfig field_trials;
+  call_config.trials = &field_trials;
   call_config.task_queue_factory = task_queue_factory.get();
   auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
   cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
@@ -3493,6 +3496,8 @@
     engine.Init();
     webrtc::RtcEventLogNull event_log;
     webrtc::Call::Config call_config(&event_log);
+    webrtc::FieldTrialBasedConfig field_trials;
+    call_config.trials = &field_trials;
     call_config.task_queue_factory = task_queue_factory.get();
     auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
     cricket::VoiceMediaChannel* channel = engine.CreateMediaChannel(
@@ -3567,6 +3572,8 @@
   engine.Init();
   webrtc::RtcEventLogNull event_log;
   webrtc::Call::Config call_config(&event_log);
+  webrtc::FieldTrialBasedConfig field_trials;
+  call_config.trials = &field_trials;
   call_config.task_queue_factory = task_queue_factory.get();
   auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
 
@@ -3610,6 +3617,8 @@
   engine.Init();
   webrtc::RtcEventLogNull event_log;
   webrtc::Call::Config call_config(&event_log);
+  webrtc::FieldTrialBasedConfig field_trials;
+  call_config.trials = &field_trials;
   call_config.task_queue_factory = task_queue_factory.get();
   auto call = absl::WrapUnique(webrtc::Call::Create(call_config));
   cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
diff --git a/test/BUILD.gn b/test/BUILD.gn
index 1a1147f..8c22c92 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -773,6 +773,7 @@
     "../api/task_queue",
     "../api/task_queue:default_task_queue_factory",
     "../api/test/video:function_video_factory",
+    "../api/transport:field_trial_based_config",
     "../api/video:builtin_video_bitrate_allocator_factory",
     "../api/video:video_bitrate_allocator_factory",
     "../api/video:video_frame",
diff --git a/test/call_test.cc b/test/call_test.cc
index 10b631a..e8c067a 100644
--- a/test/call_test.cc
+++ b/test/call_test.cc
@@ -222,12 +222,14 @@
   sender_config.network_state_predictor_factory =
       network_state_predictor_factory_.get();
   sender_config.network_controller_factory = network_controller_factory_.get();
+  sender_config.trials = &field_trials_;
   sender_call_.reset(Call::Create(sender_config));
 }
 
 void CallTest::CreateReceiverCall(const Call::Config& config) {
   auto receiver_config = config;
   receiver_config.task_queue_factory = task_queue_factory_.get();
+  receiver_config.trials = &field_trials_;
   receiver_call_.reset(Call::Create(receiver_config));
 }
 
diff --git a/test/call_test.h b/test/call_test.h
index ba9740d..3f4aa07 100644
--- a/test/call_test.h
+++ b/test/call_test.h
@@ -21,6 +21,7 @@
 #include "api/task_queue/task_queue_factory.h"
 #include "api/test/video/function_video_decoder_factory.h"
 #include "api/test/video/function_video_encoder_factory.h"
+#include "api/transport/field_trial_based_config.h"
 #include "api/video/video_bitrate_allocator_factory.h"
 #include "call/call.h"
 #include "modules/audio_device/include/test_audio_device.h"
@@ -176,6 +177,7 @@
   TaskQueueBase* task_queue() { return task_queue_.get(); }
 
   Clock* const clock_;
+  const FieldTrialBasedConfig field_trials_;
 
   std::unique_ptr<TaskQueueFactory> task_queue_factory_;
   std::unique_ptr<webrtc::RtcEventLog> send_event_log_;
diff --git a/test/scenario/call_client.cc b/test/scenario/call_client.cc
index cb29ff6..f89b13f 100644
--- a/test/scenario/call_client.cc
+++ b/test/scenario/call_client.cc
@@ -65,6 +65,7 @@
   call_config.task_queue_factory = time_controller->GetTaskQueueFactory();
   call_config.network_controller_factory = network_controller_factory;
   call_config.audio_state = audio_state;
+  call_config.trials = config.field_trials;
   return Call::Create(call_config, time_controller->GetClock(),
                       time_controller->CreateProcessThread("CallModules"),
                       time_controller->CreateProcessThread("Pacer"));
@@ -207,6 +208,7 @@
       task_queue_(time_controller->GetTaskQueueFactory()->CreateTaskQueue(
           "CallClient",
           TaskQueueFactory::Priority::NORMAL)) {
+  config.field_trials = &field_trials_;
   SendTask([this, config] {
     event_log_ = CreateEventLog(time_controller_->GetTaskQueueFactory(),
                                 log_writer_factory_.get());
diff --git a/test/scenario/call_client.h b/test/scenario/call_client.h
index 77c5986..34a15c1 100644
--- a/test/scenario/call_client.h
+++ b/test/scenario/call_client.h
@@ -152,6 +152,8 @@
   std::map<uint32_t, MediaType> ssrc_media_types_;
   // Defined last so it's destroyed first.
   TaskQueueForTest task_queue_;
+
+  const FieldTrialBasedConfig field_trials_;
 };
 
 class CallClientPair {
diff --git a/test/scenario/scenario_config.h b/test/scenario/scenario_config.h
index e769e80..301fc71 100644
--- a/test/scenario/scenario_config.h
+++ b/test/scenario/scenario_config.h
@@ -55,6 +55,7 @@
 
 struct CallClientConfig {
   TransportControllerConfig transport;
+  const WebRtcKeyValueConfig* field_trials = nullptr;
 };
 
 struct PacketStreamConfig {
diff --git a/video/end_to_end_tests/multi_stream_tester.cc b/video/end_to_end_tests/multi_stream_tester.cc
index 2299f11..c8e63e1 100644
--- a/video/end_to_end_tests/multi_stream_tester.cc
+++ b/video/end_to_end_tests/multi_stream_tester.cc
@@ -49,6 +49,8 @@
   auto task_queue = task_queue_factory->CreateTaskQueue(
       "TaskQueue", TaskQueueFactory::Priority::HIGH);
   Call::Config config(&event_log);
+  FieldTrialBasedConfig field_trials;
+  config.trials = &field_trials;
   config.task_queue_factory = task_queue_factory.get();
   std::unique_ptr<Call> sender_call;
   std::unique_ptr<Call> receiver_call;