blob: b17246049a9501d541a146ffb590ef966ef99182 [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"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010044#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080045#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010046#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/channel_manager.h"
48#include "pc/dtls_srtp_transport.h"
49#include "pc/local_audio_source.h"
50#include "pc/media_stream.h"
51#include "pc/rtp_receiver.h"
52#include "pc/rtp_sender.h"
53#include "pc/rtp_transport_internal.h"
54#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010055#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080056#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010057#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020058#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010059#include "rtc_base/third_party/sigslot/sigslot.h"
60#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020061#include "test/gmock.h"
62#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070063
64using ::testing::_;
65using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070066using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070067using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070068
deadbeef20cb0c12017-02-01 20:27:00 -080069namespace {
70
Seth Hampson845e8782018-03-02 11:34:10 -080071static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070072static const char kVideoTrackId[] = "video_1";
73static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020074static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080075static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020076static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080077static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020078static const uint32_t kVideoSsrcSimulcast = 102;
79static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080080static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080081} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070082
83namespace webrtc {
84
deadbeef20cb0c12017-02-01 20:27:00 -080085class RtpSenderReceiverTest : public testing::Test,
86 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070087 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070088 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080089 : network_thread_(rtc::Thread::Current()),
90 worker_thread_(rtc::Thread::Current()),
91 // Create fake media engine/etc. so we can create channels to use to
92 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070093 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020094 channel_manager_(absl::WrapUnique(media_engine_),
95 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080096 worker_thread_,
97 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010098 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080099 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700100 // Create channels to be used by the RtpSenders and RtpReceivers.
101 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800102 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200103 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700104 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
105 rtp_transport_ = CreateDtlsSrtpTransport();
106
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700107 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700108 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700109 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800110 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
111 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700112 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700113 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100114 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800115 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
116 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800117 voice_channel_->Enable(true);
118 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700119 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
120 video_media_channel_ = media_engine_->GetVideoChannel(0);
121 RTC_CHECK(voice_channel_);
122 RTC_CHECK(video_channel_);
123 RTC_CHECK(voice_media_channel_);
124 RTC_CHECK(video_media_channel_);
125
126 // Create streams for predefined SSRCs. Streams need to exist in order
127 // for the senders and receievers to apply parameters to them.
128 // Normally these would be created by SetLocalDescription and
129 // SetRemoteDescription.
130 voice_media_channel_->AddSendStream(
131 cricket::StreamParams::CreateLegacy(kAudioSsrc));
132 voice_media_channel_->AddRecvStream(
133 cricket::StreamParams::CreateLegacy(kAudioSsrc));
134 voice_media_channel_->AddSendStream(
135 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
136 voice_media_channel_->AddRecvStream(
137 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
138 video_media_channel_->AddSendStream(
139 cricket::StreamParams::CreateLegacy(kVideoSsrc));
140 video_media_channel_->AddRecvStream(
141 cricket::StreamParams::CreateLegacy(kVideoSsrc));
142 video_media_channel_->AddSendStream(
143 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
144 video_media_channel_->AddRecvStream(
145 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700146 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700147
Zhi Huange830e682018-03-30 10:48:35 -0700148 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200149 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
150 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700151 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
152 /*rtcp_dtls_transport=*/nullptr);
153 return dtls_srtp_transport;
154 }
155
deadbeef20cb0c12017-02-01 20:27:00 -0800156 // Needed to use DTMF sender.
157 void AddDtmfCodec() {
158 cricket::AudioSendParameters params;
159 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
160 0, 1);
161 params.codecs.push_back(kTelephoneEventCodec);
162 voice_media_channel_->SetSendParameters(params);
163 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700164
pbos5214a0a2016-12-16 15:39:11 -0800165 void AddVideoTrack() { AddVideoTrack(false); }
166
167 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100168 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800169 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700170 video_track_ =
171 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800172 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700173 }
174
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
176
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100177 void CreateAudioRtpSender(
178 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700179 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800180 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800181 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700182 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
183 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
184 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800185 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800186 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800187 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
188 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700189 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700190 }
191
Steve Anton02ee47c2018-01-10 16:26:06 -0800192 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700193 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800194 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800195 }
196
deadbeef20cb0c12017-02-01 20:27:00 -0800197 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
198
Seth Hampson2d2c8882018-05-16 16:02:32 -0700199 void CreateVideoRtpSender(uint32_t ssrc) {
200 CreateVideoRtpSender(false, ssrc);
201 }
202
pbos5214a0a2016-12-16 15:39:11 -0800203 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
204
Florent Castelli892acf02018-10-01 22:47:20 +0200205 void CreateVideoRtpSenderWithSimulcast(
206 int num_layers = kVideoSimulcastLayerCount) {
207 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100208 ssrcs.reserve(num_layers);
Florent Castelli892acf02018-10-01 22:47:20 +0200209 for (int i = 0; i < num_layers; ++i)
210 ssrcs.push_back(kVideoSsrcSimulcast + i);
211 cricket::StreamParams stream_params =
212 cricket::CreateSimStreamParams("cname", ssrcs);
213 video_media_channel_->AddSendStream(stream_params);
214 uint32_t primary_ssrc = stream_params.first_ssrc();
215 CreateVideoRtpSender(primary_ssrc);
216 }
217
Seth Hampson2d2c8882018-05-16 16:02:32 -0700218 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800219 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700220 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
221 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
222 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800223 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700224 video_rtp_sender_->SetSsrc(ssrc);
225 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700226 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800227 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700228 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800229 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800230 }
231
deadbeef70ab1a12015-09-28 16:53:55 -0700232 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700233 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700234 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700235 }
236
237 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700238 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700239 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700240 }
241
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100242 void CreateAudioRtpReceiver(
243 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100244 audio_rtp_receiver_ =
245 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800246 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800247 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700248 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700249 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700250 }
251
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100252 void CreateVideoRtpReceiver(
253 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100254 video_rtp_receiver_ =
255 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800256 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800257 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100258 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700259 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700260 }
261
Florent Castelli38332cd2018-11-20 14:08:06 +0100262 void CreateVideoRtpReceiverWithSimulcast(
263 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
264 int num_layers = kVideoSimulcastLayerCount) {
265 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100266 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100267 for (int i = 0; i < num_layers; ++i)
268 ssrcs.push_back(kVideoSsrcSimulcast + i);
269 cricket::StreamParams stream_params =
270 cricket::CreateSimStreamParams("cname", ssrcs);
271 video_media_channel_->AddRecvStream(stream_params);
272 uint32_t primary_ssrc = stream_params.first_ssrc();
273
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100274 video_rtp_receiver_ =
275 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100276 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
277 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
278 video_track_ = video_rtp_receiver_->video_track();
279 }
280
deadbeef70ab1a12015-09-28 16:53:55 -0700281 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700282 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700283 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700284 }
285
286 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700287 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288 VerifyVideoChannelNoOutput();
289 }
290
291 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
292
293 void VerifyVoiceChannelInput(uint32_t ssrc) {
294 // Verify that the media channel has an audio source, and the stream isn't
295 // muted.
296 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
297 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
298 }
299
300 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
301
302 void VerifyVideoChannelInput(uint32_t ssrc) {
303 // Verify that the media channel has a video source,
304 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
305 }
306
307 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
308
309 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
310 // Verify that the media channel's source is reset.
311 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
312 }
313
314 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
315
316 void VerifyVideoChannelNoInput(uint32_t ssrc) {
317 // Verify that the media channel's source is reset.
318 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
319 }
320
321 void VerifyVoiceChannelOutput() {
322 // Verify that the volume is initialized to 1.
323 double volume;
324 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
325 EXPECT_EQ(1, volume);
326 }
327
328 void VerifyVideoChannelOutput() {
329 // Verify that the media channel has a sink.
330 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
331 }
332
333 void VerifyVoiceChannelNoOutput() {
334 // Verify that the volume is reset to 0.
335 double volume;
336 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
337 EXPECT_EQ(0, volume);
338 }
339
340 void VerifyVideoChannelNoOutput() {
341 // Verify that the media channel's sink is reset.
342 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700343 }
344
345 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800346 rtc::Thread* const network_thread_;
347 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700348 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700349 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
350 // the |channel_manager|.
351 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
352 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800353 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700354 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 cricket::ChannelManager channel_manager_;
356 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700357 cricket::VoiceChannel* voice_channel_;
358 cricket::VideoChannel* video_channel_;
359 cricket::FakeVoiceMediaChannel* voice_media_channel_;
360 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700361 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
362 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
363 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
364 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800365 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700366 rtc::scoped_refptr<VideoTrackInterface> video_track_;
367 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800368 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800369 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700370};
371
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700372// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700373// and disassociated with an AudioRtpSender.
374TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
375 CreateAudioRtpSender();
376 DestroyAudioRtpSender();
377}
378
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700379// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700380// disassociated with a VideoRtpSender.
381TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
382 CreateVideoRtpSender();
383 DestroyVideoRtpSender();
384}
385
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700387// associated and disassociated with an AudioRtpReceiver.
388TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
389 CreateAudioRtpReceiver();
390 DestroyAudioRtpReceiver();
391}
392
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700393// Test that |video_channel_| is updated when a remote video track is
394// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700395TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
396 CreateVideoRtpReceiver();
397 DestroyVideoRtpReceiver();
398}
399
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100400TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
401 CreateAudioRtpReceiver({local_stream_});
402 DestroyAudioRtpReceiver();
403}
404
405TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
406 CreateVideoRtpReceiver({local_stream_});
407 DestroyVideoRtpReceiver();
408}
409
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700410// Test that the AudioRtpSender applies options from the local audio source.
411TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
412 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100413 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800414 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700415 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700416
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100417 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700418
419 DestroyAudioRtpSender();
420}
421
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700422// Test that the stream is muted when the track is disabled, and unmuted when
423// the track is enabled.
424TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
425 CreateAudioRtpSender();
426
427 audio_track_->set_enabled(false);
428 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
429
430 audio_track_->set_enabled(true);
431 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
432
433 DestroyAudioRtpSender();
434}
435
436// Test that the volume is set to 0 when the track is disabled, and back to
437// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700438TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
439 CreateAudioRtpReceiver();
440
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700441 double volume;
442 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
443 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700444
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700445 audio_track_->set_enabled(false);
446 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
447 EXPECT_EQ(0, volume);
448
deadbeef70ab1a12015-09-28 16:53:55 -0700449 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
451 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700452
453 DestroyAudioRtpReceiver();
454}
455
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700456// Currently no action is taken when a remote video track is disabled or
457// enabled, so there's nothing to test here, other than what is normally
458// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700459TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
460 CreateVideoRtpSender();
461
deadbeef70ab1a12015-09-28 16:53:55 -0700462 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700463 video_track_->set_enabled(true);
464
465 DestroyVideoRtpSender();
466}
467
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700468// Test that the state of the video track created by the VideoRtpReceiver is
469// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100470TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
471 CreateVideoRtpReceiver();
472
473 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
474 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
475 video_track_->GetSource()->state());
476
477 DestroyVideoRtpReceiver();
478
479 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
480 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
481 video_track_->GetSource()->state());
482}
483
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700484// Currently no action is taken when a remote video track is disabled or
485// enabled, so there's nothing to test here, other than what is normally
486// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700487TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
488 CreateVideoRtpReceiver();
489
490 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700491 video_track_->set_enabled(true);
492
493 DestroyVideoRtpReceiver();
494}
495
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700496// Test that the AudioRtpReceiver applies volume changes from the track source
497// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700498TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
499 CreateAudioRtpReceiver();
500
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501 double volume;
502 audio_track_->GetSource()->SetVolume(0.5);
503 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
504 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700505
506 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700507 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700508 audio_track_->GetSource()->SetVolume(0.8);
509 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
510 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700511
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700513 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
515 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517 // Try changing volume one more time.
518 audio_track_->GetSource()->SetVolume(0.9);
519 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
520 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700521
522 DestroyAudioRtpReceiver();
523}
524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525// Test that the media channel isn't enabled for sending if the audio sender
526// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800527TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800528 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800529 rtc::scoped_refptr<AudioTrackInterface> track =
530 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531
532 // Track but no SSRC.
533 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
534 VerifyVoiceChannelNoInput();
535
536 // SSRC but no track.
537 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
538 audio_rtp_sender_->SetSsrc(kAudioSsrc);
539 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800540}
541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542// Test that the media channel isn't enabled for sending if the video sender
543// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800544TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800545 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546
547 // Track but no SSRC.
548 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
549 VerifyVideoChannelNoInput();
550
551 // SSRC but no track.
552 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
553 video_rtp_sender_->SetSsrc(kVideoSsrc);
554 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800555}
556
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700557// Test that the media channel is enabled for sending when the audio sender
558// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800559TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800560 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800561 rtc::scoped_refptr<AudioTrackInterface> track =
562 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563 audio_rtp_sender_->SetSsrc(kAudioSsrc);
564 audio_rtp_sender_->SetTrack(track);
565 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// Test that the media channel is enabled for sending when the audio sender
571// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800572TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800573 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800574 rtc::scoped_refptr<AudioTrackInterface> track =
575 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576 audio_rtp_sender_->SetTrack(track);
577 audio_rtp_sender_->SetSsrc(kAudioSsrc);
578 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800579
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800581}
582
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583// Test that the media channel is enabled for sending when the video sender
584// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800585TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700586 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800587 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 video_rtp_sender_->SetSsrc(kVideoSsrc);
589 video_rtp_sender_->SetTrack(video_track_);
590 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800591
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800593}
594
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595// Test that the media channel is enabled for sending when the video sender
596// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800597TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700598 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800599 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600 video_rtp_sender_->SetTrack(video_track_);
601 video_rtp_sender_->SetSsrc(kVideoSsrc);
602 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800603
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700604 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800605}
606
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607// Test that the media channel stops sending when the audio sender's SSRC is set
608// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800609TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800611
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612 audio_rtp_sender_->SetSsrc(0);
613 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800614}
615
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616// Test that the media channel stops sending when the video sender's SSRC is set
617// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800618TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700619 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800620
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621 audio_rtp_sender_->SetSsrc(0);
622 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800623}
624
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625// Test that the media channel stops sending when the audio sender's track is
626// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800627TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800629
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
631 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800632}
633
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700634// Test that the media channel stops sending when the video sender's track is
635// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800636TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700637 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800638
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700639 video_rtp_sender_->SetSsrc(0);
640 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800641}
642
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700643// Test that when the audio sender's SSRC is changed, the media channel stops
644// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800645TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800647
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700648 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
649 VerifyVoiceChannelNoInput(kAudioSsrc);
650 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800651
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700652 audio_rtp_sender_ = nullptr;
653 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800654}
655
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700656// Test that when the audio sender's SSRC is changed, the media channel stops
657// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800658TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800660
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 video_rtp_sender_->SetSsrc(kVideoSsrc2);
662 VerifyVideoChannelNoInput(kVideoSsrc);
663 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800664
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665 video_rtp_sender_ = nullptr;
666 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800667}
668
skvladdc1c62c2016-03-16 19:07:43 -0700669TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
670 CreateAudioRtpSender();
671
skvladdc1c62c2016-03-16 19:07:43 -0700672 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700673 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800674 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700675
676 DestroyAudioRtpSender();
677}
678
Florent Castelli892acf02018-10-01 22:47:20 +0200679TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
680 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
681
682 RtpParameters params = audio_rtp_sender_->GetParameters();
683 ASSERT_EQ(1u, params.encodings.size());
684 params.encodings[0].max_bitrate_bps = 90000;
685 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
686
687 params = audio_rtp_sender_->GetParameters();
688 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
689 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
690
691 DestroyAudioRtpSender();
692}
693
694TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
695 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
696 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
697
698 audio_rtp_sender_ =
699 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
700 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
701 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
702
703 std::vector<RtpEncodingParameters> init_encodings(1);
704 init_encodings[0].max_bitrate_bps = 60000;
705 audio_rtp_sender_->set_init_send_encodings(init_encodings);
706
707 RtpParameters params = audio_rtp_sender_->GetParameters();
708 ASSERT_EQ(1u, params.encodings.size());
709 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
710
711 // Simulate the setLocalDescription call
712 std::vector<uint32_t> ssrcs(1, 1);
713 cricket::StreamParams stream_params =
714 cricket::CreateSimStreamParams("cname", ssrcs);
715 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800716 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200717 audio_rtp_sender_->SetSsrc(1);
718
719 params = audio_rtp_sender_->GetParameters();
720 ASSERT_EQ(1u, params.encodings.size());
721 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
722
723 DestroyAudioRtpSender();
724}
725
726TEST_F(RtpSenderReceiverTest,
727 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
728 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
729
730 RtpParameters params;
731 RTCError result = audio_rtp_sender_->SetParameters(params);
732 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
733 DestroyAudioRtpSender();
734}
735
Florent Castellicebf50f2018-05-03 15:31:53 +0200736TEST_F(RtpSenderReceiverTest,
737 AudioSenderMustCallGetParametersBeforeSetParameters) {
738 CreateAudioRtpSender();
739
740 RtpParameters params;
741 RTCError result = audio_rtp_sender_->SetParameters(params);
742 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
743
744 DestroyAudioRtpSender();
745}
746
747TEST_F(RtpSenderReceiverTest,
748 AudioSenderSetParametersInvalidatesTransactionId) {
749 CreateAudioRtpSender();
750
751 RtpParameters params = audio_rtp_sender_->GetParameters();
752 EXPECT_EQ(1u, params.encodings.size());
753 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
754 RTCError result = audio_rtp_sender_->SetParameters(params);
755 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
756
757 DestroyAudioRtpSender();
758}
759
760TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
761 CreateAudioRtpSender();
762
763 RtpParameters params = audio_rtp_sender_->GetParameters();
764 params.transaction_id = "";
765 RTCError result = audio_rtp_sender_->SetParameters(params);
766 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
767
768 DestroyAudioRtpSender();
769}
770
771TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
772 CreateAudioRtpSender();
773
774 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200775 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200776 auto saved_transaction_id = params.transaction_id;
777 params = audio_rtp_sender_->GetParameters();
778 EXPECT_NE(saved_transaction_id, params.transaction_id);
779
780 DestroyAudioRtpSender();
781}
782
783TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
784 CreateAudioRtpSender();
785
786 RtpParameters params = audio_rtp_sender_->GetParameters();
787 RtpParameters second_params = audio_rtp_sender_->GetParameters();
788
789 RTCError result = audio_rtp_sender_->SetParameters(params);
790 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700791 DestroyAudioRtpSender();
792}
793
794TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
795 CreateAudioRtpSender();
796 RtpParameters params = audio_rtp_sender_->GetParameters();
797 EXPECT_EQ(1u, params.encodings.size());
798
Florent Castelli87b3c512018-07-18 16:00:28 +0200799 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700800 params.mid = "dummy_mid";
801 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
802 audio_rtp_sender_->SetParameters(params).type());
803 params = audio_rtp_sender_->GetParameters();
804
Seth Hampson2d2c8882018-05-16 16:02:32 -0700805 DestroyAudioRtpSender();
806}
807
808TEST_F(RtpSenderReceiverTest,
809 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
810 CreateAudioRtpSender();
811 RtpParameters params = audio_rtp_sender_->GetParameters();
812 EXPECT_EQ(1u, params.encodings.size());
813
Henrik Grunelle1301a82018-12-13 12:13:22 +0000814 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -0800815 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000816 params.encodings[0].codec_payload_type = 1;
817 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
818 audio_rtp_sender_->SetParameters(params).type());
819 params = audio_rtp_sender_->GetParameters();
820
Seth Hampson2d2c8882018-05-16 16:02:32 -0700821 params.encodings[0].fec = RtpFecParameters();
822 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
823 audio_rtp_sender_->SetParameters(params).type());
824 params = audio_rtp_sender_->GetParameters();
825
826 params.encodings[0].rtx = RtpRtxParameters();
827 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
828 audio_rtp_sender_->SetParameters(params).type());
829 params = audio_rtp_sender_->GetParameters();
830
831 params.encodings[0].dtx = DtxStatus::ENABLED;
832 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
833 audio_rtp_sender_->SetParameters(params).type());
834 params = audio_rtp_sender_->GetParameters();
835
836 params.encodings[0].ptime = 1;
837 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
838 audio_rtp_sender_->SetParameters(params).type());
839 params = audio_rtp_sender_->GetParameters();
840
Seth Hampson2d2c8882018-05-16 16:02:32 -0700841 params.encodings[0].dependency_rids.push_back("dummy_rid");
842 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
843 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200844
845 DestroyAudioRtpSender();
846}
847
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700848TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
849 CreateAudioRtpSender();
850
851 EXPECT_EQ(-1, voice_media_channel_->max_bps());
852 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200853 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800854 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100855 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800856 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700857
858 // Read back the parameters and verify they have been changed.
859 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200860 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100861 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700862
863 // Verify that the audio channel received the new parameters.
864 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200865 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100866 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700867
868 // Verify that the global bitrate limit has not been changed.
869 EXPECT_EQ(-1, voice_media_channel_->max_bps());
870
871 DestroyAudioRtpSender();
872}
873
Seth Hampson24722b32017-12-22 09:36:42 -0800874TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
875 CreateAudioRtpSender();
876
877 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200878 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800879 EXPECT_EQ(webrtc::kDefaultBitratePriority,
880 params.encodings[0].bitrate_priority);
881 double new_bitrate_priority = 2.0;
882 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800883 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800884
885 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200886 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800887 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
888
889 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200890 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800891 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
892
893 DestroyAudioRtpSender();
894}
895
skvladdc1c62c2016-03-16 19:07:43 -0700896TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
897 CreateVideoRtpSender();
898
skvladdc1c62c2016-03-16 19:07:43 -0700899 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700900 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800901 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700902
903 DestroyVideoRtpSender();
904}
905
Florent Castelli892acf02018-10-01 22:47:20 +0200906TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
907 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
908
909 RtpParameters params = video_rtp_sender_->GetParameters();
910 ASSERT_EQ(1u, params.encodings.size());
911 params.encodings[0].max_bitrate_bps = 90000;
912 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
913
914 params = video_rtp_sender_->GetParameters();
915 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
916 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
917
918 DestroyVideoRtpSender();
919}
920
921TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
922 AddVideoTrack(false);
923
924 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
925 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
926 video_rtp_sender_->set_stream_ids({local_stream_->id()});
927
928 std::vector<RtpEncodingParameters> init_encodings(2);
929 init_encodings[0].max_bitrate_bps = 60000;
930 init_encodings[1].max_bitrate_bps = 900000;
931 video_rtp_sender_->set_init_send_encodings(init_encodings);
932
933 RtpParameters params = video_rtp_sender_->GetParameters();
934 ASSERT_EQ(2u, params.encodings.size());
935 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
936 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
937
938 // Simulate the setLocalDescription call
939 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100940 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200941 for (int i = 0; i < 2; ++i)
942 ssrcs.push_back(kVideoSsrcSimulcast + i);
943 cricket::StreamParams stream_params =
944 cricket::CreateSimStreamParams("cname", ssrcs);
945 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800946 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200947 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
948
949 params = video_rtp_sender_->GetParameters();
950 ASSERT_EQ(2u, params.encodings.size());
951 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
952 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
953
954 DestroyVideoRtpSender();
955}
956
957TEST_F(RtpSenderReceiverTest,
958 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
959 AddVideoTrack(false);
960
961 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
962 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
963 video_rtp_sender_->set_stream_ids({local_stream_->id()});
964
965 std::vector<RtpEncodingParameters> init_encodings(1);
966 init_encodings[0].max_bitrate_bps = 60000;
967 video_rtp_sender_->set_init_send_encodings(init_encodings);
968
969 RtpParameters params = video_rtp_sender_->GetParameters();
970 ASSERT_EQ(1u, params.encodings.size());
971 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
972
973 // Simulate the setLocalDescription call as if the user used SDP munging
974 // to enable simulcast
975 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100976 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200977 for (int i = 0; i < 2; ++i)
978 ssrcs.push_back(kVideoSsrcSimulcast + i);
979 cricket::StreamParams stream_params =
980 cricket::CreateSimStreamParams("cname", ssrcs);
981 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800982 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200983 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
984
985 params = video_rtp_sender_->GetParameters();
986 ASSERT_EQ(2u, params.encodings.size());
987 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
988
989 DestroyVideoRtpSender();
990}
991
992TEST_F(RtpSenderReceiverTest,
993 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
994 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
995
996 RtpParameters params;
997 RTCError result = video_rtp_sender_->SetParameters(params);
998 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
999 DestroyVideoRtpSender();
1000}
1001
Florent Castellicebf50f2018-05-03 15:31:53 +02001002TEST_F(RtpSenderReceiverTest,
1003 VideoSenderMustCallGetParametersBeforeSetParameters) {
1004 CreateVideoRtpSender();
1005
1006 RtpParameters params;
1007 RTCError result = video_rtp_sender_->SetParameters(params);
1008 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1009
1010 DestroyVideoRtpSender();
1011}
1012
1013TEST_F(RtpSenderReceiverTest,
1014 VideoSenderSetParametersInvalidatesTransactionId) {
1015 CreateVideoRtpSender();
1016
1017 RtpParameters params = video_rtp_sender_->GetParameters();
1018 EXPECT_EQ(1u, params.encodings.size());
1019 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1020 RTCError result = video_rtp_sender_->SetParameters(params);
1021 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1022
1023 DestroyVideoRtpSender();
1024}
1025
1026TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1027 CreateVideoRtpSender();
1028
1029 RtpParameters params = video_rtp_sender_->GetParameters();
1030 params.transaction_id = "";
1031 RTCError result = video_rtp_sender_->SetParameters(params);
1032 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1033
1034 DestroyVideoRtpSender();
1035}
1036
1037TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1038 CreateVideoRtpSender();
1039
1040 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001041 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001042 auto saved_transaction_id = params.transaction_id;
1043 params = video_rtp_sender_->GetParameters();
1044 EXPECT_NE(saved_transaction_id, params.transaction_id);
1045
1046 DestroyVideoRtpSender();
1047}
1048
1049TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1050 CreateVideoRtpSender();
1051
1052 RtpParameters params = video_rtp_sender_->GetParameters();
1053 RtpParameters second_params = video_rtp_sender_->GetParameters();
1054
1055 RTCError result = video_rtp_sender_->SetParameters(params);
1056 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1057
1058 DestroyVideoRtpSender();
1059}
1060
Seth Hampson2d2c8882018-05-16 16:02:32 -07001061TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1062 CreateVideoRtpSender();
1063 RtpParameters params = video_rtp_sender_->GetParameters();
1064 EXPECT_EQ(1u, params.encodings.size());
1065
Florent Castelli87b3c512018-07-18 16:00:28 +02001066 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001067 params.mid = "dummy_mid";
1068 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1069 video_rtp_sender_->SetParameters(params).type());
1070 params = video_rtp_sender_->GetParameters();
1071
Seth Hampson2d2c8882018-05-16 16:02:32 -07001072 DestroyVideoRtpSender();
1073}
1074
1075TEST_F(RtpSenderReceiverTest,
1076 VideoSenderCantSetUnimplementedEncodingParameters) {
1077 CreateVideoRtpSender();
1078 RtpParameters params = video_rtp_sender_->GetParameters();
1079 EXPECT_EQ(1u, params.encodings.size());
1080
Henrik Grunelle1301a82018-12-13 12:13:22 +00001081 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001082 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001083 params.encodings[0].codec_payload_type = 1;
1084 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1085 video_rtp_sender_->SetParameters(params).type());
1086 params = video_rtp_sender_->GetParameters();
1087
Seth Hampson2d2c8882018-05-16 16:02:32 -07001088 params.encodings[0].fec = RtpFecParameters();
1089 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1090 video_rtp_sender_->SetParameters(params).type());
1091 params = video_rtp_sender_->GetParameters();
1092
1093 params.encodings[0].rtx = RtpRtxParameters();
1094 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1095 video_rtp_sender_->SetParameters(params).type());
1096 params = video_rtp_sender_->GetParameters();
1097
1098 params.encodings[0].dtx = DtxStatus::ENABLED;
1099 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1100 video_rtp_sender_->SetParameters(params).type());
1101 params = video_rtp_sender_->GetParameters();
1102
1103 params.encodings[0].ptime = 1;
1104 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1105 video_rtp_sender_->SetParameters(params).type());
1106 params = video_rtp_sender_->GetParameters();
1107
Seth Hampson2d2c8882018-05-16 16:02:32 -07001108 params.encodings[0].dependency_rids.push_back("dummy_rid");
1109 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1110 video_rtp_sender_->SetParameters(params).type());
1111
1112 DestroyVideoRtpSender();
1113}
1114
Amit Hilbuchaa584152019-02-06 17:09:52 -08001115TEST_F(RtpSenderReceiverTest, VideoSenderCanSetRid) {
1116 CreateVideoRtpSender();
1117 RtpParameters params = video_rtp_sender_->GetParameters();
1118 EXPECT_EQ(1u, params.encodings.size());
1119 const std::string rid = "dummy_rid";
1120 params.encodings[0].rid = rid;
1121 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1122 params = video_rtp_sender_->GetParameters();
1123 EXPECT_EQ(1u, params.encodings.size());
1124 EXPECT_EQ(rid, params.encodings[0].rid);
1125
1126 DestroyVideoRtpSender();
1127}
1128
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001129TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1130 CreateVideoRtpSender();
1131
1132 RtpParameters params = video_rtp_sender_->GetParameters();
1133 params.encodings[0].scale_resolution_down_by = 2;
1134
1135 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1136 params = video_rtp_sender_->GetParameters();
1137 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1138
1139 DestroyVideoRtpSender();
1140}
1141
1142TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1143 CreateVideoRtpSender();
1144
1145 RtpParameters params = video_rtp_sender_->GetParameters();
1146 params.encodings[0].scale_resolution_down_by = 0.5;
1147 RTCError result = video_rtp_sender_->SetParameters(params);
1148 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1149
1150 DestroyVideoRtpSender();
1151}
1152
Florent Castelli892acf02018-10-01 22:47:20 +02001153TEST_F(RtpSenderReceiverTest,
1154 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1155 CreateVideoRtpSenderWithSimulcast();
1156 RtpParameters params = video_rtp_sender_->GetParameters();
1157 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1158
Henrik Grunelle1301a82018-12-13 12:13:22 +00001159 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001160 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001161 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001162 params.encodings[i].codec_payload_type = 1;
1163 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1164 video_rtp_sender_->SetParameters(params).type());
1165 params = video_rtp_sender_->GetParameters();
1166
Florent Castelli892acf02018-10-01 22:47:20 +02001167 params.encodings[i].fec = RtpFecParameters();
1168 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1169 video_rtp_sender_->SetParameters(params).type());
1170 params = video_rtp_sender_->GetParameters();
1171
1172 params.encodings[i].rtx = RtpRtxParameters();
1173 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1174 video_rtp_sender_->SetParameters(params).type());
1175 params = video_rtp_sender_->GetParameters();
1176
1177 params.encodings[i].dtx = DtxStatus::ENABLED;
1178 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1179 video_rtp_sender_->SetParameters(params).type());
1180 params = video_rtp_sender_->GetParameters();
1181
1182 params.encodings[i].ptime = 1;
1183 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1184 video_rtp_sender_->SetParameters(params).type());
1185 params = video_rtp_sender_->GetParameters();
1186
Florent Castelli892acf02018-10-01 22:47:20 +02001187 params.encodings[i].dependency_rids.push_back("dummy_rid");
1188 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1189 video_rtp_sender_->SetParameters(params).type());
1190 }
1191
1192 DestroyVideoRtpSender();
1193}
1194
Seth Hampson2d2c8882018-05-16 16:02:32 -07001195// A video sender can have multiple simulcast layers, in which case it will
1196// contain multiple RtpEncodingParameters. This tests that if this is the case
1197// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1198// for any encodings besides at index 0, because these are both implemented
1199// "per-sender."
1200TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1201 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001202 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001203 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001204 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001205
1206 params.encodings[1].bitrate_priority = 2.0;
1207 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1208 video_rtp_sender_->SetParameters(params).type());
1209 params = video_rtp_sender_->GetParameters();
1210
Seth Hampson2d2c8882018-05-16 16:02:32 -07001211 DestroyVideoRtpSender();
1212}
1213
Florent Castelli892acf02018-10-01 22:47:20 +02001214TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1215 // Add a simulcast specific send stream that contains 2 encoding parameters.
1216 CreateVideoRtpSenderWithSimulcast();
1217 RtpParameters params = video_rtp_sender_->GetParameters();
1218 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1219
1220 for (size_t i = 0; i < params.encodings.size(); i++) {
1221 params.encodings[i].ssrc = 1337;
1222 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1223 video_rtp_sender_->SetParameters(params).type());
1224 params = video_rtp_sender_->GetParameters();
1225 }
1226
1227 DestroyVideoRtpSender();
1228}
1229
Ă…sa Persson55659812018-06-18 17:51:32 +02001230TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001231 CreateVideoRtpSender();
1232
1233 EXPECT_EQ(-1, video_media_channel_->max_bps());
1234 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001235 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001236 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001237 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001238 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001239 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001240 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001241
1242 // Read back the parameters and verify they have been changed.
1243 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001244 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001245 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001246 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001247
1248 // Verify that the video channel received the new parameters.
1249 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001250 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001251 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001252 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001253
1254 // Verify that the global bitrate limit has not been changed.
1255 EXPECT_EQ(-1, video_media_channel_->max_bps());
1256
1257 DestroyVideoRtpSender();
1258}
1259
Ă…sa Persson55659812018-06-18 17:51:32 +02001260TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1261 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001262 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001263
1264 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001265 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001266 params.encodings[0].min_bitrate_bps = 100;
1267 params.encodings[0].max_bitrate_bps = 1000;
1268 params.encodings[1].min_bitrate_bps = 200;
1269 params.encodings[1].max_bitrate_bps = 2000;
1270 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1271
1272 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001273 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1274 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001275 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1276 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1277 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1278 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1279
1280 DestroyVideoRtpSender();
1281}
1282
Seth Hampson24722b32017-12-22 09:36:42 -08001283TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1284 CreateVideoRtpSender();
1285
1286 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001287 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001288 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1289 params.encodings[0].bitrate_priority);
1290 double new_bitrate_priority = 2.0;
1291 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001292 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001293
1294 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001295 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001296 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1297
1298 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001299 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001300 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1301
1302 DestroyVideoRtpSender();
1303}
1304
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001305TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1306 CreateAudioRtpReceiver();
1307
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001308 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001309 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001310 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1311
1312 DestroyAudioRtpReceiver();
1313}
1314
1315TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1316 CreateVideoRtpReceiver();
1317
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001318 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001319 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001320 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1321
1322 DestroyVideoRtpReceiver();
1323}
1324
Florent Castelli38332cd2018-11-20 14:08:06 +01001325TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1326 CreateVideoRtpReceiverWithSimulcast({}, 2);
1327
1328 RtpParameters params = video_rtp_receiver_->GetParameters();
1329 EXPECT_EQ(2u, params.encodings.size());
1330
1331 DestroyVideoRtpReceiver();
1332}
1333
pbos5214a0a2016-12-16 15:39:11 -08001334// Test that makes sure that a video track content hint translates to the proper
1335// value for sources that are not screencast.
1336TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1337 CreateVideoRtpSender();
1338
1339 video_track_->set_enabled(true);
1340
1341 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001342 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001343 // No content hint should be set by default.
1344 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1345 video_track_->content_hint());
1346 // Setting detailed should turn a non-screencast source into screencast mode.
1347 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001348 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001349 // Removing the content hint should turn the track back into non-screencast
1350 // mode.
1351 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001352 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001353 // Setting fluid should remain in non-screencast mode (its default).
1354 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001355 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001356 // Setting text should have the same effect as Detailed
1357 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1358 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001359
1360 DestroyVideoRtpSender();
1361}
1362
1363// Test that makes sure that a video track content hint translates to the proper
1364// value for screencast sources.
1365TEST_F(RtpSenderReceiverTest,
1366 PropagatesVideoTrackContentHintForScreencastSource) {
1367 CreateVideoRtpSender(true);
1368
1369 video_track_->set_enabled(true);
1370
1371 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001372 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001373 // No content hint should be set by default.
1374 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1375 video_track_->content_hint());
1376 // Setting fluid should turn a screencast source into non-screencast mode.
1377 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001378 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001379 // Removing the content hint should turn the track back into screencast mode.
1380 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001381 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001382 // Setting detailed should still remain in screencast mode (its default).
1383 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001384 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001385 // Setting text should have the same effect as Detailed
1386 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1387 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001388
1389 DestroyVideoRtpSender();
1390}
1391
1392// Test that makes sure any content hints that are set on a track before
1393// VideoRtpSender is ready to send are still applied when it gets ready to send.
1394TEST_F(RtpSenderReceiverTest,
1395 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1396 AddVideoTrack();
1397 // Setting detailed overrides the default non-screencast mode. This should be
1398 // applied even if the track is set on construction.
1399 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001400 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1401 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1402 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001403 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001404 video_track_->set_enabled(true);
1405
1406 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001407 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001408
1409 // Verify that the content hint is accounted for when video_rtp_sender_ does
1410 // get enabled.
1411 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001412 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001413
1414 // And removing the hint should go back to false (to verify that false was
1415 // default correctly).
1416 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001417 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001418
1419 DestroyVideoRtpSender();
1420}
1421
deadbeef20cb0c12017-02-01 20:27:00 -08001422TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1423 CreateAudioRtpSender();
1424 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1425}
1426
1427TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1428 CreateVideoRtpSender();
1429 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1430}
1431
1432// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1433// true/false from CanSendDtmf based on what |voice_channel_| returns.
1434TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1435 AddDtmfCodec();
1436 CreateAudioRtpSender();
1437 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1438 ASSERT_NE(nullptr, dtmf_sender);
1439 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1440}
1441
1442TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1443 CreateAudioRtpSender();
1444 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1445 ASSERT_NE(nullptr, dtmf_sender);
1446 // DTMF codec has not been added, as it was in the above test.
1447 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1448}
1449
1450TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1451 AddDtmfCodec();
1452 CreateAudioRtpSender();
1453 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1454 ASSERT_NE(nullptr, dtmf_sender);
1455
1456 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1457
1458 // Insert DTMF
1459 const int expected_duration = 90;
1460 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1461
1462 // Verify
1463 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1464 kDefaultTimeout);
1465 const uint32_t send_ssrc =
1466 voice_media_channel_->send_streams()[0].first_ssrc();
1467 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1468 send_ssrc, 0, expected_duration));
1469 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1470 send_ssrc, 1, expected_duration));
1471 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1472 send_ssrc, 2, expected_duration));
1473}
1474
1475// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1476// destroyed, which is needed for the DTMF sender.
1477TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1478 CreateAudioRtpSender();
1479 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1480 audio_rtp_sender_ = nullptr;
1481 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1482}
1483
Benjamin Wright84583f62018-10-04 14:22:34 -07001484// Validate that the default FrameEncryptor setting is nullptr.
1485TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1486 CreateAudioRtpSender();
1487 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1488 new FakeFrameEncryptor());
1489 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1490 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1491 EXPECT_EQ(fake_frame_encryptor.get(),
1492 audio_rtp_sender_->GetFrameEncryptor().get());
1493}
1494
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001495// Validate that setting a FrameEncryptor after the send stream is stopped does
1496// nothing.
1497TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1498 CreateAudioRtpSender();
1499 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1500 new FakeFrameEncryptor());
1501 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1502 audio_rtp_sender_->Stop();
1503 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1504 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1505}
1506
Benjamin Wright84583f62018-10-04 14:22:34 -07001507// Validate that the default FrameEncryptor setting is nullptr.
1508TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1509 CreateAudioRtpReceiver();
1510 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1511 new FakeFrameDecryptor());
1512 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1513 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1514 EXPECT_EQ(fake_frame_decryptor.get(),
1515 audio_rtp_receiver_->GetFrameDecryptor().get());
1516}
1517
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001518// Validate that the default FrameEncryptor setting is nullptr.
1519TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1520 CreateAudioRtpReceiver();
1521 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1522 new FakeFrameDecryptor());
1523 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1524 audio_rtp_receiver_->Stop();
1525 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1526 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1527}
1528
1529// Validate that the default FrameEncryptor setting is nullptr.
1530TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1531 CreateVideoRtpSender();
1532 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1533 new FakeFrameEncryptor());
1534 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1535 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1536 EXPECT_EQ(fake_frame_encryptor.get(),
1537 video_rtp_sender_->GetFrameEncryptor().get());
1538}
1539
1540// Validate that setting a FrameEncryptor after the send stream is stopped does
1541// nothing.
1542TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1543 CreateVideoRtpSender();
1544 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1545 new FakeFrameEncryptor());
1546 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1547 video_rtp_sender_->Stop();
1548 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1549 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1550}
1551
1552// Validate that the default FrameEncryptor setting is nullptr.
1553TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1554 CreateVideoRtpReceiver();
1555 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1556 new FakeFrameDecryptor());
1557 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1558 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1559 EXPECT_EQ(fake_frame_decryptor.get(),
1560 video_rtp_receiver_->GetFrameDecryptor().get());
1561}
1562
1563// Validate that the default FrameEncryptor setting is nullptr.
1564TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1565 CreateVideoRtpReceiver();
1566 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1567 new FakeFrameDecryptor());
1568 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1569 video_rtp_receiver_->Stop();
1570 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1571 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1572}
1573
deadbeef70ab1a12015-09-28 16:53:55 -07001574} // namespace webrtc