blob: c02da587b0e25ebf49cc06c69ab1c5b89c7cb9f2 [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
deadbeef70ab1a12015-09-28 16:53:55 -070015#include "webrtc/base/gunit.h"
deadbeef20cb0c12017-02-01 20:27:00 -080016#include "webrtc/base/sigslot.h"
skvlad11a9cbf2016-10-07 11:53:05 -070017#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070018#include "webrtc/media/base/fakemediaengine.h"
kwibergac9f8762016-09-30 22:29:43 -070019#include "webrtc/media/base/mediachannel.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070020#include "webrtc/media/engine/fakewebrtccall.h"
21#include "webrtc/p2p/base/faketransportcontroller.h"
ossu7bb87ee2017-01-23 04:56:25 -080022#include "webrtc/pc/audiotrack.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070023#include "webrtc/pc/channelmanager.h"
ossu7bb87ee2017-01-23 04:56:25 -080024#include "webrtc/pc/fakemediacontroller.h"
25#include "webrtc/pc/localaudiosource.h"
26#include "webrtc/pc/mediastream.h"
27#include "webrtc/pc/remoteaudiosource.h"
28#include "webrtc/pc/rtpreceiver.h"
29#include "webrtc/pc/rtpsender.h"
30#include "webrtc/pc/streamcollection.h"
31#include "webrtc/pc/test/fakevideotracksource.h"
32#include "webrtc/pc/videotrack.h"
33#include "webrtc/pc/videotracksource.h"
kwibergac9f8762016-09-30 22:29:43 -070034#include "webrtc/test/gmock.h"
35#include "webrtc/test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070036
37using ::testing::_;
38using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070039using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070040using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070041
deadbeef20cb0c12017-02-01 20:27:00 -080042namespace {
43
deadbeef70ab1a12015-09-28 16:53:55 -070044static const char kStreamLabel1[] = "local_stream_1";
45static const char kVideoTrackId[] = "video_1";
46static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020047static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080048static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020049static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080050static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080051static const int kDefaultTimeout = 10000; // 10 seconds.
52
53} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070054
55namespace webrtc {
56
deadbeef20cb0c12017-02-01 20:27:00 -080057class RtpSenderReceiverTest : public testing::Test,
58 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070059 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070060 RtpSenderReceiverTest()
61 : // Create fake media engine/etc. so we can create channels to use to
62 // test RtpSenders/RtpReceivers.
63 media_engine_(new cricket::FakeMediaEngine()),
64 channel_manager_(media_engine_,
65 rtc::Thread::Current(),
66 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070067 fake_call_(Call::Config(&event_log_)),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070068 fake_media_controller_(&channel_manager_, &fake_call_),
69 stream_(MediaStream::Create(kStreamLabel1)) {
70 // Create channels to be used by the RtpSenders and RtpReceivers.
71 channel_manager_.Init();
deadbeefac22f702017-01-12 21:59:29 -080072 bool rtcp_mux_required = true;
deadbeef7af91dd2016-12-13 11:29:11 -080073 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080074 cricket::DtlsTransportInternal* rtp_transport =
75 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080076 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 voice_channel_ = channel_manager_.CreateVoiceChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080078 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
deadbeefac22f702017-01-12 21:59:29 -080079 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required,
zhihuangf5b251b2017-01-12 19:37:48 -080080 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070081 video_channel_ = channel_manager_.CreateVideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080082 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
deadbeefac22f702017-01-12 21:59:29 -080083 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required,
zhihuangf5b251b2017-01-12 19:37:48 -080084 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080085 voice_channel_->Enable(true);
86 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070087 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
88 video_media_channel_ = media_engine_->GetVideoChannel(0);
89 RTC_CHECK(voice_channel_);
90 RTC_CHECK(video_channel_);
91 RTC_CHECK(voice_media_channel_);
92 RTC_CHECK(video_media_channel_);
93
94 // Create streams for predefined SSRCs. Streams need to exist in order
95 // for the senders and receievers to apply parameters to them.
96 // Normally these would be created by SetLocalDescription and
97 // SetRemoteDescription.
98 voice_media_channel_->AddSendStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
100 voice_media_channel_->AddRecvStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc));
102 voice_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
104 voice_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
106 video_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
108 video_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc));
110 video_media_channel_->AddSendStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
112 video_media_channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700114 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700115
deadbeef20cb0c12017-02-01 20:27:00 -0800116 // Needed to use DTMF sender.
117 void AddDtmfCodec() {
118 cricket::AudioSendParameters params;
119 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
120 0, 1);
121 params.codecs.push_back(kTelephoneEventCodec);
122 voice_media_channel_->SetSendParameters(params);
123 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700124
pbos5214a0a2016-12-16 15:39:11 -0800125 void AddVideoTrack() { AddVideoTrack(false); }
126
127 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100128 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800129 FakeVideoTrackSource::Create(is_screencast));
deadbeef70ab1a12015-09-28 16:53:55 -0700130 video_track_ = VideoTrack::Create(kVideoTrackId, source);
131 EXPECT_TRUE(stream_->AddTrack(video_track_));
132 }
133
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700134 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
135
136 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
137 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700138 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800139 audio_rtp_sender_ =
140 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700141 voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800142 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800143 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
144 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700145 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700146 }
147
deadbeef20cb0c12017-02-01 20:27:00 -0800148 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
149
pbos5214a0a2016-12-16 15:39:11 -0800150 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
151
152 void CreateVideoRtpSender(bool is_screencast) {
153 AddVideoTrack(is_screencast);
deadbeef70ab1a12015-09-28 16:53:55 -0700154 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700155 stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800156 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700157 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700158 }
159
160 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700161 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700162 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700163 }
164
165 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700166 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700167 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700168 }
169
170 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800171 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100172 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700173 EXPECT_TRUE(stream_->AddTrack(audio_track_));
perkjd61bf802016-03-24 03:16:19 -0700174 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700176 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700177 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700178 }
179
180 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100181 video_rtp_receiver_ =
182 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700183 kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100184 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700186 }
187
188 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700189 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
193 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700194 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 VerifyVideoChannelNoOutput();
196 }
197
198 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
199
200 void VerifyVoiceChannelInput(uint32_t ssrc) {
201 // Verify that the media channel has an audio source, and the stream isn't
202 // muted.
203 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
204 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
205 }
206
207 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
208
209 void VerifyVideoChannelInput(uint32_t ssrc) {
210 // Verify that the media channel has a video source,
211 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
212 }
213
214 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
215
216 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
217 // Verify that the media channel's source is reset.
218 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
219 }
220
221 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
222
223 void VerifyVideoChannelNoInput(uint32_t ssrc) {
224 // Verify that the media channel's source is reset.
225 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
226 }
227
228 void VerifyVoiceChannelOutput() {
229 // Verify that the volume is initialized to 1.
230 double volume;
231 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
232 EXPECT_EQ(1, volume);
233 }
234
235 void VerifyVideoChannelOutput() {
236 // Verify that the media channel has a sink.
237 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
238 }
239
240 void VerifyVoiceChannelNoOutput() {
241 // Verify that the volume is reset to 0.
242 double volume;
243 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
244 EXPECT_EQ(0, volume);
245 }
246
247 void VerifyVideoChannelNoOutput() {
248 // Verify that the media channel's sink is reset.
249 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700250 }
251
252 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700253 webrtc::RtcEventLogNullImpl event_log_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700254 cricket::FakeMediaEngine* media_engine_;
255 cricket::FakeTransportController fake_transport_controller_;
256 cricket::ChannelManager channel_manager_;
257 cricket::FakeCall fake_call_;
258 cricket::FakeMediaController fake_media_controller_;
259 cricket::VoiceChannel* voice_channel_;
260 cricket::VideoChannel* video_channel_;
261 cricket::FakeVoiceMediaChannel* voice_media_channel_;
262 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700263 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
264 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
265 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
266 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
267 rtc::scoped_refptr<MediaStreamInterface> stream_;
268 rtc::scoped_refptr<VideoTrackInterface> video_track_;
269 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800270 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700271};
272
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700273// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700274// and disassociated with an AudioRtpSender.
275TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
276 CreateAudioRtpSender();
277 DestroyAudioRtpSender();
278}
279
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700280// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700281// disassociated with a VideoRtpSender.
282TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
283 CreateVideoRtpSender();
284 DestroyVideoRtpSender();
285}
286
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700287// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700288// associated and disassociated with an AudioRtpReceiver.
289TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
290 CreateAudioRtpReceiver();
291 DestroyAudioRtpReceiver();
292}
293
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294// Test that |video_channel_| is updated when a remote video track is
295// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700296TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
297 CreateVideoRtpReceiver();
298 DestroyVideoRtpReceiver();
299}
300
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700301// Test that the AudioRtpSender applies options from the local audio source.
302TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
303 cricket::AudioOptions options;
304 options.echo_cancellation = rtc::Optional<bool>(true);
305 auto source = LocalAudioSource::Create(
306 PeerConnectionFactoryInterface::Options(), &options);
307 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700308
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309 EXPECT_EQ(rtc::Optional<bool>(true),
310 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700311
312 DestroyAudioRtpSender();
313}
314
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315// Test that the stream is muted when the track is disabled, and unmuted when
316// the track is enabled.
317TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
318 CreateAudioRtpSender();
319
320 audio_track_->set_enabled(false);
321 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
322
323 audio_track_->set_enabled(true);
324 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
325
326 DestroyAudioRtpSender();
327}
328
329// Test that the volume is set to 0 when the track is disabled, and back to
330// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700331TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
332 CreateAudioRtpReceiver();
333
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700334 double volume;
335 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
336 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700337
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700338 audio_track_->set_enabled(false);
339 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
340 EXPECT_EQ(0, volume);
341
deadbeef70ab1a12015-09-28 16:53:55 -0700342 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700343 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
344 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700345
346 DestroyAudioRtpReceiver();
347}
348
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700349// Currently no action is taken when a remote video track is disabled or
350// enabled, so there's nothing to test here, other than what is normally
351// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700352TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
353 CreateVideoRtpSender();
354
deadbeef70ab1a12015-09-28 16:53:55 -0700355 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700356 video_track_->set_enabled(true);
357
358 DestroyVideoRtpSender();
359}
360
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700361// Test that the state of the video track created by the VideoRtpReceiver is
362// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100363TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
364 CreateVideoRtpReceiver();
365
366 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
367 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
368 video_track_->GetSource()->state());
369
370 DestroyVideoRtpReceiver();
371
372 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
373 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
374 video_track_->GetSource()->state());
375}
376
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700377// Currently no action is taken when a remote video track is disabled or
378// enabled, so there's nothing to test here, other than what is normally
379// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700380TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
381 CreateVideoRtpReceiver();
382
383 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700384 video_track_->set_enabled(true);
385
386 DestroyVideoRtpReceiver();
387}
388
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700389// Test that the AudioRtpReceiver applies volume changes from the track source
390// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700391TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
392 CreateAudioRtpReceiver();
393
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394 double volume;
395 audio_track_->GetSource()->SetVolume(0.5);
396 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
397 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700398
399 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700400 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700401 audio_track_->GetSource()->SetVolume(0.8);
402 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
403 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700404
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700405 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700406 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700407 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
408 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700409
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700410 // Try changing volume one more time.
411 audio_track_->GetSource()->SetVolume(0.9);
412 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
413 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700414
415 DestroyAudioRtpReceiver();
416}
417
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700418// Test that the media channel isn't enabled for sending if the audio sender
419// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800420TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700421 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800422 rtc::scoped_refptr<AudioTrackInterface> track =
423 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700424
425 // Track but no SSRC.
426 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
427 VerifyVoiceChannelNoInput();
428
429 // SSRC but no track.
430 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
431 audio_rtp_sender_->SetSsrc(kAudioSsrc);
432 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800433}
434
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435// Test that the media channel isn't enabled for sending if the video sender
436// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800437TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700438 video_rtp_sender_ = new VideoRtpSender(video_channel_);
439
440 // Track but no SSRC.
441 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
442 VerifyVideoChannelNoInput();
443
444 // SSRC but no track.
445 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
446 video_rtp_sender_->SetSsrc(kVideoSsrc);
447 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800448}
449
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450// Test that the media channel is enabled for sending when the audio sender
451// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800452TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700453 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800454 rtc::scoped_refptr<AudioTrackInterface> track =
455 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700456 audio_rtp_sender_->SetSsrc(kAudioSsrc);
457 audio_rtp_sender_->SetTrack(track);
458 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800459
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700460 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800461}
462
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700463// Test that the media channel is enabled for sending when the audio sender
464// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800465TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800467 rtc::scoped_refptr<AudioTrackInterface> track =
468 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700469 audio_rtp_sender_->SetTrack(track);
470 audio_rtp_sender_->SetSsrc(kAudioSsrc);
471 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800472
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700473 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800474}
475
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700476// Test that the media channel is enabled for sending when the video sender
477// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800478TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700479 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480 video_rtp_sender_ = new VideoRtpSender(video_channel_);
481 video_rtp_sender_->SetSsrc(kVideoSsrc);
482 video_rtp_sender_->SetTrack(video_track_);
483 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800484
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700485 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800486}
487
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700488// Test that the media channel is enabled for sending when the video sender
489// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800490TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700491 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700492 video_rtp_sender_ = new VideoRtpSender(video_channel_);
493 video_rtp_sender_->SetTrack(video_track_);
494 video_rtp_sender_->SetSsrc(kVideoSsrc);
495 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800498}
499
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500// Test that the media channel stops sending when the audio sender's SSRC is set
501// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800502TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800504
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505 audio_rtp_sender_->SetSsrc(0);
506 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800507}
508
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700509// Test that the media channel stops sending when the video sender's SSRC is set
510// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800511TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800513
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 audio_rtp_sender_->SetSsrc(0);
515 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800516}
517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518// Test that the media channel stops sending when the audio sender's track is
519// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800520TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800522
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
524 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800525}
526
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527// Test that the media channel stops sending when the video sender's track is
528// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800529TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532 video_rtp_sender_->SetSsrc(0);
533 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800534}
535
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536// Test that when the audio sender's SSRC is changed, the media channel stops
537// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800538TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800540
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700541 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
542 VerifyVoiceChannelNoInput(kAudioSsrc);
543 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800544
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545 audio_rtp_sender_ = nullptr;
546 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800547}
548
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549// Test that when the audio sender's SSRC is changed, the media channel stops
550// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800551TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800553
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700554 video_rtp_sender_->SetSsrc(kVideoSsrc2);
555 VerifyVideoChannelNoInput(kVideoSsrc);
556 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800557
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558 video_rtp_sender_ = nullptr;
559 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800560}
561
skvladdc1c62c2016-03-16 19:07:43 -0700562TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
563 CreateAudioRtpSender();
564
skvladdc1c62c2016-03-16 19:07:43 -0700565 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700567 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
568
569 DestroyAudioRtpSender();
570}
571
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
573 CreateAudioRtpSender();
574
575 EXPECT_EQ(-1, voice_media_channel_->max_bps());
576 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
577 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800578 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
579 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
581
582 // Read back the parameters and verify they have been changed.
583 params = audio_rtp_sender_->GetParameters();
584 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800585 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586
587 // Verify that the audio channel received the new parameters.
588 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
589 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800590 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591
592 // Verify that the global bitrate limit has not been changed.
593 EXPECT_EQ(-1, voice_media_channel_->max_bps());
594
595 DestroyAudioRtpSender();
596}
597
skvladdc1c62c2016-03-16 19:07:43 -0700598TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
599 CreateVideoRtpSender();
600
skvladdc1c62c2016-03-16 19:07:43 -0700601 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700603 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
604
605 DestroyVideoRtpSender();
606}
607
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
609 CreateVideoRtpSender();
610
611 EXPECT_EQ(-1, video_media_channel_->max_bps());
612 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
613 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800614 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
615 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
617
618 // Read back the parameters and verify they have been changed.
619 params = video_rtp_sender_->GetParameters();
620 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800621 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622
623 // Verify that the video channel received the new parameters.
624 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
625 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800626 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627
628 // Verify that the global bitrate limit has not been changed.
629 EXPECT_EQ(-1, video_media_channel_->max_bps());
630
631 DestroyVideoRtpSender();
632}
633
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700634TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
635 CreateAudioRtpReceiver();
636
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700637 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700638 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700639 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
640
641 DestroyAudioRtpReceiver();
642}
643
644TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
645 CreateVideoRtpReceiver();
646
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700647 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700648 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700649 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
650
651 DestroyVideoRtpReceiver();
652}
653
pbos5214a0a2016-12-16 15:39:11 -0800654// Test that makes sure that a video track content hint translates to the proper
655// value for sources that are not screencast.
656TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
657 CreateVideoRtpSender();
658
659 video_track_->set_enabled(true);
660
661 // |video_track_| is not screencast by default.
662 EXPECT_EQ(rtc::Optional<bool>(false),
663 video_media_channel_->options().is_screencast);
664 // No content hint should be set by default.
665 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
666 video_track_->content_hint());
667 // Setting detailed should turn a non-screencast source into screencast mode.
668 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
669 EXPECT_EQ(rtc::Optional<bool>(true),
670 video_media_channel_->options().is_screencast);
671 // Removing the content hint should turn the track back into non-screencast
672 // mode.
673 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
674 EXPECT_EQ(rtc::Optional<bool>(false),
675 video_media_channel_->options().is_screencast);
676 // Setting fluid should remain in non-screencast mode (its default).
677 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
678 EXPECT_EQ(rtc::Optional<bool>(false),
679 video_media_channel_->options().is_screencast);
680
681 DestroyVideoRtpSender();
682}
683
684// Test that makes sure that a video track content hint translates to the proper
685// value for screencast sources.
686TEST_F(RtpSenderReceiverTest,
687 PropagatesVideoTrackContentHintForScreencastSource) {
688 CreateVideoRtpSender(true);
689
690 video_track_->set_enabled(true);
691
692 // |video_track_| with a screencast source should be screencast by default.
693 EXPECT_EQ(rtc::Optional<bool>(true),
694 video_media_channel_->options().is_screencast);
695 // No content hint should be set by default.
696 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
697 video_track_->content_hint());
698 // Setting fluid should turn a screencast source into non-screencast mode.
699 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
700 EXPECT_EQ(rtc::Optional<bool>(false),
701 video_media_channel_->options().is_screencast);
702 // Removing the content hint should turn the track back into screencast mode.
703 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
704 EXPECT_EQ(rtc::Optional<bool>(true),
705 video_media_channel_->options().is_screencast);
706 // Setting detailed should still remain in screencast mode (its default).
707 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
708 EXPECT_EQ(rtc::Optional<bool>(true),
709 video_media_channel_->options().is_screencast);
710
711 DestroyVideoRtpSender();
712}
713
714// Test that makes sure any content hints that are set on a track before
715// VideoRtpSender is ready to send are still applied when it gets ready to send.
716TEST_F(RtpSenderReceiverTest,
717 PropagatesVideoTrackContentHintSetBeforeEnabling) {
718 AddVideoTrack();
719 // Setting detailed overrides the default non-screencast mode. This should be
720 // applied even if the track is set on construction.
721 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
722 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
723 stream_->label(), video_channel_);
724 video_track_->set_enabled(true);
725
726 // Sender is not ready to send (no SSRC) so no option should have been set.
727 EXPECT_EQ(rtc::Optional<bool>(),
728 video_media_channel_->options().is_screencast);
729
730 // Verify that the content hint is accounted for when video_rtp_sender_ does
731 // get enabled.
732 video_rtp_sender_->SetSsrc(kVideoSsrc);
733 EXPECT_EQ(rtc::Optional<bool>(true),
734 video_media_channel_->options().is_screencast);
735
736 // And removing the hint should go back to false (to verify that false was
737 // default correctly).
738 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
739 EXPECT_EQ(rtc::Optional<bool>(false),
740 video_media_channel_->options().is_screencast);
741
742 DestroyVideoRtpSender();
743}
744
deadbeef20cb0c12017-02-01 20:27:00 -0800745TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
746 CreateAudioRtpSender();
747 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
748}
749
750TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
751 CreateVideoRtpSender();
752 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
753}
754
755// Test that the DTMF sender is really using |voice_channel_|, and thus returns
756// true/false from CanSendDtmf based on what |voice_channel_| returns.
757TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
758 AddDtmfCodec();
759 CreateAudioRtpSender();
760 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
761 ASSERT_NE(nullptr, dtmf_sender);
762 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
763}
764
765TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
766 CreateAudioRtpSender();
767 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
768 ASSERT_NE(nullptr, dtmf_sender);
769 // DTMF codec has not been added, as it was in the above test.
770 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
771}
772
773TEST_F(RtpSenderReceiverTest, InsertDtmf) {
774 AddDtmfCodec();
775 CreateAudioRtpSender();
776 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
777 ASSERT_NE(nullptr, dtmf_sender);
778
779 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
780
781 // Insert DTMF
782 const int expected_duration = 90;
783 dtmf_sender->InsertDtmf("012", expected_duration, 100);
784
785 // Verify
786 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
787 kDefaultTimeout);
788 const uint32_t send_ssrc =
789 voice_media_channel_->send_streams()[0].first_ssrc();
790 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
791 send_ssrc, 0, expected_duration));
792 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
793 send_ssrc, 1, expected_duration));
794 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
795 send_ssrc, 2, expected_duration));
796}
797
798// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
799// destroyed, which is needed for the DTMF sender.
800TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
801 CreateAudioRtpSender();
802 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
803 audio_rtp_sender_ = nullptr;
804 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
805}
806
deadbeef70ab1a12015-09-28 16:53:55 -0700807} // namespace webrtc