blob: ec1e9493352137fce3628a9836b0da1537162a2a [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * 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 16:53:55 -07009 */
10
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
12#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070014#include <string>
Tommif888bb52015-12-12 01:37:01 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070017
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "absl/memory/memory.h"
19#include "absl/types/optional.h"
20#include "api/audio_options.h"
21#include "api/crypto/cryptooptions.h"
22#include "api/crypto/framedecryptorinterface.h"
23#include "api/crypto/frameencryptorinterface.h"
24#include "api/dtmfsenderinterface.h"
25#include "api/mediastreaminterface.h"
26#include "api/rtcerror.h"
Seth Hampson24722b32017-12-22 09:36:42 -080027#include "api/rtpparameters.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070028#include "api/test/fake_frame_decryptor.h"
29#include "api/test/fake_frame_encryptor.h"
Yves Gerey3e707812018-11-28 16:47:49 +010030#include "logging/rtc_event_log/rtc_event_log.h"
31#include "media/base/codec.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "media/base/fakemediaengine.h"
Yves Gerey3e707812018-11-28 16:47:49 +010033#include "media/base/mediachannel.h"
34#include "media/base/mediaconfig.h"
35#include "media/base/mediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080036#include "media/base/rtpdataengine.h"
Yves Gerey3e707812018-11-28 16:47:49 +010037#include "media/base/streamparams.h"
Seth Hampson2d2c8882018-05-16 16:02:32 -070038#include "media/base/testutils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020039#include "media/engine/fakewebrtccall.h"
Yves Gerey3e707812018-11-28 16:47:49 +010040#include "p2p/base/dtlstransportinternal.h"
Zhi Huange830e682018-03-30 10:48:35 -070041#include "p2p/base/fakedtlstransport.h"
Yves Gerey3e707812018-11-28 16:47:49 +010042#include "p2p/base/p2pconstants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020043#include "pc/audiotrack.h"
Yves Gerey3e707812018-11-28 16:47:49 +010044#include "pc/channel.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020045#include "pc/channelmanager.h"
Yves Gerey3e707812018-11-28 16:47:49 +010046#include "pc/dtlssrtptransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020047#include "pc/localaudiosource.h"
48#include "pc/mediastream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020049#include "pc/rtpreceiver.h"
50#include "pc/rtpsender.h"
Yves Gerey3e707812018-11-28 16:47:49 +010051#include "pc/rtptransportinternal.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020052#include "pc/test/fakevideotracksource.h"
53#include "pc/videotrack.h"
Yves Gerey3e707812018-11-28 16:47:49 +010054#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020055#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010056#include "rtc_base/scoped_ref_ptr.h"
57#include "rtc_base/third_party/sigslot/sigslot.h"
58#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020059#include "test/gmock.h"
60#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070061
62using ::testing::_;
63using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070064using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070065using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070066
deadbeef20cb0c12017-02-01 20:27:00 -080067namespace {
68
Seth Hampson845e8782018-03-02 11:34:10 -080069static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070070static const char kVideoTrackId[] = "video_1";
71static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020072static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080073static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020074static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080075static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020076static const uint32_t kVideoSsrcSimulcast = 102;
77static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080078static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080079} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070080
81namespace webrtc {
82
deadbeef20cb0c12017-02-01 20:27:00 -080083class RtpSenderReceiverTest : public testing::Test,
84 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070085 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070086 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080087 : network_thread_(rtc::Thread::Current()),
88 worker_thread_(rtc::Thread::Current()),
89 // Create fake media engine/etc. so we can create channels to use to
90 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070091 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020092 channel_manager_(absl::WrapUnique(media_engine_),
93 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080094 worker_thread_,
95 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010096 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080097 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070098 // Create channels to be used by the RtpSenders and RtpReceivers.
99 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800100 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200101 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700102 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
103 rtp_transport_ = CreateDtlsSrtpTransport();
104
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700105 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700106 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700107 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
108 srtp_required, webrtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700109 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700110 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100111 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
112 srtp_required, webrtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800113 voice_channel_->Enable(true);
114 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700115 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
116 video_media_channel_ = media_engine_->GetVideoChannel(0);
117 RTC_CHECK(voice_channel_);
118 RTC_CHECK(video_channel_);
119 RTC_CHECK(voice_media_channel_);
120 RTC_CHECK(video_media_channel_);
121
122 // Create streams for predefined SSRCs. Streams need to exist in order
123 // for the senders and receievers to apply parameters to them.
124 // Normally these would be created by SetLocalDescription and
125 // SetRemoteDescription.
126 voice_media_channel_->AddSendStream(
127 cricket::StreamParams::CreateLegacy(kAudioSsrc));
128 voice_media_channel_->AddRecvStream(
129 cricket::StreamParams::CreateLegacy(kAudioSsrc));
130 voice_media_channel_->AddSendStream(
131 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
132 voice_media_channel_->AddRecvStream(
133 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
134 video_media_channel_->AddSendStream(
135 cricket::StreamParams::CreateLegacy(kVideoSsrc));
136 video_media_channel_->AddRecvStream(
137 cricket::StreamParams::CreateLegacy(kVideoSsrc));
138 video_media_channel_->AddSendStream(
139 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
140 video_media_channel_->AddRecvStream(
141 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700142 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700143
Zhi Huange830e682018-03-30 10:48:35 -0700144 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200145 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
146 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700147 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
148 /*rtcp_dtls_transport=*/nullptr);
149 return dtls_srtp_transport;
150 }
151
deadbeef20cb0c12017-02-01 20:27:00 -0800152 // Needed to use DTMF sender.
153 void AddDtmfCodec() {
154 cricket::AudioSendParameters params;
155 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
156 0, 1);
157 params.codecs.push_back(kTelephoneEventCodec);
158 voice_media_channel_->SetSendParameters(params);
159 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700160
pbos5214a0a2016-12-16 15:39:11 -0800161 void AddVideoTrack() { AddVideoTrack(false); }
162
163 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100164 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800165 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700166 video_track_ =
167 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800168 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700169 }
170
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700171 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
172
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100173 void CreateAudioRtpSender(
174 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800176 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800177 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700178 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
179 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
180 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800181 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800182 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800183 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
184 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700186 }
187
Steve Anton02ee47c2018-01-10 16:26:06 -0800188 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700189 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800190 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800191 }
192
deadbeef20cb0c12017-02-01 20:27:00 -0800193 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
194
Seth Hampson2d2c8882018-05-16 16:02:32 -0700195 void CreateVideoRtpSender(uint32_t ssrc) {
196 CreateVideoRtpSender(false, ssrc);
197 }
198
pbos5214a0a2016-12-16 15:39:11 -0800199 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
200
Florent Castelli892acf02018-10-01 22:47:20 +0200201 void CreateVideoRtpSenderWithSimulcast(
202 int num_layers = kVideoSimulcastLayerCount) {
203 std::vector<uint32_t> ssrcs;
204 for (int i = 0; i < num_layers; ++i)
205 ssrcs.push_back(kVideoSsrcSimulcast + i);
206 cricket::StreamParams stream_params =
207 cricket::CreateSimStreamParams("cname", ssrcs);
208 video_media_channel_->AddSendStream(stream_params);
209 uint32_t primary_ssrc = stream_params.first_ssrc();
210 CreateVideoRtpSender(primary_ssrc);
211 }
212
Seth Hampson2d2c8882018-05-16 16:02:32 -0700213 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800214 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700215 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
216 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
217 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800218 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700219 video_rtp_sender_->SetSsrc(ssrc);
220 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700221 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800222 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700223 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800224 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800225 }
226
deadbeef70ab1a12015-09-28 16:53:55 -0700227 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700228 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700229 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700230 }
231
232 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700233 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700234 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700235 }
236
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100237 void CreateAudioRtpReceiver(
238 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
239 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800240 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800241 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800242 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700243 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700244 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700245 }
246
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100247 void CreateVideoRtpReceiver(
248 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800249 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800250 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800251 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800252 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100253 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700254 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700255 }
256
Florent Castelli38332cd2018-11-20 14:08:06 +0100257 void CreateVideoRtpReceiverWithSimulcast(
258 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
259 int num_layers = kVideoSimulcastLayerCount) {
260 std::vector<uint32_t> ssrcs;
261 for (int i = 0; i < num_layers; ++i)
262 ssrcs.push_back(kVideoSsrcSimulcast + i);
263 cricket::StreamParams stream_params =
264 cricket::CreateSimStreamParams("cname", ssrcs);
265 video_media_channel_->AddRecvStream(stream_params);
266 uint32_t primary_ssrc = stream_params.first_ssrc();
267
268 video_rtp_receiver_ = new VideoRtpReceiver(
269 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
270 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
271 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
272 video_track_ = video_rtp_receiver_->video_track();
273 }
274
deadbeef70ab1a12015-09-28 16:53:55 -0700275 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700276 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700277 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700278 }
279
280 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700281 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282 VerifyVideoChannelNoOutput();
283 }
284
285 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
286
287 void VerifyVoiceChannelInput(uint32_t ssrc) {
288 // Verify that the media channel has an audio source, and the stream isn't
289 // muted.
290 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
291 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
292 }
293
294 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
295
296 void VerifyVideoChannelInput(uint32_t ssrc) {
297 // Verify that the media channel has a video source,
298 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
299 }
300
301 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
302
303 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
304 // Verify that the media channel's source is reset.
305 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
306 }
307
308 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
309
310 void VerifyVideoChannelNoInput(uint32_t ssrc) {
311 // Verify that the media channel's source is reset.
312 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
313 }
314
315 void VerifyVoiceChannelOutput() {
316 // Verify that the volume is initialized to 1.
317 double volume;
318 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
319 EXPECT_EQ(1, volume);
320 }
321
322 void VerifyVideoChannelOutput() {
323 // Verify that the media channel has a sink.
324 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
325 }
326
327 void VerifyVoiceChannelNoOutput() {
328 // Verify that the volume is reset to 0.
329 double volume;
330 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
331 EXPECT_EQ(0, volume);
332 }
333
334 void VerifyVideoChannelNoOutput() {
335 // Verify that the media channel's sink is reset.
336 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700337 }
338
339 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800340 rtc::Thread* const network_thread_;
341 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700342 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700343 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
344 // the |channel_manager|.
345 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
346 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800347 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700348 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700349 cricket::ChannelManager channel_manager_;
350 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 cricket::VoiceChannel* voice_channel_;
352 cricket::VideoChannel* video_channel_;
353 cricket::FakeVoiceMediaChannel* voice_media_channel_;
354 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700355 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
356 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
357 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
358 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800359 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700360 rtc::scoped_refptr<VideoTrackInterface> video_track_;
361 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800362 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700363};
364
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700365// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700366// and disassociated with an AudioRtpSender.
367TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
368 CreateAudioRtpSender();
369 DestroyAudioRtpSender();
370}
371
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700372// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700373// disassociated with a VideoRtpSender.
374TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
375 CreateVideoRtpSender();
376 DestroyVideoRtpSender();
377}
378
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700379// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700380// associated and disassociated with an AudioRtpReceiver.
381TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
382 CreateAudioRtpReceiver();
383 DestroyAudioRtpReceiver();
384}
385
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386// Test that |video_channel_| is updated when a remote video track is
387// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700388TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
389 CreateVideoRtpReceiver();
390 DestroyVideoRtpReceiver();
391}
392
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100393TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
394 CreateAudioRtpReceiver({local_stream_});
395 DestroyAudioRtpReceiver();
396}
397
398TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
399 CreateVideoRtpReceiver({local_stream_});
400 DestroyVideoRtpReceiver();
401}
402
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403// Test that the AudioRtpSender applies options from the local audio source.
404TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
405 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100406 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800407 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700408 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700409
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100410 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700411
412 DestroyAudioRtpSender();
413}
414
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700415// Test that the stream is muted when the track is disabled, and unmuted when
416// the track is enabled.
417TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
418 CreateAudioRtpSender();
419
420 audio_track_->set_enabled(false);
421 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
422
423 audio_track_->set_enabled(true);
424 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
425
426 DestroyAudioRtpSender();
427}
428
429// Test that the volume is set to 0 when the track is disabled, and back to
430// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700431TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
432 CreateAudioRtpReceiver();
433
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700434 double volume;
435 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
436 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700437
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700438 audio_track_->set_enabled(false);
439 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
440 EXPECT_EQ(0, volume);
441
deadbeef70ab1a12015-09-28 16:53:55 -0700442 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
444 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700445
446 DestroyAudioRtpReceiver();
447}
448
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700449// Currently no action is taken when a remote video track is disabled or
450// enabled, so there's nothing to test here, other than what is normally
451// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700452TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
453 CreateVideoRtpSender();
454
deadbeef70ab1a12015-09-28 16:53:55 -0700455 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700456 video_track_->set_enabled(true);
457
458 DestroyVideoRtpSender();
459}
460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461// Test that the state of the video track created by the VideoRtpReceiver is
462// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100463TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
464 CreateVideoRtpReceiver();
465
466 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
467 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
468 video_track_->GetSource()->state());
469
470 DestroyVideoRtpReceiver();
471
472 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
473 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
474 video_track_->GetSource()->state());
475}
476
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700477// Currently no action is taken when a remote video track is disabled or
478// enabled, so there's nothing to test here, other than what is normally
479// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700480TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
481 CreateVideoRtpReceiver();
482
483 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700484 video_track_->set_enabled(true);
485
486 DestroyVideoRtpReceiver();
487}
488
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700489// Test that the AudioRtpReceiver applies volume changes from the track source
490// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700491TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
492 CreateAudioRtpReceiver();
493
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494 double volume;
495 audio_track_->GetSource()->SetVolume(0.5);
496 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
497 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700498
499 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700500 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501 audio_track_->GetSource()->SetVolume(0.8);
502 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
503 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700504
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700506 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700507 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
508 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 // Try changing volume one more time.
511 audio_track_->GetSource()->SetVolume(0.9);
512 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
513 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700514
515 DestroyAudioRtpReceiver();
516}
517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518// Test that the media channel isn't enabled for sending if the audio sender
519// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800520TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800521 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800522 rtc::scoped_refptr<AudioTrackInterface> track =
523 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524
525 // Track but no SSRC.
526 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
527 VerifyVoiceChannelNoInput();
528
529 // SSRC but no track.
530 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
531 audio_rtp_sender_->SetSsrc(kAudioSsrc);
532 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800533}
534
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535// Test that the media channel isn't enabled for sending if the video sender
536// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800537TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800538 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539
540 // Track but no SSRC.
541 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
542 VerifyVideoChannelNoInput();
543
544 // SSRC but no track.
545 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
546 video_rtp_sender_->SetSsrc(kVideoSsrc);
547 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800548}
549
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550// Test that the media channel is enabled for sending when the audio sender
551// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800552TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800553 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800554 rtc::scoped_refptr<AudioTrackInterface> track =
555 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556 audio_rtp_sender_->SetSsrc(kAudioSsrc);
557 audio_rtp_sender_->SetTrack(track);
558 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800559
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800561}
562
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563// Test that the media channel is enabled for sending when the audio sender
564// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800565TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800566 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800567 rtc::scoped_refptr<AudioTrackInterface> track =
568 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700569 audio_rtp_sender_->SetTrack(track);
570 audio_rtp_sender_->SetSsrc(kAudioSsrc);
571 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800572
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800574}
575
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576// Test that the media channel is enabled for sending when the video sender
577// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800578TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700579 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800580 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581 video_rtp_sender_->SetSsrc(kVideoSsrc);
582 video_rtp_sender_->SetTrack(video_track_);
583 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800584
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700585 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800586}
587
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588// Test that the media channel is enabled for sending when the video sender
589// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800590TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700591 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800592 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593 video_rtp_sender_->SetTrack(video_track_);
594 video_rtp_sender_->SetSsrc(kVideoSsrc);
595 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800596
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800598}
599
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600// Test that the media channel stops sending when the audio sender's SSRC is set
601// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800602TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605 audio_rtp_sender_->SetSsrc(0);
606 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800607}
608
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609// Test that the media channel stops sending when the video sender's SSRC is set
610// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800611TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614 audio_rtp_sender_->SetSsrc(0);
615 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800616}
617
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700618// Test that the media channel stops sending when the audio sender's track is
619// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800620TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800622
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
624 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800625}
626
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627// Test that the media channel stops sending when the video sender's track is
628// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800629TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800631
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700632 video_rtp_sender_->SetSsrc(0);
633 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800634}
635
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700636// Test that when the audio sender's SSRC is changed, the media channel stops
637// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800638TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700639 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
642 VerifyVoiceChannelNoInput(kAudioSsrc);
643 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800644
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700645 audio_rtp_sender_ = nullptr;
646 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800647}
648
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700649// Test that when the audio sender's SSRC is changed, the media channel stops
650// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800651TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700652 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800653
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654 video_rtp_sender_->SetSsrc(kVideoSsrc2);
655 VerifyVideoChannelNoInput(kVideoSsrc);
656 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800657
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700658 video_rtp_sender_ = nullptr;
659 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800660}
661
skvladdc1c62c2016-03-16 19:07:43 -0700662TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
663 CreateAudioRtpSender();
664
skvladdc1c62c2016-03-16 19:07:43 -0700665 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800667 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700668
669 DestroyAudioRtpSender();
670}
671
Florent Castelli892acf02018-10-01 22:47:20 +0200672TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
673 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
674
675 RtpParameters params = audio_rtp_sender_->GetParameters();
676 ASSERT_EQ(1u, params.encodings.size());
677 params.encodings[0].max_bitrate_bps = 90000;
678 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
679
680 params = audio_rtp_sender_->GetParameters();
681 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
682 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
683
684 DestroyAudioRtpSender();
685}
686
687TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
688 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
689 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
690
691 audio_rtp_sender_ =
692 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
693 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
694 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
695
696 std::vector<RtpEncodingParameters> init_encodings(1);
697 init_encodings[0].max_bitrate_bps = 60000;
698 audio_rtp_sender_->set_init_send_encodings(init_encodings);
699
700 RtpParameters params = audio_rtp_sender_->GetParameters();
701 ASSERT_EQ(1u, params.encodings.size());
702 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
703
704 // Simulate the setLocalDescription call
705 std::vector<uint32_t> ssrcs(1, 1);
706 cricket::StreamParams stream_params =
707 cricket::CreateSimStreamParams("cname", ssrcs);
708 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800709 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200710 audio_rtp_sender_->SetSsrc(1);
711
712 params = audio_rtp_sender_->GetParameters();
713 ASSERT_EQ(1u, params.encodings.size());
714 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
715
716 DestroyAudioRtpSender();
717}
718
719TEST_F(RtpSenderReceiverTest,
720 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
721 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
722
723 RtpParameters params;
724 RTCError result = audio_rtp_sender_->SetParameters(params);
725 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
726 DestroyAudioRtpSender();
727}
728
Florent Castellicebf50f2018-05-03 15:31:53 +0200729TEST_F(RtpSenderReceiverTest,
730 AudioSenderMustCallGetParametersBeforeSetParameters) {
731 CreateAudioRtpSender();
732
733 RtpParameters params;
734 RTCError result = audio_rtp_sender_->SetParameters(params);
735 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
736
737 DestroyAudioRtpSender();
738}
739
740TEST_F(RtpSenderReceiverTest,
741 AudioSenderSetParametersInvalidatesTransactionId) {
742 CreateAudioRtpSender();
743
744 RtpParameters params = audio_rtp_sender_->GetParameters();
745 EXPECT_EQ(1u, params.encodings.size());
746 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
747 RTCError result = audio_rtp_sender_->SetParameters(params);
748 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
749
750 DestroyAudioRtpSender();
751}
752
753TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
754 CreateAudioRtpSender();
755
756 RtpParameters params = audio_rtp_sender_->GetParameters();
757 params.transaction_id = "";
758 RTCError result = audio_rtp_sender_->SetParameters(params);
759 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
760
761 DestroyAudioRtpSender();
762}
763
764TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
765 CreateAudioRtpSender();
766
767 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200768 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200769 auto saved_transaction_id = params.transaction_id;
770 params = audio_rtp_sender_->GetParameters();
771 EXPECT_NE(saved_transaction_id, params.transaction_id);
772
773 DestroyAudioRtpSender();
774}
775
776TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
777 CreateAudioRtpSender();
778
779 RtpParameters params = audio_rtp_sender_->GetParameters();
780 RtpParameters second_params = audio_rtp_sender_->GetParameters();
781
782 RTCError result = audio_rtp_sender_->SetParameters(params);
783 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700784 DestroyAudioRtpSender();
785}
786
787TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
788 CreateAudioRtpSender();
789 RtpParameters params = audio_rtp_sender_->GetParameters();
790 EXPECT_EQ(1u, params.encodings.size());
791
Florent Castelli87b3c512018-07-18 16:00:28 +0200792 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700793 params.mid = "dummy_mid";
794 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
795 audio_rtp_sender_->SetParameters(params).type());
796 params = audio_rtp_sender_->GetParameters();
797
Seth Hampson2d2c8882018-05-16 16:02:32 -0700798 DestroyAudioRtpSender();
799}
800
801TEST_F(RtpSenderReceiverTest,
802 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
803 CreateAudioRtpSender();
804 RtpParameters params = audio_rtp_sender_->GetParameters();
805 EXPECT_EQ(1u, params.encodings.size());
806
Henrik Grunelle1301a82018-12-13 12:13:22 +0000807 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200808 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000809 params.encodings[0].codec_payload_type = 1;
810 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
811 audio_rtp_sender_->SetParameters(params).type());
812 params = audio_rtp_sender_->GetParameters();
813
Seth Hampson2d2c8882018-05-16 16:02:32 -0700814 params.encodings[0].fec = RtpFecParameters();
815 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
816 audio_rtp_sender_->SetParameters(params).type());
817 params = audio_rtp_sender_->GetParameters();
818
819 params.encodings[0].rtx = RtpRtxParameters();
820 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
821 audio_rtp_sender_->SetParameters(params).type());
822 params = audio_rtp_sender_->GetParameters();
823
824 params.encodings[0].dtx = DtxStatus::ENABLED;
825 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
826 audio_rtp_sender_->SetParameters(params).type());
827 params = audio_rtp_sender_->GetParameters();
828
829 params.encodings[0].ptime = 1;
830 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
831 audio_rtp_sender_->SetParameters(params).type());
832 params = audio_rtp_sender_->GetParameters();
833
Seth Hampson2d2c8882018-05-16 16:02:32 -0700834 params.encodings[0].scale_resolution_down_by = 2.0;
835 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
836 audio_rtp_sender_->SetParameters(params).type());
837 params = audio_rtp_sender_->GetParameters();
838
839 params.encodings[0].rid = "dummy_rid";
840 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
841 audio_rtp_sender_->SetParameters(params).type());
842 params = audio_rtp_sender_->GetParameters();
843
844 params.encodings[0].dependency_rids.push_back("dummy_rid");
845 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
846 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200847
848 DestroyAudioRtpSender();
849}
850
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700851TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
852 CreateAudioRtpSender();
853
854 EXPECT_EQ(-1, voice_media_channel_->max_bps());
855 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200856 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800857 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100858 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800859 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700860
861 // Read back the parameters and verify they have been changed.
862 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200863 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100864 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700865
866 // Verify that the audio channel received the new parameters.
867 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200868 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100869 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700870
871 // Verify that the global bitrate limit has not been changed.
872 EXPECT_EQ(-1, voice_media_channel_->max_bps());
873
874 DestroyAudioRtpSender();
875}
876
Seth Hampson24722b32017-12-22 09:36:42 -0800877TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
878 CreateAudioRtpSender();
879
880 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200881 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800882 EXPECT_EQ(webrtc::kDefaultBitratePriority,
883 params.encodings[0].bitrate_priority);
884 double new_bitrate_priority = 2.0;
885 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800886 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800887
888 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200889 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800890 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
891
892 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200893 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800894 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
895
896 DestroyAudioRtpSender();
897}
898
skvladdc1c62c2016-03-16 19:07:43 -0700899TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
900 CreateVideoRtpSender();
901
skvladdc1c62c2016-03-16 19:07:43 -0700902 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700903 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800904 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700905
906 DestroyVideoRtpSender();
907}
908
Florent Castelli892acf02018-10-01 22:47:20 +0200909TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
910 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
911
912 RtpParameters params = video_rtp_sender_->GetParameters();
913 ASSERT_EQ(1u, params.encodings.size());
914 params.encodings[0].max_bitrate_bps = 90000;
915 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
916
917 params = video_rtp_sender_->GetParameters();
918 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
919 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
920
921 DestroyVideoRtpSender();
922}
923
924TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
925 AddVideoTrack(false);
926
927 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
928 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
929 video_rtp_sender_->set_stream_ids({local_stream_->id()});
930
931 std::vector<RtpEncodingParameters> init_encodings(2);
932 init_encodings[0].max_bitrate_bps = 60000;
933 init_encodings[1].max_bitrate_bps = 900000;
934 video_rtp_sender_->set_init_send_encodings(init_encodings);
935
936 RtpParameters params = video_rtp_sender_->GetParameters();
937 ASSERT_EQ(2u, params.encodings.size());
938 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
939 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
940
941 // Simulate the setLocalDescription call
942 std::vector<uint32_t> ssrcs;
943 for (int i = 0; i < 2; ++i)
944 ssrcs.push_back(kVideoSsrcSimulcast + i);
945 cricket::StreamParams stream_params =
946 cricket::CreateSimStreamParams("cname", ssrcs);
947 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800948 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200949 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
950
951 params = video_rtp_sender_->GetParameters();
952 ASSERT_EQ(2u, params.encodings.size());
953 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
954 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
955
956 DestroyVideoRtpSender();
957}
958
959TEST_F(RtpSenderReceiverTest,
960 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
961 AddVideoTrack(false);
962
963 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
964 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
965 video_rtp_sender_->set_stream_ids({local_stream_->id()});
966
967 std::vector<RtpEncodingParameters> init_encodings(1);
968 init_encodings[0].max_bitrate_bps = 60000;
969 video_rtp_sender_->set_init_send_encodings(init_encodings);
970
971 RtpParameters params = video_rtp_sender_->GetParameters();
972 ASSERT_EQ(1u, params.encodings.size());
973 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
974
975 // Simulate the setLocalDescription call as if the user used SDP munging
976 // to enable simulcast
977 std::vector<uint32_t> ssrcs;
978 for (int i = 0; i < 2; ++i)
979 ssrcs.push_back(kVideoSsrcSimulcast + i);
980 cricket::StreamParams stream_params =
981 cricket::CreateSimStreamParams("cname", ssrcs);
982 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800983 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200984 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
985
986 params = video_rtp_sender_->GetParameters();
987 ASSERT_EQ(2u, params.encodings.size());
988 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
989
990 DestroyVideoRtpSender();
991}
992
993TEST_F(RtpSenderReceiverTest,
994 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
995 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
996
997 RtpParameters params;
998 RTCError result = video_rtp_sender_->SetParameters(params);
999 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1000 DestroyVideoRtpSender();
1001}
1002
Florent Castellicebf50f2018-05-03 15:31:53 +02001003TEST_F(RtpSenderReceiverTest,
1004 VideoSenderMustCallGetParametersBeforeSetParameters) {
1005 CreateVideoRtpSender();
1006
1007 RtpParameters params;
1008 RTCError result = video_rtp_sender_->SetParameters(params);
1009 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1010
1011 DestroyVideoRtpSender();
1012}
1013
1014TEST_F(RtpSenderReceiverTest,
1015 VideoSenderSetParametersInvalidatesTransactionId) {
1016 CreateVideoRtpSender();
1017
1018 RtpParameters params = video_rtp_sender_->GetParameters();
1019 EXPECT_EQ(1u, params.encodings.size());
1020 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1021 RTCError result = video_rtp_sender_->SetParameters(params);
1022 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1023
1024 DestroyVideoRtpSender();
1025}
1026
1027TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1028 CreateVideoRtpSender();
1029
1030 RtpParameters params = video_rtp_sender_->GetParameters();
1031 params.transaction_id = "";
1032 RTCError result = video_rtp_sender_->SetParameters(params);
1033 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1034
1035 DestroyVideoRtpSender();
1036}
1037
1038TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1039 CreateVideoRtpSender();
1040
1041 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001042 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001043 auto saved_transaction_id = params.transaction_id;
1044 params = video_rtp_sender_->GetParameters();
1045 EXPECT_NE(saved_transaction_id, params.transaction_id);
1046
1047 DestroyVideoRtpSender();
1048}
1049
1050TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1051 CreateVideoRtpSender();
1052
1053 RtpParameters params = video_rtp_sender_->GetParameters();
1054 RtpParameters second_params = video_rtp_sender_->GetParameters();
1055
1056 RTCError result = video_rtp_sender_->SetParameters(params);
1057 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1058
1059 DestroyVideoRtpSender();
1060}
1061
Seth Hampson2d2c8882018-05-16 16:02:32 -07001062TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1063 CreateVideoRtpSender();
1064 RtpParameters params = video_rtp_sender_->GetParameters();
1065 EXPECT_EQ(1u, params.encodings.size());
1066
Florent Castelli87b3c512018-07-18 16:00:28 +02001067 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001068 params.mid = "dummy_mid";
1069 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1070 video_rtp_sender_->SetParameters(params).type());
1071 params = video_rtp_sender_->GetParameters();
1072
Seth Hampson2d2c8882018-05-16 16:02:32 -07001073 DestroyVideoRtpSender();
1074}
1075
1076TEST_F(RtpSenderReceiverTest,
1077 VideoSenderCantSetUnimplementedEncodingParameters) {
1078 CreateVideoRtpSender();
1079 RtpParameters params = video_rtp_sender_->GetParameters();
1080 EXPECT_EQ(1u, params.encodings.size());
1081
Henrik Grunelle1301a82018-12-13 12:13:22 +00001082 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +02001083 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001084 params.encodings[0].codec_payload_type = 1;
1085 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1086 video_rtp_sender_->SetParameters(params).type());
1087 params = video_rtp_sender_->GetParameters();
1088
Seth Hampson2d2c8882018-05-16 16:02:32 -07001089 params.encodings[0].fec = RtpFecParameters();
1090 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1091 video_rtp_sender_->SetParameters(params).type());
1092 params = video_rtp_sender_->GetParameters();
1093
1094 params.encodings[0].rtx = RtpRtxParameters();
1095 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1096 video_rtp_sender_->SetParameters(params).type());
1097 params = video_rtp_sender_->GetParameters();
1098
1099 params.encodings[0].dtx = DtxStatus::ENABLED;
1100 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1101 video_rtp_sender_->SetParameters(params).type());
1102 params = video_rtp_sender_->GetParameters();
1103
1104 params.encodings[0].ptime = 1;
1105 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1106 video_rtp_sender_->SetParameters(params).type());
1107 params = video_rtp_sender_->GetParameters();
1108
Seth Hampson2d2c8882018-05-16 16:02:32 -07001109 params.encodings[0].scale_resolution_down_by = 2.0;
1110 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1111 video_rtp_sender_->SetParameters(params).type());
1112 params = video_rtp_sender_->GetParameters();
1113
1114 params.encodings[0].rid = "dummy_rid";
1115 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1116 video_rtp_sender_->SetParameters(params).type());
1117 params = video_rtp_sender_->GetParameters();
1118
1119 params.encodings[0].dependency_rids.push_back("dummy_rid");
1120 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1121 video_rtp_sender_->SetParameters(params).type());
1122
1123 DestroyVideoRtpSender();
1124}
1125
Florent Castelli892acf02018-10-01 22:47:20 +02001126TEST_F(RtpSenderReceiverTest,
1127 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1128 CreateVideoRtpSenderWithSimulcast();
1129 RtpParameters params = video_rtp_sender_->GetParameters();
1130 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1131
Henrik Grunelle1301a82018-12-13 12:13:22 +00001132 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castelli892acf02018-10-01 22:47:20 +02001133 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1134 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001135 params.encodings[i].codec_payload_type = 1;
1136 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1137 video_rtp_sender_->SetParameters(params).type());
1138 params = video_rtp_sender_->GetParameters();
1139
Florent Castelli892acf02018-10-01 22:47:20 +02001140 params.encodings[i].fec = RtpFecParameters();
1141 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1142 video_rtp_sender_->SetParameters(params).type());
1143 params = video_rtp_sender_->GetParameters();
1144
1145 params.encodings[i].rtx = RtpRtxParameters();
1146 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1147 video_rtp_sender_->SetParameters(params).type());
1148 params = video_rtp_sender_->GetParameters();
1149
1150 params.encodings[i].dtx = DtxStatus::ENABLED;
1151 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1152 video_rtp_sender_->SetParameters(params).type());
1153 params = video_rtp_sender_->GetParameters();
1154
1155 params.encodings[i].ptime = 1;
1156 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1157 video_rtp_sender_->SetParameters(params).type());
1158 params = video_rtp_sender_->GetParameters();
1159
1160 params.encodings[i].scale_resolution_down_by = 2.0;
1161 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1162 video_rtp_sender_->SetParameters(params).type());
1163 params = video_rtp_sender_->GetParameters();
1164
1165 params.encodings[i].rid = "dummy_rid";
1166 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1167 video_rtp_sender_->SetParameters(params).type());
1168 params = video_rtp_sender_->GetParameters();
1169
1170 params.encodings[i].dependency_rids.push_back("dummy_rid");
1171 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1172 video_rtp_sender_->SetParameters(params).type());
1173 }
1174
1175 DestroyVideoRtpSender();
1176}
1177
Seth Hampson2d2c8882018-05-16 16:02:32 -07001178// A video sender can have multiple simulcast layers, in which case it will
1179// contain multiple RtpEncodingParameters. This tests that if this is the case
1180// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1181// for any encodings besides at index 0, because these are both implemented
1182// "per-sender."
1183TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1184 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001185 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001186 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001187 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001188
1189 params.encodings[1].bitrate_priority = 2.0;
1190 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1191 video_rtp_sender_->SetParameters(params).type());
1192 params = video_rtp_sender_->GetParameters();
1193
Seth Hampson2d2c8882018-05-16 16:02:32 -07001194 DestroyVideoRtpSender();
1195}
1196
Florent Castelli892acf02018-10-01 22:47:20 +02001197TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1198 // Add a simulcast specific send stream that contains 2 encoding parameters.
1199 CreateVideoRtpSenderWithSimulcast();
1200 RtpParameters params = video_rtp_sender_->GetParameters();
1201 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1202
1203 for (size_t i = 0; i < params.encodings.size(); i++) {
1204 params.encodings[i].ssrc = 1337;
1205 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1206 video_rtp_sender_->SetParameters(params).type());
1207 params = video_rtp_sender_->GetParameters();
1208 }
1209
1210 DestroyVideoRtpSender();
1211}
1212
Ă…sa Persson55659812018-06-18 17:51:32 +02001213TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001214 CreateVideoRtpSender();
1215
1216 EXPECT_EQ(-1, video_media_channel_->max_bps());
1217 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001218 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001219 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001220 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001221 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001222 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001223 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001224
1225 // Read back the parameters and verify they have been changed.
1226 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001227 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001228 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001229 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001230
1231 // Verify that the video channel received the new parameters.
1232 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001233 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001234 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001235 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001236
1237 // Verify that the global bitrate limit has not been changed.
1238 EXPECT_EQ(-1, video_media_channel_->max_bps());
1239
1240 DestroyVideoRtpSender();
1241}
1242
Ă…sa Persson55659812018-06-18 17:51:32 +02001243TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1244 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001245 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001246
1247 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001248 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001249 params.encodings[0].min_bitrate_bps = 100;
1250 params.encodings[0].max_bitrate_bps = 1000;
1251 params.encodings[1].min_bitrate_bps = 200;
1252 params.encodings[1].max_bitrate_bps = 2000;
1253 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1254
1255 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001256 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1257 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001258 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1259 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1260 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1261 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1262
1263 DestroyVideoRtpSender();
1264}
1265
Seth Hampson24722b32017-12-22 09:36:42 -08001266TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1267 CreateVideoRtpSender();
1268
1269 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001270 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001271 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1272 params.encodings[0].bitrate_priority);
1273 double new_bitrate_priority = 2.0;
1274 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001275 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001276
1277 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001278 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001279 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1280
1281 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001282 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001283 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1284
1285 DestroyVideoRtpSender();
1286}
1287
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001288TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1289 CreateAudioRtpReceiver();
1290
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001291 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001292 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001293 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1294
1295 DestroyAudioRtpReceiver();
1296}
1297
1298TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1299 CreateVideoRtpReceiver();
1300
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001301 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001302 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001303 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1304
1305 DestroyVideoRtpReceiver();
1306}
1307
Florent Castelli38332cd2018-11-20 14:08:06 +01001308TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1309 CreateVideoRtpReceiverWithSimulcast({}, 2);
1310
1311 RtpParameters params = video_rtp_receiver_->GetParameters();
1312 EXPECT_EQ(2u, params.encodings.size());
1313
1314 DestroyVideoRtpReceiver();
1315}
1316
pbos5214a0a2016-12-16 15:39:11 -08001317// Test that makes sure that a video track content hint translates to the proper
1318// value for sources that are not screencast.
1319TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1320 CreateVideoRtpSender();
1321
1322 video_track_->set_enabled(true);
1323
1324 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001325 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001326 // No content hint should be set by default.
1327 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1328 video_track_->content_hint());
1329 // Setting detailed should turn a non-screencast source into screencast mode.
1330 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001331 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001332 // Removing the content hint should turn the track back into non-screencast
1333 // mode.
1334 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001335 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001336 // Setting fluid should remain in non-screencast mode (its default).
1337 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001338 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001339 // Setting text should have the same effect as Detailed
1340 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1341 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001342
1343 DestroyVideoRtpSender();
1344}
1345
1346// Test that makes sure that a video track content hint translates to the proper
1347// value for screencast sources.
1348TEST_F(RtpSenderReceiverTest,
1349 PropagatesVideoTrackContentHintForScreencastSource) {
1350 CreateVideoRtpSender(true);
1351
1352 video_track_->set_enabled(true);
1353
1354 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001355 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001356 // No content hint should be set by default.
1357 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1358 video_track_->content_hint());
1359 // Setting fluid should turn a screencast source into non-screencast mode.
1360 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001361 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001362 // Removing the content hint should turn the track back into screencast mode.
1363 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001364 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001365 // Setting detailed should still remain in screencast mode (its default).
1366 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001367 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001368 // Setting text should have the same effect as Detailed
1369 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1370 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001371
1372 DestroyVideoRtpSender();
1373}
1374
1375// Test that makes sure any content hints that are set on a track before
1376// VideoRtpSender is ready to send are still applied when it gets ready to send.
1377TEST_F(RtpSenderReceiverTest,
1378 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1379 AddVideoTrack();
1380 // Setting detailed overrides the default non-screencast mode. This should be
1381 // applied even if the track is set on construction.
1382 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001383 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1384 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1385 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001386 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001387 video_track_->set_enabled(true);
1388
1389 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001390 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001391
1392 // Verify that the content hint is accounted for when video_rtp_sender_ does
1393 // get enabled.
1394 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001395 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001396
1397 // And removing the hint should go back to false (to verify that false was
1398 // default correctly).
1399 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001400 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001401
1402 DestroyVideoRtpSender();
1403}
1404
deadbeef20cb0c12017-02-01 20:27:00 -08001405TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1406 CreateAudioRtpSender();
1407 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1408}
1409
1410TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1411 CreateVideoRtpSender();
1412 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1413}
1414
1415// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1416// true/false from CanSendDtmf based on what |voice_channel_| returns.
1417TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1418 AddDtmfCodec();
1419 CreateAudioRtpSender();
1420 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1421 ASSERT_NE(nullptr, dtmf_sender);
1422 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1423}
1424
1425TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1426 CreateAudioRtpSender();
1427 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1428 ASSERT_NE(nullptr, dtmf_sender);
1429 // DTMF codec has not been added, as it was in the above test.
1430 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1431}
1432
1433TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1434 AddDtmfCodec();
1435 CreateAudioRtpSender();
1436 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1437 ASSERT_NE(nullptr, dtmf_sender);
1438
1439 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1440
1441 // Insert DTMF
1442 const int expected_duration = 90;
1443 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1444
1445 // Verify
1446 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1447 kDefaultTimeout);
1448 const uint32_t send_ssrc =
1449 voice_media_channel_->send_streams()[0].first_ssrc();
1450 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1451 send_ssrc, 0, expected_duration));
1452 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1453 send_ssrc, 1, expected_duration));
1454 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1455 send_ssrc, 2, expected_duration));
1456}
1457
1458// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1459// destroyed, which is needed for the DTMF sender.
1460TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1461 CreateAudioRtpSender();
1462 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1463 audio_rtp_sender_ = nullptr;
1464 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1465}
1466
Benjamin Wright84583f62018-10-04 14:22:34 -07001467// Validate that the default FrameEncryptor setting is nullptr.
1468TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1469 CreateAudioRtpSender();
1470 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1471 new FakeFrameEncryptor());
1472 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1473 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1474 EXPECT_EQ(fake_frame_encryptor.get(),
1475 audio_rtp_sender_->GetFrameEncryptor().get());
1476}
1477
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001478// Validate that setting a FrameEncryptor after the send stream is stopped does
1479// nothing.
1480TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1481 CreateAudioRtpSender();
1482 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1483 new FakeFrameEncryptor());
1484 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1485 audio_rtp_sender_->Stop();
1486 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1487 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1488}
1489
Benjamin Wright84583f62018-10-04 14:22:34 -07001490// Validate that the default FrameEncryptor setting is nullptr.
1491TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1492 CreateAudioRtpReceiver();
1493 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1494 new FakeFrameDecryptor());
1495 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1496 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1497 EXPECT_EQ(fake_frame_decryptor.get(),
1498 audio_rtp_receiver_->GetFrameDecryptor().get());
1499}
1500
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001501// Validate that the default FrameEncryptor setting is nullptr.
1502TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1503 CreateAudioRtpReceiver();
1504 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1505 new FakeFrameDecryptor());
1506 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1507 audio_rtp_receiver_->Stop();
1508 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1509 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1510}
1511
1512// Validate that the default FrameEncryptor setting is nullptr.
1513TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1514 CreateVideoRtpSender();
1515 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1516 new FakeFrameEncryptor());
1517 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1518 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1519 EXPECT_EQ(fake_frame_encryptor.get(),
1520 video_rtp_sender_->GetFrameEncryptor().get());
1521}
1522
1523// Validate that setting a FrameEncryptor after the send stream is stopped does
1524// nothing.
1525TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1526 CreateVideoRtpSender();
1527 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1528 new FakeFrameEncryptor());
1529 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1530 video_rtp_sender_->Stop();
1531 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1532 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1533}
1534
1535// Validate that the default FrameEncryptor setting is nullptr.
1536TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1537 CreateVideoRtpReceiver();
1538 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1539 new FakeFrameDecryptor());
1540 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1541 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1542 EXPECT_EQ(fake_frame_decryptor.get(),
1543 video_rtp_receiver_->GetFrameDecryptor().get());
1544}
1545
1546// Validate that the default FrameEncryptor setting is nullptr.
1547TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1548 CreateVideoRtpReceiver();
1549 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1550 new FakeFrameDecryptor());
1551 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1552 video_rtp_receiver_->Stop();
1553 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1554 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1555}
1556
deadbeef70ab1a12015-09-28 16:53:55 -07001557} // namespace webrtc