blob: 6334f723e770169dc8f743b1a37be329da7d36c2 [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_));
deadbeeffac06552015-11-25 11:26:01 -0800137 audio_rtp_sender_ =
deadbeefe814a0d2017-02-25 18:15:09 -0800138 new AudioRtpSender(local_stream_->GetAudioTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700139 {local_stream_->label()}, voice_channel_, nullptr);
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
deadbeef20cb0c12017-02-01 20:27:00 -0800146 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
147
pbos5214a0a2016-12-16 15:39:11 -0800148 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
149
150 void CreateVideoRtpSender(bool is_screencast) {
151 AddVideoTrack(is_screencast);
deadbeefe814a0d2017-02-25 18:15:09 -0800152 video_rtp_sender_ =
153 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700154 {local_stream_->label()}, video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800155 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700156 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700157 }
158
159 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700160 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700161 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
164 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700165 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700166 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700167 }
168
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100169 void CreateAudioRtpReceiver(
170 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
171 audio_rtp_receiver_ = new AudioRtpReceiver(
172 kAudioTrackId, std::move(streams), kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700173 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700174 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700175 }
176
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100177 void CreateVideoRtpReceiver(
178 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800179 video_rtp_receiver_ = new VideoRtpReceiver(
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100180 kVideoTrackId, std::move(streams), rtc::Thread::Current(), kVideoSsrc,
181 video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100182 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700183 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700184 }
185
186 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700187 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700188 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700189 }
190
191 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700192 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700193 VerifyVideoChannelNoOutput();
194 }
195
196 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
197
198 void VerifyVoiceChannelInput(uint32_t ssrc) {
199 // Verify that the media channel has an audio source, and the stream isn't
200 // muted.
201 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
202 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
203 }
204
205 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
206
207 void VerifyVideoChannelInput(uint32_t ssrc) {
208 // Verify that the media channel has a video source,
209 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
210 }
211
212 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
213
214 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
215 // Verify that the media channel's source is reset.
216 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
217 }
218
219 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
220
221 void VerifyVideoChannelNoInput(uint32_t ssrc) {
222 // Verify that the media channel's source is reset.
223 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
224 }
225
226 void VerifyVoiceChannelOutput() {
227 // Verify that the volume is initialized to 1.
228 double volume;
229 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
230 EXPECT_EQ(1, volume);
231 }
232
233 void VerifyVideoChannelOutput() {
234 // Verify that the media channel has a sink.
235 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
236 }
237
238 void VerifyVoiceChannelNoOutput() {
239 // Verify that the volume is reset to 0.
240 double volume;
241 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
242 EXPECT_EQ(0, volume);
243 }
244
245 void VerifyVideoChannelNoOutput() {
246 // Verify that the media channel's sink is reset.
247 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700248 }
249
250 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700251 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800252 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700253 cricket::FakeMediaEngine* media_engine_;
254 cricket::FakeTransportController fake_transport_controller_;
255 cricket::ChannelManager channel_manager_;
256 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700257 cricket::VoiceChannel* voice_channel_;
258 cricket::VideoChannel* video_channel_;
259 cricket::FakeVoiceMediaChannel* voice_media_channel_;
260 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700261 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
262 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
263 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
264 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800265 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700266 rtc::scoped_refptr<VideoTrackInterface> video_track_;
267 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800268 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700269};
270
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700271// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700272// and disassociated with an AudioRtpSender.
273TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
274 CreateAudioRtpSender();
275 DestroyAudioRtpSender();
276}
277
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700278// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700279// disassociated with a VideoRtpSender.
280TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
281 CreateVideoRtpSender();
282 DestroyVideoRtpSender();
283}
284
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700285// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700286// associated and disassociated with an AudioRtpReceiver.
287TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
288 CreateAudioRtpReceiver();
289 DestroyAudioRtpReceiver();
290}
291
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292// Test that |video_channel_| is updated when a remote video track is
293// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700294TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
295 CreateVideoRtpReceiver();
296 DestroyVideoRtpReceiver();
297}
298
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100299TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
300 CreateAudioRtpReceiver({local_stream_});
301 DestroyAudioRtpReceiver();
302}
303
304TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
305 CreateVideoRtpReceiver({local_stream_});
306 DestroyVideoRtpReceiver();
307}
308
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309// Test that the AudioRtpSender applies options from the local audio source.
310TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
311 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100312 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800313 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700314 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700315
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100316 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700317
318 DestroyAudioRtpSender();
319}
320
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700321// Test that the stream is muted when the track is disabled, and unmuted when
322// the track is enabled.
323TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
324 CreateAudioRtpSender();
325
326 audio_track_->set_enabled(false);
327 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
328
329 audio_track_->set_enabled(true);
330 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
331
332 DestroyAudioRtpSender();
333}
334
335// Test that the volume is set to 0 when the track is disabled, and back to
336// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700337TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
338 CreateAudioRtpReceiver();
339
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700340 double volume;
341 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
342 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700343
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344 audio_track_->set_enabled(false);
345 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
346 EXPECT_EQ(0, volume);
347
deadbeef70ab1a12015-09-28 16:53:55 -0700348 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700349 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
350 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700351
352 DestroyAudioRtpReceiver();
353}
354
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355// Currently no action is taken when a remote video track is disabled or
356// enabled, so there's nothing to test here, other than what is normally
357// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700358TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
359 CreateVideoRtpSender();
360
deadbeef70ab1a12015-09-28 16:53:55 -0700361 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700362 video_track_->set_enabled(true);
363
364 DestroyVideoRtpSender();
365}
366
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700367// Test that the state of the video track created by the VideoRtpReceiver is
368// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100369TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
370 CreateVideoRtpReceiver();
371
372 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
373 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
374 video_track_->GetSource()->state());
375
376 DestroyVideoRtpReceiver();
377
378 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
379 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
380 video_track_->GetSource()->state());
381}
382
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700383// Currently no action is taken when a remote video track is disabled or
384// enabled, so there's nothing to test here, other than what is normally
385// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700386TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
387 CreateVideoRtpReceiver();
388
389 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700390 video_track_->set_enabled(true);
391
392 DestroyVideoRtpReceiver();
393}
394
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700395// Test that the AudioRtpReceiver applies volume changes from the track source
396// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700397TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
398 CreateAudioRtpReceiver();
399
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700400 double volume;
401 audio_track_->GetSource()->SetVolume(0.5);
402 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
403 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700404
405 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700406 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700407 audio_track_->GetSource()->SetVolume(0.8);
408 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
409 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700410
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700412 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700413 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
414 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700415
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700416 // Try changing volume one more time.
417 audio_track_->GetSource()->SetVolume(0.9);
418 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
419 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700420
421 DestroyAudioRtpReceiver();
422}
423
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700424// Test that the media channel isn't enabled for sending if the audio sender
425// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800426TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700427 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800428 rtc::scoped_refptr<AudioTrackInterface> track =
429 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700430
431 // Track but no SSRC.
432 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
433 VerifyVoiceChannelNoInput();
434
435 // SSRC but no track.
436 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
437 audio_rtp_sender_->SetSsrc(kAudioSsrc);
438 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800439}
440
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700441// Test that the media channel isn't enabled for sending if the video sender
442// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800443TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700444 video_rtp_sender_ = new VideoRtpSender(video_channel_);
445
446 // Track but no SSRC.
447 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
448 VerifyVideoChannelNoInput();
449
450 // SSRC but no track.
451 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
452 video_rtp_sender_->SetSsrc(kVideoSsrc);
453 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800454}
455
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700456// Test that the media channel is enabled for sending when the audio sender
457// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800458TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700459 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800460 rtc::scoped_refptr<AudioTrackInterface> track =
461 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700462 audio_rtp_sender_->SetSsrc(kAudioSsrc);
463 audio_rtp_sender_->SetTrack(track);
464 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800465
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800467}
468
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700469// Test that the media channel is enabled for sending when the audio sender
470// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800471TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700472 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800473 rtc::scoped_refptr<AudioTrackInterface> track =
474 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700475 audio_rtp_sender_->SetTrack(track);
476 audio_rtp_sender_->SetSsrc(kAudioSsrc);
477 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800478
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700479 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800480}
481
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482// Test that the media channel is enabled for sending when the video sender
483// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800484TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700485 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486 video_rtp_sender_ = new VideoRtpSender(video_channel_);
487 video_rtp_sender_->SetSsrc(kVideoSsrc);
488 video_rtp_sender_->SetTrack(video_track_);
489 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800490
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700491 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800492}
493
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494// Test that the media channel is enabled for sending when the video sender
495// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800496TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700497 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 video_rtp_sender_ = new VideoRtpSender(video_channel_);
499 video_rtp_sender_->SetTrack(video_track_);
500 video_rtp_sender_->SetSsrc(kVideoSsrc);
501 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800502
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800504}
505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506// Test that the media channel stops sending when the audio sender's SSRC is set
507// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800508TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700509 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800510
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700511 audio_rtp_sender_->SetSsrc(0);
512 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800513}
514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515// Test that the media channel stops sending when the video sender's SSRC is set
516// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800517TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800519
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520 audio_rtp_sender_->SetSsrc(0);
521 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800522}
523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524// Test that the media channel stops sending when the audio sender's track is
525// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800526TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800528
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
530 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800531}
532
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700533// Test that the media channel stops sending when the video sender's track is
534// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800535TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538 video_rtp_sender_->SetSsrc(0);
539 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800540}
541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542// Test that when the audio sender's SSRC is changed, the media channel stops
543// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800544TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800546
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
548 VerifyVoiceChannelNoInput(kAudioSsrc);
549 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551 audio_rtp_sender_ = nullptr;
552 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that when the audio sender's SSRC is changed, the media channel stops
556// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800557TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800559
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 video_rtp_sender_->SetSsrc(kVideoSsrc2);
561 VerifyVideoChannelNoInput(kVideoSsrc);
562 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800563
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 video_rtp_sender_ = nullptr;
565 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800566}
567
skvladdc1c62c2016-03-16 19:07:43 -0700568TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
569 CreateAudioRtpSender();
570
skvladdc1c62c2016-03-16 19:07:43 -0700571 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700573 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
574
575 DestroyAudioRtpSender();
576}
577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
579 CreateAudioRtpSender();
580
581 EXPECT_EQ(-1, voice_media_channel_->max_bps());
582 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
583 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800584 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100585 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
587
588 // Read back the parameters and verify they have been changed.
589 params = audio_rtp_sender_->GetParameters();
590 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100591 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592
593 // Verify that the audio channel received the new parameters.
594 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
595 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100596 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597
598 // Verify that the global bitrate limit has not been changed.
599 EXPECT_EQ(-1, voice_media_channel_->max_bps());
600
601 DestroyAudioRtpSender();
602}
603
Seth Hampson24722b32017-12-22 09:36:42 -0800604TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
605 CreateAudioRtpSender();
606
607 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
608 EXPECT_EQ(1, params.encodings.size());
609 EXPECT_EQ(webrtc::kDefaultBitratePriority,
610 params.encodings[0].bitrate_priority);
611 double new_bitrate_priority = 2.0;
612 params.encodings[0].bitrate_priority = new_bitrate_priority;
613 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
614
615 params = audio_rtp_sender_->GetParameters();
616 EXPECT_EQ(1, params.encodings.size());
617 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
618
619 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
620 EXPECT_EQ(1, params.encodings.size());
621 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
622
623 DestroyAudioRtpSender();
624}
625
skvladdc1c62c2016-03-16 19:07:43 -0700626TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
627 CreateVideoRtpSender();
628
skvladdc1c62c2016-03-16 19:07:43 -0700629 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700630 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700631 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
632
633 DestroyVideoRtpSender();
634}
635
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700636TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
637 CreateVideoRtpSender();
638
639 EXPECT_EQ(-1, video_media_channel_->max_bps());
640 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
641 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800642 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100643 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
645
646 // Read back the parameters and verify they have been changed.
647 params = video_rtp_sender_->GetParameters();
648 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100649 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700650
651 // Verify that the video channel received the new parameters.
652 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
653 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100654 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655
656 // Verify that the global bitrate limit has not been changed.
657 EXPECT_EQ(-1, video_media_channel_->max_bps());
658
659 DestroyVideoRtpSender();
660}
661
Seth Hampson24722b32017-12-22 09:36:42 -0800662TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
663 CreateVideoRtpSender();
664
665 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
666 EXPECT_EQ(1, params.encodings.size());
667 EXPECT_EQ(webrtc::kDefaultBitratePriority,
668 params.encodings[0].bitrate_priority);
669 double new_bitrate_priority = 2.0;
670 params.encodings[0].bitrate_priority = new_bitrate_priority;
671 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
672
673 params = video_rtp_sender_->GetParameters();
674 EXPECT_EQ(1, params.encodings.size());
675 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
676
677 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
678 EXPECT_EQ(1, params.encodings.size());
679 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
680
681 DestroyVideoRtpSender();
682}
683
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700684TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
685 CreateAudioRtpReceiver();
686
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700687 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700688 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700689 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
690
691 DestroyAudioRtpReceiver();
692}
693
694TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
695 CreateVideoRtpReceiver();
696
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700697 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700698 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700699 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
700
701 DestroyVideoRtpReceiver();
702}
703
pbos5214a0a2016-12-16 15:39:11 -0800704// Test that makes sure that a video track content hint translates to the proper
705// value for sources that are not screencast.
706TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
707 CreateVideoRtpSender();
708
709 video_track_->set_enabled(true);
710
711 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100712 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800713 // No content hint should be set by default.
714 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
715 video_track_->content_hint());
716 // Setting detailed should turn a non-screencast source into screencast mode.
717 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100718 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800719 // Removing the content hint should turn the track back into non-screencast
720 // mode.
721 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100722 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800723 // Setting fluid should remain in non-screencast mode (its default).
724 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100725 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800726
727 DestroyVideoRtpSender();
728}
729
730// Test that makes sure that a video track content hint translates to the proper
731// value for screencast sources.
732TEST_F(RtpSenderReceiverTest,
733 PropagatesVideoTrackContentHintForScreencastSource) {
734 CreateVideoRtpSender(true);
735
736 video_track_->set_enabled(true);
737
738 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100739 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800740 // No content hint should be set by default.
741 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
742 video_track_->content_hint());
743 // Setting fluid should turn a screencast source into non-screencast mode.
744 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100745 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800746 // Removing the content hint should turn the track back into screencast mode.
747 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100748 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800749 // Setting detailed should still remain in screencast mode (its default).
750 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100751 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800752
753 DestroyVideoRtpSender();
754}
755
756// Test that makes sure any content hints that are set on a track before
757// VideoRtpSender is ready to send are still applied when it gets ready to send.
758TEST_F(RtpSenderReceiverTest,
759 PropagatesVideoTrackContentHintSetBeforeEnabling) {
760 AddVideoTrack();
761 // Setting detailed overrides the default non-screencast mode. This should be
762 // applied even if the track is set on construction.
763 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
deadbeefe814a0d2017-02-25 18:15:09 -0800764 video_rtp_sender_ =
765 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700766 {local_stream_->label()}, video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800767 video_track_->set_enabled(true);
768
769 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100770 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800771
772 // Verify that the content hint is accounted for when video_rtp_sender_ does
773 // get enabled.
774 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100775 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800776
777 // And removing the hint should go back to false (to verify that false was
778 // default correctly).
779 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100780 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800781
782 DestroyVideoRtpSender();
783}
784
deadbeef20cb0c12017-02-01 20:27:00 -0800785TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
786 CreateAudioRtpSender();
787 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
788}
789
790TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
791 CreateVideoRtpSender();
792 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
793}
794
795// Test that the DTMF sender is really using |voice_channel_|, and thus returns
796// true/false from CanSendDtmf based on what |voice_channel_| returns.
797TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
798 AddDtmfCodec();
799 CreateAudioRtpSender();
800 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
801 ASSERT_NE(nullptr, dtmf_sender);
802 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
803}
804
805TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
806 CreateAudioRtpSender();
807 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
808 ASSERT_NE(nullptr, dtmf_sender);
809 // DTMF codec has not been added, as it was in the above test.
810 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
811}
812
813TEST_F(RtpSenderReceiverTest, InsertDtmf) {
814 AddDtmfCodec();
815 CreateAudioRtpSender();
816 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
817 ASSERT_NE(nullptr, dtmf_sender);
818
819 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
820
821 // Insert DTMF
822 const int expected_duration = 90;
823 dtmf_sender->InsertDtmf("012", expected_duration, 100);
824
825 // Verify
826 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
827 kDefaultTimeout);
828 const uint32_t send_ssrc =
829 voice_media_channel_->send_streams()[0].first_ssrc();
830 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
831 send_ssrc, 0, expected_duration));
832 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
833 send_ssrc, 1, expected_duration));
834 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
835 send_ssrc, 2, expected_duration));
836}
837
838// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
839// destroyed, which is needed for the DTMF sender.
840TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
841 CreateAudioRtpSender();
842 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
843 audio_rtp_sender_ = nullptr;
844 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
845}
846
deadbeef70ab1a12015-09-28 16:53:55 -0700847} // namespace webrtc