blob: b084b01e1acca67da944c3933c5dc61b2416220b [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
kwibergd1fe2812016-04-27 06:47:29 -070011#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070012#include <string>
Tommif888bb52015-12-12 01:37:01 +010013#include <utility>
deadbeef70ab1a12015-09-28 16:53:55 -070014
Seth Hampson24722b32017-12-22 09:36:42 -080015#include "api/rtpparameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080017#include "media/base/rtpdataengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 10:48:35 -070019#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "pc/audiotrack.h"
21#include "pc/channelmanager.h"
22#include "pc/localaudiosource.h"
23#include "pc/mediastream.h"
24#include "pc/remoteaudiosource.h"
25#include "pc/rtpreceiver.h"
26#include "pc/rtpsender.h"
27#include "pc/streamcollection.h"
28#include "pc/test/fakevideotracksource.h"
29#include "pc/videotrack.h"
30#include "pc/videotracksource.h"
31#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "test/gmock.h"
33#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070034
35using ::testing::_;
36using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070037using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070038using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070039
deadbeef20cb0c12017-02-01 20:27:00 -080040namespace {
41
Seth Hampson845e8782018-03-02 11:34:10 -080042static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070043static const char kVideoTrackId[] = "video_1";
44static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020045static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080046static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020047static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080048static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080049static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080050} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070051
52namespace webrtc {
53
deadbeef20cb0c12017-02-01 20:27:00 -080054class RtpSenderReceiverTest : public testing::Test,
55 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070056 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070057 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080058 : network_thread_(rtc::Thread::Current()),
59 worker_thread_(rtc::Thread::Current()),
60 // Create fake media engine/etc. so we can create channels to use to
61 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070062 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080063 channel_manager_(rtc::WrapUnique(media_engine_),
64 rtc::MakeUnique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080065 worker_thread_,
66 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010067 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080068 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070069 // Create channels to be used by the RtpSenders and RtpReceivers.
70 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080071 bool srtp_required = true;
Zhi Huange830e682018-03-30 10:48:35 -070072 rtp_dtls_transport_ = rtc::MakeUnique<cricket::FakeDtlsTransport>(
73 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
74 rtp_transport_ = CreateDtlsSrtpTransport();
75
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070076 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070077 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
78 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
79 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070080 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070081 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
82 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
83 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080084 voice_channel_->Enable(true);
85 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070086 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
87 video_media_channel_ = media_engine_->GetVideoChannel(0);
88 RTC_CHECK(voice_channel_);
89 RTC_CHECK(video_channel_);
90 RTC_CHECK(voice_media_channel_);
91 RTC_CHECK(video_media_channel_);
92
93 // Create streams for predefined SSRCs. Streams need to exist in order
94 // for the senders and receievers to apply parameters to them.
95 // Normally these would be created by SetLocalDescription and
96 // SetRemoteDescription.
97 voice_media_channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kAudioSsrc));
99 voice_media_channel_->AddRecvStream(
100 cricket::StreamParams::CreateLegacy(kAudioSsrc));
101 voice_media_channel_->AddSendStream(
102 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
103 voice_media_channel_->AddRecvStream(
104 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
105 video_media_channel_->AddSendStream(
106 cricket::StreamParams::CreateLegacy(kVideoSsrc));
107 video_media_channel_->AddRecvStream(
108 cricket::StreamParams::CreateLegacy(kVideoSsrc));
109 video_media_channel_->AddSendStream(
110 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
111 video_media_channel_->AddRecvStream(
112 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700113 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700114
Zhi Huange830e682018-03-30 10:48:35 -0700115 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Zhi Huange830e682018-03-30 10:48:35 -0700116 auto dtls_srtp_transport =
Zhi Huang365381f2018-04-13 16:44:34 -0700117 rtc::MakeUnique<webrtc::DtlsSrtpTransport>(/*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700118 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
119 /*rtcp_dtls_transport=*/nullptr);
120 return dtls_srtp_transport;
121 }
122
deadbeef20cb0c12017-02-01 20:27:00 -0800123 // Needed to use DTMF sender.
124 void AddDtmfCodec() {
125 cricket::AudioSendParameters params;
126 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
127 0, 1);
128 params.codecs.push_back(kTelephoneEventCodec);
129 voice_media_channel_->SetSendParameters(params);
130 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700131
pbos5214a0a2016-12-16 15:39:11 -0800132 void AddVideoTrack() { AddVideoTrack(false); }
133
134 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100135 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800136 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700137 video_track_ =
138 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800139 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700140 }
141
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
143
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100144 void CreateAudioRtpSender(
145 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700146 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800147 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800148 audio_rtp_sender_ =
149 new AudioRtpSender(worker_thread_, local_stream_->GetAudioTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700150 {local_stream_->id()}, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800151 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800152 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800153 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
154 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700155 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700156 }
157
Steve Anton02ee47c2018-01-10 16:26:06 -0800158 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800159 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800160 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800161 }
162
deadbeef20cb0c12017-02-01 20:27:00 -0800163 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
164
pbos5214a0a2016-12-16 15:39:11 -0800165 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
166
167 void CreateVideoRtpSender(bool is_screencast) {
168 AddVideoTrack(is_screencast);
Steve Anton47136dd2018-01-12 10:49:35 -0800169 video_rtp_sender_ =
170 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700171 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800172 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800173 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700174 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700175 }
176
Steve Anton02ee47c2018-01-10 16:26:06 -0800177 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800178 video_rtp_sender_ = new VideoRtpSender(worker_thread_);
Steve Anton57858b32018-02-15 15:19:50 -0800179 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800180 }
181
deadbeef70ab1a12015-09-28 16:53:55 -0700182 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700183 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700184 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700185 }
186
187 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700188 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700189 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700190 }
191
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100192 void CreateAudioRtpReceiver(
193 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
194 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800195 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800196 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800197 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700198 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700199 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700200 }
201
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100202 void CreateVideoRtpReceiver(
203 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800204 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800205 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800206 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800207 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100208 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700209 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700210 }
211
212 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700213 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700214 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700215 }
216
217 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700218 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700219 VerifyVideoChannelNoOutput();
220 }
221
222 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
223
224 void VerifyVoiceChannelInput(uint32_t ssrc) {
225 // Verify that the media channel has an audio source, and the stream isn't
226 // muted.
227 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
228 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
229 }
230
231 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
232
233 void VerifyVideoChannelInput(uint32_t ssrc) {
234 // Verify that the media channel has a video source,
235 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
236 }
237
238 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
239
240 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
241 // Verify that the media channel's source is reset.
242 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
243 }
244
245 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
246
247 void VerifyVideoChannelNoInput(uint32_t ssrc) {
248 // Verify that the media channel's source is reset.
249 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
250 }
251
252 void VerifyVoiceChannelOutput() {
253 // Verify that the volume is initialized to 1.
254 double volume;
255 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
256 EXPECT_EQ(1, volume);
257 }
258
259 void VerifyVideoChannelOutput() {
260 // Verify that the media channel has a sink.
261 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
262 }
263
264 void VerifyVoiceChannelNoOutput() {
265 // Verify that the volume is reset to 0.
266 double volume;
267 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
268 EXPECT_EQ(0, volume);
269 }
270
271 void VerifyVideoChannelNoOutput() {
272 // Verify that the media channel's sink is reset.
273 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700274 }
275
276 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800277 rtc::Thread* const network_thread_;
278 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700279 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700280 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
281 // the |channel_manager|.
282 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
283 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800284 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700285 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286 cricket::ChannelManager channel_manager_;
287 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288 cricket::VoiceChannel* voice_channel_;
289 cricket::VideoChannel* video_channel_;
290 cricket::FakeVoiceMediaChannel* voice_media_channel_;
291 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700292 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
293 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
294 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
295 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800296 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700297 rtc::scoped_refptr<VideoTrackInterface> video_track_;
298 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800299 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700300};
301
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700302// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700303// and disassociated with an AudioRtpSender.
304TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
305 CreateAudioRtpSender();
306 DestroyAudioRtpSender();
307}
308
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700310// disassociated with a VideoRtpSender.
311TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
312 CreateVideoRtpSender();
313 DestroyVideoRtpSender();
314}
315
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700316// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700317// associated and disassociated with an AudioRtpReceiver.
318TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
319 CreateAudioRtpReceiver();
320 DestroyAudioRtpReceiver();
321}
322
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700323// Test that |video_channel_| is updated when a remote video track is
324// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700325TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
326 CreateVideoRtpReceiver();
327 DestroyVideoRtpReceiver();
328}
329
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100330TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
331 CreateAudioRtpReceiver({local_stream_});
332 DestroyAudioRtpReceiver();
333}
334
335TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
336 CreateVideoRtpReceiver({local_stream_});
337 DestroyVideoRtpReceiver();
338}
339
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700340// Test that the AudioRtpSender applies options from the local audio source.
341TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
342 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100343 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800344 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700345 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700346
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100347 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700348
349 DestroyAudioRtpSender();
350}
351
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700352// Test that the stream is muted when the track is disabled, and unmuted when
353// the track is enabled.
354TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
355 CreateAudioRtpSender();
356
357 audio_track_->set_enabled(false);
358 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
359
360 audio_track_->set_enabled(true);
361 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
362
363 DestroyAudioRtpSender();
364}
365
366// Test that the volume is set to 0 when the track is disabled, and back to
367// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700368TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
369 CreateAudioRtpReceiver();
370
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700371 double volume;
372 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
373 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700374
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700375 audio_track_->set_enabled(false);
376 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
377 EXPECT_EQ(0, volume);
378
deadbeef70ab1a12015-09-28 16:53:55 -0700379 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700380 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
381 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700382
383 DestroyAudioRtpReceiver();
384}
385
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386// Currently no action is taken when a remote video track is disabled or
387// enabled, so there's nothing to test here, other than what is normally
388// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700389TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
390 CreateVideoRtpSender();
391
deadbeef70ab1a12015-09-28 16:53:55 -0700392 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700393 video_track_->set_enabled(true);
394
395 DestroyVideoRtpSender();
396}
397
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700398// Test that the state of the video track created by the VideoRtpReceiver is
399// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100400TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
401 CreateVideoRtpReceiver();
402
403 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
404 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
405 video_track_->GetSource()->state());
406
407 DestroyVideoRtpReceiver();
408
409 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
410 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
411 video_track_->GetSource()->state());
412}
413
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700414// Currently no action is taken when a remote video track is disabled or
415// enabled, so there's nothing to test here, other than what is normally
416// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700417TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
418 CreateVideoRtpReceiver();
419
420 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700421 video_track_->set_enabled(true);
422
423 DestroyVideoRtpReceiver();
424}
425
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700426// Test that the AudioRtpReceiver applies volume changes from the track source
427// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700428TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
429 CreateAudioRtpReceiver();
430
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700431 double volume;
432 audio_track_->GetSource()->SetVolume(0.5);
433 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
434 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700435
436 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700437 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700438 audio_track_->GetSource()->SetVolume(0.8);
439 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
440 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700441
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700442 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700443 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700444 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
445 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700446
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700447 // Try changing volume one more time.
448 audio_track_->GetSource()->SetVolume(0.9);
449 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
450 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700451
452 DestroyAudioRtpReceiver();
453}
454
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700455// Test that the media channel isn't enabled for sending if the audio sender
456// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800457TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800458 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800459 rtc::scoped_refptr<AudioTrackInterface> track =
460 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461
462 // Track but no SSRC.
463 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
464 VerifyVoiceChannelNoInput();
465
466 // SSRC but no track.
467 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
468 audio_rtp_sender_->SetSsrc(kAudioSsrc);
469 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800470}
471
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700472// Test that the media channel isn't enabled for sending if the video sender
473// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800474TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800475 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700476
477 // Track but no SSRC.
478 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
479 VerifyVideoChannelNoInput();
480
481 // SSRC but no track.
482 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
483 video_rtp_sender_->SetSsrc(kVideoSsrc);
484 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800485}
486
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700487// Test that the media channel is enabled for sending when the audio sender
488// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800489TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800490 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800491 rtc::scoped_refptr<AudioTrackInterface> track =
492 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493 audio_rtp_sender_->SetSsrc(kAudioSsrc);
494 audio_rtp_sender_->SetTrack(track);
495 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800498}
499
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500// Test that the media channel is enabled for sending when the audio sender
501// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800502TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800503 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800504 rtc::scoped_refptr<AudioTrackInterface> track =
505 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 audio_rtp_sender_->SetTrack(track);
507 audio_rtp_sender_->SetSsrc(kAudioSsrc);
508 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800511}
512
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513// Test that the media channel is enabled for sending when the video sender
514// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800515TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700516 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800517 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 video_rtp_sender_->SetSsrc(kVideoSsrc);
519 video_rtp_sender_->SetTrack(video_track_);
520 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800521
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800523}
524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525// Test that the media channel is enabled for sending when the video sender
526// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800527TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700528 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800529 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530 video_rtp_sender_->SetTrack(video_track_);
531 video_rtp_sender_->SetSsrc(kVideoSsrc);
532 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800533
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800535}
536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537// Test that the media channel stops sending when the audio sender's SSRC is set
538// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800539TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542 audio_rtp_sender_->SetSsrc(0);
543 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800544}
545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546// Test that the media channel stops sending when the video sender's SSRC is set
547// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800548TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551 audio_rtp_sender_->SetSsrc(0);
552 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that the media channel stops sending when the audio sender's track is
556// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800557TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800559
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
561 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800562}
563
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564// Test that the media channel stops sending when the video sender's track is
565// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800566TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800568
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700569 video_rtp_sender_->SetSsrc(0);
570 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800571}
572
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573// Test that when the audio sender's SSRC is changed, the media channel stops
574// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800575TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
579 VerifyVoiceChannelNoInput(kAudioSsrc);
580 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800581
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582 audio_rtp_sender_ = nullptr;
583 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800584}
585
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586// Test that when the audio sender's SSRC is changed, the media channel stops
587// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800588TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700589 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800590
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591 video_rtp_sender_->SetSsrc(kVideoSsrc2);
592 VerifyVideoChannelNoInput(kVideoSsrc);
593 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800594
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 video_rtp_sender_ = nullptr;
596 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800597}
598
skvladdc1c62c2016-03-16 19:07:43 -0700599TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
600 CreateAudioRtpSender();
601
skvladdc1c62c2016-03-16 19:07:43 -0700602 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800604 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700605
606 DestroyAudioRtpSender();
607}
608
Florent Castellicebf50f2018-05-03 15:31:53 +0200609TEST_F(RtpSenderReceiverTest,
610 AudioSenderMustCallGetParametersBeforeSetParameters) {
611 CreateAudioRtpSender();
612
613 RtpParameters params;
614 RTCError result = audio_rtp_sender_->SetParameters(params);
615 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
616
617 DestroyAudioRtpSender();
618}
619
620TEST_F(RtpSenderReceiverTest,
621 AudioSenderSetParametersInvalidatesTransactionId) {
622 CreateAudioRtpSender();
623
624 RtpParameters params = audio_rtp_sender_->GetParameters();
625 EXPECT_EQ(1u, params.encodings.size());
626 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
627 RTCError result = audio_rtp_sender_->SetParameters(params);
628 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
629
630 DestroyAudioRtpSender();
631}
632
633TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
634 CreateAudioRtpSender();
635
636 RtpParameters params = audio_rtp_sender_->GetParameters();
637 params.transaction_id = "";
638 RTCError result = audio_rtp_sender_->SetParameters(params);
639 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
640
641 DestroyAudioRtpSender();
642}
643
644TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
645 CreateAudioRtpSender();
646
647 RtpParameters params = audio_rtp_sender_->GetParameters();
648 EXPECT_NE(params.transaction_id.size(), 0);
649 auto saved_transaction_id = params.transaction_id;
650 params = audio_rtp_sender_->GetParameters();
651 EXPECT_NE(saved_transaction_id, params.transaction_id);
652
653 DestroyAudioRtpSender();
654}
655
656TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
657 CreateAudioRtpSender();
658
659 RtpParameters params = audio_rtp_sender_->GetParameters();
660 RtpParameters second_params = audio_rtp_sender_->GetParameters();
661
662 RTCError result = audio_rtp_sender_->SetParameters(params);
663 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
664
665 DestroyAudioRtpSender();
666}
667
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700668TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
669 CreateAudioRtpSender();
670
671 EXPECT_EQ(-1, voice_media_channel_->max_bps());
672 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
673 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800674 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100675 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800676 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700677
678 // Read back the parameters and verify they have been changed.
679 params = audio_rtp_sender_->GetParameters();
680 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100681 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700682
683 // Verify that the audio channel received the new parameters.
684 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
685 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100686 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700687
688 // Verify that the global bitrate limit has not been changed.
689 EXPECT_EQ(-1, voice_media_channel_->max_bps());
690
691 DestroyAudioRtpSender();
692}
693
Seth Hampson24722b32017-12-22 09:36:42 -0800694TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
695 CreateAudioRtpSender();
696
697 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
698 EXPECT_EQ(1, params.encodings.size());
699 EXPECT_EQ(webrtc::kDefaultBitratePriority,
700 params.encodings[0].bitrate_priority);
701 double new_bitrate_priority = 2.0;
702 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800703 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800704
705 params = audio_rtp_sender_->GetParameters();
706 EXPECT_EQ(1, params.encodings.size());
707 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
708
709 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
710 EXPECT_EQ(1, params.encodings.size());
711 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
712
713 DestroyAudioRtpSender();
714}
715
skvladdc1c62c2016-03-16 19:07:43 -0700716TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
717 CreateVideoRtpSender();
718
skvladdc1c62c2016-03-16 19:07:43 -0700719 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700720 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800721 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700722
723 DestroyVideoRtpSender();
724}
725
Florent Castellicebf50f2018-05-03 15:31:53 +0200726TEST_F(RtpSenderReceiverTest,
727 VideoSenderMustCallGetParametersBeforeSetParameters) {
728 CreateVideoRtpSender();
729
730 RtpParameters params;
731 RTCError result = video_rtp_sender_->SetParameters(params);
732 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
733
734 DestroyVideoRtpSender();
735}
736
737TEST_F(RtpSenderReceiverTest,
738 VideoSenderSetParametersInvalidatesTransactionId) {
739 CreateVideoRtpSender();
740
741 RtpParameters params = video_rtp_sender_->GetParameters();
742 EXPECT_EQ(1u, params.encodings.size());
743 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
744 RTCError result = video_rtp_sender_->SetParameters(params);
745 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
746
747 DestroyVideoRtpSender();
748}
749
750TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
751 CreateVideoRtpSender();
752
753 RtpParameters params = video_rtp_sender_->GetParameters();
754 params.transaction_id = "";
755 RTCError result = video_rtp_sender_->SetParameters(params);
756 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
757
758 DestroyVideoRtpSender();
759}
760
761TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
762 CreateVideoRtpSender();
763
764 RtpParameters params = video_rtp_sender_->GetParameters();
765 EXPECT_NE(params.transaction_id.size(), 0);
766 auto saved_transaction_id = params.transaction_id;
767 params = video_rtp_sender_->GetParameters();
768 EXPECT_NE(saved_transaction_id, params.transaction_id);
769
770 DestroyVideoRtpSender();
771}
772
773TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
774 CreateVideoRtpSender();
775
776 RtpParameters params = video_rtp_sender_->GetParameters();
777 RtpParameters second_params = video_rtp_sender_->GetParameters();
778
779 RTCError result = video_rtp_sender_->SetParameters(params);
780 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
781
782 DestroyVideoRtpSender();
783}
784
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700785TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
786 CreateVideoRtpSender();
787
788 EXPECT_EQ(-1, video_media_channel_->max_bps());
789 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
790 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800791 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100792 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800793 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700794
795 // Read back the parameters and verify they have been changed.
796 params = video_rtp_sender_->GetParameters();
797 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100798 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700799
800 // Verify that the video channel received the new parameters.
801 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
802 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100803 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700804
805 // Verify that the global bitrate limit has not been changed.
806 EXPECT_EQ(-1, video_media_channel_->max_bps());
807
808 DestroyVideoRtpSender();
809}
810
Seth Hampson24722b32017-12-22 09:36:42 -0800811TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
812 CreateVideoRtpSender();
813
814 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
815 EXPECT_EQ(1, params.encodings.size());
816 EXPECT_EQ(webrtc::kDefaultBitratePriority,
817 params.encodings[0].bitrate_priority);
818 double new_bitrate_priority = 2.0;
819 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800820 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800821
822 params = video_rtp_sender_->GetParameters();
823 EXPECT_EQ(1, params.encodings.size());
824 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
825
826 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
827 EXPECT_EQ(1, params.encodings.size());
828 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
829
830 DestroyVideoRtpSender();
831}
832
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700833TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
834 CreateAudioRtpReceiver();
835
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700836 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700837 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700838 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
839
840 DestroyAudioRtpReceiver();
841}
842
843TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
844 CreateVideoRtpReceiver();
845
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700846 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700847 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700848 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
849
850 DestroyVideoRtpReceiver();
851}
852
pbos5214a0a2016-12-16 15:39:11 -0800853// Test that makes sure that a video track content hint translates to the proper
854// value for sources that are not screencast.
855TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
856 CreateVideoRtpSender();
857
858 video_track_->set_enabled(true);
859
860 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100861 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800862 // No content hint should be set by default.
863 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
864 video_track_->content_hint());
865 // Setting detailed should turn a non-screencast source into screencast mode.
866 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100867 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800868 // Removing the content hint should turn the track back into non-screencast
869 // mode.
870 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100871 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800872 // Setting fluid should remain in non-screencast mode (its default).
873 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100874 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800875
876 DestroyVideoRtpSender();
877}
878
879// Test that makes sure that a video track content hint translates to the proper
880// value for screencast sources.
881TEST_F(RtpSenderReceiverTest,
882 PropagatesVideoTrackContentHintForScreencastSource) {
883 CreateVideoRtpSender(true);
884
885 video_track_->set_enabled(true);
886
887 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100888 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800889 // No content hint should be set by default.
890 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
891 video_track_->content_hint());
892 // Setting fluid should turn a screencast source into non-screencast mode.
893 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100894 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800895 // Removing the content hint should turn the track back into screencast mode.
896 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100897 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800898 // Setting detailed should still remain in screencast mode (its default).
899 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100900 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800901
902 DestroyVideoRtpSender();
903}
904
905// Test that makes sure any content hints that are set on a track before
906// VideoRtpSender is ready to send are still applied when it gets ready to send.
907TEST_F(RtpSenderReceiverTest,
908 PropagatesVideoTrackContentHintSetBeforeEnabling) {
909 AddVideoTrack();
910 // Setting detailed overrides the default non-screencast mode. This should be
911 // applied even if the track is set on construction.
912 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Seth Hampson13b8bad2018-03-13 16:05:28 -0700913 video_rtp_sender_ =
914 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
915 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800916 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800917 video_track_->set_enabled(true);
918
919 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100920 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800921
922 // Verify that the content hint is accounted for when video_rtp_sender_ does
923 // get enabled.
924 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100925 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800926
927 // And removing the hint should go back to false (to verify that false was
928 // default correctly).
929 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100930 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800931
932 DestroyVideoRtpSender();
933}
934
deadbeef20cb0c12017-02-01 20:27:00 -0800935TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
936 CreateAudioRtpSender();
937 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
938}
939
940TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
941 CreateVideoRtpSender();
942 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
943}
944
945// Test that the DTMF sender is really using |voice_channel_|, and thus returns
946// true/false from CanSendDtmf based on what |voice_channel_| returns.
947TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
948 AddDtmfCodec();
949 CreateAudioRtpSender();
950 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
951 ASSERT_NE(nullptr, dtmf_sender);
952 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
953}
954
955TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
956 CreateAudioRtpSender();
957 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
958 ASSERT_NE(nullptr, dtmf_sender);
959 // DTMF codec has not been added, as it was in the above test.
960 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
961}
962
963TEST_F(RtpSenderReceiverTest, InsertDtmf) {
964 AddDtmfCodec();
965 CreateAudioRtpSender();
966 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
967 ASSERT_NE(nullptr, dtmf_sender);
968
969 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
970
971 // Insert DTMF
972 const int expected_duration = 90;
973 dtmf_sender->InsertDtmf("012", expected_duration, 100);
974
975 // Verify
976 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
977 kDefaultTimeout);
978 const uint32_t send_ssrc =
979 voice_media_channel_->send_streams()[0].first_ssrc();
980 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
981 send_ssrc, 0, expected_duration));
982 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
983 send_ssrc, 1, expected_duration));
984 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
985 send_ssrc, 2, expected_duration));
986}
987
988// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
989// destroyed, which is needed for the DTMF sender.
990TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
991 CreateAudioRtpSender();
992 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
993 audio_rtp_sender_ = nullptr;
994 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
995}
996
deadbeef70ab1a12015-09-28 16:53:55 -0700997} // namespace webrtc