blob: 105d9d31d49b8a936782d73260b778ebe07b621d [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()),
deadbeef112b2e92017-02-10 20:13:37 -080064 channel_manager_(
65 std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
66 rtc::Thread::Current(),
67 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070068 fake_call_(Call::Config(&event_log_)),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070069 fake_media_controller_(&channel_manager_, &fake_call_),
70 stream_(MediaStream::Create(kStreamLabel1)) {
71 // Create channels to be used by the RtpSenders and RtpReceivers.
72 channel_manager_.Init();
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(),
deadbeef1a2183d2017-02-10 23:44:49 -080079 cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070080 video_channel_ = channel_manager_.CreateVideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080081 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080082 cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080083 voice_channel_->Enable(true);
84 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070085 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
86 video_media_channel_ = media_engine_->GetVideoChannel(0);
87 RTC_CHECK(voice_channel_);
88 RTC_CHECK(video_channel_);
89 RTC_CHECK(voice_media_channel_);
90 RTC_CHECK(video_media_channel_);
91
92 // Create streams for predefined SSRCs. Streams need to exist in order
93 // for the senders and receievers to apply parameters to them.
94 // Normally these would be created by SetLocalDescription and
95 // SetRemoteDescription.
96 voice_media_channel_->AddSendStream(
97 cricket::StreamParams::CreateLegacy(kAudioSsrc));
98 voice_media_channel_->AddRecvStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
100 voice_media_channel_->AddSendStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
102 voice_media_channel_->AddRecvStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
104 video_media_channel_->AddSendStream(
105 cricket::StreamParams::CreateLegacy(kVideoSsrc));
106 video_media_channel_->AddRecvStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
108 video_media_channel_->AddSendStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
110 video_media_channel_->AddRecvStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700112 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700113
deadbeef20cb0c12017-02-01 20:27:00 -0800114 // Needed to use DTMF sender.
115 void AddDtmfCodec() {
116 cricket::AudioSendParameters params;
117 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
118 0, 1);
119 params.codecs.push_back(kTelephoneEventCodec);
120 voice_media_channel_->SetSendParameters(params);
121 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700122
pbos5214a0a2016-12-16 15:39:11 -0800123 void AddVideoTrack() { AddVideoTrack(false); }
124
125 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100126 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800127 FakeVideoTrackSource::Create(is_screencast));
deadbeef70ab1a12015-09-28 16:53:55 -0700128 video_track_ = VideoTrack::Create(kVideoTrackId, source);
129 EXPECT_TRUE(stream_->AddTrack(video_track_));
130 }
131
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700132 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
133
134 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
135 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700136 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800137 audio_rtp_sender_ =
138 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700139 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);
deadbeef70ab1a12015-09-28 16:53:55 -0700152 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700153 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() {
tommi6eca7e32015-12-15 04:27:11 -0800169 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100170 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700171 EXPECT_TRUE(stream_->AddTrack(audio_track_));
perkjd61bf802016-03-24 03:16:19 -0700172 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700173 kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700174 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700175 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700176 }
177
178 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100179 video_rtp_receiver_ =
180 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700181 kVideoSsrc, 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_;
257 cricket::FakeMediaController fake_media_controller_;
258 cricket::VoiceChannel* voice_channel_;
259 cricket::VideoChannel* video_channel_;
260 cricket::FakeVoiceMediaChannel* voice_media_channel_;
261 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700262 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
263 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
264 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
265 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
266 rtc::scoped_refptr<MediaStreamInterface> stream_;
267 rtc::scoped_refptr<VideoTrackInterface> video_track_;
268 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800269 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700270};
271
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700272// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700273// and disassociated with an AudioRtpSender.
274TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
275 CreateAudioRtpSender();
276 DestroyAudioRtpSender();
277}
278
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700279// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700280// disassociated with a VideoRtpSender.
281TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
282 CreateVideoRtpSender();
283 DestroyVideoRtpSender();
284}
285
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700287// associated and disassociated with an AudioRtpReceiver.
288TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
289 CreateAudioRtpReceiver();
290 DestroyAudioRtpReceiver();
291}
292
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700293// Test that |video_channel_| is updated when a remote video track is
294// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700295TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
296 CreateVideoRtpReceiver();
297 DestroyVideoRtpReceiver();
298}
299
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700300// Test that the AudioRtpSender applies options from the local audio source.
301TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
302 cricket::AudioOptions options;
303 options.echo_cancellation = rtc::Optional<bool>(true);
deadbeef757146b2017-02-10 21:26:48 -0800304 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700305 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700306
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700307 EXPECT_EQ(rtc::Optional<bool>(true),
308 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700309
310 DestroyAudioRtpSender();
311}
312
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700313// Test that the stream is muted when the track is disabled, and unmuted when
314// the track is enabled.
315TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
316 CreateAudioRtpSender();
317
318 audio_track_->set_enabled(false);
319 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
320
321 audio_track_->set_enabled(true);
322 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
323
324 DestroyAudioRtpSender();
325}
326
327// Test that the volume is set to 0 when the track is disabled, and back to
328// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700329TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
330 CreateAudioRtpReceiver();
331
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700332 double volume;
333 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
334 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700335
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700336 audio_track_->set_enabled(false);
337 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
338 EXPECT_EQ(0, volume);
339
deadbeef70ab1a12015-09-28 16:53:55 -0700340 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700341 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
342 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700343
344 DestroyAudioRtpReceiver();
345}
346
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700347// Currently no action is taken when a remote video track is disabled or
348// enabled, so there's nothing to test here, other than what is normally
349// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700350TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
351 CreateVideoRtpSender();
352
deadbeef70ab1a12015-09-28 16:53:55 -0700353 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700354 video_track_->set_enabled(true);
355
356 DestroyVideoRtpSender();
357}
358
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700359// Test that the state of the video track created by the VideoRtpReceiver is
360// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100361TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
362 CreateVideoRtpReceiver();
363
364 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
365 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
366 video_track_->GetSource()->state());
367
368 DestroyVideoRtpReceiver();
369
370 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
371 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
372 video_track_->GetSource()->state());
373}
374
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700375// Currently no action is taken when a remote video track is disabled or
376// enabled, so there's nothing to test here, other than what is normally
377// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700378TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
379 CreateVideoRtpReceiver();
380
381 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700382 video_track_->set_enabled(true);
383
384 DestroyVideoRtpReceiver();
385}
386
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700387// Test that the AudioRtpReceiver applies volume changes from the track source
388// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700389TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
390 CreateAudioRtpReceiver();
391
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700392 double volume;
393 audio_track_->GetSource()->SetVolume(0.5);
394 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
395 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700396
397 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700398 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700399 audio_track_->GetSource()->SetVolume(0.8);
400 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
401 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700402
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700404 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700405 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
406 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700407
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700408 // Try changing volume one more time.
409 audio_track_->GetSource()->SetVolume(0.9);
410 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
411 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700412
413 DestroyAudioRtpReceiver();
414}
415
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700416// Test that the media channel isn't enabled for sending if the audio sender
417// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800418TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800420 rtc::scoped_refptr<AudioTrackInterface> track =
421 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700422
423 // Track but no SSRC.
424 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
425 VerifyVoiceChannelNoInput();
426
427 // SSRC but no track.
428 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
429 audio_rtp_sender_->SetSsrc(kAudioSsrc);
430 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800431}
432
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700433// Test that the media channel isn't enabled for sending if the video sender
434// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800435TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700436 video_rtp_sender_ = new VideoRtpSender(video_channel_);
437
438 // Track but no SSRC.
439 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
440 VerifyVideoChannelNoInput();
441
442 // SSRC but no track.
443 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
444 video_rtp_sender_->SetSsrc(kVideoSsrc);
445 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800446}
447
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448// Test that the media channel is enabled for sending when the audio sender
449// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800450TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700451 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800452 rtc::scoped_refptr<AudioTrackInterface> track =
453 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454 audio_rtp_sender_->SetSsrc(kAudioSsrc);
455 audio_rtp_sender_->SetTrack(track);
456 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800457
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700458 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800459}
460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461// Test that the media channel is enabled for sending when the audio sender
462// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800463TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800465 rtc::scoped_refptr<AudioTrackInterface> track =
466 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467 audio_rtp_sender_->SetTrack(track);
468 audio_rtp_sender_->SetSsrc(kAudioSsrc);
469 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800470
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800472}
473
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474// Test that the media channel is enabled for sending when the video sender
475// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800476TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700477 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700478 video_rtp_sender_ = new VideoRtpSender(video_channel_);
479 video_rtp_sender_->SetSsrc(kVideoSsrc);
480 video_rtp_sender_->SetTrack(video_track_);
481 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800482
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700483 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800484}
485
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486// Test that the media channel is enabled for sending when the video sender
487// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800488TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700489 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700490 video_rtp_sender_ = new VideoRtpSender(video_channel_);
491 video_rtp_sender_->SetTrack(video_track_);
492 video_rtp_sender_->SetSsrc(kVideoSsrc);
493 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800494
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700495 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800496}
497
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498// Test that the media channel stops sending when the audio sender's SSRC is set
499// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800500TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800502
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 audio_rtp_sender_->SetSsrc(0);
504 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800505}
506
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700507// Test that the media channel stops sending when the video sender's SSRC is set
508// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800509TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800511
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 audio_rtp_sender_->SetSsrc(0);
513 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800514}
515
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516// Test that the media channel stops sending when the audio sender's track is
517// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800518TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800520
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
522 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800523}
524
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525// Test that the media channel stops sending when the video sender's track is
526// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800527TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800529
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530 video_rtp_sender_->SetSsrc(0);
531 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800532}
533
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534// Test that when the audio sender's SSRC is changed, the media channel stops
535// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800536TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
540 VerifyVoiceChannelNoInput(kAudioSsrc);
541 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543 audio_rtp_sender_ = nullptr;
544 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800545}
546
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547// Test that when the audio sender's SSRC is changed, the media channel stops
548// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800549TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552 video_rtp_sender_->SetSsrc(kVideoSsrc2);
553 VerifyVideoChannelNoInput(kVideoSsrc);
554 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800555
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556 video_rtp_sender_ = nullptr;
557 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800558}
559
skvladdc1c62c2016-03-16 19:07:43 -0700560TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
561 CreateAudioRtpSender();
562
skvladdc1c62c2016-03-16 19:07:43 -0700563 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700565 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
566
567 DestroyAudioRtpSender();
568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
571 CreateAudioRtpSender();
572
573 EXPECT_EQ(-1, voice_media_channel_->max_bps());
574 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
575 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800576 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
577 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
579
580 // Read back the parameters and verify they have been changed.
581 params = audio_rtp_sender_->GetParameters();
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 audio channel received the new parameters.
586 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
587 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800588 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700589
590 // Verify that the global bitrate limit has not been changed.
591 EXPECT_EQ(-1, voice_media_channel_->max_bps());
592
593 DestroyAudioRtpSender();
594}
595
skvladdc1c62c2016-03-16 19:07:43 -0700596TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
597 CreateVideoRtpSender();
598
skvladdc1c62c2016-03-16 19:07:43 -0700599 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700601 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
602
603 DestroyVideoRtpSender();
604}
605
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700606TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
607 CreateVideoRtpSender();
608
609 EXPECT_EQ(-1, video_media_channel_->max_bps());
610 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
611 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800612 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
613 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
615
616 // Read back the parameters and verify they have been changed.
617 params = video_rtp_sender_->GetParameters();
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 video channel received the new parameters.
622 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
623 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800624 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700625
626 // Verify that the global bitrate limit has not been changed.
627 EXPECT_EQ(-1, video_media_channel_->max_bps());
628
629 DestroyVideoRtpSender();
630}
631
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700632TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
633 CreateAudioRtpReceiver();
634
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700635 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700636 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700637 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
638
639 DestroyAudioRtpReceiver();
640}
641
642TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
643 CreateVideoRtpReceiver();
644
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700645 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700647 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
648
649 DestroyVideoRtpReceiver();
650}
651
pbos5214a0a2016-12-16 15:39:11 -0800652// Test that makes sure that a video track content hint translates to the proper
653// value for sources that are not screencast.
654TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
655 CreateVideoRtpSender();
656
657 video_track_->set_enabled(true);
658
659 // |video_track_| is not screencast by default.
660 EXPECT_EQ(rtc::Optional<bool>(false),
661 video_media_channel_->options().is_screencast);
662 // No content hint should be set by default.
663 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
664 video_track_->content_hint());
665 // Setting detailed should turn a non-screencast source into screencast mode.
666 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
667 EXPECT_EQ(rtc::Optional<bool>(true),
668 video_media_channel_->options().is_screencast);
669 // Removing the content hint should turn the track back into non-screencast
670 // mode.
671 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
672 EXPECT_EQ(rtc::Optional<bool>(false),
673 video_media_channel_->options().is_screencast);
674 // Setting fluid should remain in non-screencast mode (its default).
675 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
676 EXPECT_EQ(rtc::Optional<bool>(false),
677 video_media_channel_->options().is_screencast);
678
679 DestroyVideoRtpSender();
680}
681
682// Test that makes sure that a video track content hint translates to the proper
683// value for screencast sources.
684TEST_F(RtpSenderReceiverTest,
685 PropagatesVideoTrackContentHintForScreencastSource) {
686 CreateVideoRtpSender(true);
687
688 video_track_->set_enabled(true);
689
690 // |video_track_| with a screencast source should be screencast by default.
691 EXPECT_EQ(rtc::Optional<bool>(true),
692 video_media_channel_->options().is_screencast);
693 // No content hint should be set by default.
694 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
695 video_track_->content_hint());
696 // Setting fluid should turn a screencast source into non-screencast mode.
697 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
698 EXPECT_EQ(rtc::Optional<bool>(false),
699 video_media_channel_->options().is_screencast);
700 // Removing the content hint should turn the track back into screencast mode.
701 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
702 EXPECT_EQ(rtc::Optional<bool>(true),
703 video_media_channel_->options().is_screencast);
704 // Setting detailed should still remain in screencast mode (its default).
705 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
706 EXPECT_EQ(rtc::Optional<bool>(true),
707 video_media_channel_->options().is_screencast);
708
709 DestroyVideoRtpSender();
710}
711
712// Test that makes sure any content hints that are set on a track before
713// VideoRtpSender is ready to send are still applied when it gets ready to send.
714TEST_F(RtpSenderReceiverTest,
715 PropagatesVideoTrackContentHintSetBeforeEnabling) {
716 AddVideoTrack();
717 // Setting detailed overrides the default non-screencast mode. This should be
718 // applied even if the track is set on construction.
719 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
720 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
721 stream_->label(), video_channel_);
722 video_track_->set_enabled(true);
723
724 // Sender is not ready to send (no SSRC) so no option should have been set.
725 EXPECT_EQ(rtc::Optional<bool>(),
726 video_media_channel_->options().is_screencast);
727
728 // Verify that the content hint is accounted for when video_rtp_sender_ does
729 // get enabled.
730 video_rtp_sender_->SetSsrc(kVideoSsrc);
731 EXPECT_EQ(rtc::Optional<bool>(true),
732 video_media_channel_->options().is_screencast);
733
734 // And removing the hint should go back to false (to verify that false was
735 // default correctly).
736 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
737 EXPECT_EQ(rtc::Optional<bool>(false),
738 video_media_channel_->options().is_screencast);
739
740 DestroyVideoRtpSender();
741}
742
deadbeef20cb0c12017-02-01 20:27:00 -0800743TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
744 CreateAudioRtpSender();
745 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
746}
747
748TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
749 CreateVideoRtpSender();
750 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
751}
752
753// Test that the DTMF sender is really using |voice_channel_|, and thus returns
754// true/false from CanSendDtmf based on what |voice_channel_| returns.
755TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
756 AddDtmfCodec();
757 CreateAudioRtpSender();
758 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
759 ASSERT_NE(nullptr, dtmf_sender);
760 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
761}
762
763TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
764 CreateAudioRtpSender();
765 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
766 ASSERT_NE(nullptr, dtmf_sender);
767 // DTMF codec has not been added, as it was in the above test.
768 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
769}
770
771TEST_F(RtpSenderReceiverTest, InsertDtmf) {
772 AddDtmfCodec();
773 CreateAudioRtpSender();
774 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
775 ASSERT_NE(nullptr, dtmf_sender);
776
777 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
778
779 // Insert DTMF
780 const int expected_duration = 90;
781 dtmf_sender->InsertDtmf("012", expected_duration, 100);
782
783 // Verify
784 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
785 kDefaultTimeout);
786 const uint32_t send_ssrc =
787 voice_media_channel_->send_streams()[0].first_ssrc();
788 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
789 send_ssrc, 0, expected_duration));
790 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
791 send_ssrc, 1, expected_duration));
792 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
793 send_ssrc, 2, expected_duration));
794}
795
796// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
797// destroyed, which is needed for the DTMF sender.
798TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
799 CreateAudioRtpSender();
800 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
801 audio_rtp_sender_ = nullptr;
802 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
803}
804
deadbeef70ab1a12015-09-28 16:53:55 -0700805} // namespace webrtc