blob: bf413e411ddff643746a3c967ab139f9e9f41952 [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
skvlad11a9cbf2016-10-07 11:53:05 -070015#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070016#include "webrtc/media/base/fakemediaengine.h"
kwibergac9f8762016-09-30 22:29:43 -070017#include "webrtc/media/base/mediachannel.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070018#include "webrtc/media/engine/fakewebrtccall.h"
19#include "webrtc/p2p/base/faketransportcontroller.h"
ossu7bb87ee2017-01-23 04:56:25 -080020#include "webrtc/pc/audiotrack.h"
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070021#include "webrtc/pc/channelmanager.h"
ossu7bb87ee2017-01-23 04:56:25 -080022#include "webrtc/pc/localaudiosource.h"
23#include "webrtc/pc/mediastream.h"
24#include "webrtc/pc/remoteaudiosource.h"
25#include "webrtc/pc/rtpreceiver.h"
26#include "webrtc/pc/rtpsender.h"
27#include "webrtc/pc/streamcollection.h"
28#include "webrtc/pc/test/fakevideotracksource.h"
29#include "webrtc/pc/videotrack.h"
30#include "webrtc/pc/videotracksource.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020031#include "webrtc/rtc_base/gunit.h"
32#include "webrtc/rtc_base/sigslot.h"
kwibergac9f8762016-09-30 22:29:43 -070033#include "webrtc/test/gmock.h"
34#include "webrtc/test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070035
36using ::testing::_;
37using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070038using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070039using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070040
deadbeef20cb0c12017-02-01 20:27:00 -080041namespace {
42
deadbeef70ab1a12015-09-28 16:53:55 -070043static const char kStreamLabel1[] = "local_stream_1";
44static const char kVideoTrackId[] = "video_1";
45static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020046static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080047static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020048static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080049static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080050static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080051} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070052
53namespace webrtc {
54
deadbeef20cb0c12017-02-01 20:27:00 -080055class RtpSenderReceiverTest : public testing::Test,
56 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070057 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070058 RtpSenderReceiverTest()
59 : // Create fake media engine/etc. so we can create channels to use to
deadbeefe814a0d2017-02-25 18:15:09 -080060 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070061 media_engine_(new cricket::FakeMediaEngine()),
deadbeef112b2e92017-02-10 20:13:37 -080062 channel_manager_(
63 std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
64 rtc::Thread::Current(),
65 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070066 fake_call_(Call::Config(&event_log_)),
deadbeefe814a0d2017-02-25 18:15:09 -080067 local_stream_(MediaStream::Create(kStreamLabel1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070068 // Create channels to be used by the RtpSenders and RtpReceivers.
69 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080070 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080071 cricket::DtlsTransportInternal* rtp_transport =
72 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080073 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070074 voice_channel_ = channel_manager_.CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -070075 &fake_call_, cricket::MediaConfig(),
76 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080077 cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070078 video_channel_ = channel_manager_.CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -070079 &fake_call_, cricket::MediaConfig(),
80 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080081 cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080082 voice_channel_->Enable(true);
83 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070084 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
85 video_media_channel_ = media_engine_->GetVideoChannel(0);
86 RTC_CHECK(voice_channel_);
87 RTC_CHECK(video_channel_);
88 RTC_CHECK(voice_media_channel_);
89 RTC_CHECK(video_media_channel_);
90
91 // Create streams for predefined SSRCs. Streams need to exist in order
92 // for the senders and receievers to apply parameters to them.
93 // Normally these would be created by SetLocalDescription and
94 // SetRemoteDescription.
95 voice_media_channel_->AddSendStream(
96 cricket::StreamParams::CreateLegacy(kAudioSsrc));
97 voice_media_channel_->AddRecvStream(
98 cricket::StreamParams::CreateLegacy(kAudioSsrc));
99 voice_media_channel_->AddSendStream(
100 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
101 voice_media_channel_->AddRecvStream(
102 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
103 video_media_channel_->AddSendStream(
104 cricket::StreamParams::CreateLegacy(kVideoSsrc));
105 video_media_channel_->AddRecvStream(
106 cricket::StreamParams::CreateLegacy(kVideoSsrc));
107 video_media_channel_->AddSendStream(
108 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
109 video_media_channel_->AddRecvStream(
110 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700111 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700112
deadbeef20cb0c12017-02-01 20:27:00 -0800113 // Needed to use DTMF sender.
114 void AddDtmfCodec() {
115 cricket::AudioSendParameters params;
116 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
117 0, 1);
118 params.codecs.push_back(kTelephoneEventCodec);
119 voice_media_channel_->SetSendParameters(params);
120 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700121
pbos5214a0a2016-12-16 15:39:11 -0800122 void AddVideoTrack() { AddVideoTrack(false); }
123
124 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100125 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800126 FakeVideoTrackSource::Create(is_screencast));
mbonadei539d1042017-07-10 02:40:49 -0700127 video_track_ = VideoTrack::Create(kVideoTrackId, source);
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
133 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
134 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800135 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800136 audio_rtp_sender_ =
deadbeefe814a0d2017-02-25 18:15:09 -0800137 new AudioRtpSender(local_stream_->GetAudioTracks()[0],
138 local_stream_->label(), voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800139 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800140 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
141 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
deadbeef20cb0c12017-02-01 20:27:00 -0800145 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
146
pbos5214a0a2016-12-16 15:39:11 -0800147 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
148
149 void CreateVideoRtpSender(bool is_screencast) {
150 AddVideoTrack(is_screencast);
deadbeefe814a0d2017-02-25 18:15:09 -0800151 video_rtp_sender_ =
152 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
153 local_stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800154 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700155 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700156 }
157
158 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700159 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700160 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700161 }
162
163 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700164 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700166 }
167
168 void CreateAudioRtpReceiver() {
deadbeefe814a0d2017-02-25 18:15:09 -0800169 audio_rtp_receiver_ =
170 new AudioRtpReceiver(kAudioTrackId, kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700171 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700172 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700173 }
174
175 void CreateVideoRtpReceiver() {
deadbeefe814a0d2017-02-25 18:15:09 -0800176 video_rtp_receiver_ = new VideoRtpReceiver(
177 kVideoTrackId, rtc::Thread::Current(), kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100178 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700179 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700180 }
181
182 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700183 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700184 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700185 }
186
187 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700188 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700189 VerifyVideoChannelNoOutput();
190 }
191
192 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
193
194 void VerifyVoiceChannelInput(uint32_t ssrc) {
195 // Verify that the media channel has an audio source, and the stream isn't
196 // muted.
197 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
198 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
199 }
200
201 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
202
203 void VerifyVideoChannelInput(uint32_t ssrc) {
204 // Verify that the media channel has a video source,
205 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
206 }
207
208 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
209
210 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
211 // Verify that the media channel's source is reset.
212 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
213 }
214
215 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
216
217 void VerifyVideoChannelNoInput(uint32_t ssrc) {
218 // Verify that the media channel's source is reset.
219 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
220 }
221
222 void VerifyVoiceChannelOutput() {
223 // Verify that the volume is initialized to 1.
224 double volume;
225 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
226 EXPECT_EQ(1, volume);
227 }
228
229 void VerifyVideoChannelOutput() {
230 // Verify that the media channel has a sink.
231 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
232 }
233
234 void VerifyVoiceChannelNoOutput() {
235 // Verify that the volume is reset to 0.
236 double volume;
237 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
238 EXPECT_EQ(0, volume);
239 }
240
241 void VerifyVideoChannelNoOutput() {
242 // Verify that the media channel's sink is reset.
243 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700244 }
245
246 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700247 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800248 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700249 cricket::FakeMediaEngine* media_engine_;
250 cricket::FakeTransportController fake_transport_controller_;
251 cricket::ChannelManager channel_manager_;
252 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700253 cricket::VoiceChannel* voice_channel_;
254 cricket::VideoChannel* video_channel_;
255 cricket::FakeVoiceMediaChannel* voice_media_channel_;
256 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700257 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
258 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
259 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
260 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800261 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700262 rtc::scoped_refptr<VideoTrackInterface> video_track_;
263 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800264 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700265};
266
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700267// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700268// and disassociated with an AudioRtpSender.
269TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
270 CreateAudioRtpSender();
271 DestroyAudioRtpSender();
272}
273
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700274// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700275// disassociated with a VideoRtpSender.
276TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
277 CreateVideoRtpSender();
278 DestroyVideoRtpSender();
279}
280
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700282// associated and disassociated with an AudioRtpReceiver.
283TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
284 CreateAudioRtpReceiver();
285 DestroyAudioRtpReceiver();
286}
287
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700288// Test that |video_channel_| is updated when a remote video track is
289// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700290TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
291 CreateVideoRtpReceiver();
292 DestroyVideoRtpReceiver();
293}
294
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700295// Test that the AudioRtpSender applies options from the local audio source.
296TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
297 cricket::AudioOptions options;
298 options.echo_cancellation = rtc::Optional<bool>(true);
deadbeef757146b2017-02-10 21:26:48 -0800299 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700300 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700301
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700302 EXPECT_EQ(rtc::Optional<bool>(true),
303 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700304
305 DestroyAudioRtpSender();
306}
307
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308// Test that the stream is muted when the track is disabled, and unmuted when
309// the track is enabled.
310TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
311 CreateAudioRtpSender();
312
313 audio_track_->set_enabled(false);
314 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
315
316 audio_track_->set_enabled(true);
317 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
318
319 DestroyAudioRtpSender();
320}
321
322// Test that the volume is set to 0 when the track is disabled, and back to
323// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700324TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
325 CreateAudioRtpReceiver();
326
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700327 double volume;
328 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
329 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700330
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700331 audio_track_->set_enabled(false);
332 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
333 EXPECT_EQ(0, volume);
334
deadbeef70ab1a12015-09-28 16:53:55 -0700335 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700336 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
337 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700338
339 DestroyAudioRtpReceiver();
340}
341
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700342// Currently no action is taken when a remote video track is disabled or
343// enabled, so there's nothing to test here, other than what is normally
344// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700345TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
346 CreateVideoRtpSender();
347
deadbeef70ab1a12015-09-28 16:53:55 -0700348 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700349 video_track_->set_enabled(true);
350
351 DestroyVideoRtpSender();
352}
353
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700354// Test that the state of the video track created by the VideoRtpReceiver is
355// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100356TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
357 CreateVideoRtpReceiver();
358
359 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
360 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
361 video_track_->GetSource()->state());
362
363 DestroyVideoRtpReceiver();
364
365 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
366 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
367 video_track_->GetSource()->state());
368}
369
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700370// Currently no action is taken when a remote video track is disabled or
371// enabled, so there's nothing to test here, other than what is normally
372// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700373TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
374 CreateVideoRtpReceiver();
375
376 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700377 video_track_->set_enabled(true);
378
379 DestroyVideoRtpReceiver();
380}
381
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700382// Test that the AudioRtpReceiver applies volume changes from the track source
383// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700384TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
385 CreateAudioRtpReceiver();
386
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700387 double volume;
388 audio_track_->GetSource()->SetVolume(0.5);
389 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
390 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700391
392 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700393 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394 audio_track_->GetSource()->SetVolume(0.8);
395 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
396 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700397
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700398 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700399 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700400 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
401 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700402
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403 // Try changing volume one more time.
404 audio_track_->GetSource()->SetVolume(0.9);
405 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
406 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700407
408 DestroyAudioRtpReceiver();
409}
410
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411// Test that the media channel isn't enabled for sending if the audio sender
412// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800413TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700414 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800415 rtc::scoped_refptr<AudioTrackInterface> track =
416 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700417
418 // Track but no SSRC.
419 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
420 VerifyVoiceChannelNoInput();
421
422 // SSRC but no track.
423 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
424 audio_rtp_sender_->SetSsrc(kAudioSsrc);
425 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800426}
427
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700428// Test that the media channel isn't enabled for sending if the video sender
429// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800430TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700431 video_rtp_sender_ = new VideoRtpSender(video_channel_);
432
433 // Track but no SSRC.
434 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
435 VerifyVideoChannelNoInput();
436
437 // SSRC but no track.
438 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
439 video_rtp_sender_->SetSsrc(kVideoSsrc);
440 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800441}
442
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443// Test that the media channel is enabled for sending when the audio sender
444// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800445TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700446 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800447 rtc::scoped_refptr<AudioTrackInterface> track =
448 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700449 audio_rtp_sender_->SetSsrc(kAudioSsrc);
450 audio_rtp_sender_->SetTrack(track);
451 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800452
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700453 DestroyAudioRtpSender();
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 last.
deadbeeffac06552015-11-25 11:26:01 -0800458TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
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_->SetTrack(track);
463 audio_rtp_sender_->SetSsrc(kAudioSsrc);
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 video sender
470// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800471TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700472 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700473 video_rtp_sender_ = new VideoRtpSender(video_channel_);
474 video_rtp_sender_->SetSsrc(kVideoSsrc);
475 video_rtp_sender_->SetTrack(video_track_);
476 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800477
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700478 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800479}
480
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700481// Test that the media channel is enabled for sending when the video sender
482// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800483TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700484 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700485 video_rtp_sender_ = new VideoRtpSender(video_channel_);
486 video_rtp_sender_->SetTrack(video_track_);
487 video_rtp_sender_->SetSsrc(kVideoSsrc);
488 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800489
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700490 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that the media channel stops sending when the audio sender's SSRC is set
494// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700496 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800497
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 audio_rtp_sender_->SetSsrc(0);
499 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800500}
501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502// Test that the media channel stops sending when the video sender's SSRC is set
503// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800504TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800506
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700507 audio_rtp_sender_->SetSsrc(0);
508 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800509}
510
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700511// Test that the media channel stops sending when the audio sender's track is
512// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800513TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800515
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
517 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800518}
519
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700520// Test that the media channel stops sending when the video sender's track is
521// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800522TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525 video_rtp_sender_->SetSsrc(0);
526 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800527}
528
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529// Test that when the audio sender's SSRC is changed, the media channel stops
530// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800531TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800533
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
535 VerifyVoiceChannelNoInput(kAudioSsrc);
536 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538 audio_rtp_sender_ = nullptr;
539 VerifyVoiceChannelNoInput(kAudioSsrc2);
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, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800546
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547 video_rtp_sender_->SetSsrc(kVideoSsrc2);
548 VerifyVideoChannelNoInput(kVideoSsrc);
549 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551 video_rtp_sender_ = nullptr;
552 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800553}
554
skvladdc1c62c2016-03-16 19:07:43 -0700555TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
556 CreateAudioRtpSender();
557
skvladdc1c62c2016-03-16 19:07:43 -0700558 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700560 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
561
562 DestroyAudioRtpSender();
563}
564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
566 CreateAudioRtpSender();
567
568 EXPECT_EQ(-1, voice_media_channel_->max_bps());
569 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
570 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800571 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
572 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
574
575 // Read back the parameters and verify they have been changed.
576 params = audio_rtp_sender_->GetParameters();
577 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800578 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579
580 // Verify that the audio channel received the new parameters.
581 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
582 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800583 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700584
585 // Verify that the global bitrate limit has not been changed.
586 EXPECT_EQ(-1, voice_media_channel_->max_bps());
587
588 DestroyAudioRtpSender();
589}
590
skvladdc1c62c2016-03-16 19:07:43 -0700591TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
592 CreateVideoRtpSender();
593
skvladdc1c62c2016-03-16 19:07:43 -0700594 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700596 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
597
598 DestroyVideoRtpSender();
599}
600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
602 CreateVideoRtpSender();
603
604 EXPECT_EQ(-1, video_media_channel_->max_bps());
605 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
606 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800607 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
608 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
610
611 // Read back the parameters and verify they have been changed.
612 params = video_rtp_sender_->GetParameters();
613 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800614 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700615
616 // Verify that the video channel received the new parameters.
617 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
618 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800619 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700620
621 // Verify that the global bitrate limit has not been changed.
622 EXPECT_EQ(-1, video_media_channel_->max_bps());
623
624 DestroyVideoRtpSender();
625}
626
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700627TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
628 CreateAudioRtpReceiver();
629
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700630 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700631 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700632 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
633
634 DestroyAudioRtpReceiver();
635}
636
637TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
638 CreateVideoRtpReceiver();
639
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700640 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700642 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
643
644 DestroyVideoRtpReceiver();
645}
646
pbos5214a0a2016-12-16 15:39:11 -0800647// Test that makes sure that a video track content hint translates to the proper
648// value for sources that are not screencast.
649TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
650 CreateVideoRtpSender();
651
652 video_track_->set_enabled(true);
653
654 // |video_track_| is not screencast by default.
655 EXPECT_EQ(rtc::Optional<bool>(false),
656 video_media_channel_->options().is_screencast);
657 // No content hint should be set by default.
658 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
659 video_track_->content_hint());
660 // Setting detailed should turn a non-screencast source into screencast mode.
661 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
662 EXPECT_EQ(rtc::Optional<bool>(true),
663 video_media_channel_->options().is_screencast);
664 // Removing the content hint should turn the track back into non-screencast
665 // mode.
666 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
667 EXPECT_EQ(rtc::Optional<bool>(false),
668 video_media_channel_->options().is_screencast);
669 // Setting fluid should remain in non-screencast mode (its default).
670 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
671 EXPECT_EQ(rtc::Optional<bool>(false),
672 video_media_channel_->options().is_screencast);
673
674 DestroyVideoRtpSender();
675}
676
677// Test that makes sure that a video track content hint translates to the proper
678// value for screencast sources.
679TEST_F(RtpSenderReceiverTest,
680 PropagatesVideoTrackContentHintForScreencastSource) {
681 CreateVideoRtpSender(true);
682
683 video_track_->set_enabled(true);
684
685 // |video_track_| with a screencast source should be screencast by default.
686 EXPECT_EQ(rtc::Optional<bool>(true),
687 video_media_channel_->options().is_screencast);
688 // No content hint should be set by default.
689 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
690 video_track_->content_hint());
691 // Setting fluid should turn a screencast source into non-screencast mode.
692 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
693 EXPECT_EQ(rtc::Optional<bool>(false),
694 video_media_channel_->options().is_screencast);
695 // Removing the content hint should turn the track back into screencast mode.
696 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
697 EXPECT_EQ(rtc::Optional<bool>(true),
698 video_media_channel_->options().is_screencast);
699 // Setting detailed should still remain in screencast mode (its default).
700 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
701 EXPECT_EQ(rtc::Optional<bool>(true),
702 video_media_channel_->options().is_screencast);
703
704 DestroyVideoRtpSender();
705}
706
707// Test that makes sure any content hints that are set on a track before
708// VideoRtpSender is ready to send are still applied when it gets ready to send.
709TEST_F(RtpSenderReceiverTest,
710 PropagatesVideoTrackContentHintSetBeforeEnabling) {
711 AddVideoTrack();
712 // Setting detailed overrides the default non-screencast mode. This should be
713 // applied even if the track is set on construction.
714 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
deadbeefe814a0d2017-02-25 18:15:09 -0800715 video_rtp_sender_ =
716 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
717 local_stream_->label(), video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800718 video_track_->set_enabled(true);
719
720 // Sender is not ready to send (no SSRC) so no option should have been set.
721 EXPECT_EQ(rtc::Optional<bool>(),
722 video_media_channel_->options().is_screencast);
723
724 // Verify that the content hint is accounted for when video_rtp_sender_ does
725 // get enabled.
726 video_rtp_sender_->SetSsrc(kVideoSsrc);
727 EXPECT_EQ(rtc::Optional<bool>(true),
728 video_media_channel_->options().is_screencast);
729
730 // And removing the hint should go back to false (to verify that false was
731 // default correctly).
732 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
733 EXPECT_EQ(rtc::Optional<bool>(false),
734 video_media_channel_->options().is_screencast);
735
736 DestroyVideoRtpSender();
737}
738
deadbeef20cb0c12017-02-01 20:27:00 -0800739TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
740 CreateAudioRtpSender();
741 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
742}
743
744TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
745 CreateVideoRtpSender();
746 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
747}
748
749// Test that the DTMF sender is really using |voice_channel_|, and thus returns
750// true/false from CanSendDtmf based on what |voice_channel_| returns.
751TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
752 AddDtmfCodec();
753 CreateAudioRtpSender();
754 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
755 ASSERT_NE(nullptr, dtmf_sender);
756 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
757}
758
759TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
760 CreateAudioRtpSender();
761 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
762 ASSERT_NE(nullptr, dtmf_sender);
763 // DTMF codec has not been added, as it was in the above test.
764 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
765}
766
767TEST_F(RtpSenderReceiverTest, InsertDtmf) {
768 AddDtmfCodec();
769 CreateAudioRtpSender();
770 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
771 ASSERT_NE(nullptr, dtmf_sender);
772
773 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
774
775 // Insert DTMF
776 const int expected_duration = 90;
777 dtmf_sender->InsertDtmf("012", expected_duration, 100);
778
779 // Verify
780 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
781 kDefaultTimeout);
782 const uint32_t send_ssrc =
783 voice_media_channel_->send_streams()[0].first_ssrc();
784 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
785 send_ssrc, 0, expected_duration));
786 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
787 send_ssrc, 1, expected_duration));
788 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
789 send_ssrc, 2, expected_duration));
790}
791
792// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
793// destroyed, which is needed for the DTMF sender.
794TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
795 CreateAudioRtpSender();
796 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
797 audio_rtp_sender_ = nullptr;
798 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
799}
800
deadbeef70ab1a12015-09-28 16:53:55 -0700801} // namespace webrtc