blob: 9779eb6f5657e6055a4dd432376e3213abef8043 [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));
perkj773be362017-07-31 23:22:01 -0700127 video_track_ =
128 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800129 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700130 }
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);
deadbeefe814a0d2017-02-25 18:15:09 -0800136 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800137 audio_rtp_sender_ =
deadbeefe814a0d2017-02-25 18:15:09 -0800138 new AudioRtpSender(local_stream_->GetAudioTracks()[0],
139 local_stream_->label(), voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800140 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800141 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
142 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700143 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700144 }
145
deadbeef20cb0c12017-02-01 20:27:00 -0800146 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
147
pbos5214a0a2016-12-16 15:39:11 -0800148 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
149
150 void CreateVideoRtpSender(bool is_screencast) {
151 AddVideoTrack(is_screencast);
deadbeefe814a0d2017-02-25 18:15:09 -0800152 video_rtp_sender_ =
153 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
154 local_stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800155 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700156 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700157 }
158
159 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700160 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700161 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
164 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700165 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700166 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700167 }
168
169 void CreateAudioRtpReceiver() {
deadbeefe814a0d2017-02-25 18:15:09 -0800170 audio_rtp_receiver_ =
171 new AudioRtpReceiver(kAudioTrackId, kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700172 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700173 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700174 }
175
176 void CreateVideoRtpReceiver() {
deadbeefe814a0d2017-02-25 18:15:09 -0800177 video_rtp_receiver_ = new VideoRtpReceiver(
178 kVideoTrackId, rtc::Thread::Current(), kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100179 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700181 }
182
183 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700184 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700185 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700186 }
187
188 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700189 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVideoChannelNoOutput();
191 }
192
193 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
194
195 void VerifyVoiceChannelInput(uint32_t ssrc) {
196 // Verify that the media channel has an audio source, and the stream isn't
197 // muted.
198 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
199 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
200 }
201
202 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
203
204 void VerifyVideoChannelInput(uint32_t ssrc) {
205 // Verify that the media channel has a video source,
206 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
207 }
208
209 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
210
211 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
212 // Verify that the media channel's source is reset.
213 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
214 }
215
216 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
217
218 void VerifyVideoChannelNoInput(uint32_t ssrc) {
219 // Verify that the media channel's source is reset.
220 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
221 }
222
223 void VerifyVoiceChannelOutput() {
224 // Verify that the volume is initialized to 1.
225 double volume;
226 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
227 EXPECT_EQ(1, volume);
228 }
229
230 void VerifyVideoChannelOutput() {
231 // Verify that the media channel has a sink.
232 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
233 }
234
235 void VerifyVoiceChannelNoOutput() {
236 // Verify that the volume is reset to 0.
237 double volume;
238 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
239 EXPECT_EQ(0, volume);
240 }
241
242 void VerifyVideoChannelNoOutput() {
243 // Verify that the media channel's sink is reset.
244 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700245 }
246
247 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700248 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800249 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700250 cricket::FakeMediaEngine* media_engine_;
251 cricket::FakeTransportController fake_transport_controller_;
252 cricket::ChannelManager channel_manager_;
253 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700254 cricket::VoiceChannel* voice_channel_;
255 cricket::VideoChannel* video_channel_;
256 cricket::FakeVoiceMediaChannel* voice_media_channel_;
257 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700258 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
259 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
260 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
261 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800262 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700263 rtc::scoped_refptr<VideoTrackInterface> video_track_;
264 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800265 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700266};
267
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700268// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700269// and disassociated with an AudioRtpSender.
270TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
271 CreateAudioRtpSender();
272 DestroyAudioRtpSender();
273}
274
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700275// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700276// disassociated with a VideoRtpSender.
277TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
278 CreateVideoRtpSender();
279 DestroyVideoRtpSender();
280}
281
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700283// associated and disassociated with an AudioRtpReceiver.
284TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
285 CreateAudioRtpReceiver();
286 DestroyAudioRtpReceiver();
287}
288
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289// Test that |video_channel_| is updated when a remote video track is
290// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700291TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
292 CreateVideoRtpReceiver();
293 DestroyVideoRtpReceiver();
294}
295
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700296// Test that the AudioRtpSender applies options from the local audio source.
297TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
298 cricket::AudioOptions options;
299 options.echo_cancellation = rtc::Optional<bool>(true);
deadbeef757146b2017-02-10 21:26:48 -0800300 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700301 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700302
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700303 EXPECT_EQ(rtc::Optional<bool>(true),
304 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700305
306 DestroyAudioRtpSender();
307}
308
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309// Test that the stream is muted when the track is disabled, and unmuted when
310// the track is enabled.
311TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
312 CreateAudioRtpSender();
313
314 audio_track_->set_enabled(false);
315 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
316
317 audio_track_->set_enabled(true);
318 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
319
320 DestroyAudioRtpSender();
321}
322
323// Test that the volume is set to 0 when the track is disabled, and back to
324// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700325TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
326 CreateAudioRtpReceiver();
327
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700328 double volume;
329 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
330 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700331
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700332 audio_track_->set_enabled(false);
333 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
334 EXPECT_EQ(0, volume);
335
deadbeef70ab1a12015-09-28 16:53:55 -0700336 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700337 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
338 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700339
340 DestroyAudioRtpReceiver();
341}
342
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700343// Currently no action is taken when a remote video track is disabled or
344// enabled, so there's nothing to test here, other than what is normally
345// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700346TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
347 CreateVideoRtpSender();
348
deadbeef70ab1a12015-09-28 16:53:55 -0700349 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700350 video_track_->set_enabled(true);
351
352 DestroyVideoRtpSender();
353}
354
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355// Test that the state of the video track created by the VideoRtpReceiver is
356// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100357TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
358 CreateVideoRtpReceiver();
359
360 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
361 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
362 video_track_->GetSource()->state());
363
364 DestroyVideoRtpReceiver();
365
366 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
367 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
368 video_track_->GetSource()->state());
369}
370
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700371// Currently no action is taken when a remote video track is disabled or
372// enabled, so there's nothing to test here, other than what is normally
373// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700374TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
375 CreateVideoRtpReceiver();
376
377 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700378 video_track_->set_enabled(true);
379
380 DestroyVideoRtpReceiver();
381}
382
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700383// Test that the AudioRtpReceiver applies volume changes from the track source
384// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700385TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
386 CreateAudioRtpReceiver();
387
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700388 double volume;
389 audio_track_->GetSource()->SetVolume(0.5);
390 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
391 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700392
393 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700394 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700395 audio_track_->GetSource()->SetVolume(0.8);
396 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
397 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700398
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700399 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700400 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700401 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
402 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700403
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700404 // Try changing volume one more time.
405 audio_track_->GetSource()->SetVolume(0.9);
406 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
407 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700408
409 DestroyAudioRtpReceiver();
410}
411
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700412// Test that the media channel isn't enabled for sending if the audio sender
413// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800414TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700415 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800416 rtc::scoped_refptr<AudioTrackInterface> track =
417 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700418
419 // Track but no SSRC.
420 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
421 VerifyVoiceChannelNoInput();
422
423 // SSRC but no track.
424 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
425 audio_rtp_sender_->SetSsrc(kAudioSsrc);
426 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800427}
428
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700429// Test that the media channel isn't enabled for sending if the video sender
430// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800431TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700432 video_rtp_sender_ = new VideoRtpSender(video_channel_);
433
434 // Track but no SSRC.
435 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
436 VerifyVideoChannelNoInput();
437
438 // SSRC but no track.
439 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
440 video_rtp_sender_->SetSsrc(kVideoSsrc);
441 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800442}
443
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700444// Test that the media channel is enabled for sending when the audio sender
445// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800446TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700447 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800448 rtc::scoped_refptr<AudioTrackInterface> track =
449 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450 audio_rtp_sender_->SetSsrc(kAudioSsrc);
451 audio_rtp_sender_->SetTrack(track);
452 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800453
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800455}
456
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700457// Test that the media channel is enabled for sending when the audio sender
458// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800459TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700460 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800461 rtc::scoped_refptr<AudioTrackInterface> track =
462 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700463 audio_rtp_sender_->SetTrack(track);
464 audio_rtp_sender_->SetSsrc(kAudioSsrc);
465 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800466
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800468}
469
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700470// Test that the media channel is enabled for sending when the video sender
471// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800472TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700473 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474 video_rtp_sender_ = new VideoRtpSender(video_channel_);
475 video_rtp_sender_->SetSsrc(kVideoSsrc);
476 video_rtp_sender_->SetTrack(video_track_);
477 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800478
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700479 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800480}
481
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482// Test that the media channel is enabled for sending when the video sender
483// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800484TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700485 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486 video_rtp_sender_ = new VideoRtpSender(video_channel_);
487 video_rtp_sender_->SetTrack(video_track_);
488 video_rtp_sender_->SetSsrc(kVideoSsrc);
489 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800490
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700491 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800492}
493
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494// Test that the media channel stops sending when the audio sender's SSRC is set
495// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800496TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800498
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 audio_rtp_sender_->SetSsrc(0);
500 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800501}
502
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503// Test that the media channel stops sending when the video sender's SSRC is set
504// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800505TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800507
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700508 audio_rtp_sender_->SetSsrc(0);
509 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800510}
511
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512// Test that the media channel stops sending when the audio sender's track is
513// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800514TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
518 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800519}
520
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521// Test that the media channel stops sending when the video sender's track is
522// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800523TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800525
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 video_rtp_sender_->SetSsrc(0);
527 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800528}
529
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530// Test that when the audio sender's SSRC is changed, the media channel stops
531// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800532TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700533 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800534
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
536 VerifyVoiceChannelNoInput(kAudioSsrc);
537 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 audio_rtp_sender_ = nullptr;
540 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800541}
542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543// Test that when the audio sender's SSRC is changed, the media channel stops
544// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800545TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800547
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700548 video_rtp_sender_->SetSsrc(kVideoSsrc2);
549 VerifyVideoChannelNoInput(kVideoSsrc);
550 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552 video_rtp_sender_ = nullptr;
553 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800554}
555
skvladdc1c62c2016-03-16 19:07:43 -0700556TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
557 CreateAudioRtpSender();
558
skvladdc1c62c2016-03-16 19:07:43 -0700559 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700561 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
562
563 DestroyAudioRtpSender();
564}
565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
567 CreateAudioRtpSender();
568
569 EXPECT_EQ(-1, voice_media_channel_->max_bps());
570 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
571 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800572 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
573 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
575
576 // Read back the parameters and verify they have been changed.
577 params = audio_rtp_sender_->GetParameters();
578 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800579 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580
581 // Verify that the audio channel received the new parameters.
582 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
583 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800584 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700585
586 // Verify that the global bitrate limit has not been changed.
587 EXPECT_EQ(-1, voice_media_channel_->max_bps());
588
589 DestroyAudioRtpSender();
590}
591
skvladdc1c62c2016-03-16 19:07:43 -0700592TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
593 CreateVideoRtpSender();
594
skvladdc1c62c2016-03-16 19:07:43 -0700595 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700597 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
598
599 DestroyVideoRtpSender();
600}
601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
603 CreateVideoRtpSender();
604
605 EXPECT_EQ(-1, video_media_channel_->max_bps());
606 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
607 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800608 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
609 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
611
612 // Read back the parameters and verify they have been changed.
613 params = video_rtp_sender_->GetParameters();
614 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800615 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616
617 // Verify that the video channel received the new parameters.
618 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
619 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800620 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621
622 // Verify that the global bitrate limit has not been changed.
623 EXPECT_EQ(-1, video_media_channel_->max_bps());
624
625 DestroyVideoRtpSender();
626}
627
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700628TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
629 CreateAudioRtpReceiver();
630
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700631 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700632 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700633 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
634
635 DestroyAudioRtpReceiver();
636}
637
638TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
639 CreateVideoRtpReceiver();
640
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700641 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700642 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700643 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
644
645 DestroyVideoRtpReceiver();
646}
647
pbos5214a0a2016-12-16 15:39:11 -0800648// Test that makes sure that a video track content hint translates to the proper
649// value for sources that are not screencast.
650TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
651 CreateVideoRtpSender();
652
653 video_track_->set_enabled(true);
654
655 // |video_track_| is not screencast by default.
656 EXPECT_EQ(rtc::Optional<bool>(false),
657 video_media_channel_->options().is_screencast);
658 // No content hint should be set by default.
659 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
660 video_track_->content_hint());
661 // Setting detailed should turn a non-screencast source into screencast mode.
662 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
663 EXPECT_EQ(rtc::Optional<bool>(true),
664 video_media_channel_->options().is_screencast);
665 // Removing the content hint should turn the track back into non-screencast
666 // mode.
667 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
668 EXPECT_EQ(rtc::Optional<bool>(false),
669 video_media_channel_->options().is_screencast);
670 // Setting fluid should remain in non-screencast mode (its default).
671 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
672 EXPECT_EQ(rtc::Optional<bool>(false),
673 video_media_channel_->options().is_screencast);
674
675 DestroyVideoRtpSender();
676}
677
678// Test that makes sure that a video track content hint translates to the proper
679// value for screencast sources.
680TEST_F(RtpSenderReceiverTest,
681 PropagatesVideoTrackContentHintForScreencastSource) {
682 CreateVideoRtpSender(true);
683
684 video_track_->set_enabled(true);
685
686 // |video_track_| with a screencast source should be screencast by default.
687 EXPECT_EQ(rtc::Optional<bool>(true),
688 video_media_channel_->options().is_screencast);
689 // No content hint should be set by default.
690 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
691 video_track_->content_hint());
692 // Setting fluid should turn a screencast source into non-screencast mode.
693 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
694 EXPECT_EQ(rtc::Optional<bool>(false),
695 video_media_channel_->options().is_screencast);
696 // Removing the content hint should turn the track back into screencast mode.
697 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
698 EXPECT_EQ(rtc::Optional<bool>(true),
699 video_media_channel_->options().is_screencast);
700 // Setting detailed should still remain in screencast mode (its default).
701 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
702 EXPECT_EQ(rtc::Optional<bool>(true),
703 video_media_channel_->options().is_screencast);
704
705 DestroyVideoRtpSender();
706}
707
708// Test that makes sure any content hints that are set on a track before
709// VideoRtpSender is ready to send are still applied when it gets ready to send.
710TEST_F(RtpSenderReceiverTest,
711 PropagatesVideoTrackContentHintSetBeforeEnabling) {
712 AddVideoTrack();
713 // Setting detailed overrides the default non-screencast mode. This should be
714 // applied even if the track is set on construction.
715 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
deadbeefe814a0d2017-02-25 18:15:09 -0800716 video_rtp_sender_ =
717 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
718 local_stream_->label(), video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800719 video_track_->set_enabled(true);
720
721 // Sender is not ready to send (no SSRC) so no option should have been set.
722 EXPECT_EQ(rtc::Optional<bool>(),
723 video_media_channel_->options().is_screencast);
724
725 // Verify that the content hint is accounted for when video_rtp_sender_ does
726 // get enabled.
727 video_rtp_sender_->SetSsrc(kVideoSsrc);
728 EXPECT_EQ(rtc::Optional<bool>(true),
729 video_media_channel_->options().is_screencast);
730
731 // And removing the hint should go back to false (to verify that false was
732 // default correctly).
733 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
734 EXPECT_EQ(rtc::Optional<bool>(false),
735 video_media_channel_->options().is_screencast);
736
737 DestroyVideoRtpSender();
738}
739
deadbeef20cb0c12017-02-01 20:27:00 -0800740TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
741 CreateAudioRtpSender();
742 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
743}
744
745TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
746 CreateVideoRtpSender();
747 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
748}
749
750// Test that the DTMF sender is really using |voice_channel_|, and thus returns
751// true/false from CanSendDtmf based on what |voice_channel_| returns.
752TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
753 AddDtmfCodec();
754 CreateAudioRtpSender();
755 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
756 ASSERT_NE(nullptr, dtmf_sender);
757 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
758}
759
760TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
761 CreateAudioRtpSender();
762 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
763 ASSERT_NE(nullptr, dtmf_sender);
764 // DTMF codec has not been added, as it was in the above test.
765 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
766}
767
768TEST_F(RtpSenderReceiverTest, InsertDtmf) {
769 AddDtmfCodec();
770 CreateAudioRtpSender();
771 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
772 ASSERT_NE(nullptr, dtmf_sender);
773
774 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
775
776 // Insert DTMF
777 const int expected_duration = 90;
778 dtmf_sender->InsertDtmf("012", expected_duration, 100);
779
780 // Verify
781 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
782 kDefaultTimeout);
783 const uint32_t send_ssrc =
784 voice_media_channel_->send_streams()[0].first_ssrc();
785 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
786 send_ssrc, 0, expected_duration));
787 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
788 send_ssrc, 1, expected_duration));
789 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
790 send_ssrc, 2, expected_duration));
791}
792
793// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
794// destroyed, which is needed for the DTMF sender.
795TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
796 CreateAudioRtpSender();
797 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
798 audio_rtp_sender_ = nullptr;
799 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
800}
801
deadbeef70ab1a12015-09-28 16:53:55 -0700802} // namespace webrtc