blob: 9ccbe95026c51e1677f2c378c1047891e66a3b68 [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"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "pc/audiotrack.h"
20#include "pc/channelmanager.h"
21#include "pc/localaudiosource.h"
22#include "pc/mediastream.h"
23#include "pc/remoteaudiosource.h"
24#include "pc/rtpreceiver.h"
25#include "pc/rtpsender.h"
26#include "pc/streamcollection.h"
Zhi Huangb5261582017-09-29 10:51:43 -070027#include "pc/test/faketransportcontroller.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#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
deadbeef70ab1a12015-09-28 16:53:55 -070042static const char kStreamLabel1[] = "local_stream_1";
43static 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()
58 : // Create fake media engine/etc. so we can create channels to use to
deadbeefe814a0d2017-02-25 18:15:09 -080059 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070060 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080061 channel_manager_(rtc::WrapUnique(media_engine_),
62 rtc::MakeUnique<cricket::RtpDataEngine>(),
63 rtc::Thread::Current(),
64 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070065 fake_call_(Call::Config(&event_log_)),
deadbeefe814a0d2017-02-25 18:15:09 -080066 local_stream_(MediaStream::Create(kStreamLabel1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070067 // Create channels to be used by the RtpSenders and RtpReceivers.
68 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080069 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080070 cricket::DtlsTransportInternal* rtp_transport =
71 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080072 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070073 voice_channel_ = channel_manager_.CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -070074 &fake_call_, cricket::MediaConfig(),
75 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080076 cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 video_channel_ = channel_manager_.CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -070078 &fake_call_, cricket::MediaConfig(),
79 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080080 cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080081 voice_channel_->Enable(true);
82 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070083 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
84 video_media_channel_ = media_engine_->GetVideoChannel(0);
85 RTC_CHECK(voice_channel_);
86 RTC_CHECK(video_channel_);
87 RTC_CHECK(voice_media_channel_);
88 RTC_CHECK(video_media_channel_);
89
90 // Create streams for predefined SSRCs. Streams need to exist in order
91 // for the senders and receievers to apply parameters to them.
92 // Normally these would be created by SetLocalDescription and
93 // SetRemoteDescription.
94 voice_media_channel_->AddSendStream(
95 cricket::StreamParams::CreateLegacy(kAudioSsrc));
96 voice_media_channel_->AddRecvStream(
97 cricket::StreamParams::CreateLegacy(kAudioSsrc));
98 voice_media_channel_->AddSendStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
100 voice_media_channel_->AddRecvStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
102 video_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kVideoSsrc));
104 video_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kVideoSsrc));
106 video_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
108 video_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700110 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700111
deadbeef20cb0c12017-02-01 20:27:00 -0800112 // Needed to use DTMF sender.
113 void AddDtmfCodec() {
114 cricket::AudioSendParameters params;
115 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
116 0, 1);
117 params.codecs.push_back(kTelephoneEventCodec);
118 voice_media_channel_->SetSendParameters(params);
119 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700120
pbos5214a0a2016-12-16 15:39:11 -0800121 void AddVideoTrack() { AddVideoTrack(false); }
122
123 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100124 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800125 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700126 video_track_ =
127 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800128 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700129 }
130
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700131 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
132
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100133 void CreateAudioRtpSender(
134 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800136 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton02ee47c2018-01-10 16:26:06 -0800137 audio_rtp_sender_ = new AudioRtpSender(local_stream_->GetAudioTracks()[0],
138 {local_stream_->label()}, nullptr);
139 audio_rtp_sender_->SetChannel(voice_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800140 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800141 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
142 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700143 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700144 }
145
Steve Anton02ee47c2018-01-10 16:26:06 -0800146 void CreateAudioRtpSenderWithNoTrack() {
147 audio_rtp_sender_ = new AudioRtpSender(nullptr);
148 audio_rtp_sender_->SetChannel(voice_channel_);
149 }
150
deadbeef20cb0c12017-02-01 20:27:00 -0800151 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
152
pbos5214a0a2016-12-16 15:39:11 -0800153 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
154
155 void CreateVideoRtpSender(bool is_screencast) {
156 AddVideoTrack(is_screencast);
Steve Anton02ee47c2018-01-10 16:26:06 -0800157 video_rtp_sender_ = new VideoRtpSender(local_stream_->GetVideoTracks()[0],
158 {local_stream_->label()});
159 video_rtp_sender_->SetChannel(video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800160 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700161 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
Steve Anton02ee47c2018-01-10 16:26:06 -0800164 void CreateVideoRtpSenderWithNoTrack() {
165 video_rtp_sender_ = new VideoRtpSender();
166 video_rtp_sender_->SetChannel(video_channel_);
167 }
168
deadbeef70ab1a12015-09-28 16:53:55 -0700169 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700170 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700171 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700172 }
173
174 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700175 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700176 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700177 }
178
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100179 void CreateAudioRtpReceiver(
180 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
181 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Anton60776752018-01-10 11:51:34 -0800182 rtc::Thread::Current(), kAudioTrackId, std::move(streams), kAudioSsrc,
183 voice_media_channel_);
perkjd61bf802016-03-24 03:16:19 -0700184 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700186 }
187
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100188 void CreateVideoRtpReceiver(
189 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800190 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Anton60776752018-01-10 11:51:34 -0800191 rtc::Thread::Current(), kVideoTrackId, std::move(streams), kVideoSsrc,
192 video_media_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100193 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700194 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700195 }
196
197 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700198 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700199 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700200 }
201
202 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700203 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700204 VerifyVideoChannelNoOutput();
205 }
206
207 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
208
209 void VerifyVoiceChannelInput(uint32_t ssrc) {
210 // Verify that the media channel has an audio source, and the stream isn't
211 // muted.
212 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
213 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
214 }
215
216 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
217
218 void VerifyVideoChannelInput(uint32_t ssrc) {
219 // Verify that the media channel has a video source,
220 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
221 }
222
223 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
224
225 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
226 // Verify that the media channel's source is reset.
227 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
228 }
229
230 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
231
232 void VerifyVideoChannelNoInput(uint32_t ssrc) {
233 // Verify that the media channel's source is reset.
234 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
235 }
236
237 void VerifyVoiceChannelOutput() {
238 // Verify that the volume is initialized to 1.
239 double volume;
240 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
241 EXPECT_EQ(1, volume);
242 }
243
244 void VerifyVideoChannelOutput() {
245 // Verify that the media channel has a sink.
246 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
247 }
248
249 void VerifyVoiceChannelNoOutput() {
250 // Verify that the volume is reset to 0.
251 double volume;
252 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
253 EXPECT_EQ(0, volume);
254 }
255
256 void VerifyVideoChannelNoOutput() {
257 // Verify that the media channel's sink is reset.
258 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700259 }
260
261 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700262 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800263 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700264 cricket::FakeMediaEngine* media_engine_;
265 cricket::FakeTransportController fake_transport_controller_;
266 cricket::ChannelManager channel_manager_;
267 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700268 cricket::VoiceChannel* voice_channel_;
269 cricket::VideoChannel* video_channel_;
270 cricket::FakeVoiceMediaChannel* voice_media_channel_;
271 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700272 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
273 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
274 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
275 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800276 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700277 rtc::scoped_refptr<VideoTrackInterface> video_track_;
278 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800279 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700280};
281
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700283// and disassociated with an AudioRtpSender.
284TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
285 CreateAudioRtpSender();
286 DestroyAudioRtpSender();
287}
288
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700290// disassociated with a VideoRtpSender.
291TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
292 CreateVideoRtpSender();
293 DestroyVideoRtpSender();
294}
295
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700296// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700297// associated and disassociated with an AudioRtpReceiver.
298TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
299 CreateAudioRtpReceiver();
300 DestroyAudioRtpReceiver();
301}
302
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700303// Test that |video_channel_| is updated when a remote video track is
304// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700305TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
306 CreateVideoRtpReceiver();
307 DestroyVideoRtpReceiver();
308}
309
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100310TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
311 CreateAudioRtpReceiver({local_stream_});
312 DestroyAudioRtpReceiver();
313}
314
315TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
316 CreateVideoRtpReceiver({local_stream_});
317 DestroyVideoRtpReceiver();
318}
319
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700320// Test that the AudioRtpSender applies options from the local audio source.
321TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
322 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100323 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800324 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700325 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700326
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100327 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700328
329 DestroyAudioRtpSender();
330}
331
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700332// Test that the stream is muted when the track is disabled, and unmuted when
333// the track is enabled.
334TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
335 CreateAudioRtpSender();
336
337 audio_track_->set_enabled(false);
338 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
339
340 audio_track_->set_enabled(true);
341 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
342
343 DestroyAudioRtpSender();
344}
345
346// Test that the volume is set to 0 when the track is disabled, and back to
347// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700348TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
349 CreateAudioRtpReceiver();
350
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 double volume;
352 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
353 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700354
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 audio_track_->set_enabled(false);
356 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
357 EXPECT_EQ(0, volume);
358
deadbeef70ab1a12015-09-28 16:53:55 -0700359 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700360 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
361 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700362
363 DestroyAudioRtpReceiver();
364}
365
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700366// Currently no action is taken when a remote video track is disabled or
367// enabled, so there's nothing to test here, other than what is normally
368// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700369TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
370 CreateVideoRtpSender();
371
deadbeef70ab1a12015-09-28 16:53:55 -0700372 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700373 video_track_->set_enabled(true);
374
375 DestroyVideoRtpSender();
376}
377
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700378// Test that the state of the video track created by the VideoRtpReceiver is
379// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100380TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
381 CreateVideoRtpReceiver();
382
383 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
384 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
385 video_track_->GetSource()->state());
386
387 DestroyVideoRtpReceiver();
388
389 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
390 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
391 video_track_->GetSource()->state());
392}
393
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394// Currently no action is taken when a remote video track is disabled or
395// enabled, so there's nothing to test here, other than what is normally
396// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700397TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
398 CreateVideoRtpReceiver();
399
400 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700401 video_track_->set_enabled(true);
402
403 DestroyVideoRtpReceiver();
404}
405
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700406// Test that the AudioRtpReceiver applies volume changes from the track source
407// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700408TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
409 CreateAudioRtpReceiver();
410
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411 double volume;
412 audio_track_->GetSource()->SetVolume(0.5);
413 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
414 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700415
416 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700417 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700418 audio_track_->GetSource()->SetVolume(0.8);
419 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
420 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700421
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700422 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700423 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700424 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
425 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700426
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700427 // Try changing volume one more time.
428 audio_track_->GetSource()->SetVolume(0.9);
429 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
430 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700431
432 DestroyAudioRtpReceiver();
433}
434
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435// Test that the media channel isn't enabled for sending if the audio sender
436// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800437TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800438 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800439 rtc::scoped_refptr<AudioTrackInterface> track =
440 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700441
442 // Track but no SSRC.
443 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
444 VerifyVoiceChannelNoInput();
445
446 // SSRC but no track.
447 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
448 audio_rtp_sender_->SetSsrc(kAudioSsrc);
449 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800450}
451
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700452// Test that the media channel isn't enabled for sending if the video sender
453// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800454TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800455 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700456
457 // Track but no SSRC.
458 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
459 VerifyVideoChannelNoInput();
460
461 // SSRC but no track.
462 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
463 video_rtp_sender_->SetSsrc(kVideoSsrc);
464 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800465}
466
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467// Test that the media channel is enabled for sending when the audio sender
468// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800469TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800470 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800471 rtc::scoped_refptr<AudioTrackInterface> track =
472 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700473 audio_rtp_sender_->SetSsrc(kAudioSsrc);
474 audio_rtp_sender_->SetTrack(track);
475 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800476
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700477 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800478}
479
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480// Test that the media channel is enabled for sending when the audio sender
481// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800482TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800483 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800484 rtc::scoped_refptr<AudioTrackInterface> track =
485 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486 audio_rtp_sender_->SetTrack(track);
487 audio_rtp_sender_->SetSsrc(kAudioSsrc);
488 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800489
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700490 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that the media channel is enabled for sending when the video sender
494// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700496 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800497 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 video_rtp_sender_->SetSsrc(kVideoSsrc);
499 video_rtp_sender_->SetTrack(video_track_);
500 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800503}
504
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505// Test that the media channel is enabled for sending when the video sender
506// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800507TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700508 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800509 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 video_rtp_sender_->SetTrack(video_track_);
511 video_rtp_sender_->SetSsrc(kVideoSsrc);
512 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800513
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800515}
516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517// Test that the media channel stops sending when the audio sender's SSRC is set
518// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800519TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800521
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 audio_rtp_sender_->SetSsrc(0);
523 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800524}
525
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526// Test that the media channel stops sending when the video sender's SSRC is set
527// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800528TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531 audio_rtp_sender_->SetSsrc(0);
532 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800533}
534
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535// Test that the media channel stops sending when the audio sender's track is
536// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800537TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
541 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800542}
543
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544// Test that the media channel stops sending when the video sender's track is
545// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800546TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800548
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549 video_rtp_sender_->SetSsrc(0);
550 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800551}
552
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553// Test that when the audio sender's SSRC is changed, the media channel stops
554// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800555TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800557
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
559 VerifyVoiceChannelNoInput(kAudioSsrc);
560 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800561
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700562 audio_rtp_sender_ = nullptr;
563 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800564}
565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566// Test that when the audio sender's SSRC is changed, the media channel stops
567// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800568TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700569 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800570
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571 video_rtp_sender_->SetSsrc(kVideoSsrc2);
572 VerifyVideoChannelNoInput(kVideoSsrc);
573 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800574
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575 video_rtp_sender_ = nullptr;
576 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800577}
578
skvladdc1c62c2016-03-16 19:07:43 -0700579TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
580 CreateAudioRtpSender();
581
skvladdc1c62c2016-03-16 19:07:43 -0700582 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700584 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
585
586 DestroyAudioRtpSender();
587}
588
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700589TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
590 CreateAudioRtpSender();
591
592 EXPECT_EQ(-1, voice_media_channel_->max_bps());
593 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
594 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800595 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100596 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
598
599 // Read back the parameters and verify they have been changed.
600 params = audio_rtp_sender_->GetParameters();
601 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100602 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603
604 // Verify that the audio channel received the new parameters.
605 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
606 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100607 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608
609 // Verify that the global bitrate limit has not been changed.
610 EXPECT_EQ(-1, voice_media_channel_->max_bps());
611
612 DestroyAudioRtpSender();
613}
614
Seth Hampson24722b32017-12-22 09:36:42 -0800615TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
616 CreateAudioRtpSender();
617
618 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
619 EXPECT_EQ(1, params.encodings.size());
620 EXPECT_EQ(webrtc::kDefaultBitratePriority,
621 params.encodings[0].bitrate_priority);
622 double new_bitrate_priority = 2.0;
623 params.encodings[0].bitrate_priority = new_bitrate_priority;
624 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
625
626 params = audio_rtp_sender_->GetParameters();
627 EXPECT_EQ(1, params.encodings.size());
628 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
629
630 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
631 EXPECT_EQ(1, params.encodings.size());
632 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
633
634 DestroyAudioRtpSender();
635}
636
skvladdc1c62c2016-03-16 19:07:43 -0700637TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
638 CreateVideoRtpSender();
639
skvladdc1c62c2016-03-16 19:07:43 -0700640 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700642 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
643
644 DestroyVideoRtpSender();
645}
646
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700647TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
648 CreateVideoRtpSender();
649
650 EXPECT_EQ(-1, video_media_channel_->max_bps());
651 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
652 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800653 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100654 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
656
657 // Read back the parameters and verify they have been changed.
658 params = video_rtp_sender_->GetParameters();
659 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100660 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661
662 // Verify that the video channel received the new parameters.
663 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
664 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100665 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700666
667 // Verify that the global bitrate limit has not been changed.
668 EXPECT_EQ(-1, video_media_channel_->max_bps());
669
670 DestroyVideoRtpSender();
671}
672
Seth Hampson24722b32017-12-22 09:36:42 -0800673TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
674 CreateVideoRtpSender();
675
676 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
677 EXPECT_EQ(1, params.encodings.size());
678 EXPECT_EQ(webrtc::kDefaultBitratePriority,
679 params.encodings[0].bitrate_priority);
680 double new_bitrate_priority = 2.0;
681 params.encodings[0].bitrate_priority = new_bitrate_priority;
682 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
683
684 params = video_rtp_sender_->GetParameters();
685 EXPECT_EQ(1, params.encodings.size());
686 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
687
688 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
689 EXPECT_EQ(1, params.encodings.size());
690 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
691
692 DestroyVideoRtpSender();
693}
694
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700695TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
696 CreateAudioRtpReceiver();
697
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700698 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700699 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700700 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
701
702 DestroyAudioRtpReceiver();
703}
704
705TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
706 CreateVideoRtpReceiver();
707
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700708 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700709 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700710 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
711
712 DestroyVideoRtpReceiver();
713}
714
pbos5214a0a2016-12-16 15:39:11 -0800715// Test that makes sure that a video track content hint translates to the proper
716// value for sources that are not screencast.
717TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
718 CreateVideoRtpSender();
719
720 video_track_->set_enabled(true);
721
722 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100723 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800724 // No content hint should be set by default.
725 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
726 video_track_->content_hint());
727 // Setting detailed should turn a non-screencast source into screencast mode.
728 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100729 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800730 // Removing the content hint should turn the track back into non-screencast
731 // mode.
732 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100733 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800734 // Setting fluid should remain in non-screencast mode (its default).
735 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100736 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800737
738 DestroyVideoRtpSender();
739}
740
741// Test that makes sure that a video track content hint translates to the proper
742// value for screencast sources.
743TEST_F(RtpSenderReceiverTest,
744 PropagatesVideoTrackContentHintForScreencastSource) {
745 CreateVideoRtpSender(true);
746
747 video_track_->set_enabled(true);
748
749 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100750 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800751 // No content hint should be set by default.
752 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
753 video_track_->content_hint());
754 // Setting fluid should turn a screencast source into non-screencast mode.
755 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100756 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800757 // Removing the content hint should turn the track back into screencast mode.
758 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100759 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800760 // Setting detailed should still remain in screencast mode (its default).
761 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100762 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800763
764 DestroyVideoRtpSender();
765}
766
767// Test that makes sure any content hints that are set on a track before
768// VideoRtpSender is ready to send are still applied when it gets ready to send.
769TEST_F(RtpSenderReceiverTest,
770 PropagatesVideoTrackContentHintSetBeforeEnabling) {
771 AddVideoTrack();
772 // Setting detailed overrides the default non-screencast mode. This should be
773 // applied even if the track is set on construction.
774 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton02ee47c2018-01-10 16:26:06 -0800775 video_rtp_sender_ = new VideoRtpSender(local_stream_->GetVideoTracks()[0],
776 {local_stream_->label()});
777 video_rtp_sender_->SetChannel(video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800778 video_track_->set_enabled(true);
779
780 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100781 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800782
783 // Verify that the content hint is accounted for when video_rtp_sender_ does
784 // get enabled.
785 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100786 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800787
788 // And removing the hint should go back to false (to verify that false was
789 // default correctly).
790 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100791 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800792
793 DestroyVideoRtpSender();
794}
795
deadbeef20cb0c12017-02-01 20:27:00 -0800796TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
797 CreateAudioRtpSender();
798 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
799}
800
801TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
802 CreateVideoRtpSender();
803 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
804}
805
806// Test that the DTMF sender is really using |voice_channel_|, and thus returns
807// true/false from CanSendDtmf based on what |voice_channel_| returns.
808TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
809 AddDtmfCodec();
810 CreateAudioRtpSender();
811 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
812 ASSERT_NE(nullptr, dtmf_sender);
813 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
814}
815
816TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
817 CreateAudioRtpSender();
818 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
819 ASSERT_NE(nullptr, dtmf_sender);
820 // DTMF codec has not been added, as it was in the above test.
821 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
822}
823
824TEST_F(RtpSenderReceiverTest, InsertDtmf) {
825 AddDtmfCodec();
826 CreateAudioRtpSender();
827 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
828 ASSERT_NE(nullptr, dtmf_sender);
829
830 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
831
832 // Insert DTMF
833 const int expected_duration = 90;
834 dtmf_sender->InsertDtmf("012", expected_duration, 100);
835
836 // Verify
837 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
838 kDefaultTimeout);
839 const uint32_t send_ssrc =
840 voice_media_channel_->send_streams()[0].first_ssrc();
841 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
842 send_ssrc, 0, expected_duration));
843 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
844 send_ssrc, 1, expected_duration));
845 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
846 send_ssrc, 2, expected_duration));
847}
848
849// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
850// destroyed, which is needed for the DTMF sender.
851TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
852 CreateAudioRtpSender();
853 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
854 audio_rtp_sender_ = nullptr;
855 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
856}
857
deadbeef70ab1a12015-09-28 16:53:55 -0700858} // namespace webrtc