blob: e3a8d5e14a3a5ce6e1a0d55cee9ed814a501919f [file] [log] [blame]
deadbeef70ab1a12015-09-28 23:53:551/*
kjellanderb24317b2016-02-10 15:54:432 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 23:53:553 *
kjellanderb24317b2016-02-10 15:54:434 * 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.
deadbeef70ab1a12015-09-28 23:53:559 */
10
Yves Gerey3e707812018-11-28 15:47:4911#include <stddef.h>
12#include <cstdint>
kwibergd1fe2812016-04-27 13:47:2913#include <memory>
deadbeef70ab1a12015-09-28 23:53:5514#include <string>
Tommif888bb52015-12-12 00:37:0115#include <utility>
Yves Gerey3e707812018-11-28 15:47:4916#include <vector>
deadbeef70ab1a12015-09-28 23:53:5517
Yves Gerey3e707812018-11-28 15:47:4918#include "absl/memory/memory.h"
19#include "absl/types/optional.h"
20#include "api/audio_options.h"
Steve Anton10542f22019-01-11 17:11:0021#include "api/crypto/crypto_options.h"
22#include "api/crypto/frame_decryptor_interface.h"
23#include "api/crypto/frame_encryptor_interface.h"
24#include "api/dtmf_sender_interface.h"
25#include "api/media_stream_interface.h"
26#include "api/rtc_error.h"
27#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 19:26:4828#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 21:22:3429#include "api/test/fake_frame_decryptor.h"
30#include "api/test/fake_frame_encryptor.h"
Yves Gerey3e707812018-11-28 15:47:4931#include "logging/rtc_event_log/rtc_event_log.h"
32#include "media/base/codec.h"
Steve Anton10542f22019-01-11 17:11:0033#include "media/base/fake_media_engine.h"
34#include "media/base/media_channel.h"
35#include "media/base/media_config.h"
36#include "media/base/media_engine.h"
37#include "media/base/rtp_data_engine.h"
38#include "media/base/stream_params.h"
39#include "media/base/test_utils.h"
40#include "media/engine/fake_webrtc_call.h"
41#include "p2p/base/dtls_transport_internal.h"
42#include "p2p/base/fake_dtls_transport.h"
43#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 09:29:1944#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0045#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 15:47:4946#include "pc/channel.h"
Steve Anton10542f22019-01-11 17:11:0047#include "pc/channel_manager.h"
48#include "pc/dtls_srtp_transport.h"
49#include "pc/local_audio_source.h"
50#include "pc/media_stream.h"
51#include "pc/rtp_receiver.h"
52#include "pc/rtp_sender.h"
53#include "pc/rtp_transport_internal.h"
54#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 09:29:1955#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 17:11:0056#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 15:47:4957#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3158#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 15:47:4959#include "rtc_base/third_party/sigslot/sigslot.h"
60#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3161#include "test/gmock.h"
62#include "test/gtest.h"
deadbeef70ab1a12015-09-28 23:53:5563
64using ::testing::_;
65using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 23:20:0166using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-17 02:07:4367using ::testing::Return;
deadbeef70ab1a12015-09-28 23:53:5568
deadbeef20cb0c12017-02-02 04:27:0069namespace {
70
Seth Hampson845e8782018-03-02 19:34:1071static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 23:53:5572static const char kVideoTrackId[] = "video_1";
73static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 10:23:2174static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 19:26:0175static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 10:23:2176static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 19:26:0177static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 20:47:2078static const uint32_t kVideoSsrcSimulcast = 102;
79static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-02 04:27:0080static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-02 04:27:0081} // namespace
deadbeef70ab1a12015-09-28 23:53:5582
83namespace webrtc {
84
deadbeef20cb0c12017-02-02 04:27:0085class RtpSenderReceiverTest : public testing::Test,
86 public sigslot::has_slots<> {
tkchin3784b4a2016-06-25 02:31:4787 public:
Taylor Brandstetterba29c6a2016-06-27 23:30:3588 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 18:49:3589 : network_thread_(rtc::Thread::Current()),
90 worker_thread_(rtc::Thread::Current()),
91 // Create fake media engine/etc. so we can create channels to use to
92 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 23:30:3593 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 09:40:3394 channel_manager_(absl::WrapUnique(media_engine_),
95 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 18:49:3596 worker_thread_,
97 network_thread_),
Sebastian Jansson8f83b422018-02-21 12:07:1398 fake_call_(),
Seth Hampson845e8782018-03-02 19:34:1099 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35100 // Create channels to be used by the RtpSenders and RtpReceivers.
101 channel_manager_.Init();
deadbeef7af91dd2016-12-13 19:29:11102 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 09:40:33103 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 17:48:35104 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
105 rtp_transport_ = CreateDtlsSrtpTransport();
106
Taylor Brandstetterba29c6a2016-06-27 23:30:35107 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 17:48:35108 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 20:15:42109 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-26 01:13:56110 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
111 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 23:30:35112 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 17:48:35113 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 14:54:47114 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-26 01:13:56115 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
116 cricket::VideoOptions());
deadbeef20cb0c12017-02-02 04:27:00117 voice_channel_->Enable(true);
118 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:35119 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
120 video_media_channel_ = media_engine_->GetVideoChannel(0);
121 RTC_CHECK(voice_channel_);
122 RTC_CHECK(video_channel_);
123 RTC_CHECK(voice_media_channel_);
124 RTC_CHECK(video_media_channel_);
125
126 // Create streams for predefined SSRCs. Streams need to exist in order
127 // for the senders and receievers to apply parameters to them.
128 // Normally these would be created by SetLocalDescription and
129 // SetRemoteDescription.
130 voice_media_channel_->AddSendStream(
131 cricket::StreamParams::CreateLegacy(kAudioSsrc));
132 voice_media_channel_->AddRecvStream(
133 cricket::StreamParams::CreateLegacy(kAudioSsrc));
134 voice_media_channel_->AddSendStream(
135 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
136 voice_media_channel_->AddRecvStream(
137 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
138 video_media_channel_->AddSendStream(
139 cricket::StreamParams::CreateLegacy(kVideoSsrc));
140 video_media_channel_->AddRecvStream(
141 cricket::StreamParams::CreateLegacy(kVideoSsrc));
142 video_media_channel_->AddSendStream(
143 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
144 video_media_channel_->AddRecvStream(
145 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-25 02:31:47146 }
Taylor Brandstetter2d549172016-06-24 21:18:22147
Zhi Huange830e682018-03-30 17:48:35148 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 09:40:33149 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
150 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 17:48:35151 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
152 /*rtcp_dtls_transport=*/nullptr);
153 return dtls_srtp_transport;
154 }
155
deadbeef20cb0c12017-02-02 04:27:00156 // Needed to use DTMF sender.
157 void AddDtmfCodec() {
158 cricket::AudioSendParameters params;
159 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
160 0, 1);
161 params.codecs.push_back(kTelephoneEventCodec);
162 voice_media_channel_->SetSendParameters(params);
163 }
Taylor Brandstetterba29c6a2016-06-27 23:30:35164
pbos5214a0a2016-12-16 23:39:11165 void AddVideoTrack() { AddVideoTrack(false); }
166
167 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 00:27:48168 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 23:39:11169 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-08-01 06:22:01170 video_track_ =
171 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-26 02:15:09172 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 23:53:55173 }
174
Taylor Brandstetterba29c6a2016-06-27 23:30:35175 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
176
Mirko Bonadeic61ce0d2017-11-21 16:04:20177 void CreateAudioRtpSender(
178 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35179 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-26 02:15:09180 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 18:49:35181 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 20:03:36182 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
183 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
184 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-14 00:26:05185 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 19:26:01186 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-02 04:27:00187 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
188 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 23:30:35189 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 23:53:55190 }
191
Steve Anton02ee47c2018-01-11 00:26:06192 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 20:03:36193 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-14 00:26:05194 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-11 00:26:06195 }
196
deadbeef20cb0c12017-02-02 04:27:00197 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
198
Seth Hampson2d2c8882018-05-16 23:02:32199 void CreateVideoRtpSender(uint32_t ssrc) {
200 CreateVideoRtpSender(false, ssrc);
201 }
202
pbos5214a0a2016-12-16 23:39:11203 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
204
Florent Castelli892acf02018-10-01 20:47:20205 void CreateVideoRtpSenderWithSimulcast(
206 int num_layers = kVideoSimulcastLayerCount) {
207 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53208 ssrcs.reserve(num_layers);
Florent Castelli892acf02018-10-01 20:47:20209 for (int i = 0; i < num_layers; ++i)
210 ssrcs.push_back(kVideoSsrcSimulcast + i);
211 cricket::StreamParams stream_params =
212 cricket::CreateSimStreamParams("cname", ssrcs);
213 video_media_channel_->AddSendStream(stream_params);
214 uint32_t primary_ssrc = stream_params.first_ssrc();
215 CreateVideoRtpSender(primary_ssrc);
216 }
217
Seth Hampson2d2c8882018-05-16 23:02:32218 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 23:39:11219 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 20:03:36220 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
221 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
222 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-14 00:26:05223 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 23:02:32224 video_rtp_sender_->SetSsrc(ssrc);
225 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 23:53:55226 }
Steve Anton02ee47c2018-01-11 00:26:06227 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 20:03:36228 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-14 00:26:05229 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-11 00:26:06230 }
231
deadbeef70ab1a12015-09-28 23:53:55232 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55233 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35234 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55235 }
236
237 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 23:53:55238 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35239 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 23:53:55240 }
241
Henrik Boström9e6fd2b2017-11-21 12:41:51242 void CreateAudioRtpReceiver(
243 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 20:38:12244 audio_rtp_receiver_ =
245 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-14 00:26:05246 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-18 01:41:02247 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 10:16:19248 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35249 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55250 }
251
Henrik Boström9e6fd2b2017-11-21 12:41:51252 void CreateVideoRtpReceiver(
253 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 20:38:12254 video_rtp_receiver_ =
255 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-14 00:26:05256 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-18 01:41:02257 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 17:32:00258 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 23:30:35259 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 23:53:55260 }
261
Florent Castelli38332cd2018-11-20 13:08:06262 void CreateVideoRtpReceiverWithSimulcast(
263 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
264 int num_layers = kVideoSimulcastLayerCount) {
265 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53266 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 13:08:06267 for (int i = 0; i < num_layers; ++i)
268 ssrcs.push_back(kVideoSsrcSimulcast + i);
269 cricket::StreamParams stream_params =
270 cricket::CreateSimStreamParams("cname", ssrcs);
271 video_media_channel_->AddRecvStream(stream_params);
272 uint32_t primary_ssrc = stream_params.first_ssrc();
273
Mirko Bonadei05cf6be2019-01-31 20:38:12274 video_rtp_receiver_ =
275 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 13:08:06276 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
277 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
278 video_track_ = video_rtp_receiver_->video_track();
279 }
280
deadbeef70ab1a12015-09-28 23:53:55281 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 23:53:55282 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35283 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 23:53:55284 }
285
286 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 23:53:55287 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 23:30:35288 VerifyVideoChannelNoOutput();
289 }
290
291 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
292
293 void VerifyVoiceChannelInput(uint32_t ssrc) {
294 // Verify that the media channel has an audio source, and the stream isn't
295 // muted.
296 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
297 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
298 }
299
300 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
301
302 void VerifyVideoChannelInput(uint32_t ssrc) {
303 // Verify that the media channel has a video source,
304 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
305 }
306
307 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
308
309 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
310 // Verify that the media channel's source is reset.
311 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
312 }
313
314 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
315
316 void VerifyVideoChannelNoInput(uint32_t ssrc) {
317 // Verify that the media channel's source is reset.
318 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
319 }
320
321 void VerifyVoiceChannelOutput() {
322 // Verify that the volume is initialized to 1.
323 double volume;
324 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
325 EXPECT_EQ(1, volume);
326 }
327
328 void VerifyVideoChannelOutput() {
329 // Verify that the media channel has a sink.
330 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
331 }
332
333 void VerifyVoiceChannelNoOutput() {
334 // Verify that the volume is reset to 0.
335 double volume;
336 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
337 EXPECT_EQ(0, volume);
338 }
339
340 void VerifyVideoChannelNoOutput() {
341 // Verify that the media channel's sink is reset.
342 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 23:53:55343 }
344
345 protected:
Steve Anton47136dd2018-01-12 18:49:35346 rtc::Thread* const network_thread_;
347 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 18:53:05348 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 17:48:35349 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
350 // the |channel_manager|.
351 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
352 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-11 04:13:37353 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 23:30:35354 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35355 cricket::ChannelManager channel_manager_;
356 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 23:30:35357 cricket::VoiceChannel* voice_channel_;
358 cricket::VideoChannel* video_channel_;
359 cricket::FakeVoiceMediaChannel* voice_media_channel_;
360 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 23:53:55361 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
362 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
363 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
364 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-26 02:15:09365 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 23:53:55366 rtc::scoped_refptr<VideoTrackInterface> video_track_;
367 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-02 04:27:00368 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-26 01:13:56369 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 23:53:55370};
371
Taylor Brandstetterba29c6a2016-06-27 23:30:35372// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 23:53:55373// and disassociated with an AudioRtpSender.
374TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
375 CreateAudioRtpSender();
376 DestroyAudioRtpSender();
377}
378
Taylor Brandstetterba29c6a2016-06-27 23:30:35379// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 23:53:55380// disassociated with a VideoRtpSender.
381TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
382 CreateVideoRtpSender();
383 DestroyVideoRtpSender();
384}
385
Taylor Brandstetterba29c6a2016-06-27 23:30:35386// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 23:53:55387// associated and disassociated with an AudioRtpReceiver.
388TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
389 CreateAudioRtpReceiver();
390 DestroyAudioRtpReceiver();
391}
392
Taylor Brandstetterba29c6a2016-06-27 23:30:35393// Test that |video_channel_| is updated when a remote video track is
394// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55395TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
396 CreateVideoRtpReceiver();
397 DestroyVideoRtpReceiver();
398}
399
Henrik Boström9e6fd2b2017-11-21 12:41:51400TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
401 CreateAudioRtpReceiver({local_stream_});
402 DestroyAudioRtpReceiver();
403}
404
405TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
406 CreateVideoRtpReceiver({local_stream_});
407 DestroyVideoRtpReceiver();
408}
409
Taylor Brandstetterba29c6a2016-06-27 23:30:35410// Test that the AudioRtpSender applies options from the local audio source.
411TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
412 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 09:54:27413 options.echo_cancellation = true;
deadbeef757146b2017-02-11 05:26:48414 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 23:30:35415 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 21:18:22416
Oskar Sundbom36f8f3e2017-11-16 09:54:27417 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 21:18:22418
419 DestroyAudioRtpSender();
420}
421
Taylor Brandstetterba29c6a2016-06-27 23:30:35422// Test that the stream is muted when the track is disabled, and unmuted when
423// the track is enabled.
424TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
425 CreateAudioRtpSender();
426
427 audio_track_->set_enabled(false);
428 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
429
430 audio_track_->set_enabled(true);
431 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
432
433 DestroyAudioRtpSender();
434}
435
436// Test that the volume is set to 0 when the track is disabled, and back to
437// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 23:53:55438TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
439 CreateAudioRtpReceiver();
440
Taylor Brandstetterba29c6a2016-06-27 23:30:35441 double volume;
442 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
443 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 21:18:22444
Taylor Brandstetterba29c6a2016-06-27 23:30:35445 audio_track_->set_enabled(false);
446 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
447 EXPECT_EQ(0, volume);
448
deadbeef70ab1a12015-09-28 23:53:55449 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:35450 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
451 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 23:53:55452
453 DestroyAudioRtpReceiver();
454}
455
Taylor Brandstetterba29c6a2016-06-27 23:30:35456// Currently no action is taken when a remote video track is disabled or
457// enabled, so there's nothing to test here, other than what is normally
458// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 23:53:55459TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
460 CreateVideoRtpSender();
461
deadbeef70ab1a12015-09-28 23:53:55462 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55463 video_track_->set_enabled(true);
464
465 DestroyVideoRtpSender();
466}
467
Taylor Brandstetterba29c6a2016-06-27 23:30:35468// Test that the state of the video track created by the VideoRtpReceiver is
469// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 17:32:00470TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
471 CreateVideoRtpReceiver();
472
473 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
474 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
475 video_track_->GetSource()->state());
476
477 DestroyVideoRtpReceiver();
478
479 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
480 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
481 video_track_->GetSource()->state());
482}
483
Taylor Brandstetterba29c6a2016-06-27 23:30:35484// Currently no action is taken when a remote video track is disabled or
485// enabled, so there's nothing to test here, other than what is normally
486// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 23:53:55487TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
488 CreateVideoRtpReceiver();
489
490 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 23:53:55491 video_track_->set_enabled(true);
492
493 DestroyVideoRtpReceiver();
494}
495
Taylor Brandstetterba29c6a2016-06-27 23:30:35496// Test that the AudioRtpReceiver applies volume changes from the track source
497// to the media channel.
deadbeef70ab1a12015-09-28 23:53:55498TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
499 CreateAudioRtpReceiver();
500
Taylor Brandstetterba29c6a2016-06-27 23:30:35501 double volume;
502 audio_track_->GetSource()->SetVolume(0.5);
503 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
504 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 23:53:55505
506 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 23:53:55507 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 23:30:35508 audio_track_->GetSource()->SetVolume(0.8);
509 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
510 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 23:53:55511
Taylor Brandstetterba29c6a2016-06-27 23:30:35512 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 23:53:55513 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 23:30:35514 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
515 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 23:53:55516
Taylor Brandstetterba29c6a2016-06-27 23:30:35517 // Try changing volume one more time.
518 audio_track_->GetSource()->SetVolume(0.9);
519 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
520 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 23:53:55521
522 DestroyAudioRtpReceiver();
523}
524
Taylor Brandstetterba29c6a2016-06-27 23:30:35525// Test that the media channel isn't enabled for sending if the audio sender
526// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01527TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06528 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01529 rtc::scoped_refptr<AudioTrackInterface> track =
530 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35531
532 // Track but no SSRC.
533 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
534 VerifyVoiceChannelNoInput();
535
536 // SSRC but no track.
537 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
538 audio_rtp_sender_->SetSsrc(kAudioSsrc);
539 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01540}
541
Taylor Brandstetterba29c6a2016-06-27 23:30:35542// Test that the media channel isn't enabled for sending if the video sender
543// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 19:26:01544TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06545 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35546
547 // Track but no SSRC.
548 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
549 VerifyVideoChannelNoInput();
550
551 // SSRC but no track.
552 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
553 video_rtp_sender_->SetSsrc(kVideoSsrc);
554 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01555}
556
Taylor Brandstetterba29c6a2016-06-27 23:30:35557// Test that the media channel is enabled for sending when the audio sender
558// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01559TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-11 00:26:06560 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01561 rtc::scoped_refptr<AudioTrackInterface> track =
562 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35563 audio_rtp_sender_->SetSsrc(kAudioSsrc);
564 audio_rtp_sender_->SetTrack(track);
565 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01566
Taylor Brandstetterba29c6a2016-06-27 23:30:35567 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01568}
569
Taylor Brandstetterba29c6a2016-06-27 23:30:35570// Test that the media channel is enabled for sending when the audio sender
571// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01572TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-11 00:26:06573 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 19:26:01574 rtc::scoped_refptr<AudioTrackInterface> track =
575 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 23:30:35576 audio_rtp_sender_->SetTrack(track);
577 audio_rtp_sender_->SetSsrc(kAudioSsrc);
578 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 19:26:01579
Taylor Brandstetterba29c6a2016-06-27 23:30:35580 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01581}
582
Taylor Brandstetterba29c6a2016-06-27 23:30:35583// Test that the media channel is enabled for sending when the video sender
584// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 19:26:01585TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 15:20:42586 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06587 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35588 video_rtp_sender_->SetSsrc(kVideoSsrc);
589 video_rtp_sender_->SetTrack(video_track_);
590 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01591
Taylor Brandstetterba29c6a2016-06-27 23:30:35592 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01593}
594
Taylor Brandstetterba29c6a2016-06-27 23:30:35595// Test that the media channel is enabled for sending when the video sender
596// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 19:26:01597TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 15:20:42598 AddVideoTrack();
Steve Anton02ee47c2018-01-11 00:26:06599 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 23:30:35600 video_rtp_sender_->SetTrack(video_track_);
601 video_rtp_sender_->SetSsrc(kVideoSsrc);
602 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 19:26:01603
Taylor Brandstetterba29c6a2016-06-27 23:30:35604 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01605}
606
Taylor Brandstetterba29c6a2016-06-27 23:30:35607// Test that the media channel stops sending when the audio sender's SSRC is set
608// to 0.
deadbeeffac06552015-11-25 19:26:01609TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35610 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01611
Taylor Brandstetterba29c6a2016-06-27 23:30:35612 audio_rtp_sender_->SetSsrc(0);
613 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01614}
615
Taylor Brandstetterba29c6a2016-06-27 23:30:35616// Test that the media channel stops sending when the video sender's SSRC is set
617// to 0.
deadbeeffac06552015-11-25 19:26:01618TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35619 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01620
Taylor Brandstetterba29c6a2016-06-27 23:30:35621 audio_rtp_sender_->SetSsrc(0);
622 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01623}
624
Taylor Brandstetterba29c6a2016-06-27 23:30:35625// Test that the media channel stops sending when the audio sender's track is
626// set to null.
deadbeeffac06552015-11-25 19:26:01627TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35628 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01629
Taylor Brandstetterba29c6a2016-06-27 23:30:35630 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
631 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 19:26:01632}
633
Taylor Brandstetterba29c6a2016-06-27 23:30:35634// Test that the media channel stops sending when the video sender's track is
635// set to null.
deadbeeffac06552015-11-25 19:26:01636TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35637 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01638
Taylor Brandstetterba29c6a2016-06-27 23:30:35639 video_rtp_sender_->SetSsrc(0);
640 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 19:26:01641}
642
Taylor Brandstetterba29c6a2016-06-27 23:30:35643// Test that when the audio sender's SSRC is changed, the media channel stops
644// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01645TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35646 CreateAudioRtpSender();
deadbeeffac06552015-11-25 19:26:01647
Taylor Brandstetterba29c6a2016-06-27 23:30:35648 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
649 VerifyVoiceChannelNoInput(kAudioSsrc);
650 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01651
Taylor Brandstetterba29c6a2016-06-27 23:30:35652 audio_rtp_sender_ = nullptr;
653 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 19:26:01654}
655
Taylor Brandstetterba29c6a2016-06-27 23:30:35656// Test that when the audio sender's SSRC is changed, the media channel stops
657// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 19:26:01658TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 23:30:35659 CreateVideoRtpSender();
deadbeeffac06552015-11-25 19:26:01660
Taylor Brandstetterba29c6a2016-06-27 23:30:35661 video_rtp_sender_->SetSsrc(kVideoSsrc2);
662 VerifyVideoChannelNoInput(kVideoSsrc);
663 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01664
Taylor Brandstetterba29c6a2016-06-27 23:30:35665 video_rtp_sender_ = nullptr;
666 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 19:26:01667}
668
skvladdc1c62c2016-03-17 02:07:43669TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
670 CreateAudioRtpSender();
671
skvladdc1c62c2016-03-17 02:07:43672 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35673 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36674 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43675
676 DestroyAudioRtpSender();
677}
678
Florent Castelli892acf02018-10-01 20:47:20679TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
680 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
681
682 RtpParameters params = audio_rtp_sender_->GetParameters();
683 ASSERT_EQ(1u, params.encodings.size());
684 params.encodings[0].max_bitrate_bps = 90000;
685 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
686
687 params = audio_rtp_sender_->GetParameters();
688 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
689 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
690
691 DestroyAudioRtpSender();
692}
693
694TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
695 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
696 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
697
698 audio_rtp_sender_ =
699 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
700 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
701 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
702
703 std::vector<RtpEncodingParameters> init_encodings(1);
704 init_encodings[0].max_bitrate_bps = 60000;
705 audio_rtp_sender_->set_init_send_encodings(init_encodings);
706
707 RtpParameters params = audio_rtp_sender_->GetParameters();
708 ASSERT_EQ(1u, params.encodings.size());
709 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
710
711 // Simulate the setLocalDescription call
712 std::vector<uint32_t> ssrcs(1, 1);
713 cricket::StreamParams stream_params =
714 cricket::CreateSimStreamParams("cname", ssrcs);
715 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-14 00:26:05716 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 20:47:20717 audio_rtp_sender_->SetSsrc(1);
718
719 params = audio_rtp_sender_->GetParameters();
720 ASSERT_EQ(1u, params.encodings.size());
721 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
722
723 DestroyAudioRtpSender();
724}
725
726TEST_F(RtpSenderReceiverTest,
727 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
728 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
729
730 RtpParameters params;
731 RTCError result = audio_rtp_sender_->SetParameters(params);
732 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
733 DestroyAudioRtpSender();
734}
735
Florent Castellicebf50f2018-05-03 13:31:53736TEST_F(RtpSenderReceiverTest,
737 AudioSenderMustCallGetParametersBeforeSetParameters) {
738 CreateAudioRtpSender();
739
740 RtpParameters params;
741 RTCError result = audio_rtp_sender_->SetParameters(params);
742 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
743
744 DestroyAudioRtpSender();
745}
746
747TEST_F(RtpSenderReceiverTest,
748 AudioSenderSetParametersInvalidatesTransactionId) {
749 CreateAudioRtpSender();
750
751 RtpParameters params = audio_rtp_sender_->GetParameters();
752 EXPECT_EQ(1u, params.encodings.size());
753 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
754 RTCError result = audio_rtp_sender_->SetParameters(params);
755 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
756
757 DestroyAudioRtpSender();
758}
759
760TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
761 CreateAudioRtpSender();
762
763 RtpParameters params = audio_rtp_sender_->GetParameters();
764 params.transaction_id = "";
765 RTCError result = audio_rtp_sender_->SetParameters(params);
766 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
767
768 DestroyAudioRtpSender();
769}
770
771TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
772 CreateAudioRtpSender();
773
774 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23775 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:53776 auto saved_transaction_id = params.transaction_id;
777 params = audio_rtp_sender_->GetParameters();
778 EXPECT_NE(saved_transaction_id, params.transaction_id);
779
780 DestroyAudioRtpSender();
781}
782
783TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
784 CreateAudioRtpSender();
785
786 RtpParameters params = audio_rtp_sender_->GetParameters();
787 RtpParameters second_params = audio_rtp_sender_->GetParameters();
788
789 RTCError result = audio_rtp_sender_->SetParameters(params);
790 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 23:02:32791 DestroyAudioRtpSender();
792}
793
794TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
795 CreateAudioRtpSender();
796 RtpParameters params = audio_rtp_sender_->GetParameters();
797 EXPECT_EQ(1u, params.encodings.size());
798
Florent Castelli87b3c512018-07-18 14:00:28799 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:32800 params.mid = "dummy_mid";
801 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
802 audio_rtp_sender_->SetParameters(params).type());
803 params = audio_rtp_sender_->GetParameters();
804
Seth Hampson2d2c8882018-05-16 23:02:32805 DestroyAudioRtpSender();
806}
807
808TEST_F(RtpSenderReceiverTest,
809 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
810 CreateAudioRtpSender();
811 RtpParameters params = audio_rtp_sender_->GetParameters();
812 EXPECT_EQ(1u, params.encodings.size());
813
Henrik Grunelle1301a82018-12-13 12:13:22814 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Emircan Uysaler78323432019-02-08 20:41:39815 // scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22816 params.encodings[0].codec_payload_type = 1;
817 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
818 audio_rtp_sender_->SetParameters(params).type());
819 params = audio_rtp_sender_->GetParameters();
820
Seth Hampson2d2c8882018-05-16 23:02:32821 params.encodings[0].fec = RtpFecParameters();
822 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
823 audio_rtp_sender_->SetParameters(params).type());
824 params = audio_rtp_sender_->GetParameters();
825
826 params.encodings[0].rtx = RtpRtxParameters();
827 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
828 audio_rtp_sender_->SetParameters(params).type());
829 params = audio_rtp_sender_->GetParameters();
830
831 params.encodings[0].dtx = DtxStatus::ENABLED;
832 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
833 audio_rtp_sender_->SetParameters(params).type());
834 params = audio_rtp_sender_->GetParameters();
835
836 params.encodings[0].ptime = 1;
837 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
838 audio_rtp_sender_->SetParameters(params).type());
839 params = audio_rtp_sender_->GetParameters();
840
Emircan Uysaler78323432019-02-08 20:41:39841 params.encodings[0].rid = "dummy_rid";
842 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
843 audio_rtp_sender_->SetParameters(params).type());
844 params = audio_rtp_sender_->GetParameters();
845
Seth Hampson2d2c8882018-05-16 23:02:32846 params.encodings[0].dependency_rids.push_back("dummy_rid");
847 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
848 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 13:31:53849
850 DestroyAudioRtpSender();
851}
852
Taylor Brandstetterba29c6a2016-06-27 23:30:35853TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
854 CreateAudioRtpSender();
855
856 EXPECT_EQ(-1, voice_media_channel_->max_bps());
857 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23858 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 20:09:01859 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:27860 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:36861 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:35862
863 // Read back the parameters and verify they have been changed.
864 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23865 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:27866 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:35867
868 // Verify that the audio channel received the new parameters.
869 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:23870 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 09:54:27871 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:35872
873 // Verify that the global bitrate limit has not been changed.
874 EXPECT_EQ(-1, voice_media_channel_->max_bps());
875
876 DestroyAudioRtpSender();
877}
878
Seth Hampson24722b32017-12-22 17:36:42879TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
880 CreateAudioRtpSender();
881
882 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23883 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42884 EXPECT_EQ(webrtc::kDefaultBitratePriority,
885 params.encodings[0].bitrate_priority);
886 double new_bitrate_priority = 2.0;
887 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:36888 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:42889
890 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:23891 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42892 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
893
894 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:23895 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:42896 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
897
898 DestroyAudioRtpSender();
899}
900
skvladdc1c62c2016-03-17 02:07:43901TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
902 CreateVideoRtpSender();
903
skvladdc1c62c2016-03-17 02:07:43904 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:35905 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 23:02:36906 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-17 02:07:43907
908 DestroyVideoRtpSender();
909}
910
Florent Castelli892acf02018-10-01 20:47:20911TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
912 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
913
914 RtpParameters params = video_rtp_sender_->GetParameters();
915 ASSERT_EQ(1u, params.encodings.size());
916 params.encodings[0].max_bitrate_bps = 90000;
917 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
918
919 params = video_rtp_sender_->GetParameters();
920 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
921 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
922
923 DestroyVideoRtpSender();
924}
925
926TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
927 AddVideoTrack(false);
928
929 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
930 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
931 video_rtp_sender_->set_stream_ids({local_stream_->id()});
932
933 std::vector<RtpEncodingParameters> init_encodings(2);
934 init_encodings[0].max_bitrate_bps = 60000;
935 init_encodings[1].max_bitrate_bps = 900000;
936 video_rtp_sender_->set_init_send_encodings(init_encodings);
937
938 RtpParameters params = video_rtp_sender_->GetParameters();
939 ASSERT_EQ(2u, params.encodings.size());
940 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
941 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
942
943 // Simulate the setLocalDescription call
944 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53945 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:20946 for (int i = 0; i < 2; ++i)
947 ssrcs.push_back(kVideoSsrcSimulcast + i);
948 cricket::StreamParams stream_params =
949 cricket::CreateSimStreamParams("cname", ssrcs);
950 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-14 00:26:05951 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 20:47:20952 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
953
954 params = video_rtp_sender_->GetParameters();
955 ASSERT_EQ(2u, params.encodings.size());
956 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
957 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
958
959 DestroyVideoRtpSender();
960}
961
962TEST_F(RtpSenderReceiverTest,
963 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
964 AddVideoTrack(false);
965
966 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
967 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
968 video_rtp_sender_->set_stream_ids({local_stream_->id()});
969
970 std::vector<RtpEncodingParameters> init_encodings(1);
971 init_encodings[0].max_bitrate_bps = 60000;
972 video_rtp_sender_->set_init_send_encodings(init_encodings);
973
974 RtpParameters params = video_rtp_sender_->GetParameters();
975 ASSERT_EQ(1u, params.encodings.size());
976 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
977
978 // Simulate the setLocalDescription call as if the user used SDP munging
979 // to enable simulcast
980 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 09:11:53981 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 20:47:20982 for (int i = 0; i < 2; ++i)
983 ssrcs.push_back(kVideoSsrcSimulcast + i);
984 cricket::StreamParams stream_params =
985 cricket::CreateSimStreamParams("cname", ssrcs);
986 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-14 00:26:05987 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 20:47:20988 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
989
990 params = video_rtp_sender_->GetParameters();
991 ASSERT_EQ(2u, params.encodings.size());
992 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
993
994 DestroyVideoRtpSender();
995}
996
997TEST_F(RtpSenderReceiverTest,
998 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
999 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
1000
1001 RtpParameters params;
1002 RTCError result = video_rtp_sender_->SetParameters(params);
1003 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1004 DestroyVideoRtpSender();
1005}
1006
Florent Castellicebf50f2018-05-03 13:31:531007TEST_F(RtpSenderReceiverTest,
1008 VideoSenderMustCallGetParametersBeforeSetParameters) {
1009 CreateVideoRtpSender();
1010
1011 RtpParameters params;
1012 RTCError result = video_rtp_sender_->SetParameters(params);
1013 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1014
1015 DestroyVideoRtpSender();
1016}
1017
1018TEST_F(RtpSenderReceiverTest,
1019 VideoSenderSetParametersInvalidatesTransactionId) {
1020 CreateVideoRtpSender();
1021
1022 RtpParameters params = video_rtp_sender_->GetParameters();
1023 EXPECT_EQ(1u, params.encodings.size());
1024 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1025 RTCError result = video_rtp_sender_->SetParameters(params);
1026 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1027
1028 DestroyVideoRtpSender();
1029}
1030
1031TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1032 CreateVideoRtpSender();
1033
1034 RtpParameters params = video_rtp_sender_->GetParameters();
1035 params.transaction_id = "";
1036 RTCError result = video_rtp_sender_->SetParameters(params);
1037 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1038
1039 DestroyVideoRtpSender();
1040}
1041
1042TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1043 CreateVideoRtpSender();
1044
1045 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231046 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 13:31:531047 auto saved_transaction_id = params.transaction_id;
1048 params = video_rtp_sender_->GetParameters();
1049 EXPECT_NE(saved_transaction_id, params.transaction_id);
1050
1051 DestroyVideoRtpSender();
1052}
1053
1054TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1055 CreateVideoRtpSender();
1056
1057 RtpParameters params = video_rtp_sender_->GetParameters();
1058 RtpParameters second_params = video_rtp_sender_->GetParameters();
1059
1060 RTCError result = video_rtp_sender_->SetParameters(params);
1061 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1062
1063 DestroyVideoRtpSender();
1064}
1065
Seth Hampson2d2c8882018-05-16 23:02:321066TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1067 CreateVideoRtpSender();
1068 RtpParameters params = video_rtp_sender_->GetParameters();
1069 EXPECT_EQ(1u, params.encodings.size());
1070
Florent Castelli87b3c512018-07-18 14:00:281071 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 23:02:321072 params.mid = "dummy_mid";
1073 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1074 video_rtp_sender_->SetParameters(params).type());
1075 params = video_rtp_sender_->GetParameters();
1076
Seth Hampson2d2c8882018-05-16 23:02:321077 DestroyVideoRtpSender();
1078}
1079
1080TEST_F(RtpSenderReceiverTest,
1081 VideoSenderCantSetUnimplementedEncodingParameters) {
1082 CreateVideoRtpSender();
1083 RtpParameters params = video_rtp_sender_->GetParameters();
1084 EXPECT_EQ(1u, params.encodings.size());
1085
Henrik Grunelle1301a82018-12-13 12:13:221086 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Emircan Uysaler78323432019-02-08 20:41:391087 // scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:221088 params.encodings[0].codec_payload_type = 1;
1089 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1090 video_rtp_sender_->SetParameters(params).type());
1091 params = video_rtp_sender_->GetParameters();
1092
Seth Hampson2d2c8882018-05-16 23:02:321093 params.encodings[0].fec = RtpFecParameters();
1094 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1095 video_rtp_sender_->SetParameters(params).type());
1096 params = video_rtp_sender_->GetParameters();
1097
1098 params.encodings[0].rtx = RtpRtxParameters();
1099 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1100 video_rtp_sender_->SetParameters(params).type());
1101 params = video_rtp_sender_->GetParameters();
1102
1103 params.encodings[0].dtx = DtxStatus::ENABLED;
1104 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1105 video_rtp_sender_->SetParameters(params).type());
1106 params = video_rtp_sender_->GetParameters();
1107
1108 params.encodings[0].ptime = 1;
1109 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1110 video_rtp_sender_->SetParameters(params).type());
1111 params = video_rtp_sender_->GetParameters();
1112
Emircan Uysaler78323432019-02-08 20:41:391113 params.encodings[0].rid = "dummy_rid";
1114 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1115 video_rtp_sender_->SetParameters(params).type());
1116 params = video_rtp_sender_->GetParameters();
1117
Seth Hampson2d2c8882018-05-16 23:02:321118 params.encodings[0].dependency_rids.push_back("dummy_rid");
1119 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1120 video_rtp_sender_->SetParameters(params).type());
1121
1122 DestroyVideoRtpSender();
1123}
1124
Florent Castellic1a0bcb2019-01-29 13:26:481125TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1126 CreateVideoRtpSender();
1127
1128 RtpParameters params = video_rtp_sender_->GetParameters();
1129 params.encodings[0].scale_resolution_down_by = 2;
1130
1131 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1132 params = video_rtp_sender_->GetParameters();
1133 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1134
1135 DestroyVideoRtpSender();
1136}
1137
1138TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1139 CreateVideoRtpSender();
1140
1141 RtpParameters params = video_rtp_sender_->GetParameters();
1142 params.encodings[0].scale_resolution_down_by = 0.5;
1143 RTCError result = video_rtp_sender_->SetParameters(params);
1144 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1145
1146 DestroyVideoRtpSender();
1147}
1148
Florent Castelli892acf02018-10-01 20:47:201149TEST_F(RtpSenderReceiverTest,
1150 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1151 CreateVideoRtpSenderWithSimulcast();
1152 RtpParameters params = video_rtp_sender_->GetParameters();
1153 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1154
Henrik Grunelle1301a82018-12-13 12:13:221155 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Emircan Uysaler78323432019-02-08 20:41:391156 // scale_framerate_down_by, rid, dependency_rids.
Florent Castelli892acf02018-10-01 20:47:201157 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:221158 params.encodings[i].codec_payload_type = 1;
1159 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1160 video_rtp_sender_->SetParameters(params).type());
1161 params = video_rtp_sender_->GetParameters();
1162
Florent Castelli892acf02018-10-01 20:47:201163 params.encodings[i].fec = RtpFecParameters();
1164 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1165 video_rtp_sender_->SetParameters(params).type());
1166 params = video_rtp_sender_->GetParameters();
1167
1168 params.encodings[i].rtx = RtpRtxParameters();
1169 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1170 video_rtp_sender_->SetParameters(params).type());
1171 params = video_rtp_sender_->GetParameters();
1172
1173 params.encodings[i].dtx = DtxStatus::ENABLED;
1174 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1175 video_rtp_sender_->SetParameters(params).type());
1176 params = video_rtp_sender_->GetParameters();
1177
1178 params.encodings[i].ptime = 1;
1179 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1180 video_rtp_sender_->SetParameters(params).type());
1181 params = video_rtp_sender_->GetParameters();
1182
Emircan Uysaler78323432019-02-08 20:41:391183 params.encodings[i].rid = "dummy_rid";
1184 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1185 video_rtp_sender_->SetParameters(params).type());
1186 params = video_rtp_sender_->GetParameters();
1187
Florent Castelli892acf02018-10-01 20:47:201188 params.encodings[i].dependency_rids.push_back("dummy_rid");
1189 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1190 video_rtp_sender_->SetParameters(params).type());
1191 }
1192
1193 DestroyVideoRtpSender();
1194}
1195
Seth Hampson2d2c8882018-05-16 23:02:321196// A video sender can have multiple simulcast layers, in which case it will
1197// contain multiple RtpEncodingParameters. This tests that if this is the case
1198// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1199// for any encodings besides at index 0, because these are both implemented
1200// "per-sender."
1201TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1202 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201203 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 23:02:321204 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201205 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 23:02:321206
1207 params.encodings[1].bitrate_priority = 2.0;
1208 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1209 video_rtp_sender_->SetParameters(params).type());
1210 params = video_rtp_sender_->GetParameters();
1211
Seth Hampson2d2c8882018-05-16 23:02:321212 DestroyVideoRtpSender();
1213}
1214
Florent Castelli892acf02018-10-01 20:47:201215TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1216 // Add a simulcast specific send stream that contains 2 encoding parameters.
1217 CreateVideoRtpSenderWithSimulcast();
1218 RtpParameters params = video_rtp_sender_->GetParameters();
1219 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1220
1221 for (size_t i = 0; i < params.encodings.size(); i++) {
1222 params.encodings[i].ssrc = 1337;
1223 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1224 video_rtp_sender_->SetParameters(params).type());
1225 params = video_rtp_sender_->GetParameters();
1226 }
1227
1228 DestroyVideoRtpSender();
1229}
1230
Ă…sa Persson55659812018-06-18 15:51:321231TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 23:30:351232 CreateVideoRtpSender();
1233
1234 EXPECT_EQ(-1, video_media_channel_->max_bps());
1235 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231236 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321237 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 20:09:011238 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 15:51:321239 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 09:54:271240 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 23:02:361241 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 23:30:351242
1243 // Read back the parameters and verify they have been changed.
1244 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231245 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321246 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271247 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351248
1249 // Verify that the video channel received the new parameters.
1250 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231251 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321252 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 09:54:271253 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 23:30:351254
1255 // Verify that the global bitrate limit has not been changed.
1256 EXPECT_EQ(-1, video_media_channel_->max_bps());
1257
1258 DestroyVideoRtpSender();
1259}
1260
Ă…sa Persson55659812018-06-18 15:51:321261TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1262 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 20:47:201263 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 15:51:321264
1265 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 20:47:201266 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321267 params.encodings[0].min_bitrate_bps = 100;
1268 params.encodings[0].max_bitrate_bps = 1000;
1269 params.encodings[1].min_bitrate_bps = 200;
1270 params.encodings[1].max_bitrate_bps = 2000;
1271 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1272
1273 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 20:47:201274 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1275 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 15:51:321276 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1277 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1278 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1279 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1280
1281 DestroyVideoRtpSender();
1282}
1283
Seth Hampson24722b32017-12-22 17:36:421284TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1285 CreateVideoRtpSender();
1286
1287 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231288 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421289 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1290 params.encodings[0].bitrate_priority);
1291 double new_bitrate_priority = 2.0;
1292 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 23:02:361293 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 17:36:421294
1295 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 10:53:231296 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421297 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1298
1299 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 10:53:231300 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 17:36:421301 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1302
1303 DestroyVideoRtpSender();
1304}
1305
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301306TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1307 CreateAudioRtpReceiver();
1308
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301309 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351310 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301311 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1312
1313 DestroyAudioRtpReceiver();
1314}
1315
1316TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1317 CreateVideoRtpReceiver();
1318
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301319 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 23:30:351320 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 18:40:301321 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1322
1323 DestroyVideoRtpReceiver();
1324}
1325
Florent Castelli38332cd2018-11-20 13:08:061326TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1327 CreateVideoRtpReceiverWithSimulcast({}, 2);
1328
1329 RtpParameters params = video_rtp_receiver_->GetParameters();
1330 EXPECT_EQ(2u, params.encodings.size());
1331
1332 DestroyVideoRtpReceiver();
1333}
1334
pbos5214a0a2016-12-16 23:39:111335// Test that makes sure that a video track content hint translates to the proper
1336// value for sources that are not screencast.
1337TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1338 CreateVideoRtpSender();
1339
1340 video_track_->set_enabled(true);
1341
1342 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 09:54:271343 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111344 // No content hint should be set by default.
1345 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1346 video_track_->content_hint());
1347 // Setting detailed should turn a non-screencast source into screencast mode.
1348 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 09:54:271349 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111350 // Removing the content hint should turn the track back into non-screencast
1351 // mode.
1352 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271353 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111354 // Setting fluid should remain in non-screencast mode (its default).
1355 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 09:54:271356 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101357 // Setting text should have the same effect as Detailed
1358 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1359 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111360
1361 DestroyVideoRtpSender();
1362}
1363
1364// Test that makes sure that a video track content hint translates to the proper
1365// value for screencast sources.
1366TEST_F(RtpSenderReceiverTest,
1367 PropagatesVideoTrackContentHintForScreencastSource) {
1368 CreateVideoRtpSender(true);
1369
1370 video_track_->set_enabled(true);
1371
1372 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 09:54:271373 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111374 // No content hint should be set by default.
1375 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1376 video_track_->content_hint());
1377 // Setting fluid should turn a screencast source into non-screencast mode.
1378 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 09:54:271379 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111380 // Removing the content hint should turn the track back into screencast mode.
1381 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271382 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111383 // Setting detailed should still remain in screencast mode (its default).
1384 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 09:54:271385 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 06:53:101386 // Setting text should have the same effect as Detailed
1387 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1388 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111389
1390 DestroyVideoRtpSender();
1391}
1392
1393// Test that makes sure any content hints that are set on a track before
1394// VideoRtpSender is ready to send are still applied when it gets ready to send.
1395TEST_F(RtpSenderReceiverTest,
1396 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1397 AddVideoTrack();
1398 // Setting detailed overrides the default non-screencast mode. This should be
1399 // applied even if the track is set on construction.
1400 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 20:03:361401 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1402 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1403 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-14 00:26:051404 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 23:39:111405 video_track_->set_enabled(true);
1406
1407 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 14:47:431408 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111409
1410 // Verify that the content hint is accounted for when video_rtp_sender_ does
1411 // get enabled.
1412 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 09:54:271413 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111414
1415 // And removing the hint should go back to false (to verify that false was
1416 // default correctly).
1417 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 09:54:271418 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 23:39:111419
1420 DestroyVideoRtpSender();
1421}
1422
deadbeef20cb0c12017-02-02 04:27:001423TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1424 CreateAudioRtpSender();
1425 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1426}
1427
1428TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1429 CreateVideoRtpSender();
1430 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1431}
1432
1433// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1434// true/false from CanSendDtmf based on what |voice_channel_| returns.
1435TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1436 AddDtmfCodec();
1437 CreateAudioRtpSender();
1438 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1439 ASSERT_NE(nullptr, dtmf_sender);
1440 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1441}
1442
1443TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1444 CreateAudioRtpSender();
1445 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1446 ASSERT_NE(nullptr, dtmf_sender);
1447 // DTMF codec has not been added, as it was in the above test.
1448 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1449}
1450
1451TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1452 AddDtmfCodec();
1453 CreateAudioRtpSender();
1454 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1455 ASSERT_NE(nullptr, dtmf_sender);
1456
1457 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1458
1459 // Insert DTMF
1460 const int expected_duration = 90;
1461 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1462
1463 // Verify
1464 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1465 kDefaultTimeout);
1466 const uint32_t send_ssrc =
1467 voice_media_channel_->send_streams()[0].first_ssrc();
1468 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1469 send_ssrc, 0, expected_duration));
1470 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1471 send_ssrc, 1, expected_duration));
1472 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1473 send_ssrc, 2, expected_duration));
1474}
1475
1476// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1477// destroyed, which is needed for the DTMF sender.
1478TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1479 CreateAudioRtpSender();
1480 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1481 audio_rtp_sender_ = nullptr;
1482 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1483}
1484
Benjamin Wright84583f62018-10-04 21:22:341485// Validate that the default FrameEncryptor setting is nullptr.
1486TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1487 CreateAudioRtpSender();
1488 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1489 new FakeFrameEncryptor());
1490 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1491 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1492 EXPECT_EQ(fake_frame_encryptor.get(),
1493 audio_rtp_sender_->GetFrameEncryptor().get());
1494}
1495
Benjamin Wrightc462a6e2018-10-26 20:16:161496// Validate that setting a FrameEncryptor after the send stream is stopped does
1497// nothing.
1498TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1499 CreateAudioRtpSender();
1500 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1501 new FakeFrameEncryptor());
1502 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1503 audio_rtp_sender_->Stop();
1504 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1505 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1506}
1507
Benjamin Wright84583f62018-10-04 21:22:341508// Validate that the default FrameEncryptor setting is nullptr.
1509TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1510 CreateAudioRtpReceiver();
1511 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1512 new FakeFrameDecryptor());
1513 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1514 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1515 EXPECT_EQ(fake_frame_decryptor.get(),
1516 audio_rtp_receiver_->GetFrameDecryptor().get());
1517}
1518
Benjamin Wrightc462a6e2018-10-26 20:16:161519// Validate that the default FrameEncryptor setting is nullptr.
1520TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1521 CreateAudioRtpReceiver();
1522 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1523 new FakeFrameDecryptor());
1524 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1525 audio_rtp_receiver_->Stop();
1526 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1527 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1528}
1529
1530// Validate that the default FrameEncryptor setting is nullptr.
1531TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1532 CreateVideoRtpSender();
1533 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1534 new FakeFrameEncryptor());
1535 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1536 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1537 EXPECT_EQ(fake_frame_encryptor.get(),
1538 video_rtp_sender_->GetFrameEncryptor().get());
1539}
1540
1541// Validate that setting a FrameEncryptor after the send stream is stopped does
1542// nothing.
1543TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1544 CreateVideoRtpSender();
1545 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1546 new FakeFrameEncryptor());
1547 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1548 video_rtp_sender_->Stop();
1549 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1550 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1551}
1552
1553// Validate that the default FrameEncryptor setting is nullptr.
1554TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1555 CreateVideoRtpReceiver();
1556 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1557 new FakeFrameDecryptor());
1558 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1559 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1560 EXPECT_EQ(fake_frame_decryptor.get(),
1561 video_rtp_receiver_->GetFrameDecryptor().get());
1562}
1563
1564// Validate that the default FrameEncryptor setting is nullptr.
1565TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1566 CreateVideoRtpReceiver();
1567 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1568 new FakeFrameDecryptor());
1569 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1570 video_rtp_receiver_->Stop();
1571 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1572 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1573}
1574
deadbeef70ab1a12015-09-28 23:53:551575} // namespace webrtc