xref: /aosp_15_r20/external/webrtc/pc/rtp_sender_receiver_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include <stddef.h>
12 
13 #include <cstdint>
14 #include <iterator>
15 #include <memory>
16 #include <string>
17 #include <utility>
18 #include <vector>
19 
20 #include "absl/algorithm/container.h"
21 #include "absl/memory/memory.h"
22 #include "absl/types/optional.h"
23 #include "api/audio_options.h"
24 #include "api/crypto/crypto_options.h"
25 #include "api/crypto/frame_decryptor_interface.h"
26 #include "api/crypto/frame_encryptor_interface.h"
27 #include "api/dtmf_sender_interface.h"
28 #include "api/media_stream_interface.h"
29 #include "api/rtc_error.h"
30 #include "api/rtc_event_log/rtc_event_log.h"
31 #include "api/rtp_parameters.h"
32 #include "api/rtp_receiver_interface.h"
33 #include "api/scoped_refptr.h"
34 #include "api/test/fake_frame_decryptor.h"
35 #include "api/test/fake_frame_encryptor.h"
36 #include "api/video/builtin_video_bitrate_allocator_factory.h"
37 #include "api/video/video_bitrate_allocator_factory.h"
38 #include "api/video/video_codec_constants.h"
39 #include "media/base/codec.h"
40 #include "media/base/delayable.h"
41 #include "media/base/fake_media_engine.h"
42 #include "media/base/media_channel.h"
43 #include "media/base/media_config.h"
44 #include "media/base/media_engine.h"
45 #include "media/base/rid_description.h"
46 #include "media/base/stream_params.h"
47 #include "media/base/test_utils.h"
48 #include "media/engine/fake_webrtc_call.h"
49 #include "p2p/base/dtls_transport_internal.h"
50 #include "p2p/base/fake_dtls_transport.h"
51 #include "p2p/base/p2p_constants.h"
52 #include "pc/audio_rtp_receiver.h"
53 #include "pc/audio_track.h"
54 #include "pc/channel.h"
55 #include "pc/dtls_srtp_transport.h"
56 #include "pc/local_audio_source.h"
57 #include "pc/media_stream.h"
58 #include "pc/rtp_sender.h"
59 #include "pc/rtp_transport_internal.h"
60 #include "pc/test/fake_video_track_source.h"
61 #include "pc/video_rtp_receiver.h"
62 #include "pc/video_track.h"
63 #include "rtc_base/checks.h"
64 #include "rtc_base/gunit.h"
65 #include "rtc_base/thread.h"
66 #include "test/gmock.h"
67 #include "test/gtest.h"
68 #include "test/run_loop.h"
69 #include "test/scoped_key_value_config.h"
70 
71 using ::testing::_;
72 using ::testing::ContainerEq;
73 using ::testing::Exactly;
74 using ::testing::InvokeWithoutArgs;
75 using ::testing::Return;
76 using RidList = std::vector<std::string>;
77 
78 namespace {
79 
80 static const char kStreamId1[] = "local_stream_1";
81 static const char kVideoTrackId[] = "video_1";
82 static const char kAudioTrackId[] = "audio_1";
83 static const uint32_t kVideoSsrc = 98;
84 static const uint32_t kVideoSsrc2 = 100;
85 static const uint32_t kAudioSsrc = 99;
86 static const uint32_t kAudioSsrc2 = 101;
87 static const uint32_t kVideoSsrcSimulcast = 102;
88 static const uint32_t kVideoSimulcastLayerCount = 2;
89 static const int kDefaultTimeout = 10000;  // 10 seconds.
90 
91 class MockSetStreamsObserver
92     : public webrtc::RtpSenderBase::SetStreamsObserver {
93  public:
94   MOCK_METHOD(void, OnSetStreams, (), (override));
95 };
96 
97 }  // namespace
98 
99 namespace webrtc {
100 
101 class RtpSenderReceiverTest
102     : public ::testing::Test,
103       public ::testing::WithParamInterface<std::pair<RidList, RidList>> {
104  public:
RtpSenderReceiverTest()105   RtpSenderReceiverTest()
106       : network_thread_(rtc::Thread::Current()),
107         worker_thread_(rtc::Thread::Current()),
108         video_bitrate_allocator_factory_(
109             webrtc::CreateBuiltinVideoBitrateAllocatorFactory()),
110         // Create fake media engine/etc. so we can create channels to use to
111         // test RtpSenders/RtpReceivers.
112         media_engine_(std::make_unique<cricket::FakeMediaEngine>()),
113         fake_call_(worker_thread_, network_thread_),
114         local_stream_(MediaStream::Create(kStreamId1)) {
115     rtp_dtls_transport_ = std::make_unique<cricket::FakeDtlsTransport>(
116         "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
117     rtp_transport_ = CreateDtlsSrtpTransport();
118 
119     // Create the channels, discard the result; we get them later.
120     // Fake media channels are owned by the media engine.
121     media_engine_->voice().CreateMediaChannel(
122         &fake_call_, cricket::MediaConfig(), cricket::AudioOptions(),
123         webrtc::CryptoOptions());
124     media_engine_->video().CreateMediaChannel(
125         &fake_call_, cricket::MediaConfig(), cricket::VideoOptions(),
126         webrtc::CryptoOptions(), video_bitrate_allocator_factory_.get());
127 
128     voice_media_channel_ = absl::WrapUnique(media_engine_->GetVoiceChannel(0));
129     video_media_channel_ = absl::WrapUnique(media_engine_->GetVideoChannel(0));
130 
131     RTC_CHECK(voice_media_channel());
132     RTC_CHECK(video_media_channel());
133 
134     // Create streams for predefined SSRCs. Streams need to exist in order
135     // for the senders and receievers to apply parameters to them.
136     // Normally these would be created by SetLocalDescription and
137     // SetRemoteDescription.
138     voice_media_channel_->AddSendStream(
139         cricket::StreamParams::CreateLegacy(kAudioSsrc));
140     voice_media_channel_->AddRecvStream(
141         cricket::StreamParams::CreateLegacy(kAudioSsrc));
142     voice_media_channel_->AddSendStream(
143         cricket::StreamParams::CreateLegacy(kAudioSsrc2));
144     voice_media_channel_->AddRecvStream(
145         cricket::StreamParams::CreateLegacy(kAudioSsrc2));
146     video_media_channel_->AddSendStream(
147         cricket::StreamParams::CreateLegacy(kVideoSsrc));
148     video_media_channel_->AddRecvStream(
149         cricket::StreamParams::CreateLegacy(kVideoSsrc));
150     video_media_channel_->AddSendStream(
151         cricket::StreamParams::CreateLegacy(kVideoSsrc2));
152     video_media_channel_->AddRecvStream(
153         cricket::StreamParams::CreateLegacy(kVideoSsrc2));
154   }
155 
~RtpSenderReceiverTest()156   ~RtpSenderReceiverTest() {
157     audio_rtp_sender_ = nullptr;
158     video_rtp_sender_ = nullptr;
159     audio_rtp_receiver_ = nullptr;
160     video_rtp_receiver_ = nullptr;
161     local_stream_ = nullptr;
162     video_track_ = nullptr;
163     audio_track_ = nullptr;
164   }
165 
CreateDtlsSrtpTransport()166   std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
167     auto dtls_srtp_transport = std::make_unique<webrtc::DtlsSrtpTransport>(
168         /*rtcp_mux_required=*/true, field_trials_);
169     dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
170                                            /*rtcp_dtls_transport=*/nullptr);
171     return dtls_srtp_transport;
172   }
173 
174   // Needed to use DTMF sender.
AddDtmfCodec()175   void AddDtmfCodec() {
176     cricket::AudioSendParameters params;
177     const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
178                                                    0, 1);
179     params.codecs.push_back(kTelephoneEventCodec);
180     voice_media_channel()->SetSendParameters(params);
181   }
182 
AddVideoTrack()183   void AddVideoTrack() { AddVideoTrack(false); }
184 
AddVideoTrack(bool is_screencast)185   void AddVideoTrack(bool is_screencast) {
186     rtc::scoped_refptr<VideoTrackSourceInterface> source(
187         FakeVideoTrackSource::Create(is_screencast));
188     video_track_ =
189         VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
190     EXPECT_TRUE(local_stream_->AddTrack(video_track_));
191   }
192 
CreateAudioRtpSender()193   void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
194 
CreateAudioRtpSender(const rtc::scoped_refptr<LocalAudioSource> & source)195   void CreateAudioRtpSender(
196       const rtc::scoped_refptr<LocalAudioSource>& source) {
197     audio_track_ = AudioTrack::Create(kAudioTrackId, source);
198     EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
199     std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
200         std::make_unique<MockSetStreamsObserver>();
201     audio_rtp_sender_ =
202         AudioRtpSender::Create(worker_thread_, audio_track_->id(), nullptr,
203                                set_streams_observer.get());
204     ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
205     EXPECT_CALL(*set_streams_observer, OnSetStreams());
206     audio_rtp_sender_->SetStreams({local_stream_->id()});
207     audio_rtp_sender_->SetMediaChannel(voice_media_channel());
208     audio_rtp_sender_->SetSsrc(kAudioSsrc);
209     VerifyVoiceChannelInput();
210   }
211 
CreateAudioRtpSenderWithNoTrack()212   void CreateAudioRtpSenderWithNoTrack() {
213     audio_rtp_sender_ =
214         AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
215     audio_rtp_sender_->SetMediaChannel(voice_media_channel());
216   }
217 
CreateVideoRtpSender(uint32_t ssrc)218   void CreateVideoRtpSender(uint32_t ssrc) {
219     CreateVideoRtpSender(false, ssrc);
220   }
221 
CreateVideoRtpSender()222   void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
223 
CreateSimulcastStreamParams(int num_layers)224   cricket::StreamParams CreateSimulcastStreamParams(int num_layers) {
225     std::vector<uint32_t> ssrcs;
226     ssrcs.reserve(num_layers);
227     for (int i = 0; i < num_layers; ++i) {
228       ssrcs.push_back(kVideoSsrcSimulcast + i);
229     }
230     return cricket::CreateSimStreamParams("cname", ssrcs);
231   }
232 
CreateVideoRtpSender(const cricket::StreamParams & stream_params)233   uint32_t CreateVideoRtpSender(const cricket::StreamParams& stream_params) {
234     video_media_channel_->AddSendStream(stream_params);
235     uint32_t primary_ssrc = stream_params.first_ssrc();
236     CreateVideoRtpSender(primary_ssrc);
237     return primary_ssrc;
238   }
239 
CreateVideoRtpSenderWithSimulcast(int num_layers=kVideoSimulcastLayerCount)240   uint32_t CreateVideoRtpSenderWithSimulcast(
241       int num_layers = kVideoSimulcastLayerCount) {
242     return CreateVideoRtpSender(CreateSimulcastStreamParams(num_layers));
243   }
244 
CreateVideoRtpSenderWithSimulcast(const std::vector<std::string> & rids)245   uint32_t CreateVideoRtpSenderWithSimulcast(
246       const std::vector<std::string>& rids) {
247     cricket::StreamParams stream_params =
248         CreateSimulcastStreamParams(rids.size());
249     std::vector<cricket::RidDescription> rid_descriptions;
250     absl::c_transform(
251         rids, std::back_inserter(rid_descriptions), [](const std::string& rid) {
252           return cricket::RidDescription(rid, cricket::RidDirection::kSend);
253         });
254     stream_params.set_rids(rid_descriptions);
255     return CreateVideoRtpSender(stream_params);
256   }
257 
CreateVideoRtpSender(bool is_screencast,uint32_t ssrc=kVideoSsrc)258   void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
259     AddVideoTrack(is_screencast);
260     std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
261         std::make_unique<MockSetStreamsObserver>();
262     video_rtp_sender_ = VideoRtpSender::Create(
263         worker_thread_, video_track_->id(), set_streams_observer.get());
264     ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
265     EXPECT_CALL(*set_streams_observer, OnSetStreams());
266     video_rtp_sender_->SetStreams({local_stream_->id()});
267     video_rtp_sender_->SetMediaChannel(video_media_channel());
268     video_rtp_sender_->SetSsrc(ssrc);
269     VerifyVideoChannelInput(ssrc);
270   }
CreateVideoRtpSenderWithNoTrack()271   void CreateVideoRtpSenderWithNoTrack() {
272     video_rtp_sender_ =
273         VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
274     video_rtp_sender_->SetMediaChannel(video_media_channel());
275   }
276 
DestroyAudioRtpSender()277   void DestroyAudioRtpSender() {
278     audio_rtp_sender_ = nullptr;
279     VerifyVoiceChannelNoInput();
280   }
281 
DestroyVideoRtpSender()282   void DestroyVideoRtpSender() {
283     video_rtp_sender_ = nullptr;
284     VerifyVideoChannelNoInput();
285   }
286 
CreateAudioRtpReceiver(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={})287   void CreateAudioRtpReceiver(
288       std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
289     audio_rtp_receiver_ = rtc::make_ref_counted<AudioRtpReceiver>(
290         rtc::Thread::Current(), kAudioTrackId, streams,
291         /*is_unified_plan=*/true);
292     audio_rtp_receiver_->SetMediaChannel(voice_media_channel());
293     audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
294     audio_track_ = audio_rtp_receiver_->audio_track();
295     VerifyVoiceChannelOutput();
296   }
297 
CreateVideoRtpReceiver(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={})298   void CreateVideoRtpReceiver(
299       std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
300     video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
301         rtc::Thread::Current(), kVideoTrackId, streams);
302     video_rtp_receiver_->SetMediaChannel(video_media_channel());
303     video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
304     video_track_ = video_rtp_receiver_->video_track();
305     VerifyVideoChannelOutput();
306   }
307 
CreateVideoRtpReceiverWithSimulcast(std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams={},int num_layers=kVideoSimulcastLayerCount)308   void CreateVideoRtpReceiverWithSimulcast(
309       std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
310       int num_layers = kVideoSimulcastLayerCount) {
311     std::vector<uint32_t> ssrcs;
312     ssrcs.reserve(num_layers);
313     for (int i = 0; i < num_layers; ++i)
314       ssrcs.push_back(kVideoSsrcSimulcast + i);
315     cricket::StreamParams stream_params =
316         cricket::CreateSimStreamParams("cname", ssrcs);
317     video_media_channel_->AddRecvStream(stream_params);
318     uint32_t primary_ssrc = stream_params.first_ssrc();
319 
320     video_rtp_receiver_ = rtc::make_ref_counted<VideoRtpReceiver>(
321         rtc::Thread::Current(), kVideoTrackId, streams);
322     video_rtp_receiver_->SetMediaChannel(video_media_channel());
323     video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
324     video_track_ = video_rtp_receiver_->video_track();
325   }
326 
DestroyAudioRtpReceiver()327   void DestroyAudioRtpReceiver() {
328     if (!audio_rtp_receiver_)
329       return;
330     audio_rtp_receiver_->SetMediaChannel(nullptr);
331     audio_rtp_receiver_ = nullptr;
332     VerifyVoiceChannelNoOutput();
333   }
334 
DestroyVideoRtpReceiver()335   void DestroyVideoRtpReceiver() {
336     if (!video_rtp_receiver_)
337       return;
338     video_rtp_receiver_->Stop();
339     video_rtp_receiver_->SetMediaChannel(nullptr);
340     video_rtp_receiver_ = nullptr;
341     VerifyVideoChannelNoOutput();
342   }
343 
VerifyVoiceChannelInput()344   void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
345 
VerifyVoiceChannelInput(uint32_t ssrc)346   void VerifyVoiceChannelInput(uint32_t ssrc) {
347     // Verify that the media channel has an audio source, and the stream isn't
348     // muted.
349     EXPECT_TRUE(voice_media_channel()->HasSource(ssrc));
350     EXPECT_FALSE(voice_media_channel()->IsStreamMuted(ssrc));
351   }
352 
VerifyVideoChannelInput()353   void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
354 
VerifyVideoChannelInput(uint32_t ssrc)355   void VerifyVideoChannelInput(uint32_t ssrc) {
356     // Verify that the media channel has a video source,
357     EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
358   }
359 
VerifyVoiceChannelNoInput()360   void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
361 
VerifyVoiceChannelNoInput(uint32_t ssrc)362   void VerifyVoiceChannelNoInput(uint32_t ssrc) {
363     // Verify that the media channel's source is reset.
364     EXPECT_FALSE(voice_media_channel()->HasSource(ssrc));
365   }
366 
VerifyVideoChannelNoInput()367   void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
368 
VerifyVideoChannelNoInput(uint32_t ssrc)369   void VerifyVideoChannelNoInput(uint32_t ssrc) {
370     // Verify that the media channel's source is reset.
371     EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
372   }
373 
VerifyVoiceChannelOutput()374   void VerifyVoiceChannelOutput() {
375     // Verify that the volume is initialized to 1.
376     double volume;
377     EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
378     EXPECT_EQ(1, volume);
379   }
380 
VerifyVideoChannelOutput()381   void VerifyVideoChannelOutput() {
382     // Verify that the media channel has a sink.
383     EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
384   }
385 
VerifyVoiceChannelNoOutput()386   void VerifyVoiceChannelNoOutput() {
387     // Verify that the volume is reset to 0.
388     double volume;
389     EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
390     EXPECT_EQ(0, volume);
391   }
392 
VerifyVideoChannelNoOutput()393   void VerifyVideoChannelNoOutput() {
394     // Verify that the media channel's sink is reset.
395     EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
396   }
397 
398   // Verifies that the encoding layers contain the specified RIDs.
VerifyEncodingLayers(const VideoRtpSender & sender,const std::vector<std::string> & rids)399   bool VerifyEncodingLayers(const VideoRtpSender& sender,
400                             const std::vector<std::string>& rids) {
401     bool has_failure = HasFailure();
402     RtpParameters parameters = sender.GetParameters();
403     std::vector<std::string> encoding_rids;
404     absl::c_transform(
405         parameters.encodings, std::back_inserter(encoding_rids),
406         [](const RtpEncodingParameters& encoding) { return encoding.rid; });
407     EXPECT_THAT(rids, ContainerEq(encoding_rids));
408     return has_failure || !HasFailure();
409   }
410 
411   // Runs a test for disabling the encoding layers on the specified sender.
RunDisableEncodingLayersTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers,VideoRtpSender * sender)412   void RunDisableEncodingLayersTest(
413       const std::vector<std::string>& all_layers,
414       const std::vector<std::string>& disabled_layers,
415       VideoRtpSender* sender) {
416     std::vector<std::string> expected;
417     absl::c_copy_if(all_layers, std::back_inserter(expected),
418                     [&disabled_layers](const std::string& rid) {
419                       return !absl::c_linear_search(disabled_layers, rid);
420                     });
421 
422     EXPECT_TRUE(VerifyEncodingLayers(*sender, all_layers));
423     sender->DisableEncodingLayers(disabled_layers);
424     EXPECT_TRUE(VerifyEncodingLayers(*sender, expected));
425   }
426 
427   // Runs a test for setting an encoding layer as inactive.
428   // This test assumes that some layers have already been disabled.
RunSetLastLayerAsInactiveTest(VideoRtpSender * sender)429   void RunSetLastLayerAsInactiveTest(VideoRtpSender* sender) {
430     auto parameters = sender->GetParameters();
431     if (parameters.encodings.size() == 0) {
432       return;
433     }
434 
435     RtpEncodingParameters& encoding = parameters.encodings.back();
436     auto rid = encoding.rid;
437     EXPECT_TRUE(encoding.active);
438     encoding.active = false;
439     auto error = sender->SetParameters(parameters);
440     ASSERT_TRUE(error.ok());
441     parameters = sender->GetParameters();
442     RtpEncodingParameters& result_encoding = parameters.encodings.back();
443     EXPECT_EQ(rid, result_encoding.rid);
444     EXPECT_FALSE(result_encoding.active);
445   }
446 
447   // Runs a test for disabling the encoding layers on a sender without a media
448   // channel.
RunDisableSimulcastLayersWithoutMediaEngineTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers)449   void RunDisableSimulcastLayersWithoutMediaEngineTest(
450       const std::vector<std::string>& all_layers,
451       const std::vector<std::string>& disabled_layers) {
452     auto sender = VideoRtpSender::Create(rtc::Thread::Current(), "1", nullptr);
453     RtpParameters parameters;
454     parameters.encodings.resize(all_layers.size());
455     for (size_t i = 0; i < all_layers.size(); ++i) {
456       parameters.encodings[i].rid = all_layers[i];
457     }
458     sender->set_init_send_encodings(parameters.encodings);
459     RunDisableEncodingLayersTest(all_layers, disabled_layers, sender.get());
460     RunSetLastLayerAsInactiveTest(sender.get());
461   }
462 
463   // Runs a test for disabling the encoding layers on a sender with a media
464   // channel.
RunDisableSimulcastLayersWithMediaEngineTest(const std::vector<std::string> & all_layers,const std::vector<std::string> & disabled_layers)465   void RunDisableSimulcastLayersWithMediaEngineTest(
466       const std::vector<std::string>& all_layers,
467       const std::vector<std::string>& disabled_layers) {
468     uint32_t ssrc = CreateVideoRtpSenderWithSimulcast(all_layers);
469     RunDisableEncodingLayersTest(all_layers, disabled_layers,
470                                  video_rtp_sender_.get());
471 
472     auto channel_parameters = video_media_channel_->GetRtpSendParameters(ssrc);
473     ASSERT_EQ(channel_parameters.encodings.size(), all_layers.size());
474     for (size_t i = 0; i < all_layers.size(); ++i) {
475       EXPECT_EQ(all_layers[i], channel_parameters.encodings[i].rid);
476       bool is_active = !absl::c_linear_search(disabled_layers, all_layers[i]);
477       EXPECT_EQ(is_active, channel_parameters.encodings[i].active);
478     }
479 
480     RunSetLastLayerAsInactiveTest(video_rtp_sender_.get());
481   }
482 
483   // Check that minimum Jitter Buffer delay is propagated to the underlying
484   // `media_channel`.
VerifyRtpReceiverDelayBehaviour(cricket::Delayable * media_channel,RtpReceiverInterface * receiver,uint32_t ssrc)485   void VerifyRtpReceiverDelayBehaviour(cricket::Delayable* media_channel,
486                                        RtpReceiverInterface* receiver,
487                                        uint32_t ssrc) {
488     receiver->SetJitterBufferMinimumDelay(/*delay_seconds=*/0.5);
489     absl::optional<int> delay_ms =
490         media_channel->GetBaseMinimumPlayoutDelayMs(ssrc);  // In milliseconds.
491     EXPECT_DOUBLE_EQ(0.5, delay_ms.value_or(0) / 1000.0);
492   }
493 
494  protected:
video_media_channel()495   cricket::FakeVideoMediaChannel* video_media_channel() {
496     return video_media_channel_.get();
497   }
voice_media_channel()498   cricket::FakeVoiceMediaChannel* voice_media_channel() {
499     return voice_media_channel_.get();
500   }
501 
502   test::RunLoop run_loop_;
503   rtc::Thread* const network_thread_;
504   rtc::Thread* const worker_thread_;
505   webrtc::RtcEventLogNull event_log_;
506   // The `rtp_dtls_transport_` and `rtp_transport_` should be destroyed after
507   // the `channel_manager`.
508   std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
509   std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
510   std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
511       video_bitrate_allocator_factory_;
512   std::unique_ptr<cricket::FakeMediaEngine> media_engine_;
513   rtc::UniqueRandomIdGenerator ssrc_generator_;
514   cricket::FakeCall fake_call_;
515   std::unique_ptr<cricket::FakeVoiceMediaChannel> voice_media_channel_;
516   std::unique_ptr<cricket::FakeVideoMediaChannel> video_media_channel_;
517   rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
518   rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
519   rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
520   rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
521   rtc::scoped_refptr<MediaStreamInterface> local_stream_;
522   rtc::scoped_refptr<VideoTrackInterface> video_track_;
523   rtc::scoped_refptr<AudioTrackInterface> audio_track_;
524   webrtc::test::ScopedKeyValueConfig field_trials_;
525 };
526 
527 // Test that `voice_channel_` is updated when an audio track is associated
528 // and disassociated with an AudioRtpSender.
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpSender)529 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
530   CreateAudioRtpSender();
531   DestroyAudioRtpSender();
532 }
533 
534 // Test that `video_channel_` is updated when a video track is associated and
535 // disassociated with a VideoRtpSender.
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpSender)536 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
537   CreateVideoRtpSender();
538   DestroyVideoRtpSender();
539 }
540 
541 // Test that `voice_channel_` is updated when a remote audio track is
542 // associated and disassociated with an AudioRtpReceiver.
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpReceiver)543 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
544   CreateAudioRtpReceiver();
545   DestroyAudioRtpReceiver();
546 }
547 
548 // Test that `video_channel_` is updated when a remote video track is
549 // associated and disassociated with a VideoRtpReceiver.
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpReceiver)550 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
551   CreateVideoRtpReceiver();
552   DestroyVideoRtpReceiver();
553 }
554 
TEST_F(RtpSenderReceiverTest,AddAndDestroyAudioRtpReceiverWithStreams)555 TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
556   CreateAudioRtpReceiver({local_stream_});
557   DestroyAudioRtpReceiver();
558 }
559 
TEST_F(RtpSenderReceiverTest,AddAndDestroyVideoRtpReceiverWithStreams)560 TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
561   CreateVideoRtpReceiver({local_stream_});
562   DestroyVideoRtpReceiver();
563 }
564 
565 // Test that the AudioRtpSender applies options from the local audio source.
TEST_F(RtpSenderReceiverTest,LocalAudioSourceOptionsApplied)566 TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
567   cricket::AudioOptions options;
568   options.echo_cancellation = true;
569   auto source = LocalAudioSource::Create(&options);
570   CreateAudioRtpSender(source);
571 
572   EXPECT_EQ(true, voice_media_channel()->options().echo_cancellation);
573 
574   DestroyAudioRtpSender();
575 }
576 
577 // Test that the stream is muted when the track is disabled, and unmuted when
578 // the track is enabled.
TEST_F(RtpSenderReceiverTest,LocalAudioTrackDisable)579 TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
580   CreateAudioRtpSender();
581 
582   audio_track_->set_enabled(false);
583   EXPECT_TRUE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
584 
585   audio_track_->set_enabled(true);
586   EXPECT_FALSE(voice_media_channel()->IsStreamMuted(kAudioSsrc));
587 
588   DestroyAudioRtpSender();
589 }
590 
591 // Test that the volume is set to 0 when the track is disabled, and back to
592 // 1 when the track is enabled.
TEST_F(RtpSenderReceiverTest,RemoteAudioTrackDisable)593 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
594   CreateAudioRtpReceiver();
595 
596   double volume;
597   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
598   EXPECT_EQ(1, volume);
599 
600   // Handling of enable/disable is applied asynchronously.
601   audio_track_->set_enabled(false);
602   run_loop_.Flush();
603 
604   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
605   EXPECT_EQ(0, volume);
606 
607   audio_track_->set_enabled(true);
608   run_loop_.Flush();
609   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
610   EXPECT_EQ(1, volume);
611 
612   DestroyAudioRtpReceiver();
613 }
614 
615 // Currently no action is taken when a remote video track is disabled or
616 // enabled, so there's nothing to test here, other than what is normally
617 // verified in DestroyVideoRtpSender.
TEST_F(RtpSenderReceiverTest,LocalVideoTrackDisable)618 TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
619   CreateVideoRtpSender();
620 
621   video_track_->set_enabled(false);
622   video_track_->set_enabled(true);
623 
624   DestroyVideoRtpSender();
625 }
626 
627 // Test that the state of the video track created by the VideoRtpReceiver is
628 // updated when the receiver is destroyed.
TEST_F(RtpSenderReceiverTest,RemoteVideoTrackState)629 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
630   CreateVideoRtpReceiver();
631 
632   EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
633   EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
634             video_track_->GetSource()->state());
635 
636   DestroyVideoRtpReceiver();
637 
638   EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
639   EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
640             video_track_->GetSource()->state());
641   DestroyVideoRtpReceiver();
642 }
643 
644 // Currently no action is taken when a remote video track is disabled or
645 // enabled, so there's nothing to test here, other than what is normally
646 // verified in DestroyVideoRtpReceiver.
TEST_F(RtpSenderReceiverTest,RemoteVideoTrackDisable)647 TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
648   CreateVideoRtpReceiver();
649 
650   video_track_->set_enabled(false);
651   video_track_->set_enabled(true);
652 
653   DestroyVideoRtpReceiver();
654 }
655 
656 // Test that the AudioRtpReceiver applies volume changes from the track source
657 // to the media channel.
TEST_F(RtpSenderReceiverTest,RemoteAudioTrackSetVolume)658 TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
659   CreateAudioRtpReceiver();
660 
661   double volume;
662   audio_track_->GetSource()->SetVolume(0.5);
663   run_loop_.Flush();
664   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
665   EXPECT_EQ(0.5, volume);
666 
667   // Disable the audio track, this should prevent setting the volume.
668   audio_track_->set_enabled(false);
669   RTC_DCHECK_EQ(worker_thread_, run_loop_.task_queue());
670   run_loop_.Flush();
671   audio_track_->GetSource()->SetVolume(0.8);
672   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
673   EXPECT_EQ(0, volume);
674 
675   // When the track is enabled, the previously set volume should take effect.
676   audio_track_->set_enabled(true);
677   run_loop_.Flush();
678   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
679   EXPECT_EQ(0.8, volume);
680 
681   // Try changing volume one more time.
682   audio_track_->GetSource()->SetVolume(0.9);
683   run_loop_.Flush();
684   EXPECT_TRUE(voice_media_channel()->GetOutputVolume(kAudioSsrc, &volume));
685   EXPECT_EQ(0.9, volume);
686 
687   DestroyAudioRtpReceiver();
688 }
689 
TEST_F(RtpSenderReceiverTest,AudioRtpReceiverDelay)690 TEST_F(RtpSenderReceiverTest, AudioRtpReceiverDelay) {
691   CreateAudioRtpReceiver();
692   VerifyRtpReceiverDelayBehaviour(voice_media_channel(),
693                                   audio_rtp_receiver_.get(), kAudioSsrc);
694   DestroyAudioRtpReceiver();
695 }
696 
TEST_F(RtpSenderReceiverTest,VideoRtpReceiverDelay)697 TEST_F(RtpSenderReceiverTest, VideoRtpReceiverDelay) {
698   CreateVideoRtpReceiver();
699   VerifyRtpReceiverDelayBehaviour(video_media_channel(),
700                                   video_rtp_receiver_.get(), kVideoSsrc);
701   DestroyVideoRtpReceiver();
702 }
703 
704 // Test that the media channel isn't enabled for sending if the audio sender
705 // doesn't have both a track and SSRC.
TEST_F(RtpSenderReceiverTest,AudioSenderWithoutTrackAndSsrc)706 TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
707   CreateAudioRtpSenderWithNoTrack();
708   rtc::scoped_refptr<AudioTrackInterface> track =
709       AudioTrack::Create(kAudioTrackId, nullptr);
710 
711   // Track but no SSRC.
712   EXPECT_TRUE(audio_rtp_sender_->SetTrack(track.get()));
713   VerifyVoiceChannelNoInput();
714 
715   // SSRC but no track.
716   EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
717   audio_rtp_sender_->SetSsrc(kAudioSsrc);
718   VerifyVoiceChannelNoInput();
719 }
720 
721 // Test that the media channel isn't enabled for sending if the video sender
722 // doesn't have both a track and SSRC.
TEST_F(RtpSenderReceiverTest,VideoSenderWithoutTrackAndSsrc)723 TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
724   CreateVideoRtpSenderWithNoTrack();
725 
726   // Track but no SSRC.
727   EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
728   VerifyVideoChannelNoInput();
729 
730   // SSRC but no track.
731   EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
732   video_rtp_sender_->SetSsrc(kVideoSsrc);
733   VerifyVideoChannelNoInput();
734 }
735 
736 // Test that the media channel is enabled for sending when the audio sender
737 // has a track and SSRC, when the SSRC is set first.
TEST_F(RtpSenderReceiverTest,AudioSenderEarlyWarmupSsrcThenTrack)738 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
739   CreateAudioRtpSenderWithNoTrack();
740   rtc::scoped_refptr<AudioTrackInterface> track =
741       AudioTrack::Create(kAudioTrackId, nullptr);
742   audio_rtp_sender_->SetSsrc(kAudioSsrc);
743   audio_rtp_sender_->SetTrack(track.get());
744   VerifyVoiceChannelInput();
745 
746   DestroyAudioRtpSender();
747 }
748 
749 // Test that the media channel is enabled for sending when the audio sender
750 // has a track and SSRC, when the SSRC is set last.
TEST_F(RtpSenderReceiverTest,AudioSenderEarlyWarmupTrackThenSsrc)751 TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
752   CreateAudioRtpSenderWithNoTrack();
753   rtc::scoped_refptr<AudioTrackInterface> track =
754       AudioTrack::Create(kAudioTrackId, nullptr);
755   audio_rtp_sender_->SetTrack(track.get());
756   audio_rtp_sender_->SetSsrc(kAudioSsrc);
757   VerifyVoiceChannelInput();
758 
759   DestroyAudioRtpSender();
760 }
761 
762 // Test that the media channel is enabled for sending when the video sender
763 // has a track and SSRC, when the SSRC is set first.
TEST_F(RtpSenderReceiverTest,VideoSenderEarlyWarmupSsrcThenTrack)764 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
765   AddVideoTrack();
766   CreateVideoRtpSenderWithNoTrack();
767   video_rtp_sender_->SetSsrc(kVideoSsrc);
768   video_rtp_sender_->SetTrack(video_track_.get());
769   VerifyVideoChannelInput();
770 
771   DestroyVideoRtpSender();
772 }
773 
774 // Test that the media channel is enabled for sending when the video sender
775 // has a track and SSRC, when the SSRC is set last.
TEST_F(RtpSenderReceiverTest,VideoSenderEarlyWarmupTrackThenSsrc)776 TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
777   AddVideoTrack();
778   CreateVideoRtpSenderWithNoTrack();
779   video_rtp_sender_->SetTrack(video_track_.get());
780   video_rtp_sender_->SetSsrc(kVideoSsrc);
781   VerifyVideoChannelInput();
782 
783   DestroyVideoRtpSender();
784 }
785 
786 // Test that the media channel stops sending when the audio sender's SSRC is set
787 // to 0.
TEST_F(RtpSenderReceiverTest,AudioSenderSsrcSetToZero)788 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
789   CreateAudioRtpSender();
790 
791   audio_rtp_sender_->SetSsrc(0);
792   VerifyVoiceChannelNoInput();
793 }
794 
795 // Test that the media channel stops sending when the video sender's SSRC is set
796 // to 0.
TEST_F(RtpSenderReceiverTest,VideoSenderSsrcSetToZero)797 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
798   CreateAudioRtpSender();
799 
800   audio_rtp_sender_->SetSsrc(0);
801   VerifyVideoChannelNoInput();
802 }
803 
804 // Test that the media channel stops sending when the audio sender's track is
805 // set to null.
TEST_F(RtpSenderReceiverTest,AudioSenderTrackSetToNull)806 TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
807   CreateAudioRtpSender();
808 
809   EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
810   VerifyVoiceChannelNoInput();
811 }
812 
813 // Test that the media channel stops sending when the video sender's track is
814 // set to null.
TEST_F(RtpSenderReceiverTest,VideoSenderTrackSetToNull)815 TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
816   CreateVideoRtpSender();
817 
818   video_rtp_sender_->SetSsrc(0);
819   VerifyVideoChannelNoInput();
820 }
821 
822 // Test that when the audio sender's SSRC is changed, the media channel stops
823 // sending with the old SSRC and starts sending with the new one.
TEST_F(RtpSenderReceiverTest,AudioSenderSsrcChanged)824 TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
825   CreateAudioRtpSender();
826 
827   audio_rtp_sender_->SetSsrc(kAudioSsrc2);
828   VerifyVoiceChannelNoInput(kAudioSsrc);
829   VerifyVoiceChannelInput(kAudioSsrc2);
830 
831   audio_rtp_sender_ = nullptr;
832   VerifyVoiceChannelNoInput(kAudioSsrc2);
833 }
834 
835 // Test that when the audio sender's SSRC is changed, the media channel stops
836 // sending with the old SSRC and starts sending with the new one.
TEST_F(RtpSenderReceiverTest,VideoSenderSsrcChanged)837 TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
838   CreateVideoRtpSender();
839 
840   video_rtp_sender_->SetSsrc(kVideoSsrc2);
841   VerifyVideoChannelNoInput(kVideoSsrc);
842   VerifyVideoChannelInput(kVideoSsrc2);
843 
844   video_rtp_sender_ = nullptr;
845   VerifyVideoChannelNoInput(kVideoSsrc2);
846 }
847 
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParameters)848 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
849   CreateAudioRtpSender();
850 
851   RtpParameters params = audio_rtp_sender_->GetParameters();
852   EXPECT_EQ(1u, params.encodings.size());
853   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
854 
855   DestroyAudioRtpSender();
856 }
857 
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersAsync)858 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersAsync) {
859   CreateAudioRtpSender();
860 
861   RtpParameters params = audio_rtp_sender_->GetParameters();
862   EXPECT_EQ(1u, params.encodings.size());
863   absl::optional<webrtc::RTCError> result;
864   audio_rtp_sender_->SetParametersAsync(
865       params, [&result](webrtc::RTCError error) { result = error; });
866   run_loop_.Flush();
867   EXPECT_TRUE(result->ok());
868 
869   DestroyAudioRtpSender();
870 }
871 
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersBeforeNegotiation)872 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
873   audio_rtp_sender_ =
874       AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
875 
876   RtpParameters params = audio_rtp_sender_->GetParameters();
877   ASSERT_EQ(1u, params.encodings.size());
878   params.encodings[0].max_bitrate_bps = 90000;
879   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
880 
881   params = audio_rtp_sender_->GetParameters();
882   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
883   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
884 
885   DestroyAudioRtpSender();
886 }
887 
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetParametersAsyncBeforeNegotiation)888 TEST_F(RtpSenderReceiverTest,
889        AudioSenderCanSetParametersAsyncBeforeNegotiation) {
890   audio_rtp_sender_ =
891       AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
892 
893   absl::optional<webrtc::RTCError> result;
894   RtpParameters params = audio_rtp_sender_->GetParameters();
895   ASSERT_EQ(1u, params.encodings.size());
896   params.encodings[0].max_bitrate_bps = 90000;
897 
898   audio_rtp_sender_->SetParametersAsync(
899       params, [&result](webrtc::RTCError error) { result = error; });
900   run_loop_.Flush();
901   EXPECT_TRUE(result->ok());
902 
903   params = audio_rtp_sender_->GetParameters();
904   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
905 
906   audio_rtp_sender_->SetParametersAsync(
907       params, [&result](webrtc::RTCError error) { result = error; });
908   run_loop_.Flush();
909   EXPECT_TRUE(result->ok());
910 
911   DestroyAudioRtpSender();
912 }
913 
TEST_F(RtpSenderReceiverTest,AudioSenderInitParametersMovedAfterNegotiation)914 TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
915   audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
916   EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
917 
918   std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
919       std::make_unique<MockSetStreamsObserver>();
920   audio_rtp_sender_ = AudioRtpSender::Create(
921       worker_thread_, audio_track_->id(), nullptr, set_streams_observer.get());
922   ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_.get()));
923   EXPECT_CALL(*set_streams_observer, OnSetStreams());
924   audio_rtp_sender_->SetStreams({local_stream_->id()});
925 
926   std::vector<RtpEncodingParameters> init_encodings(1);
927   init_encodings[0].max_bitrate_bps = 60000;
928   audio_rtp_sender_->set_init_send_encodings(init_encodings);
929 
930   RtpParameters params = audio_rtp_sender_->GetParameters();
931   ASSERT_EQ(1u, params.encodings.size());
932   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
933 
934   // Simulate the setLocalDescription call
935   std::vector<uint32_t> ssrcs(1, 1);
936   cricket::StreamParams stream_params =
937       cricket::CreateSimStreamParams("cname", ssrcs);
938   voice_media_channel()->AddSendStream(stream_params);
939   audio_rtp_sender_->SetMediaChannel(voice_media_channel());
940   audio_rtp_sender_->SetSsrc(1);
941 
942   params = audio_rtp_sender_->GetParameters();
943   ASSERT_EQ(1u, params.encodings.size());
944   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
945 
946   DestroyAudioRtpSender();
947 }
948 
TEST_F(RtpSenderReceiverTest,AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation)949 TEST_F(RtpSenderReceiverTest,
950        AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
951   audio_rtp_sender_ =
952       AudioRtpSender::Create(worker_thread_, /*id=*/"", nullptr, nullptr);
953 
954   RtpParameters params;
955   RTCError result = audio_rtp_sender_->SetParameters(params);
956   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
957   DestroyAudioRtpSender();
958 }
959 
TEST_F(RtpSenderReceiverTest,AudioSenderMustCallGetParametersBeforeSetParameters)960 TEST_F(RtpSenderReceiverTest,
961        AudioSenderMustCallGetParametersBeforeSetParameters) {
962   CreateAudioRtpSender();
963 
964   RtpParameters params;
965   RTCError result = audio_rtp_sender_->SetParameters(params);
966   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
967 
968   DestroyAudioRtpSender();
969 }
970 
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersInvalidatesTransactionId)971 TEST_F(RtpSenderReceiverTest,
972        AudioSenderSetParametersInvalidatesTransactionId) {
973   CreateAudioRtpSender();
974 
975   RtpParameters params = audio_rtp_sender_->GetParameters();
976   EXPECT_EQ(1u, params.encodings.size());
977   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
978   RTCError result = audio_rtp_sender_->SetParameters(params);
979   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
980 
981   DestroyAudioRtpSender();
982 }
983 
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersAsyncInvalidatesTransactionId)984 TEST_F(RtpSenderReceiverTest,
985        AudioSenderSetParametersAsyncInvalidatesTransactionId) {
986   CreateAudioRtpSender();
987 
988   RtpParameters params = audio_rtp_sender_->GetParameters();
989   EXPECT_EQ(1u, params.encodings.size());
990   absl::optional<webrtc::RTCError> result;
991   audio_rtp_sender_->SetParametersAsync(
992       params, [&result](webrtc::RTCError error) { result = error; });
993   run_loop_.Flush();
994   EXPECT_TRUE(result->ok());
995   audio_rtp_sender_->SetParametersAsync(
996       params, [&result](webrtc::RTCError error) { result = error; });
997   run_loop_.Flush();
998   EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
999 
1000   DestroyAudioRtpSender();
1001 }
1002 
TEST_F(RtpSenderReceiverTest,AudioSenderDetectTransactionIdModification)1003 TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
1004   CreateAudioRtpSender();
1005 
1006   RtpParameters params = audio_rtp_sender_->GetParameters();
1007   params.transaction_id = "";
1008   RTCError result = audio_rtp_sender_->SetParameters(params);
1009   EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1010 
1011   DestroyAudioRtpSender();
1012 }
1013 
TEST_F(RtpSenderReceiverTest,AudioSenderCheckTransactionIdRefresh)1014 TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
1015   CreateAudioRtpSender();
1016 
1017   RtpParameters params = audio_rtp_sender_->GetParameters();
1018   EXPECT_NE(params.transaction_id.size(), 0U);
1019   auto saved_transaction_id = params.transaction_id;
1020   params = audio_rtp_sender_->GetParameters();
1021   EXPECT_NE(saved_transaction_id, params.transaction_id);
1022 
1023   DestroyAudioRtpSender();
1024 }
1025 
TEST_F(RtpSenderReceiverTest,AudioSenderSetParametersOldValueFail)1026 TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
1027   CreateAudioRtpSender();
1028 
1029   RtpParameters params = audio_rtp_sender_->GetParameters();
1030   RtpParameters second_params = audio_rtp_sender_->GetParameters();
1031 
1032   RTCError result = audio_rtp_sender_->SetParameters(params);
1033   EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1034   DestroyAudioRtpSender();
1035 }
1036 
TEST_F(RtpSenderReceiverTest,AudioSenderCantSetUnimplementedRtpParameters)1037 TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
1038   CreateAudioRtpSender();
1039   RtpParameters params = audio_rtp_sender_->GetParameters();
1040   EXPECT_EQ(1u, params.encodings.size());
1041 
1042   // Unimplemented RtpParameters: mid
1043   params.mid = "dummy_mid";
1044   EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1045             audio_rtp_sender_->SetParameters(params).type());
1046   params = audio_rtp_sender_->GetParameters();
1047 
1048   DestroyAudioRtpSender();
1049 }
1050 
TEST_F(RtpSenderReceiverTest,SetAudioMaxSendBitrate)1051 TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
1052   CreateAudioRtpSender();
1053 
1054   EXPECT_EQ(-1, voice_media_channel()->max_bps());
1055   webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
1056   EXPECT_EQ(1U, params.encodings.size());
1057   EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
1058   params.encodings[0].max_bitrate_bps = 1000;
1059   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1060 
1061   // Read back the parameters and verify they have been changed.
1062   params = audio_rtp_sender_->GetParameters();
1063   EXPECT_EQ(1U, params.encodings.size());
1064   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1065 
1066   // Verify that the audio channel received the new parameters.
1067   params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
1068   EXPECT_EQ(1U, params.encodings.size());
1069   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1070 
1071   // Verify that the global bitrate limit has not been changed.
1072   EXPECT_EQ(-1, voice_media_channel()->max_bps());
1073 
1074   DestroyAudioRtpSender();
1075 }
1076 
TEST_F(RtpSenderReceiverTest,SetAudioBitratePriority)1077 TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
1078   CreateAudioRtpSender();
1079 
1080   webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
1081   EXPECT_EQ(1U, params.encodings.size());
1082   EXPECT_EQ(webrtc::kDefaultBitratePriority,
1083             params.encodings[0].bitrate_priority);
1084   double new_bitrate_priority = 2.0;
1085   params.encodings[0].bitrate_priority = new_bitrate_priority;
1086   EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
1087 
1088   params = audio_rtp_sender_->GetParameters();
1089   EXPECT_EQ(1U, params.encodings.size());
1090   EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1091 
1092   params = voice_media_channel()->GetRtpSendParameters(kAudioSsrc);
1093   EXPECT_EQ(1U, params.encodings.size());
1094   EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1095 
1096   DestroyAudioRtpSender();
1097 }
1098 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParameters)1099 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
1100   CreateVideoRtpSender();
1101 
1102   RtpParameters params = video_rtp_sender_->GetParameters();
1103   EXPECT_EQ(1u, params.encodings.size());
1104   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1105 
1106   DestroyVideoRtpSender();
1107 }
1108 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersAsync)1109 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersAsync) {
1110   CreateVideoRtpSender();
1111 
1112   RtpParameters params = video_rtp_sender_->GetParameters();
1113   EXPECT_EQ(1u, params.encodings.size());
1114   absl::optional<webrtc::RTCError> result;
1115   video_rtp_sender_->SetParametersAsync(
1116       params, [&result](webrtc::RTCError error) { result = error; });
1117   run_loop_.Flush();
1118   EXPECT_TRUE(result->ok());
1119 
1120   DestroyVideoRtpSender();
1121 }
1122 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersBeforeNegotiation)1123 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
1124   video_rtp_sender_ =
1125       VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1126 
1127   RtpParameters params = video_rtp_sender_->GetParameters();
1128   ASSERT_EQ(1u, params.encodings.size());
1129   params.encodings[0].max_bitrate_bps = 90000;
1130   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1131 
1132   params = video_rtp_sender_->GetParameters();
1133   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1134   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1135 
1136   DestroyVideoRtpSender();
1137 }
1138 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetParametersAsyncBeforeNegotiation)1139 TEST_F(RtpSenderReceiverTest,
1140        VideoSenderCanSetParametersAsyncBeforeNegotiation) {
1141   video_rtp_sender_ =
1142       VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1143 
1144   absl::optional<webrtc::RTCError> result;
1145   RtpParameters params = video_rtp_sender_->GetParameters();
1146   ASSERT_EQ(1u, params.encodings.size());
1147   params.encodings[0].max_bitrate_bps = 90000;
1148   video_rtp_sender_->SetParametersAsync(
1149       params, [&result](webrtc::RTCError error) { result = error; });
1150   run_loop_.Flush();
1151   EXPECT_TRUE(result->ok());
1152 
1153   params = video_rtp_sender_->GetParameters();
1154   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1155   video_rtp_sender_->SetParametersAsync(
1156       params, [&result](webrtc::RTCError error) { result = error; });
1157   run_loop_.Flush();
1158   EXPECT_TRUE(result->ok());
1159 
1160   DestroyVideoRtpSender();
1161 }
1162 
TEST_F(RtpSenderReceiverTest,VideoSenderInitParametersMovedAfterNegotiation)1163 TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1164   AddVideoTrack(false);
1165 
1166   std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1167       std::make_unique<MockSetStreamsObserver>();
1168   video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1169                                              set_streams_observer.get());
1170   ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1171   EXPECT_CALL(*set_streams_observer, OnSetStreams());
1172   video_rtp_sender_->SetStreams({local_stream_->id()});
1173 
1174   std::vector<RtpEncodingParameters> init_encodings(2);
1175   init_encodings[0].max_bitrate_bps = 60000;
1176   init_encodings[1].max_bitrate_bps = 900000;
1177   video_rtp_sender_->set_init_send_encodings(init_encodings);
1178 
1179   RtpParameters params = video_rtp_sender_->GetParameters();
1180   ASSERT_EQ(2u, params.encodings.size());
1181   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1182   EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1183 
1184   // Simulate the setLocalDescription call
1185   std::vector<uint32_t> ssrcs;
1186   ssrcs.reserve(2);
1187   for (int i = 0; i < 2; ++i)
1188     ssrcs.push_back(kVideoSsrcSimulcast + i);
1189   cricket::StreamParams stream_params =
1190       cricket::CreateSimStreamParams("cname", ssrcs);
1191   video_media_channel()->AddSendStream(stream_params);
1192   video_rtp_sender_->SetMediaChannel(video_media_channel());
1193   video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1194 
1195   params = video_rtp_sender_->GetParameters();
1196   ASSERT_EQ(2u, params.encodings.size());
1197   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1198   EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1199 
1200   DestroyVideoRtpSender();
1201 }
1202 
TEST_F(RtpSenderReceiverTest,VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation)1203 TEST_F(RtpSenderReceiverTest,
1204        VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1205   AddVideoTrack(false);
1206 
1207   std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1208       std::make_unique<MockSetStreamsObserver>();
1209   video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1210                                              set_streams_observer.get());
1211   ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1212   EXPECT_CALL(*set_streams_observer, OnSetStreams());
1213   video_rtp_sender_->SetStreams({local_stream_->id()});
1214 
1215   std::vector<RtpEncodingParameters> init_encodings(1);
1216   init_encodings[0].max_bitrate_bps = 60000;
1217   video_rtp_sender_->set_init_send_encodings(init_encodings);
1218 
1219   RtpParameters params = video_rtp_sender_->GetParameters();
1220   ASSERT_EQ(1u, params.encodings.size());
1221   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1222 
1223   // Simulate the setLocalDescription call as if the user used SDP munging
1224   // to enable simulcast
1225   std::vector<uint32_t> ssrcs;
1226   ssrcs.reserve(2);
1227   for (int i = 0; i < 2; ++i)
1228     ssrcs.push_back(kVideoSsrcSimulcast + i);
1229   cricket::StreamParams stream_params =
1230       cricket::CreateSimStreamParams("cname", ssrcs);
1231   video_media_channel()->AddSendStream(stream_params);
1232   video_rtp_sender_->SetMediaChannel(video_media_channel());
1233   video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1234 
1235   params = video_rtp_sender_->GetParameters();
1236   ASSERT_EQ(2u, params.encodings.size());
1237   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1238 
1239   DestroyVideoRtpSender();
1240 }
1241 
1242 #if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1243 using RtpSenderReceiverDeathTest = RtpSenderReceiverTest;
1244 
TEST_F(RtpSenderReceiverDeathTest,VideoSenderManualRemoveSimulcastFailsDeathTest)1245 TEST_F(RtpSenderReceiverDeathTest,
1246        VideoSenderManualRemoveSimulcastFailsDeathTest) {
1247   AddVideoTrack(false);
1248 
1249   std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1250       std::make_unique<MockSetStreamsObserver>();
1251   video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1252                                              set_streams_observer.get());
1253   ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1254   EXPECT_CALL(*set_streams_observer, OnSetStreams());
1255   video_rtp_sender_->SetStreams({local_stream_->id()});
1256 
1257   std::vector<RtpEncodingParameters> init_encodings(2);
1258   init_encodings[0].max_bitrate_bps = 60000;
1259   init_encodings[1].max_bitrate_bps = 120000;
1260   video_rtp_sender_->set_init_send_encodings(init_encodings);
1261 
1262   RtpParameters params = video_rtp_sender_->GetParameters();
1263   ASSERT_EQ(2u, params.encodings.size());
1264   EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1265 
1266   // Simulate the setLocalDescription call as if the user used SDP munging
1267   // to disable simulcast.
1268   std::vector<uint32_t> ssrcs;
1269   ssrcs.reserve(2);
1270   for (int i = 0; i < 2; ++i)
1271     ssrcs.push_back(kVideoSsrcSimulcast + i);
1272   cricket::StreamParams stream_params =
1273       cricket::StreamParams::CreateLegacy(kVideoSsrc);
1274   video_media_channel()->AddSendStream(stream_params);
1275   video_rtp_sender_->SetMediaChannel(video_media_channel());
1276   EXPECT_DEATH(video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast), "");
1277 }
1278 #endif
1279 
TEST_F(RtpSenderReceiverTest,VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation)1280 TEST_F(RtpSenderReceiverTest,
1281        VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
1282   video_rtp_sender_ =
1283       VideoRtpSender::Create(worker_thread_, /*id=*/"", nullptr);
1284 
1285   RtpParameters params;
1286   RTCError result = video_rtp_sender_->SetParameters(params);
1287   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1288   DestroyVideoRtpSender();
1289 }
1290 
TEST_F(RtpSenderReceiverTest,VideoSenderMustCallGetParametersBeforeSetParameters)1291 TEST_F(RtpSenderReceiverTest,
1292        VideoSenderMustCallGetParametersBeforeSetParameters) {
1293   CreateVideoRtpSender();
1294 
1295   RtpParameters params;
1296   RTCError result = video_rtp_sender_->SetParameters(params);
1297   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1298 
1299   DestroyVideoRtpSender();
1300 }
1301 
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersInvalidatesTransactionId)1302 TEST_F(RtpSenderReceiverTest,
1303        VideoSenderSetParametersInvalidatesTransactionId) {
1304   CreateVideoRtpSender();
1305 
1306   RtpParameters params = video_rtp_sender_->GetParameters();
1307   EXPECT_EQ(1u, params.encodings.size());
1308   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1309   RTCError result = video_rtp_sender_->SetParameters(params);
1310   EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1311 
1312   DestroyVideoRtpSender();
1313 }
1314 
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersAsyncInvalidatesTransactionId)1315 TEST_F(RtpSenderReceiverTest,
1316        VideoSenderSetParametersAsyncInvalidatesTransactionId) {
1317   CreateVideoRtpSender();
1318 
1319   RtpParameters params = video_rtp_sender_->GetParameters();
1320   EXPECT_EQ(1u, params.encodings.size());
1321   absl::optional<webrtc::RTCError> result;
1322   video_rtp_sender_->SetParametersAsync(
1323       params, [&result](webrtc::RTCError error) { result = error; });
1324   run_loop_.Flush();
1325   EXPECT_TRUE(result->ok());
1326   video_rtp_sender_->SetParametersAsync(
1327       params, [&result](webrtc::RTCError error) { result = error; });
1328   run_loop_.Flush();
1329   EXPECT_EQ(RTCErrorType::INVALID_STATE, result->type());
1330 
1331   DestroyVideoRtpSender();
1332 }
1333 
TEST_F(RtpSenderReceiverTest,VideoSenderDetectTransactionIdModification)1334 TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1335   CreateVideoRtpSender();
1336 
1337   RtpParameters params = video_rtp_sender_->GetParameters();
1338   params.transaction_id = "";
1339   RTCError result = video_rtp_sender_->SetParameters(params);
1340   EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1341 
1342   DestroyVideoRtpSender();
1343 }
1344 
TEST_F(RtpSenderReceiverTest,VideoSenderCheckTransactionIdRefresh)1345 TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1346   CreateVideoRtpSender();
1347 
1348   RtpParameters params = video_rtp_sender_->GetParameters();
1349   EXPECT_NE(params.transaction_id.size(), 0U);
1350   auto saved_transaction_id = params.transaction_id;
1351   params = video_rtp_sender_->GetParameters();
1352   EXPECT_NE(saved_transaction_id, params.transaction_id);
1353 
1354   DestroyVideoRtpSender();
1355 }
1356 
TEST_F(RtpSenderReceiverTest,VideoSenderSetParametersOldValueFail)1357 TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1358   CreateVideoRtpSender();
1359 
1360   RtpParameters params = video_rtp_sender_->GetParameters();
1361   RtpParameters second_params = video_rtp_sender_->GetParameters();
1362 
1363   RTCError result = video_rtp_sender_->SetParameters(params);
1364   EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1365 
1366   DestroyVideoRtpSender();
1367 }
1368 
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetUnimplementedRtpParameters)1369 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1370   CreateVideoRtpSender();
1371   RtpParameters params = video_rtp_sender_->GetParameters();
1372   EXPECT_EQ(1u, params.encodings.size());
1373 
1374   // Unimplemented RtpParameters: mid
1375   params.mid = "dummy_mid";
1376   EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1377             video_rtp_sender_->SetParameters(params).type());
1378   params = video_rtp_sender_->GetParameters();
1379 
1380   DestroyVideoRtpSender();
1381 }
1382 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetScaleResolutionDownBy)1383 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1384   CreateVideoRtpSender();
1385 
1386   RtpParameters params = video_rtp_sender_->GetParameters();
1387   params.encodings[0].scale_resolution_down_by = 2;
1388 
1389   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1390   params = video_rtp_sender_->GetParameters();
1391   EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1392 
1393   DestroyVideoRtpSender();
1394 }
1395 
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidScaleResolutionDownBy)1396 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1397   CreateVideoRtpSender();
1398 
1399   RtpParameters params = video_rtp_sender_->GetParameters();
1400   params.encodings[0].scale_resolution_down_by = 0.5;
1401   RTCError result = video_rtp_sender_->SetParameters(params);
1402   EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1403 
1404   DestroyVideoRtpSender();
1405 }
1406 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetNumTemporalLayers)1407 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetNumTemporalLayers) {
1408   CreateVideoRtpSender();
1409 
1410   RtpParameters params = video_rtp_sender_->GetParameters();
1411   params.encodings[0].num_temporal_layers = 2;
1412 
1413   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1414   params = video_rtp_sender_->GetParameters();
1415   EXPECT_EQ(2, params.encodings[0].num_temporal_layers);
1416 
1417   DestroyVideoRtpSender();
1418 }
1419 
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidNumTemporalLayers)1420 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidNumTemporalLayers) {
1421   CreateVideoRtpSender();
1422 
1423   RtpParameters params = video_rtp_sender_->GetParameters();
1424   params.encodings[0].num_temporal_layers = webrtc::kMaxTemporalStreams + 1;
1425   RTCError result = video_rtp_sender_->SetParameters(params);
1426   EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1427 
1428   DestroyVideoRtpSender();
1429 }
1430 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetMaxFramerate)1431 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerate) {
1432   CreateVideoRtpSender();
1433 
1434   RtpParameters params = video_rtp_sender_->GetParameters();
1435   params.encodings[0].max_framerate = 20;
1436 
1437   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1438   params = video_rtp_sender_->GetParameters();
1439   EXPECT_EQ(20., params.encodings[0].max_framerate);
1440 
1441   DestroyVideoRtpSender();
1442 }
1443 
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetMaxFramerateZero)1444 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetMaxFramerateZero) {
1445   CreateVideoRtpSender();
1446 
1447   RtpParameters params = video_rtp_sender_->GetParameters();
1448   params.encodings[0].max_framerate = 0.;
1449 
1450   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1451   params = video_rtp_sender_->GetParameters();
1452   EXPECT_EQ(0., params.encodings[0].max_framerate);
1453 
1454   DestroyVideoRtpSender();
1455 }
1456 
TEST_F(RtpSenderReceiverTest,VideoSenderDetectInvalidMaxFramerate)1457 TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidMaxFramerate) {
1458   CreateVideoRtpSender();
1459 
1460   RtpParameters params = video_rtp_sender_->GetParameters();
1461   params.encodings[0].max_framerate = -5.;
1462   RTCError result = video_rtp_sender_->SetParameters(params);
1463   EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1464 
1465   DestroyVideoRtpSender();
1466 }
1467 
1468 // A video sender can have multiple simulcast layers, in which case it will
1469 // contain multiple RtpEncodingParameters. This tests that if this is the case
1470 // (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1471 // for any encodings besides at index 0, because these are both implemented
1472 // "per-sender."
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetPerSenderEncodingParameters)1473 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1474   // Add a simulcast specific send stream that contains 2 encoding parameters.
1475   CreateVideoRtpSenderWithSimulcast();
1476   RtpParameters params = video_rtp_sender_->GetParameters();
1477   EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1478 
1479   params.encodings[1].bitrate_priority = 2.0;
1480   EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1481             video_rtp_sender_->SetParameters(params).type());
1482   params = video_rtp_sender_->GetParameters();
1483 
1484   DestroyVideoRtpSender();
1485 }
1486 
TEST_F(RtpSenderReceiverTest,VideoSenderCantSetReadOnlyEncodingParameters)1487 TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1488   // Add a simulcast specific send stream that contains 2 encoding parameters.
1489   CreateVideoRtpSenderWithSimulcast();
1490   RtpParameters params = video_rtp_sender_->GetParameters();
1491   EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1492 
1493   for (size_t i = 0; i < params.encodings.size(); i++) {
1494     params.encodings[i].ssrc = 1337;
1495     EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1496               video_rtp_sender_->SetParameters(params).type());
1497     params = video_rtp_sender_->GetParameters();
1498   }
1499 
1500   DestroyVideoRtpSender();
1501 }
1502 
TEST_F(RtpSenderReceiverTest,SetVideoMinMaxSendBitrate)1503 TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
1504   CreateVideoRtpSender();
1505 
1506   EXPECT_EQ(-1, video_media_channel()->max_bps());
1507   webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1508   EXPECT_EQ(1U, params.encodings.size());
1509   EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
1510   EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
1511   params.encodings[0].min_bitrate_bps = 100;
1512   params.encodings[0].max_bitrate_bps = 1000;
1513   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1514 
1515   // Read back the parameters and verify they have been changed.
1516   params = video_rtp_sender_->GetParameters();
1517   EXPECT_EQ(1U, params.encodings.size());
1518   EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1519   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1520 
1521   // Verify that the video channel received the new parameters.
1522   params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
1523   EXPECT_EQ(1U, params.encodings.size());
1524   EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1525   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1526 
1527   // Verify that the global bitrate limit has not been changed.
1528   EXPECT_EQ(-1, video_media_channel()->max_bps());
1529 
1530   DestroyVideoRtpSender();
1531 }
1532 
TEST_F(RtpSenderReceiverTest,SetVideoMinMaxSendBitrateSimulcast)1533 TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1534   // Add a simulcast specific send stream that contains 2 encoding parameters.
1535   CreateVideoRtpSenderWithSimulcast();
1536 
1537   RtpParameters params = video_rtp_sender_->GetParameters();
1538   EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1539   params.encodings[0].min_bitrate_bps = 100;
1540   params.encodings[0].max_bitrate_bps = 1000;
1541   params.encodings[1].min_bitrate_bps = 200;
1542   params.encodings[1].max_bitrate_bps = 2000;
1543   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1544 
1545   // Verify that the video channel received the new parameters.
1546   params = video_media_channel()->GetRtpSendParameters(kVideoSsrcSimulcast);
1547   EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1548   EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1549   EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1550   EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1551   EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1552 
1553   DestroyVideoRtpSender();
1554 }
1555 
TEST_F(RtpSenderReceiverTest,SetVideoBitratePriority)1556 TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1557   CreateVideoRtpSender();
1558 
1559   webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1560   EXPECT_EQ(1U, params.encodings.size());
1561   EXPECT_EQ(webrtc::kDefaultBitratePriority,
1562             params.encodings[0].bitrate_priority);
1563   double new_bitrate_priority = 2.0;
1564   params.encodings[0].bitrate_priority = new_bitrate_priority;
1565   EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1566 
1567   params = video_rtp_sender_->GetParameters();
1568   EXPECT_EQ(1U, params.encodings.size());
1569   EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1570 
1571   params = video_media_channel()->GetRtpSendParameters(kVideoSsrc);
1572   EXPECT_EQ(1U, params.encodings.size());
1573   EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1574 
1575   DestroyVideoRtpSender();
1576 }
1577 
TEST_F(RtpSenderReceiverTest,VideoReceiverCanGetParametersWithSimulcast)1578 TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1579   CreateVideoRtpReceiverWithSimulcast({}, 2);
1580 
1581   RtpParameters params = video_rtp_receiver_->GetParameters();
1582   EXPECT_EQ(2u, params.encodings.size());
1583 
1584   DestroyVideoRtpReceiver();
1585 }
1586 
TEST_F(RtpSenderReceiverTest,GenerateKeyFrameWithAudio)1587 TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithAudio) {
1588   CreateAudioRtpSender();
1589 
1590   auto error = audio_rtp_sender_->GenerateKeyFrame({});
1591   EXPECT_FALSE(error.ok());
1592   EXPECT_EQ(error.type(), RTCErrorType::UNSUPPORTED_OPERATION);
1593 
1594   DestroyAudioRtpSender();
1595 }
1596 
TEST_F(RtpSenderReceiverTest,GenerateKeyFrameWithVideo)1597 TEST_F(RtpSenderReceiverTest, GenerateKeyFrameWithVideo) {
1598   CreateVideoRtpSenderWithSimulcast({"1", "2", "3"});
1599 
1600   auto error = video_rtp_sender_->GenerateKeyFrame({});
1601   EXPECT_TRUE(error.ok());
1602 
1603   error = video_rtp_sender_->GenerateKeyFrame({"1"});
1604   EXPECT_TRUE(error.ok());
1605 
1606   error = video_rtp_sender_->GenerateKeyFrame({""});
1607   EXPECT_FALSE(error.ok());
1608   EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1609 
1610   error = video_rtp_sender_->GenerateKeyFrame({"no-such-rid"});
1611   EXPECT_FALSE(error.ok());
1612   EXPECT_EQ(error.type(), RTCErrorType::INVALID_PARAMETER);
1613 
1614   DestroyVideoRtpSender();
1615 }
1616 
1617 // Test that makes sure that a video track content hint translates to the proper
1618 // value for sources that are not screencast.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHint)1619 TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1620   CreateVideoRtpSender();
1621 
1622   video_track_->set_enabled(true);
1623 
1624   // `video_track_` is not screencast by default.
1625   EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1626   // No content hint should be set by default.
1627   EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1628             video_track_->content_hint());
1629   // Setting detailed should turn a non-screencast source into screencast mode.
1630   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1631   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1632   // Removing the content hint should turn the track back into non-screencast
1633   // mode.
1634   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1635   EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1636   // Setting fluid should remain in non-screencast mode (its default).
1637   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
1638   EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1639   // Setting text should have the same effect as Detailed
1640   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1641   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1642 
1643   DestroyVideoRtpSender();
1644 }
1645 
1646 // Test that makes sure that a video track content hint translates to the proper
1647 // value for screencast sources.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHintForScreencastSource)1648 TEST_F(RtpSenderReceiverTest,
1649        PropagatesVideoTrackContentHintForScreencastSource) {
1650   CreateVideoRtpSender(true);
1651 
1652   video_track_->set_enabled(true);
1653 
1654   // `video_track_` with a screencast source should be screencast by default.
1655   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1656   // No content hint should be set by default.
1657   EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1658             video_track_->content_hint());
1659   // Setting fluid should turn a screencast source into non-screencast mode.
1660   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
1661   EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1662   // Removing the content hint should turn the track back into screencast mode.
1663   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1664   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1665   // Setting detailed should still remain in screencast mode (its default).
1666   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1667   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1668   // Setting text should have the same effect as Detailed
1669   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1670   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1671 
1672   DestroyVideoRtpSender();
1673 }
1674 
1675 // Test that makes sure any content hints that are set on a track before
1676 // VideoRtpSender is ready to send are still applied when it gets ready to send.
TEST_F(RtpSenderReceiverTest,PropagatesVideoTrackContentHintSetBeforeEnabling)1677 TEST_F(RtpSenderReceiverTest,
1678        PropagatesVideoTrackContentHintSetBeforeEnabling) {
1679   AddVideoTrack();
1680   std::unique_ptr<MockSetStreamsObserver> set_streams_observer =
1681       std::make_unique<MockSetStreamsObserver>();
1682   // Setting detailed overrides the default non-screencast mode. This should be
1683   // applied even if the track is set on construction.
1684   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
1685   video_rtp_sender_ = VideoRtpSender::Create(worker_thread_, video_track_->id(),
1686                                              set_streams_observer.get());
1687   ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_.get()));
1688   EXPECT_CALL(*set_streams_observer, OnSetStreams());
1689   video_rtp_sender_->SetStreams({local_stream_->id()});
1690   video_rtp_sender_->SetMediaChannel(video_media_channel());
1691   video_track_->set_enabled(true);
1692 
1693   // Sender is not ready to send (no SSRC) so no option should have been set.
1694   EXPECT_EQ(absl::nullopt, video_media_channel()->options().is_screencast);
1695 
1696   // Verify that the content hint is accounted for when video_rtp_sender_ does
1697   // get enabled.
1698   video_rtp_sender_->SetSsrc(kVideoSsrc);
1699   EXPECT_EQ(true, video_media_channel()->options().is_screencast);
1700 
1701   // And removing the hint should go back to false (to verify that false was
1702   // default correctly).
1703   video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
1704   EXPECT_EQ(false, video_media_channel()->options().is_screencast);
1705 
1706   DestroyVideoRtpSender();
1707 }
1708 
TEST_F(RtpSenderReceiverTest,AudioSenderHasDtmfSender)1709 TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1710   CreateAudioRtpSender();
1711   EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1712 }
1713 
TEST_F(RtpSenderReceiverTest,VideoSenderDoesNotHaveDtmfSender)1714 TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1715   CreateVideoRtpSender();
1716   EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1717 }
1718 
1719 // Test that the DTMF sender is really using `voice_channel_`, and thus returns
1720 // true/false from CanSendDtmf based on what `voice_channel_` returns.
TEST_F(RtpSenderReceiverTest,CanInsertDtmf)1721 TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1722   AddDtmfCodec();
1723   CreateAudioRtpSender();
1724   auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1725   ASSERT_NE(nullptr, dtmf_sender);
1726   EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1727 }
1728 
TEST_F(RtpSenderReceiverTest,CanNotInsertDtmf)1729 TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1730   CreateAudioRtpSender();
1731   auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1732   ASSERT_NE(nullptr, dtmf_sender);
1733   // DTMF codec has not been added, as it was in the above test.
1734   EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1735 }
1736 
TEST_F(RtpSenderReceiverTest,InsertDtmf)1737 TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1738   AddDtmfCodec();
1739   CreateAudioRtpSender();
1740   auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1741   ASSERT_NE(nullptr, dtmf_sender);
1742 
1743   EXPECT_EQ(0U, voice_media_channel()->dtmf_info_queue().size());
1744 
1745   // Insert DTMF
1746   const int expected_duration = 90;
1747   dtmf_sender->InsertDtmf("012", expected_duration, 100);
1748 
1749   // Verify
1750   ASSERT_EQ_WAIT(3U, voice_media_channel()->dtmf_info_queue().size(),
1751                  kDefaultTimeout);
1752   const uint32_t send_ssrc =
1753       voice_media_channel()->send_streams()[0].first_ssrc();
1754   EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[0],
1755                               send_ssrc, 0, expected_duration));
1756   EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[1],
1757                               send_ssrc, 1, expected_duration));
1758   EXPECT_TRUE(CompareDtmfInfo(voice_media_channel()->dtmf_info_queue()[2],
1759                               send_ssrc, 2, expected_duration));
1760 }
1761 
1762 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioSenderCanSetFrameEncryptor)1763 TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1764   CreateAudioRtpSender();
1765   rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1766       new FakeFrameEncryptor());
1767   EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1768   audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1769   EXPECT_EQ(fake_frame_encryptor.get(),
1770             audio_rtp_sender_->GetFrameEncryptor().get());
1771 }
1772 
1773 // Validate that setting a FrameEncryptor after the send stream is stopped does
1774 // nothing.
TEST_F(RtpSenderReceiverTest,AudioSenderCannotSetFrameEncryptorAfterStop)1775 TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1776   CreateAudioRtpSender();
1777   rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1778       new FakeFrameEncryptor());
1779   EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1780   audio_rtp_sender_->Stop();
1781   audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1782   // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1783 }
1784 
1785 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioReceiverCanSetFrameDecryptor)1786 TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1787   CreateAudioRtpReceiver();
1788   rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1789       rtc::make_ref_counted<FakeFrameDecryptor>());
1790   EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1791   audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1792   EXPECT_EQ(fake_frame_decryptor.get(),
1793             audio_rtp_receiver_->GetFrameDecryptor().get());
1794   DestroyAudioRtpReceiver();
1795 }
1796 
1797 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,AudioReceiverCannotSetFrameDecryptorAfterStop)1798 TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1799   CreateAudioRtpReceiver();
1800   rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1801       rtc::make_ref_counted<FakeFrameDecryptor>());
1802   EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1803   audio_rtp_receiver_->SetMediaChannel(nullptr);
1804   audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1805   // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1806   DestroyAudioRtpReceiver();
1807 }
1808 
1809 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoSenderCanSetFrameEncryptor)1810 TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1811   CreateVideoRtpSender();
1812   rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1813       new FakeFrameEncryptor());
1814   EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1815   video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1816   EXPECT_EQ(fake_frame_encryptor.get(),
1817             video_rtp_sender_->GetFrameEncryptor().get());
1818 }
1819 
1820 // Validate that setting a FrameEncryptor after the send stream is stopped does
1821 // nothing.
TEST_F(RtpSenderReceiverTest,VideoSenderCannotSetFrameEncryptorAfterStop)1822 TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1823   CreateVideoRtpSender();
1824   rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1825       new FakeFrameEncryptor());
1826   EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1827   video_rtp_sender_->Stop();
1828   video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1829   // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1830 }
1831 
1832 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoReceiverCanSetFrameDecryptor)1833 TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1834   CreateVideoRtpReceiver();
1835   rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1836       rtc::make_ref_counted<FakeFrameDecryptor>());
1837   EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1838   video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1839   EXPECT_EQ(fake_frame_decryptor.get(),
1840             video_rtp_receiver_->GetFrameDecryptor().get());
1841   DestroyVideoRtpReceiver();
1842 }
1843 
1844 // Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest,VideoReceiverCannotSetFrameDecryptorAfterStop)1845 TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1846   CreateVideoRtpReceiver();
1847   rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1848       rtc::make_ref_counted<FakeFrameDecryptor>());
1849   EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1850   video_rtp_receiver_->SetMediaChannel(nullptr);
1851   video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1852   // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1853   DestroyVideoRtpReceiver();
1854 }
1855 
1856 // Checks that calling the internal methods for get/set parameters do not
1857 // invalidate any parameters retreived by clients.
TEST_F(RtpSenderReceiverTest,InternalParameterMethodsDoNotInvalidateTransaction)1858 TEST_F(RtpSenderReceiverTest,
1859        InternalParameterMethodsDoNotInvalidateTransaction) {
1860   CreateVideoRtpSender();
1861   RtpParameters parameters = video_rtp_sender_->GetParameters();
1862   RtpParameters new_parameters = video_rtp_sender_->GetParametersInternal();
1863   new_parameters.encodings[0].active = false;
1864   video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
1865   new_parameters.encodings[0].active = true;
1866   video_rtp_sender_->SetParametersInternal(new_parameters, nullptr, true);
1867   parameters.encodings[0].active = false;
1868   EXPECT_TRUE(video_rtp_sender_->SetParameters(parameters).ok());
1869 }
1870 
1871 // Helper method for syntactic sugar for accepting a vector with '{}' notation.
CreatePairOfRidVectors(const std::vector<std::string> & first,const std::vector<std::string> & second)1872 std::pair<RidList, RidList> CreatePairOfRidVectors(
1873     const std::vector<std::string>& first,
1874     const std::vector<std::string>& second) {
1875   return std::make_pair(first, second);
1876 }
1877 
1878 // These parameters are used to test disabling simulcast layers.
1879 const std::pair<RidList, RidList> kDisableSimulcastLayersParameters[] = {
1880     // Tests removing the first layer. This is a special case because
1881     // the first layer's SSRC is also the 'primary' SSRC used to associate the
1882     // parameters to the media channel.
1883     CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1"}),
1884     // Tests removing some layers.
1885     CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "4"}),
1886     // Tests simulcast rejected scenario all layers except first are rejected.
1887     CreatePairOfRidVectors({"1", "2", "3", "4"}, {"2", "3", "4"}),
1888     // Tests removing all layers.
1889     CreatePairOfRidVectors({"1", "2", "3", "4"}, {"1", "2", "3", "4"}),
1890 };
1891 
1892 // Runs test for disabling layers on a sender without a media engine set.
TEST_P(RtpSenderReceiverTest,DisableSimulcastLayersWithoutMediaEngine)1893 TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithoutMediaEngine) {
1894   auto parameter = GetParam();
1895   RunDisableSimulcastLayersWithoutMediaEngineTest(parameter.first,
1896                                                   parameter.second);
1897 }
1898 
1899 // Runs test for disabling layers on a sender with a media engine set.
TEST_P(RtpSenderReceiverTest,DisableSimulcastLayersWithMediaEngine)1900 TEST_P(RtpSenderReceiverTest, DisableSimulcastLayersWithMediaEngine) {
1901   auto parameter = GetParam();
1902   RunDisableSimulcastLayersWithMediaEngineTest(parameter.first,
1903                                                parameter.second);
1904 }
1905 
1906 INSTANTIATE_TEST_SUITE_P(
1907     DisableSimulcastLayersInSender,
1908     RtpSenderReceiverTest,
1909     ::testing::ValuesIn(kDisableSimulcastLayersParameters));
1910 
1911 }  // namespace webrtc
1912