blob: f3fb63ad4868fa0030fdcd0eac44bc9f9612f9d6 [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"
Steve Anton10542f22019-01-11 09:11:00 -080021#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 20:26:48 +010028#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070029#include "api/test/fake_frame_decryptor.h"
30#include "api/test/fake_frame_encryptor.h"
Yves Gerey3e707812018-11-28 16:47:49 +010031#include "logging/rtc_event_log/rtc_event_log.h"
32#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080033#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"
44#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010045#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "pc/channel_manager.h"
47#include "pc/dtls_srtp_transport.h"
48#include "pc/local_audio_source.h"
49#include "pc/media_stream.h"
50#include "pc/rtp_receiver.h"
51#include "pc/rtp_sender.h"
52#include "pc/rtp_transport_internal.h"
53#include "pc/test/fake_video_track_source.h"
54#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010055#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020056#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010057#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,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800108 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
109 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700111 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100112 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800113 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
114 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800115 voice_channel_->Enable(true);
116 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700117 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
118 video_media_channel_ = media_engine_->GetVideoChannel(0);
119 RTC_CHECK(voice_channel_);
120 RTC_CHECK(video_channel_);
121 RTC_CHECK(voice_media_channel_);
122 RTC_CHECK(video_media_channel_);
123
124 // Create streams for predefined SSRCs. Streams need to exist in order
125 // for the senders and receievers to apply parameters to them.
126 // Normally these would be created by SetLocalDescription and
127 // SetRemoteDescription.
128 voice_media_channel_->AddSendStream(
129 cricket::StreamParams::CreateLegacy(kAudioSsrc));
130 voice_media_channel_->AddRecvStream(
131 cricket::StreamParams::CreateLegacy(kAudioSsrc));
132 voice_media_channel_->AddSendStream(
133 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
134 voice_media_channel_->AddRecvStream(
135 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
136 video_media_channel_->AddSendStream(
137 cricket::StreamParams::CreateLegacy(kVideoSsrc));
138 video_media_channel_->AddRecvStream(
139 cricket::StreamParams::CreateLegacy(kVideoSsrc));
140 video_media_channel_->AddSendStream(
141 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
142 video_media_channel_->AddRecvStream(
143 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700144 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700145
Zhi Huange830e682018-03-30 10:48:35 -0700146 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200147 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
148 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700149 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
150 /*rtcp_dtls_transport=*/nullptr);
151 return dtls_srtp_transport;
152 }
153
deadbeef20cb0c12017-02-01 20:27:00 -0800154 // Needed to use DTMF sender.
155 void AddDtmfCodec() {
156 cricket::AudioSendParameters params;
157 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
158 0, 1);
159 params.codecs.push_back(kTelephoneEventCodec);
160 voice_media_channel_->SetSendParameters(params);
161 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700162
pbos5214a0a2016-12-16 15:39:11 -0800163 void AddVideoTrack() { AddVideoTrack(false); }
164
165 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100166 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800167 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700168 video_track_ =
169 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800170 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700171 }
172
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700173 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
174
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100175 void CreateAudioRtpSender(
176 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700177 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800178 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800179 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700180 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
181 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
182 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800183 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800184 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800185 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
186 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700187 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700188 }
189
Steve Anton02ee47c2018-01-10 16:26:06 -0800190 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700191 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800192 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800193 }
194
deadbeef20cb0c12017-02-01 20:27:00 -0800195 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
196
Seth Hampson2d2c8882018-05-16 16:02:32 -0700197 void CreateVideoRtpSender(uint32_t ssrc) {
198 CreateVideoRtpSender(false, ssrc);
199 }
200
pbos5214a0a2016-12-16 15:39:11 -0800201 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
202
Florent Castelli892acf02018-10-01 22:47:20 +0200203 void CreateVideoRtpSenderWithSimulcast(
204 int num_layers = kVideoSimulcastLayerCount) {
205 std::vector<uint32_t> ssrcs;
206 for (int i = 0; i < num_layers; ++i)
207 ssrcs.push_back(kVideoSsrcSimulcast + i);
208 cricket::StreamParams stream_params =
209 cricket::CreateSimStreamParams("cname", ssrcs);
210 video_media_channel_->AddSendStream(stream_params);
211 uint32_t primary_ssrc = stream_params.first_ssrc();
212 CreateVideoRtpSender(primary_ssrc);
213 }
214
Seth Hampson2d2c8882018-05-16 16:02:32 -0700215 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800216 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700217 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
218 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
219 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800220 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700221 video_rtp_sender_->SetSsrc(ssrc);
222 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700223 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800224 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700225 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800226 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800227 }
228
deadbeef70ab1a12015-09-28 16:53:55 -0700229 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700230 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700231 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700232 }
233
234 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700235 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700236 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700237 }
238
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100239 void CreateAudioRtpReceiver(
240 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
241 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800242 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800243 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800244 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700245 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700246 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700247 }
248
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100249 void CreateVideoRtpReceiver(
250 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800251 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800252 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800253 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800254 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100255 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700256 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700257 }
258
Florent Castelli38332cd2018-11-20 14:08:06 +0100259 void CreateVideoRtpReceiverWithSimulcast(
260 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
261 int num_layers = kVideoSimulcastLayerCount) {
262 std::vector<uint32_t> ssrcs;
263 for (int i = 0; i < num_layers; ++i)
264 ssrcs.push_back(kVideoSsrcSimulcast + i);
265 cricket::StreamParams stream_params =
266 cricket::CreateSimStreamParams("cname", ssrcs);
267 video_media_channel_->AddRecvStream(stream_params);
268 uint32_t primary_ssrc = stream_params.first_ssrc();
269
270 video_rtp_receiver_ = new VideoRtpReceiver(
271 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
272 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
273 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
274 video_track_ = video_rtp_receiver_->video_track();
275 }
276
deadbeef70ab1a12015-09-28 16:53:55 -0700277 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700278 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700279 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700280 }
281
282 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700283 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700284 VerifyVideoChannelNoOutput();
285 }
286
287 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
288
289 void VerifyVoiceChannelInput(uint32_t ssrc) {
290 // Verify that the media channel has an audio source, and the stream isn't
291 // muted.
292 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
293 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
294 }
295
296 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
297
298 void VerifyVideoChannelInput(uint32_t ssrc) {
299 // Verify that the media channel has a video source,
300 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
301 }
302
303 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
304
305 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
306 // Verify that the media channel's source is reset.
307 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
308 }
309
310 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
311
312 void VerifyVideoChannelNoInput(uint32_t ssrc) {
313 // Verify that the media channel's source is reset.
314 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
315 }
316
317 void VerifyVoiceChannelOutput() {
318 // Verify that the volume is initialized to 1.
319 double volume;
320 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
321 EXPECT_EQ(1, volume);
322 }
323
324 void VerifyVideoChannelOutput() {
325 // Verify that the media channel has a sink.
326 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
327 }
328
329 void VerifyVoiceChannelNoOutput() {
330 // Verify that the volume is reset to 0.
331 double volume;
332 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
333 EXPECT_EQ(0, volume);
334 }
335
336 void VerifyVideoChannelNoOutput() {
337 // Verify that the media channel's sink is reset.
338 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700339 }
340
341 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800342 rtc::Thread* const network_thread_;
343 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700344 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700345 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
346 // the |channel_manager|.
347 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
348 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800349 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700350 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 cricket::ChannelManager channel_manager_;
352 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700353 cricket::VoiceChannel* voice_channel_;
354 cricket::VideoChannel* video_channel_;
355 cricket::FakeVoiceMediaChannel* voice_media_channel_;
356 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700357 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
358 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
359 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
360 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800361 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700362 rtc::scoped_refptr<VideoTrackInterface> video_track_;
363 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800364 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800365 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700366};
367
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700368// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700369// and disassociated with an AudioRtpSender.
370TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
371 CreateAudioRtpSender();
372 DestroyAudioRtpSender();
373}
374
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700375// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700376// disassociated with a VideoRtpSender.
377TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
378 CreateVideoRtpSender();
379 DestroyVideoRtpSender();
380}
381
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700382// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700383// associated and disassociated with an AudioRtpReceiver.
384TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
385 CreateAudioRtpReceiver();
386 DestroyAudioRtpReceiver();
387}
388
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700389// Test that |video_channel_| is updated when a remote video track is
390// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700391TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
392 CreateVideoRtpReceiver();
393 DestroyVideoRtpReceiver();
394}
395
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100396TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
397 CreateAudioRtpReceiver({local_stream_});
398 DestroyAudioRtpReceiver();
399}
400
401TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
402 CreateVideoRtpReceiver({local_stream_});
403 DestroyVideoRtpReceiver();
404}
405
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700406// Test that the AudioRtpSender applies options from the local audio source.
407TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
408 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100409 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800410 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700412
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100413 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700414
415 DestroyAudioRtpSender();
416}
417
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700418// Test that the stream is muted when the track is disabled, and unmuted when
419// the track is enabled.
420TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
421 CreateAudioRtpSender();
422
423 audio_track_->set_enabled(false);
424 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
425
426 audio_track_->set_enabled(true);
427 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
428
429 DestroyAudioRtpSender();
430}
431
432// Test that the volume is set to 0 when the track is disabled, and back to
433// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700434TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
435 CreateAudioRtpReceiver();
436
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700437 double volume;
438 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
439 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700440
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700441 audio_track_->set_enabled(false);
442 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
443 EXPECT_EQ(0, volume);
444
deadbeef70ab1a12015-09-28 16:53:55 -0700445 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700446 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
447 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700448
449 DestroyAudioRtpReceiver();
450}
451
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700452// Currently no action is taken when a remote video track is disabled or
453// enabled, so there's nothing to test here, other than what is normally
454// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700455TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
456 CreateVideoRtpSender();
457
deadbeef70ab1a12015-09-28 16:53:55 -0700458 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700459 video_track_->set_enabled(true);
460
461 DestroyVideoRtpSender();
462}
463
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464// Test that the state of the video track created by the VideoRtpReceiver is
465// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100466TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
467 CreateVideoRtpReceiver();
468
469 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
470 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
471 video_track_->GetSource()->state());
472
473 DestroyVideoRtpReceiver();
474
475 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
476 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
477 video_track_->GetSource()->state());
478}
479
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480// Currently no action is taken when a remote video track is disabled or
481// enabled, so there's nothing to test here, other than what is normally
482// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700483TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
484 CreateVideoRtpReceiver();
485
486 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700487 video_track_->set_enabled(true);
488
489 DestroyVideoRtpReceiver();
490}
491
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700492// Test that the AudioRtpReceiver applies volume changes from the track source
493// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700494TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
495 CreateAudioRtpReceiver();
496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 double volume;
498 audio_track_->GetSource()->SetVolume(0.5);
499 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
500 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700501
502 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700503 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504 audio_track_->GetSource()->SetVolume(0.8);
505 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
506 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700507
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700508 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700509 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
511 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700512
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 // Try changing volume one more time.
514 audio_track_->GetSource()->SetVolume(0.9);
515 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
516 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700517
518 DestroyAudioRtpReceiver();
519}
520
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521// Test that the media channel isn't enabled for sending if the audio sender
522// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800523TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800524 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800525 rtc::scoped_refptr<AudioTrackInterface> track =
526 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527
528 // Track but no SSRC.
529 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
530 VerifyVoiceChannelNoInput();
531
532 // SSRC but no track.
533 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
534 audio_rtp_sender_->SetSsrc(kAudioSsrc);
535 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800536}
537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538// Test that the media channel isn't enabled for sending if the video sender
539// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800540TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800541 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542
543 // Track but no SSRC.
544 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
545 VerifyVideoChannelNoInput();
546
547 // SSRC but no track.
548 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
549 video_rtp_sender_->SetSsrc(kVideoSsrc);
550 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800551}
552
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553// Test that the media channel is enabled for sending when the audio sender
554// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800555TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800556 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800557 rtc::scoped_refptr<AudioTrackInterface> track =
558 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 audio_rtp_sender_->SetSsrc(kAudioSsrc);
560 audio_rtp_sender_->SetTrack(track);
561 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800562
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800564}
565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566// Test that the media channel is enabled for sending when the audio sender
567// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800568TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800569 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800570 rtc::scoped_refptr<AudioTrackInterface> track =
571 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572 audio_rtp_sender_->SetTrack(track);
573 audio_rtp_sender_->SetSsrc(kAudioSsrc);
574 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800575
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800577}
578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579// Test that the media channel is enabled for sending when the video sender
580// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800581TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700582 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800583 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700584 video_rtp_sender_->SetSsrc(kVideoSsrc);
585 video_rtp_sender_->SetTrack(video_track_);
586 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800587
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800589}
590
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591// Test that the media channel is enabled for sending when the video sender
592// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800593TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700594 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800595 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596 video_rtp_sender_->SetTrack(video_track_);
597 video_rtp_sender_->SetSsrc(kVideoSsrc);
598 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800599
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800601}
602
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603// Test that the media channel stops sending when the audio sender's SSRC is set
604// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800605TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700606 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800607
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 audio_rtp_sender_->SetSsrc(0);
609 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800610}
611
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612// Test that the media channel stops sending when the video sender's SSRC is set
613// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800614TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800616
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 audio_rtp_sender_->SetSsrc(0);
618 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800619}
620
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621// Test that the media channel stops sending when the audio sender's track is
622// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800623TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700624 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800625
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
627 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800628}
629
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630// Test that the media channel stops sending when the video sender's track is
631// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800632TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800634
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700635 video_rtp_sender_->SetSsrc(0);
636 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800637}
638
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700639// Test that when the audio sender's SSRC is changed, the media channel stops
640// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800641TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700642 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800643
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
645 VerifyVoiceChannelNoInput(kAudioSsrc);
646 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800647
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700648 audio_rtp_sender_ = nullptr;
649 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800650}
651
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700652// Test that when the audio sender's SSRC is changed, the media channel stops
653// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800654TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800656
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 video_rtp_sender_->SetSsrc(kVideoSsrc2);
658 VerifyVideoChannelNoInput(kVideoSsrc);
659 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 video_rtp_sender_ = nullptr;
662 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800663}
664
skvladdc1c62c2016-03-16 19:07:43 -0700665TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
666 CreateAudioRtpSender();
667
skvladdc1c62c2016-03-16 19:07:43 -0700668 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700669 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800670 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700671
672 DestroyAudioRtpSender();
673}
674
Florent Castelli892acf02018-10-01 22:47:20 +0200675TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
676 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
677
678 RtpParameters params = audio_rtp_sender_->GetParameters();
679 ASSERT_EQ(1u, params.encodings.size());
680 params.encodings[0].max_bitrate_bps = 90000;
681 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
682
683 params = audio_rtp_sender_->GetParameters();
684 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
685 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
686
687 DestroyAudioRtpSender();
688}
689
690TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
691 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
692 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
693
694 audio_rtp_sender_ =
695 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
696 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
697 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
698
699 std::vector<RtpEncodingParameters> init_encodings(1);
700 init_encodings[0].max_bitrate_bps = 60000;
701 audio_rtp_sender_->set_init_send_encodings(init_encodings);
702
703 RtpParameters params = audio_rtp_sender_->GetParameters();
704 ASSERT_EQ(1u, params.encodings.size());
705 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
706
707 // Simulate the setLocalDescription call
708 std::vector<uint32_t> ssrcs(1, 1);
709 cricket::StreamParams stream_params =
710 cricket::CreateSimStreamParams("cname", ssrcs);
711 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800712 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200713 audio_rtp_sender_->SetSsrc(1);
714
715 params = audio_rtp_sender_->GetParameters();
716 ASSERT_EQ(1u, params.encodings.size());
717 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
718
719 DestroyAudioRtpSender();
720}
721
722TEST_F(RtpSenderReceiverTest,
723 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
724 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
725
726 RtpParameters params;
727 RTCError result = audio_rtp_sender_->SetParameters(params);
728 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
729 DestroyAudioRtpSender();
730}
731
Florent Castellicebf50f2018-05-03 15:31:53 +0200732TEST_F(RtpSenderReceiverTest,
733 AudioSenderMustCallGetParametersBeforeSetParameters) {
734 CreateAudioRtpSender();
735
736 RtpParameters params;
737 RTCError result = audio_rtp_sender_->SetParameters(params);
738 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
739
740 DestroyAudioRtpSender();
741}
742
743TEST_F(RtpSenderReceiverTest,
744 AudioSenderSetParametersInvalidatesTransactionId) {
745 CreateAudioRtpSender();
746
747 RtpParameters params = audio_rtp_sender_->GetParameters();
748 EXPECT_EQ(1u, params.encodings.size());
749 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
750 RTCError result = audio_rtp_sender_->SetParameters(params);
751 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
752
753 DestroyAudioRtpSender();
754}
755
756TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
757 CreateAudioRtpSender();
758
759 RtpParameters params = audio_rtp_sender_->GetParameters();
760 params.transaction_id = "";
761 RTCError result = audio_rtp_sender_->SetParameters(params);
762 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
763
764 DestroyAudioRtpSender();
765}
766
767TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
768 CreateAudioRtpSender();
769
770 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200771 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200772 auto saved_transaction_id = params.transaction_id;
773 params = audio_rtp_sender_->GetParameters();
774 EXPECT_NE(saved_transaction_id, params.transaction_id);
775
776 DestroyAudioRtpSender();
777}
778
779TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
780 CreateAudioRtpSender();
781
782 RtpParameters params = audio_rtp_sender_->GetParameters();
783 RtpParameters second_params = audio_rtp_sender_->GetParameters();
784
785 RTCError result = audio_rtp_sender_->SetParameters(params);
786 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700787 DestroyAudioRtpSender();
788}
789
790TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
791 CreateAudioRtpSender();
792 RtpParameters params = audio_rtp_sender_->GetParameters();
793 EXPECT_EQ(1u, params.encodings.size());
794
Florent Castelli87b3c512018-07-18 16:00:28 +0200795 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700796 params.mid = "dummy_mid";
797 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
798 audio_rtp_sender_->SetParameters(params).type());
799 params = audio_rtp_sender_->GetParameters();
800
Seth Hampson2d2c8882018-05-16 16:02:32 -0700801 DestroyAudioRtpSender();
802}
803
804TEST_F(RtpSenderReceiverTest,
805 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
806 CreateAudioRtpSender();
807 RtpParameters params = audio_rtp_sender_->GetParameters();
808 EXPECT_EQ(1u, params.encodings.size());
809
Henrik Grunelle1301a82018-12-13 12:13:22 +0000810 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200811 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000812 params.encodings[0].codec_payload_type = 1;
813 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
814 audio_rtp_sender_->SetParameters(params).type());
815 params = audio_rtp_sender_->GetParameters();
816
Seth Hampson2d2c8882018-05-16 16:02:32 -0700817 params.encodings[0].fec = RtpFecParameters();
818 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
819 audio_rtp_sender_->SetParameters(params).type());
820 params = audio_rtp_sender_->GetParameters();
821
822 params.encodings[0].rtx = RtpRtxParameters();
823 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
824 audio_rtp_sender_->SetParameters(params).type());
825 params = audio_rtp_sender_->GetParameters();
826
827 params.encodings[0].dtx = DtxStatus::ENABLED;
828 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
829 audio_rtp_sender_->SetParameters(params).type());
830 params = audio_rtp_sender_->GetParameters();
831
832 params.encodings[0].ptime = 1;
833 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
834 audio_rtp_sender_->SetParameters(params).type());
835 params = audio_rtp_sender_->GetParameters();
836
Seth Hampson2d2c8882018-05-16 16:02:32 -0700837 params.encodings[0].scale_resolution_down_by = 2.0;
838 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
839 audio_rtp_sender_->SetParameters(params).type());
840 params = audio_rtp_sender_->GetParameters();
841
842 params.encodings[0].rid = "dummy_rid";
843 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
844 audio_rtp_sender_->SetParameters(params).type());
845 params = audio_rtp_sender_->GetParameters();
846
847 params.encodings[0].dependency_rids.push_back("dummy_rid");
848 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
849 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200850
851 DestroyAudioRtpSender();
852}
853
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700854TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
855 CreateAudioRtpSender();
856
857 EXPECT_EQ(-1, voice_media_channel_->max_bps());
858 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200859 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800860 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100861 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800862 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700863
864 // Read back the parameters and verify they have been changed.
865 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200866 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100867 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700868
869 // Verify that the audio channel received the new parameters.
870 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200871 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100872 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700873
874 // Verify that the global bitrate limit has not been changed.
875 EXPECT_EQ(-1, voice_media_channel_->max_bps());
876
877 DestroyAudioRtpSender();
878}
879
Seth Hampson24722b32017-12-22 09:36:42 -0800880TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
881 CreateAudioRtpSender();
882
883 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200884 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800885 EXPECT_EQ(webrtc::kDefaultBitratePriority,
886 params.encodings[0].bitrate_priority);
887 double new_bitrate_priority = 2.0;
888 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800889 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800890
891 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200892 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800893 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
894
895 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200896 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800897 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
898
899 DestroyAudioRtpSender();
900}
901
skvladdc1c62c2016-03-16 19:07:43 -0700902TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
903 CreateVideoRtpSender();
904
skvladdc1c62c2016-03-16 19:07:43 -0700905 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700906 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800907 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700908
909 DestroyVideoRtpSender();
910}
911
Florent Castelli892acf02018-10-01 22:47:20 +0200912TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
913 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
914
915 RtpParameters params = video_rtp_sender_->GetParameters();
916 ASSERT_EQ(1u, params.encodings.size());
917 params.encodings[0].max_bitrate_bps = 90000;
918 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
919
920 params = video_rtp_sender_->GetParameters();
921 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
922 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
923
924 DestroyVideoRtpSender();
925}
926
927TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
928 AddVideoTrack(false);
929
930 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
931 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
932 video_rtp_sender_->set_stream_ids({local_stream_->id()});
933
934 std::vector<RtpEncodingParameters> init_encodings(2);
935 init_encodings[0].max_bitrate_bps = 60000;
936 init_encodings[1].max_bitrate_bps = 900000;
937 video_rtp_sender_->set_init_send_encodings(init_encodings);
938
939 RtpParameters params = video_rtp_sender_->GetParameters();
940 ASSERT_EQ(2u, params.encodings.size());
941 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
942 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
943
944 // Simulate the setLocalDescription call
945 std::vector<uint32_t> ssrcs;
946 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-13 16:26:05 -0800951 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200952 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;
981 for (int i = 0; i < 2; ++i)
982 ssrcs.push_back(kVideoSsrcSimulcast + i);
983 cricket::StreamParams stream_params =
984 cricket::CreateSimStreamParams("cname", ssrcs);
985 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800986 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200987 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
988
989 params = video_rtp_sender_->GetParameters();
990 ASSERT_EQ(2u, params.encodings.size());
991 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
992
993 DestroyVideoRtpSender();
994}
995
996TEST_F(RtpSenderReceiverTest,
997 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
998 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
999
1000 RtpParameters params;
1001 RTCError result = video_rtp_sender_->SetParameters(params);
1002 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1003 DestroyVideoRtpSender();
1004}
1005
Florent Castellicebf50f2018-05-03 15:31:53 +02001006TEST_F(RtpSenderReceiverTest,
1007 VideoSenderMustCallGetParametersBeforeSetParameters) {
1008 CreateVideoRtpSender();
1009
1010 RtpParameters params;
1011 RTCError result = video_rtp_sender_->SetParameters(params);
1012 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1013
1014 DestroyVideoRtpSender();
1015}
1016
1017TEST_F(RtpSenderReceiverTest,
1018 VideoSenderSetParametersInvalidatesTransactionId) {
1019 CreateVideoRtpSender();
1020
1021 RtpParameters params = video_rtp_sender_->GetParameters();
1022 EXPECT_EQ(1u, params.encodings.size());
1023 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1024 RTCError result = video_rtp_sender_->SetParameters(params);
1025 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1026
1027 DestroyVideoRtpSender();
1028}
1029
1030TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1031 CreateVideoRtpSender();
1032
1033 RtpParameters params = video_rtp_sender_->GetParameters();
1034 params.transaction_id = "";
1035 RTCError result = video_rtp_sender_->SetParameters(params);
1036 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1037
1038 DestroyVideoRtpSender();
1039}
1040
1041TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1042 CreateVideoRtpSender();
1043
1044 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001045 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001046 auto saved_transaction_id = params.transaction_id;
1047 params = video_rtp_sender_->GetParameters();
1048 EXPECT_NE(saved_transaction_id, params.transaction_id);
1049
1050 DestroyVideoRtpSender();
1051}
1052
1053TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1054 CreateVideoRtpSender();
1055
1056 RtpParameters params = video_rtp_sender_->GetParameters();
1057 RtpParameters second_params = video_rtp_sender_->GetParameters();
1058
1059 RTCError result = video_rtp_sender_->SetParameters(params);
1060 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1061
1062 DestroyVideoRtpSender();
1063}
1064
Seth Hampson2d2c8882018-05-16 16:02:32 -07001065TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1066 CreateVideoRtpSender();
1067 RtpParameters params = video_rtp_sender_->GetParameters();
1068 EXPECT_EQ(1u, params.encodings.size());
1069
Florent Castelli87b3c512018-07-18 16:00:28 +02001070 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001071 params.mid = "dummy_mid";
1072 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1073 video_rtp_sender_->SetParameters(params).type());
1074 params = video_rtp_sender_->GetParameters();
1075
Seth Hampson2d2c8882018-05-16 16:02:32 -07001076 DestroyVideoRtpSender();
1077}
1078
1079TEST_F(RtpSenderReceiverTest,
1080 VideoSenderCantSetUnimplementedEncodingParameters) {
1081 CreateVideoRtpSender();
1082 RtpParameters params = video_rtp_sender_->GetParameters();
1083 EXPECT_EQ(1u, params.encodings.size());
1084
Henrik Grunelle1301a82018-12-13 12:13:22 +00001085 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +02001086 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001087 params.encodings[0].codec_payload_type = 1;
1088 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1089 video_rtp_sender_->SetParameters(params).type());
1090 params = video_rtp_sender_->GetParameters();
1091
Seth Hampson2d2c8882018-05-16 16:02:32 -07001092 params.encodings[0].fec = RtpFecParameters();
1093 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1094 video_rtp_sender_->SetParameters(params).type());
1095 params = video_rtp_sender_->GetParameters();
1096
1097 params.encodings[0].rtx = RtpRtxParameters();
1098 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1099 video_rtp_sender_->SetParameters(params).type());
1100 params = video_rtp_sender_->GetParameters();
1101
1102 params.encodings[0].dtx = DtxStatus::ENABLED;
1103 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1104 video_rtp_sender_->SetParameters(params).type());
1105 params = video_rtp_sender_->GetParameters();
1106
1107 params.encodings[0].ptime = 1;
1108 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1109 video_rtp_sender_->SetParameters(params).type());
1110 params = video_rtp_sender_->GetParameters();
1111
Seth Hampson2d2c8882018-05-16 16:02:32 -07001112 params.encodings[0].scale_resolution_down_by = 2.0;
1113 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1114 video_rtp_sender_->SetParameters(params).type());
1115 params = video_rtp_sender_->GetParameters();
1116
1117 params.encodings[0].rid = "dummy_rid";
1118 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1119 video_rtp_sender_->SetParameters(params).type());
1120 params = video_rtp_sender_->GetParameters();
1121
1122 params.encodings[0].dependency_rids.push_back("dummy_rid");
1123 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1124 video_rtp_sender_->SetParameters(params).type());
1125
1126 DestroyVideoRtpSender();
1127}
1128
Florent Castelli892acf02018-10-01 22:47:20 +02001129TEST_F(RtpSenderReceiverTest,
1130 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1131 CreateVideoRtpSenderWithSimulcast();
1132 RtpParameters params = video_rtp_sender_->GetParameters();
1133 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1134
Henrik Grunelle1301a82018-12-13 12:13:22 +00001135 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castelli892acf02018-10-01 22:47:20 +02001136 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1137 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001138 params.encodings[i].codec_payload_type = 1;
1139 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1140 video_rtp_sender_->SetParameters(params).type());
1141 params = video_rtp_sender_->GetParameters();
1142
Florent Castelli892acf02018-10-01 22:47:20 +02001143 params.encodings[i].fec = RtpFecParameters();
1144 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1145 video_rtp_sender_->SetParameters(params).type());
1146 params = video_rtp_sender_->GetParameters();
1147
1148 params.encodings[i].rtx = RtpRtxParameters();
1149 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1150 video_rtp_sender_->SetParameters(params).type());
1151 params = video_rtp_sender_->GetParameters();
1152
1153 params.encodings[i].dtx = DtxStatus::ENABLED;
1154 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1155 video_rtp_sender_->SetParameters(params).type());
1156 params = video_rtp_sender_->GetParameters();
1157
1158 params.encodings[i].ptime = 1;
1159 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1160 video_rtp_sender_->SetParameters(params).type());
1161 params = video_rtp_sender_->GetParameters();
1162
1163 params.encodings[i].scale_resolution_down_by = 2.0;
1164 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1165 video_rtp_sender_->SetParameters(params).type());
1166 params = video_rtp_sender_->GetParameters();
1167
1168 params.encodings[i].rid = "dummy_rid";
1169 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1170 video_rtp_sender_->SetParameters(params).type());
1171 params = video_rtp_sender_->GetParameters();
1172
1173 params.encodings[i].dependency_rids.push_back("dummy_rid");
1174 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1175 video_rtp_sender_->SetParameters(params).type());
1176 }
1177
1178 DestroyVideoRtpSender();
1179}
1180
Seth Hampson2d2c8882018-05-16 16:02:32 -07001181// A video sender can have multiple simulcast layers, in which case it will
1182// contain multiple RtpEncodingParameters. This tests that if this is the case
1183// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1184// for any encodings besides at index 0, because these are both implemented
1185// "per-sender."
1186TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1187 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001188 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001189 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001190 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001191
1192 params.encodings[1].bitrate_priority = 2.0;
1193 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1194 video_rtp_sender_->SetParameters(params).type());
1195 params = video_rtp_sender_->GetParameters();
1196
Seth Hampson2d2c8882018-05-16 16:02:32 -07001197 DestroyVideoRtpSender();
1198}
1199
Florent Castelli892acf02018-10-01 22:47:20 +02001200TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1201 // Add a simulcast specific send stream that contains 2 encoding parameters.
1202 CreateVideoRtpSenderWithSimulcast();
1203 RtpParameters params = video_rtp_sender_->GetParameters();
1204 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1205
1206 for (size_t i = 0; i < params.encodings.size(); i++) {
1207 params.encodings[i].ssrc = 1337;
1208 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1209 video_rtp_sender_->SetParameters(params).type());
1210 params = video_rtp_sender_->GetParameters();
1211 }
1212
1213 DestroyVideoRtpSender();
1214}
1215
Ă…sa Persson55659812018-06-18 17:51:32 +02001216TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001217 CreateVideoRtpSender();
1218
1219 EXPECT_EQ(-1, video_media_channel_->max_bps());
1220 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001221 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001222 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001223 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001224 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001225 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001226 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001227
1228 // Read back the parameters and verify they have been changed.
1229 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001230 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001231 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001232 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001233
1234 // Verify that the video channel received the new parameters.
1235 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001236 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001237 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001238 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001239
1240 // Verify that the global bitrate limit has not been changed.
1241 EXPECT_EQ(-1, video_media_channel_->max_bps());
1242
1243 DestroyVideoRtpSender();
1244}
1245
Ă…sa Persson55659812018-06-18 17:51:32 +02001246TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1247 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001248 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001249
1250 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001251 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001252 params.encodings[0].min_bitrate_bps = 100;
1253 params.encodings[0].max_bitrate_bps = 1000;
1254 params.encodings[1].min_bitrate_bps = 200;
1255 params.encodings[1].max_bitrate_bps = 2000;
1256 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1257
1258 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001259 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1260 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001261 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1262 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1263 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1264 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1265
1266 DestroyVideoRtpSender();
1267}
1268
Seth Hampson24722b32017-12-22 09:36:42 -08001269TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1270 CreateVideoRtpSender();
1271
1272 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001273 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001274 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1275 params.encodings[0].bitrate_priority);
1276 double new_bitrate_priority = 2.0;
1277 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001278 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001279
1280 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001281 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001282 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1283
1284 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001285 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001286 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1287
1288 DestroyVideoRtpSender();
1289}
1290
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001291TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1292 CreateAudioRtpReceiver();
1293
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001294 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001295 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001296 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1297
1298 DestroyAudioRtpReceiver();
1299}
1300
1301TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1302 CreateVideoRtpReceiver();
1303
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001304 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001305 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001306 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1307
1308 DestroyVideoRtpReceiver();
1309}
1310
Florent Castelli38332cd2018-11-20 14:08:06 +01001311TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1312 CreateVideoRtpReceiverWithSimulcast({}, 2);
1313
1314 RtpParameters params = video_rtp_receiver_->GetParameters();
1315 EXPECT_EQ(2u, params.encodings.size());
1316
1317 DestroyVideoRtpReceiver();
1318}
1319
pbos5214a0a2016-12-16 15:39:11 -08001320// Test that makes sure that a video track content hint translates to the proper
1321// value for sources that are not screencast.
1322TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1323 CreateVideoRtpSender();
1324
1325 video_track_->set_enabled(true);
1326
1327 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001328 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001329 // No content hint should be set by default.
1330 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1331 video_track_->content_hint());
1332 // Setting detailed should turn a non-screencast source into screencast mode.
1333 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001334 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001335 // Removing the content hint should turn the track back into non-screencast
1336 // mode.
1337 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001338 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001339 // Setting fluid should remain in non-screencast mode (its default).
1340 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001341 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001342 // Setting text should have the same effect as Detailed
1343 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1344 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001345
1346 DestroyVideoRtpSender();
1347}
1348
1349// Test that makes sure that a video track content hint translates to the proper
1350// value for screencast sources.
1351TEST_F(RtpSenderReceiverTest,
1352 PropagatesVideoTrackContentHintForScreencastSource) {
1353 CreateVideoRtpSender(true);
1354
1355 video_track_->set_enabled(true);
1356
1357 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001358 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001359 // No content hint should be set by default.
1360 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1361 video_track_->content_hint());
1362 // Setting fluid should turn a screencast source into non-screencast mode.
1363 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001364 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001365 // Removing the content hint should turn the track back into screencast mode.
1366 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001367 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001368 // Setting detailed should still remain in screencast mode (its default).
1369 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001370 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001371 // Setting text should have the same effect as Detailed
1372 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1373 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001374
1375 DestroyVideoRtpSender();
1376}
1377
1378// Test that makes sure any content hints that are set on a track before
1379// VideoRtpSender is ready to send are still applied when it gets ready to send.
1380TEST_F(RtpSenderReceiverTest,
1381 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1382 AddVideoTrack();
1383 // Setting detailed overrides the default non-screencast mode. This should be
1384 // applied even if the track is set on construction.
1385 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001386 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1387 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1388 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001389 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001390 video_track_->set_enabled(true);
1391
1392 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001393 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001394
1395 // Verify that the content hint is accounted for when video_rtp_sender_ does
1396 // get enabled.
1397 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001398 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001399
1400 // And removing the hint should go back to false (to verify that false was
1401 // default correctly).
1402 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001403 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001404
1405 DestroyVideoRtpSender();
1406}
1407
deadbeef20cb0c12017-02-01 20:27:00 -08001408TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1409 CreateAudioRtpSender();
1410 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1411}
1412
1413TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1414 CreateVideoRtpSender();
1415 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1416}
1417
1418// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1419// true/false from CanSendDtmf based on what |voice_channel_| returns.
1420TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1421 AddDtmfCodec();
1422 CreateAudioRtpSender();
1423 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1424 ASSERT_NE(nullptr, dtmf_sender);
1425 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1426}
1427
1428TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1429 CreateAudioRtpSender();
1430 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1431 ASSERT_NE(nullptr, dtmf_sender);
1432 // DTMF codec has not been added, as it was in the above test.
1433 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1434}
1435
1436TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1437 AddDtmfCodec();
1438 CreateAudioRtpSender();
1439 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1440 ASSERT_NE(nullptr, dtmf_sender);
1441
1442 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1443
1444 // Insert DTMF
1445 const int expected_duration = 90;
1446 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1447
1448 // Verify
1449 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1450 kDefaultTimeout);
1451 const uint32_t send_ssrc =
1452 voice_media_channel_->send_streams()[0].first_ssrc();
1453 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1454 send_ssrc, 0, expected_duration));
1455 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1456 send_ssrc, 1, expected_duration));
1457 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1458 send_ssrc, 2, expected_duration));
1459}
1460
1461// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1462// destroyed, which is needed for the DTMF sender.
1463TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1464 CreateAudioRtpSender();
1465 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1466 audio_rtp_sender_ = nullptr;
1467 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1468}
1469
Benjamin Wright84583f62018-10-04 14:22:34 -07001470// Validate that the default FrameEncryptor setting is nullptr.
1471TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1472 CreateAudioRtpSender();
1473 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1474 new FakeFrameEncryptor());
1475 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1476 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1477 EXPECT_EQ(fake_frame_encryptor.get(),
1478 audio_rtp_sender_->GetFrameEncryptor().get());
1479}
1480
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001481// Validate that setting a FrameEncryptor after the send stream is stopped does
1482// nothing.
1483TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1484 CreateAudioRtpSender();
1485 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1486 new FakeFrameEncryptor());
1487 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1488 audio_rtp_sender_->Stop();
1489 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1490 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1491}
1492
Benjamin Wright84583f62018-10-04 14:22:34 -07001493// Validate that the default FrameEncryptor setting is nullptr.
1494TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1495 CreateAudioRtpReceiver();
1496 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1497 new FakeFrameDecryptor());
1498 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1499 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1500 EXPECT_EQ(fake_frame_decryptor.get(),
1501 audio_rtp_receiver_->GetFrameDecryptor().get());
1502}
1503
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001504// Validate that the default FrameEncryptor setting is nullptr.
1505TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1506 CreateAudioRtpReceiver();
1507 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1508 new FakeFrameDecryptor());
1509 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1510 audio_rtp_receiver_->Stop();
1511 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1512 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1513}
1514
1515// Validate that the default FrameEncryptor setting is nullptr.
1516TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1517 CreateVideoRtpSender();
1518 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1519 new FakeFrameEncryptor());
1520 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1521 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1522 EXPECT_EQ(fake_frame_encryptor.get(),
1523 video_rtp_sender_->GetFrameEncryptor().get());
1524}
1525
1526// Validate that setting a FrameEncryptor after the send stream is stopped does
1527// nothing.
1528TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1529 CreateVideoRtpSender();
1530 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1531 new FakeFrameEncryptor());
1532 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1533 video_rtp_sender_->Stop();
1534 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1535 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1536}
1537
1538// Validate that the default FrameEncryptor setting is nullptr.
1539TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1540 CreateVideoRtpReceiver();
1541 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1542 new FakeFrameDecryptor());
1543 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1544 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1545 EXPECT_EQ(fake_frame_decryptor.get(),
1546 video_rtp_receiver_->GetFrameDecryptor().get());
1547}
1548
1549// Validate that the default FrameEncryptor setting is nullptr.
1550TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1551 CreateVideoRtpReceiver();
1552 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1553 new FakeFrameDecryptor());
1554 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1555 video_rtp_receiver_->Stop();
1556 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1557 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1558}
1559
deadbeef70ab1a12015-09-28 16:53:55 -07001560} // namespace webrtc