blob: 83f06c6449c8ab80db75536d139f2cf7e27d4687 [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;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100206 ssrcs.reserve(num_layers);
Florent Castelli892acf02018-10-01 22:47:20 +0200207 for (int i = 0; i < num_layers; ++i)
208 ssrcs.push_back(kVideoSsrcSimulcast + i);
209 cricket::StreamParams stream_params =
210 cricket::CreateSimStreamParams("cname", ssrcs);
211 video_media_channel_->AddSendStream(stream_params);
212 uint32_t primary_ssrc = stream_params.first_ssrc();
213 CreateVideoRtpSender(primary_ssrc);
214 }
215
Seth Hampson2d2c8882018-05-16 16:02:32 -0700216 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800217 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700218 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
219 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
220 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800221 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700222 video_rtp_sender_->SetSsrc(ssrc);
223 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700224 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800225 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700226 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800227 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800228 }
229
deadbeef70ab1a12015-09-28 16:53:55 -0700230 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700231 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700232 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700233 }
234
235 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700236 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700237 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700238 }
239
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100240 void CreateAudioRtpReceiver(
241 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
242 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800243 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800244 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800245 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700246 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700247 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700248 }
249
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100250 void CreateVideoRtpReceiver(
251 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800252 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800253 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800254 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800255 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100256 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700257 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700258 }
259
Florent Castelli38332cd2018-11-20 14:08:06 +0100260 void CreateVideoRtpReceiverWithSimulcast(
261 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
262 int num_layers = kVideoSimulcastLayerCount) {
263 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100264 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100265 for (int i = 0; i < num_layers; ++i)
266 ssrcs.push_back(kVideoSsrcSimulcast + i);
267 cricket::StreamParams stream_params =
268 cricket::CreateSimStreamParams("cname", ssrcs);
269 video_media_channel_->AddRecvStream(stream_params);
270 uint32_t primary_ssrc = stream_params.first_ssrc();
271
272 video_rtp_receiver_ = new VideoRtpReceiver(
273 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
274 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
275 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
276 video_track_ = video_rtp_receiver_->video_track();
277 }
278
deadbeef70ab1a12015-09-28 16:53:55 -0700279 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700280 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700282 }
283
284 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700285 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286 VerifyVideoChannelNoOutput();
287 }
288
289 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
290
291 void VerifyVoiceChannelInput(uint32_t ssrc) {
292 // Verify that the media channel has an audio source, and the stream isn't
293 // muted.
294 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
295 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
296 }
297
298 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
299
300 void VerifyVideoChannelInput(uint32_t ssrc) {
301 // Verify that the media channel has a video source,
302 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
303 }
304
305 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
306
307 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
308 // Verify that the media channel's source is reset.
309 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
310 }
311
312 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
313
314 void VerifyVideoChannelNoInput(uint32_t ssrc) {
315 // Verify that the media channel's source is reset.
316 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
317 }
318
319 void VerifyVoiceChannelOutput() {
320 // Verify that the volume is initialized to 1.
321 double volume;
322 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
323 EXPECT_EQ(1, volume);
324 }
325
326 void VerifyVideoChannelOutput() {
327 // Verify that the media channel has a sink.
328 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
329 }
330
331 void VerifyVoiceChannelNoOutput() {
332 // Verify that the volume is reset to 0.
333 double volume;
334 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
335 EXPECT_EQ(0, volume);
336 }
337
338 void VerifyVideoChannelNoOutput() {
339 // Verify that the media channel's sink is reset.
340 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700341 }
342
343 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800344 rtc::Thread* const network_thread_;
345 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700346 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700347 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
348 // the |channel_manager|.
349 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
350 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800351 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700352 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700353 cricket::ChannelManager channel_manager_;
354 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 cricket::VoiceChannel* voice_channel_;
356 cricket::VideoChannel* video_channel_;
357 cricket::FakeVoiceMediaChannel* voice_media_channel_;
358 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700359 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
360 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
361 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
362 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800363 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700364 rtc::scoped_refptr<VideoTrackInterface> video_track_;
365 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800366 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800367 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700368};
369
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700370// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700371// and disassociated with an AudioRtpSender.
372TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
373 CreateAudioRtpSender();
374 DestroyAudioRtpSender();
375}
376
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700377// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700378// disassociated with a VideoRtpSender.
379TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
380 CreateVideoRtpSender();
381 DestroyVideoRtpSender();
382}
383
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700385// associated and disassociated with an AudioRtpReceiver.
386TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
387 CreateAudioRtpReceiver();
388 DestroyAudioRtpReceiver();
389}
390
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700391// Test that |video_channel_| is updated when a remote video track is
392// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700393TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
394 CreateVideoRtpReceiver();
395 DestroyVideoRtpReceiver();
396}
397
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100398TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
399 CreateAudioRtpReceiver({local_stream_});
400 DestroyAudioRtpReceiver();
401}
402
403TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
404 CreateVideoRtpReceiver({local_stream_});
405 DestroyVideoRtpReceiver();
406}
407
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700408// Test that the AudioRtpSender applies options from the local audio source.
409TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
410 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100411 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800412 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700413 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700414
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100415 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700416
417 DestroyAudioRtpSender();
418}
419
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700420// Test that the stream is muted when the track is disabled, and unmuted when
421// the track is enabled.
422TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
423 CreateAudioRtpSender();
424
425 audio_track_->set_enabled(false);
426 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
427
428 audio_track_->set_enabled(true);
429 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
430
431 DestroyAudioRtpSender();
432}
433
434// Test that the volume is set to 0 when the track is disabled, and back to
435// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700436TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
437 CreateAudioRtpReceiver();
438
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700439 double volume;
440 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
441 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700442
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 audio_track_->set_enabled(false);
444 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
445 EXPECT_EQ(0, volume);
446
deadbeef70ab1a12015-09-28 16:53:55 -0700447 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
449 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700450
451 DestroyAudioRtpReceiver();
452}
453
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454// Currently no action is taken when a remote video track is disabled or
455// enabled, so there's nothing to test here, other than what is normally
456// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700457TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
458 CreateVideoRtpSender();
459
deadbeef70ab1a12015-09-28 16:53:55 -0700460 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700461 video_track_->set_enabled(true);
462
463 DestroyVideoRtpSender();
464}
465
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466// Test that the state of the video track created by the VideoRtpReceiver is
467// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100468TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
469 CreateVideoRtpReceiver();
470
471 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
472 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
473 video_track_->GetSource()->state());
474
475 DestroyVideoRtpReceiver();
476
477 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
478 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
479 video_track_->GetSource()->state());
480}
481
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482// Currently no action is taken when a remote video track is disabled or
483// enabled, so there's nothing to test here, other than what is normally
484// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700485TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
486 CreateVideoRtpReceiver();
487
488 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700489 video_track_->set_enabled(true);
490
491 DestroyVideoRtpReceiver();
492}
493
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494// Test that the AudioRtpReceiver applies volume changes from the track source
495// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700496TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
497 CreateAudioRtpReceiver();
498
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 double volume;
500 audio_track_->GetSource()->SetVolume(0.5);
501 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
502 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700503
504 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700505 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 audio_track_->GetSource()->SetVolume(0.8);
507 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
508 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700511 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
513 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 // Try changing volume one more time.
516 audio_track_->GetSource()->SetVolume(0.9);
517 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
518 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700519
520 DestroyAudioRtpReceiver();
521}
522
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523// Test that the media channel isn't enabled for sending if the audio sender
524// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800525TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800526 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800527 rtc::scoped_refptr<AudioTrackInterface> track =
528 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529
530 // Track but no SSRC.
531 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
532 VerifyVoiceChannelNoInput();
533
534 // SSRC but no track.
535 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
536 audio_rtp_sender_->SetSsrc(kAudioSsrc);
537 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800538}
539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540// Test that the media channel isn't enabled for sending if the video sender
541// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800542TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800543 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544
545 // Track but no SSRC.
546 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
547 VerifyVideoChannelNoInput();
548
549 // SSRC but no track.
550 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
551 video_rtp_sender_->SetSsrc(kVideoSsrc);
552 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that the media channel is enabled for sending when the audio sender
556// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800557TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800558 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800559 rtc::scoped_refptr<AudioTrackInterface> track =
560 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 audio_rtp_sender_->SetSsrc(kAudioSsrc);
562 audio_rtp_sender_->SetTrack(track);
563 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800566}
567
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568// Test that the media channel is enabled for sending when the audio sender
569// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800570TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800571 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800572 rtc::scoped_refptr<AudioTrackInterface> track =
573 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574 audio_rtp_sender_->SetTrack(track);
575 audio_rtp_sender_->SetSsrc(kAudioSsrc);
576 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800579}
580
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581// Test that the media channel is enabled for sending when the video sender
582// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800583TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700584 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800585 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 video_rtp_sender_->SetSsrc(kVideoSsrc);
587 video_rtp_sender_->SetTrack(video_track_);
588 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800591}
592
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593// Test that the media channel is enabled for sending when the video sender
594// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800595TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700596 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800597 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598 video_rtp_sender_->SetTrack(video_track_);
599 video_rtp_sender_->SetSsrc(kVideoSsrc);
600 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800603}
604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605// Test that the media channel stops sending when the audio sender's SSRC is set
606// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800607TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 audio_rtp_sender_->SetSsrc(0);
611 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800612}
613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614// Test that the media channel stops sending when the video sender's SSRC is set
615// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800616TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800618
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700619 audio_rtp_sender_->SetSsrc(0);
620 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800621}
622
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623// Test that the media channel stops sending when the audio sender's track is
624// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800625TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800627
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
629 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800630}
631
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700632// Test that the media channel stops sending when the video sender's track is
633// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800634TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700635 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800636
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700637 video_rtp_sender_->SetSsrc(0);
638 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Test that when the audio sender's SSRC is changed, the media channel stops
642// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800643TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800645
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
647 VerifyVoiceChannelNoInput(kAudioSsrc);
648 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800649
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700650 audio_rtp_sender_ = nullptr;
651 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800652}
653
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654// Test that when the audio sender's SSRC is changed, the media channel stops
655// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800656TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800658
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 video_rtp_sender_->SetSsrc(kVideoSsrc2);
660 VerifyVideoChannelNoInput(kVideoSsrc);
661 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800662
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700663 video_rtp_sender_ = nullptr;
664 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800665}
666
skvladdc1c62c2016-03-16 19:07:43 -0700667TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
668 CreateAudioRtpSender();
669
skvladdc1c62c2016-03-16 19:07:43 -0700670 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800672 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700673
674 DestroyAudioRtpSender();
675}
676
Florent Castelli892acf02018-10-01 22:47:20 +0200677TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
678 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
679
680 RtpParameters params = audio_rtp_sender_->GetParameters();
681 ASSERT_EQ(1u, params.encodings.size());
682 params.encodings[0].max_bitrate_bps = 90000;
683 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
684
685 params = audio_rtp_sender_->GetParameters();
686 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
687 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
688
689 DestroyAudioRtpSender();
690}
691
692TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
693 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
694 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
695
696 audio_rtp_sender_ =
697 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
698 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
699 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
700
701 std::vector<RtpEncodingParameters> init_encodings(1);
702 init_encodings[0].max_bitrate_bps = 60000;
703 audio_rtp_sender_->set_init_send_encodings(init_encodings);
704
705 RtpParameters params = audio_rtp_sender_->GetParameters();
706 ASSERT_EQ(1u, params.encodings.size());
707 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
708
709 // Simulate the setLocalDescription call
710 std::vector<uint32_t> ssrcs(1, 1);
711 cricket::StreamParams stream_params =
712 cricket::CreateSimStreamParams("cname", ssrcs);
713 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800714 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200715 audio_rtp_sender_->SetSsrc(1);
716
717 params = audio_rtp_sender_->GetParameters();
718 ASSERT_EQ(1u, params.encodings.size());
719 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
720
721 DestroyAudioRtpSender();
722}
723
724TEST_F(RtpSenderReceiverTest,
725 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
726 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
727
728 RtpParameters params;
729 RTCError result = audio_rtp_sender_->SetParameters(params);
730 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
731 DestroyAudioRtpSender();
732}
733
Florent Castellicebf50f2018-05-03 15:31:53 +0200734TEST_F(RtpSenderReceiverTest,
735 AudioSenderMustCallGetParametersBeforeSetParameters) {
736 CreateAudioRtpSender();
737
738 RtpParameters params;
739 RTCError result = audio_rtp_sender_->SetParameters(params);
740 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
741
742 DestroyAudioRtpSender();
743}
744
745TEST_F(RtpSenderReceiverTest,
746 AudioSenderSetParametersInvalidatesTransactionId) {
747 CreateAudioRtpSender();
748
749 RtpParameters params = audio_rtp_sender_->GetParameters();
750 EXPECT_EQ(1u, params.encodings.size());
751 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
752 RTCError result = audio_rtp_sender_->SetParameters(params);
753 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
754
755 DestroyAudioRtpSender();
756}
757
758TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
759 CreateAudioRtpSender();
760
761 RtpParameters params = audio_rtp_sender_->GetParameters();
762 params.transaction_id = "";
763 RTCError result = audio_rtp_sender_->SetParameters(params);
764 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
765
766 DestroyAudioRtpSender();
767}
768
769TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
770 CreateAudioRtpSender();
771
772 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200773 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200774 auto saved_transaction_id = params.transaction_id;
775 params = audio_rtp_sender_->GetParameters();
776 EXPECT_NE(saved_transaction_id, params.transaction_id);
777
778 DestroyAudioRtpSender();
779}
780
781TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
782 CreateAudioRtpSender();
783
784 RtpParameters params = audio_rtp_sender_->GetParameters();
785 RtpParameters second_params = audio_rtp_sender_->GetParameters();
786
787 RTCError result = audio_rtp_sender_->SetParameters(params);
788 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700789 DestroyAudioRtpSender();
790}
791
792TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
793 CreateAudioRtpSender();
794 RtpParameters params = audio_rtp_sender_->GetParameters();
795 EXPECT_EQ(1u, params.encodings.size());
796
Florent Castelli87b3c512018-07-18 16:00:28 +0200797 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700798 params.mid = "dummy_mid";
799 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
800 audio_rtp_sender_->SetParameters(params).type());
801 params = audio_rtp_sender_->GetParameters();
802
Seth Hampson2d2c8882018-05-16 16:02:32 -0700803 DestroyAudioRtpSender();
804}
805
806TEST_F(RtpSenderReceiverTest,
807 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
808 CreateAudioRtpSender();
809 RtpParameters params = audio_rtp_sender_->GetParameters();
810 EXPECT_EQ(1u, params.encodings.size());
811
Henrik Grunelle1301a82018-12-13 12:13:22 +0000812 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castellic1a0bcb2019-01-29 14:26:48 +0100813 // scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000814 params.encodings[0].codec_payload_type = 1;
815 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
816 audio_rtp_sender_->SetParameters(params).type());
817 params = audio_rtp_sender_->GetParameters();
818
Seth Hampson2d2c8882018-05-16 16:02:32 -0700819 params.encodings[0].fec = RtpFecParameters();
820 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
821 audio_rtp_sender_->SetParameters(params).type());
822 params = audio_rtp_sender_->GetParameters();
823
824 params.encodings[0].rtx = RtpRtxParameters();
825 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
826 audio_rtp_sender_->SetParameters(params).type());
827 params = audio_rtp_sender_->GetParameters();
828
829 params.encodings[0].dtx = DtxStatus::ENABLED;
830 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
831 audio_rtp_sender_->SetParameters(params).type());
832 params = audio_rtp_sender_->GetParameters();
833
834 params.encodings[0].ptime = 1;
835 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
836 audio_rtp_sender_->SetParameters(params).type());
837 params = audio_rtp_sender_->GetParameters();
838
Seth Hampson2d2c8882018-05-16 16:02:32 -0700839 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;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100943 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200944 for (int i = 0; i < 2; ++i)
945 ssrcs.push_back(kVideoSsrcSimulcast + i);
946 cricket::StreamParams stream_params =
947 cricket::CreateSimStreamParams("cname", ssrcs);
948 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800949 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200950 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
951
952 params = video_rtp_sender_->GetParameters();
953 ASSERT_EQ(2u, params.encodings.size());
954 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
955 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
956
957 DestroyVideoRtpSender();
958}
959
960TEST_F(RtpSenderReceiverTest,
961 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
962 AddVideoTrack(false);
963
964 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
965 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
966 video_rtp_sender_->set_stream_ids({local_stream_->id()});
967
968 std::vector<RtpEncodingParameters> init_encodings(1);
969 init_encodings[0].max_bitrate_bps = 60000;
970 video_rtp_sender_->set_init_send_encodings(init_encodings);
971
972 RtpParameters params = video_rtp_sender_->GetParameters();
973 ASSERT_EQ(1u, params.encodings.size());
974 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
975
976 // Simulate the setLocalDescription call as if the user used SDP munging
977 // to enable simulcast
978 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100979 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200980 for (int i = 0; i < 2; ++i)
981 ssrcs.push_back(kVideoSsrcSimulcast + i);
982 cricket::StreamParams stream_params =
983 cricket::CreateSimStreamParams("cname", ssrcs);
984 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800985 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200986 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
987
988 params = video_rtp_sender_->GetParameters();
989 ASSERT_EQ(2u, params.encodings.size());
990 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
991
992 DestroyVideoRtpSender();
993}
994
995TEST_F(RtpSenderReceiverTest,
996 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
997 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
998
999 RtpParameters params;
1000 RTCError result = video_rtp_sender_->SetParameters(params);
1001 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1002 DestroyVideoRtpSender();
1003}
1004
Florent Castellicebf50f2018-05-03 15:31:53 +02001005TEST_F(RtpSenderReceiverTest,
1006 VideoSenderMustCallGetParametersBeforeSetParameters) {
1007 CreateVideoRtpSender();
1008
1009 RtpParameters params;
1010 RTCError result = video_rtp_sender_->SetParameters(params);
1011 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1012
1013 DestroyVideoRtpSender();
1014}
1015
1016TEST_F(RtpSenderReceiverTest,
1017 VideoSenderSetParametersInvalidatesTransactionId) {
1018 CreateVideoRtpSender();
1019
1020 RtpParameters params = video_rtp_sender_->GetParameters();
1021 EXPECT_EQ(1u, params.encodings.size());
1022 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1023 RTCError result = video_rtp_sender_->SetParameters(params);
1024 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1025
1026 DestroyVideoRtpSender();
1027}
1028
1029TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1030 CreateVideoRtpSender();
1031
1032 RtpParameters params = video_rtp_sender_->GetParameters();
1033 params.transaction_id = "";
1034 RTCError result = video_rtp_sender_->SetParameters(params);
1035 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1036
1037 DestroyVideoRtpSender();
1038}
1039
1040TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1041 CreateVideoRtpSender();
1042
1043 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001044 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001045 auto saved_transaction_id = params.transaction_id;
1046 params = video_rtp_sender_->GetParameters();
1047 EXPECT_NE(saved_transaction_id, params.transaction_id);
1048
1049 DestroyVideoRtpSender();
1050}
1051
1052TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1053 CreateVideoRtpSender();
1054
1055 RtpParameters params = video_rtp_sender_->GetParameters();
1056 RtpParameters second_params = video_rtp_sender_->GetParameters();
1057
1058 RTCError result = video_rtp_sender_->SetParameters(params);
1059 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1060
1061 DestroyVideoRtpSender();
1062}
1063
Seth Hampson2d2c8882018-05-16 16:02:32 -07001064TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1065 CreateVideoRtpSender();
1066 RtpParameters params = video_rtp_sender_->GetParameters();
1067 EXPECT_EQ(1u, params.encodings.size());
1068
Florent Castelli87b3c512018-07-18 16:00:28 +02001069 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001070 params.mid = "dummy_mid";
1071 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1072 video_rtp_sender_->SetParameters(params).type());
1073 params = video_rtp_sender_->GetParameters();
1074
Seth Hampson2d2c8882018-05-16 16:02:32 -07001075 DestroyVideoRtpSender();
1076}
1077
1078TEST_F(RtpSenderReceiverTest,
1079 VideoSenderCantSetUnimplementedEncodingParameters) {
1080 CreateVideoRtpSender();
1081 RtpParameters params = video_rtp_sender_->GetParameters();
1082 EXPECT_EQ(1u, params.encodings.size());
1083
Henrik Grunelle1301a82018-12-13 12:13:22 +00001084 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001085 // scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001086 params.encodings[0].codec_payload_type = 1;
1087 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1088 video_rtp_sender_->SetParameters(params).type());
1089 params = video_rtp_sender_->GetParameters();
1090
Seth Hampson2d2c8882018-05-16 16:02:32 -07001091 params.encodings[0].fec = RtpFecParameters();
1092 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1093 video_rtp_sender_->SetParameters(params).type());
1094 params = video_rtp_sender_->GetParameters();
1095
1096 params.encodings[0].rtx = RtpRtxParameters();
1097 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1098 video_rtp_sender_->SetParameters(params).type());
1099 params = video_rtp_sender_->GetParameters();
1100
1101 params.encodings[0].dtx = DtxStatus::ENABLED;
1102 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1103 video_rtp_sender_->SetParameters(params).type());
1104 params = video_rtp_sender_->GetParameters();
1105
1106 params.encodings[0].ptime = 1;
1107 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1108 video_rtp_sender_->SetParameters(params).type());
1109 params = video_rtp_sender_->GetParameters();
1110
Seth Hampson2d2c8882018-05-16 16:02:32 -07001111 params.encodings[0].rid = "dummy_rid";
1112 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1113 video_rtp_sender_->SetParameters(params).type());
1114 params = video_rtp_sender_->GetParameters();
1115
1116 params.encodings[0].dependency_rids.push_back("dummy_rid");
1117 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1118 video_rtp_sender_->SetParameters(params).type());
1119
1120 DestroyVideoRtpSender();
1121}
1122
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001123TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1124 CreateVideoRtpSender();
1125
1126 RtpParameters params = video_rtp_sender_->GetParameters();
1127 params.encodings[0].scale_resolution_down_by = 2;
1128
1129 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1130 params = video_rtp_sender_->GetParameters();
1131 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1132
1133 DestroyVideoRtpSender();
1134}
1135
1136TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1137 CreateVideoRtpSender();
1138
1139 RtpParameters params = video_rtp_sender_->GetParameters();
1140 params.encodings[0].scale_resolution_down_by = 0.5;
1141 RTCError result = video_rtp_sender_->SetParameters(params);
1142 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1143
1144 DestroyVideoRtpSender();
1145}
1146
Florent Castelli892acf02018-10-01 22:47:20 +02001147TEST_F(RtpSenderReceiverTest,
1148 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1149 CreateVideoRtpSenderWithSimulcast();
1150 RtpParameters params = video_rtp_sender_->GetParameters();
1151 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1152
Henrik Grunelle1301a82018-12-13 12:13:22 +00001153 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001154 // scale_framerate_down_by, rid, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001155 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001156 params.encodings[i].codec_payload_type = 1;
1157 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1158 video_rtp_sender_->SetParameters(params).type());
1159 params = video_rtp_sender_->GetParameters();
1160
Florent Castelli892acf02018-10-01 22:47:20 +02001161 params.encodings[i].fec = RtpFecParameters();
1162 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1163 video_rtp_sender_->SetParameters(params).type());
1164 params = video_rtp_sender_->GetParameters();
1165
1166 params.encodings[i].rtx = RtpRtxParameters();
1167 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1168 video_rtp_sender_->SetParameters(params).type());
1169 params = video_rtp_sender_->GetParameters();
1170
1171 params.encodings[i].dtx = DtxStatus::ENABLED;
1172 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1173 video_rtp_sender_->SetParameters(params).type());
1174 params = video_rtp_sender_->GetParameters();
1175
1176 params.encodings[i].ptime = 1;
1177 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1178 video_rtp_sender_->SetParameters(params).type());
1179 params = video_rtp_sender_->GetParameters();
1180
Florent Castelli892acf02018-10-01 22:47:20 +02001181 params.encodings[i].rid = "dummy_rid";
1182 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1183 video_rtp_sender_->SetParameters(params).type());
1184 params = video_rtp_sender_->GetParameters();
1185
1186 params.encodings[i].dependency_rids.push_back("dummy_rid");
1187 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1188 video_rtp_sender_->SetParameters(params).type());
1189 }
1190
1191 DestroyVideoRtpSender();
1192}
1193
Seth Hampson2d2c8882018-05-16 16:02:32 -07001194// A video sender can have multiple simulcast layers, in which case it will
1195// contain multiple RtpEncodingParameters. This tests that if this is the case
1196// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1197// for any encodings besides at index 0, because these are both implemented
1198// "per-sender."
1199TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1200 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001201 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001202 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001203 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001204
1205 params.encodings[1].bitrate_priority = 2.0;
1206 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1207 video_rtp_sender_->SetParameters(params).type());
1208 params = video_rtp_sender_->GetParameters();
1209
Seth Hampson2d2c8882018-05-16 16:02:32 -07001210 DestroyVideoRtpSender();
1211}
1212
Florent Castelli892acf02018-10-01 22:47:20 +02001213TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1214 // Add a simulcast specific send stream that contains 2 encoding parameters.
1215 CreateVideoRtpSenderWithSimulcast();
1216 RtpParameters params = video_rtp_sender_->GetParameters();
1217 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1218
1219 for (size_t i = 0; i < params.encodings.size(); i++) {
1220 params.encodings[i].ssrc = 1337;
1221 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1222 video_rtp_sender_->SetParameters(params).type());
1223 params = video_rtp_sender_->GetParameters();
1224 }
1225
1226 DestroyVideoRtpSender();
1227}
1228
Ă…sa Persson55659812018-06-18 17:51:32 +02001229TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001230 CreateVideoRtpSender();
1231
1232 EXPECT_EQ(-1, video_media_channel_->max_bps());
1233 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001234 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001235 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001236 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001237 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001238 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001239 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001240
1241 // Read back the parameters and verify they have been changed.
1242 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001243 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001244 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001245 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001246
1247 // Verify that the video channel received the new parameters.
1248 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001249 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001250 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001251 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001252
1253 // Verify that the global bitrate limit has not been changed.
1254 EXPECT_EQ(-1, video_media_channel_->max_bps());
1255
1256 DestroyVideoRtpSender();
1257}
1258
Ă…sa Persson55659812018-06-18 17:51:32 +02001259TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1260 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001261 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001262
1263 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001264 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001265 params.encodings[0].min_bitrate_bps = 100;
1266 params.encodings[0].max_bitrate_bps = 1000;
1267 params.encodings[1].min_bitrate_bps = 200;
1268 params.encodings[1].max_bitrate_bps = 2000;
1269 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1270
1271 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001272 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1273 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001274 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1275 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1276 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1277 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1278
1279 DestroyVideoRtpSender();
1280}
1281
Seth Hampson24722b32017-12-22 09:36:42 -08001282TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1283 CreateVideoRtpSender();
1284
1285 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001286 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001287 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1288 params.encodings[0].bitrate_priority);
1289 double new_bitrate_priority = 2.0;
1290 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001291 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001292
1293 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001294 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001295 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1296
1297 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001298 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001299 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1300
1301 DestroyVideoRtpSender();
1302}
1303
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001304TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1305 CreateAudioRtpReceiver();
1306
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001307 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001308 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001309 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1310
1311 DestroyAudioRtpReceiver();
1312}
1313
1314TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1315 CreateVideoRtpReceiver();
1316
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001317 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001318 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001319 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1320
1321 DestroyVideoRtpReceiver();
1322}
1323
Florent Castelli38332cd2018-11-20 14:08:06 +01001324TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1325 CreateVideoRtpReceiverWithSimulcast({}, 2);
1326
1327 RtpParameters params = video_rtp_receiver_->GetParameters();
1328 EXPECT_EQ(2u, params.encodings.size());
1329
1330 DestroyVideoRtpReceiver();
1331}
1332
pbos5214a0a2016-12-16 15:39:11 -08001333// Test that makes sure that a video track content hint translates to the proper
1334// value for sources that are not screencast.
1335TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1336 CreateVideoRtpSender();
1337
1338 video_track_->set_enabled(true);
1339
1340 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001341 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001342 // No content hint should be set by default.
1343 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1344 video_track_->content_hint());
1345 // Setting detailed should turn a non-screencast source into screencast mode.
1346 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001347 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001348 // Removing the content hint should turn the track back into non-screencast
1349 // mode.
1350 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001351 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001352 // Setting fluid should remain in non-screencast mode (its default).
1353 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001354 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001355 // Setting text should have the same effect as Detailed
1356 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1357 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001358
1359 DestroyVideoRtpSender();
1360}
1361
1362// Test that makes sure that a video track content hint translates to the proper
1363// value for screencast sources.
1364TEST_F(RtpSenderReceiverTest,
1365 PropagatesVideoTrackContentHintForScreencastSource) {
1366 CreateVideoRtpSender(true);
1367
1368 video_track_->set_enabled(true);
1369
1370 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001371 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001372 // No content hint should be set by default.
1373 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1374 video_track_->content_hint());
1375 // Setting fluid should turn a screencast source into non-screencast mode.
1376 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001377 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001378 // Removing the content hint should turn the track back into screencast mode.
1379 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001380 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001381 // Setting detailed should still remain in screencast mode (its default).
1382 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001383 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001384 // Setting text should have the same effect as Detailed
1385 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1386 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001387
1388 DestroyVideoRtpSender();
1389}
1390
1391// Test that makes sure any content hints that are set on a track before
1392// VideoRtpSender is ready to send are still applied when it gets ready to send.
1393TEST_F(RtpSenderReceiverTest,
1394 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1395 AddVideoTrack();
1396 // Setting detailed overrides the default non-screencast mode. This should be
1397 // applied even if the track is set on construction.
1398 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001399 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1400 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1401 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001402 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001403 video_track_->set_enabled(true);
1404
1405 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001406 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001407
1408 // Verify that the content hint is accounted for when video_rtp_sender_ does
1409 // get enabled.
1410 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001411 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001412
1413 // And removing the hint should go back to false (to verify that false was
1414 // default correctly).
1415 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001416 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001417
1418 DestroyVideoRtpSender();
1419}
1420
deadbeef20cb0c12017-02-01 20:27:00 -08001421TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1422 CreateAudioRtpSender();
1423 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1424}
1425
1426TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1427 CreateVideoRtpSender();
1428 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1429}
1430
1431// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1432// true/false from CanSendDtmf based on what |voice_channel_| returns.
1433TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1434 AddDtmfCodec();
1435 CreateAudioRtpSender();
1436 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1437 ASSERT_NE(nullptr, dtmf_sender);
1438 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1439}
1440
1441TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1442 CreateAudioRtpSender();
1443 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1444 ASSERT_NE(nullptr, dtmf_sender);
1445 // DTMF codec has not been added, as it was in the above test.
1446 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1447}
1448
1449TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1450 AddDtmfCodec();
1451 CreateAudioRtpSender();
1452 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1453 ASSERT_NE(nullptr, dtmf_sender);
1454
1455 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1456
1457 // Insert DTMF
1458 const int expected_duration = 90;
1459 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1460
1461 // Verify
1462 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1463 kDefaultTimeout);
1464 const uint32_t send_ssrc =
1465 voice_media_channel_->send_streams()[0].first_ssrc();
1466 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1467 send_ssrc, 0, expected_duration));
1468 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1469 send_ssrc, 1, expected_duration));
1470 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1471 send_ssrc, 2, expected_duration));
1472}
1473
1474// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1475// destroyed, which is needed for the DTMF sender.
1476TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1477 CreateAudioRtpSender();
1478 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1479 audio_rtp_sender_ = nullptr;
1480 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1481}
1482
Benjamin Wright84583f62018-10-04 14:22:34 -07001483// Validate that the default FrameEncryptor setting is nullptr.
1484TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1485 CreateAudioRtpSender();
1486 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1487 new FakeFrameEncryptor());
1488 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1489 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1490 EXPECT_EQ(fake_frame_encryptor.get(),
1491 audio_rtp_sender_->GetFrameEncryptor().get());
1492}
1493
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001494// Validate that setting a FrameEncryptor after the send stream is stopped does
1495// nothing.
1496TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1497 CreateAudioRtpSender();
1498 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1499 new FakeFrameEncryptor());
1500 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1501 audio_rtp_sender_->Stop();
1502 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1503 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1504}
1505
Benjamin Wright84583f62018-10-04 14:22:34 -07001506// Validate that the default FrameEncryptor setting is nullptr.
1507TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1508 CreateAudioRtpReceiver();
1509 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1510 new FakeFrameDecryptor());
1511 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1512 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1513 EXPECT_EQ(fake_frame_decryptor.get(),
1514 audio_rtp_receiver_->GetFrameDecryptor().get());
1515}
1516
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001517// Validate that the default FrameEncryptor setting is nullptr.
1518TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1519 CreateAudioRtpReceiver();
1520 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1521 new FakeFrameDecryptor());
1522 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1523 audio_rtp_receiver_->Stop();
1524 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1525 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1526}
1527
1528// Validate that the default FrameEncryptor setting is nullptr.
1529TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1530 CreateVideoRtpSender();
1531 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1532 new FakeFrameEncryptor());
1533 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1534 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1535 EXPECT_EQ(fake_frame_encryptor.get(),
1536 video_rtp_sender_->GetFrameEncryptor().get());
1537}
1538
1539// Validate that setting a FrameEncryptor after the send stream is stopped does
1540// nothing.
1541TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1542 CreateVideoRtpSender();
1543 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1544 new FakeFrameEncryptor());
1545 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1546 video_rtp_sender_->Stop();
1547 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1548 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1549}
1550
1551// Validate that the default FrameEncryptor setting is nullptr.
1552TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1553 CreateVideoRtpReceiver();
1554 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1555 new FakeFrameDecryptor());
1556 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1557 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1558 EXPECT_EQ(fake_frame_decryptor.get(),
1559 video_rtp_receiver_->GetFrameDecryptor().get());
1560}
1561
1562// Validate that the default FrameEncryptor setting is nullptr.
1563TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1564 CreateVideoRtpReceiver();
1565 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1566 new FakeFrameDecryptor());
1567 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1568 video_rtp_receiver_->Stop();
1569 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1570 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1571}
1572
deadbeef70ab1a12015-09-28 16:53:55 -07001573} // namespace webrtc