blob: 5ddf6c4c81bc4ce5e0ae38026ab0c676c93b1511 [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
deadbeefe814a0d2017-02-25 18:15:09 -080062 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070063 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_),
deadbeefe814a0d2017-02-25 18:15:09 -080070 local_stream_(MediaStream::Create(kStreamLabel1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070071 // 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);
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_;
254 cricket::FakeMediaController fake_media_controller_;
255 cricket::VoiceChannel* voice_channel_;
256 cricket::VideoChannel* video_channel_;
257 cricket::FakeVoiceMediaChannel* voice_media_channel_;
258 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700259 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
260 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
261 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
262 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800263 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700264 rtc::scoped_refptr<VideoTrackInterface> video_track_;
265 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800266 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700267};
268
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700269// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700270// and disassociated with an AudioRtpSender.
271TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
272 CreateAudioRtpSender();
273 DestroyAudioRtpSender();
274}
275
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700276// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700277// disassociated with a VideoRtpSender.
278TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
279 CreateVideoRtpSender();
280 DestroyVideoRtpSender();
281}
282
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700283// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700284// associated and disassociated with an AudioRtpReceiver.
285TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
286 CreateAudioRtpReceiver();
287 DestroyAudioRtpReceiver();
288}
289
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700290// Test that |video_channel_| is updated when a remote video track is
291// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700292TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
293 CreateVideoRtpReceiver();
294 DestroyVideoRtpReceiver();
295}
296
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700297// Test that the AudioRtpSender applies options from the local audio source.
298TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
299 cricket::AudioOptions options;
300 options.echo_cancellation = rtc::Optional<bool>(true);
deadbeef757146b2017-02-10 21:26:48 -0800301 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700302 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700303
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700304 EXPECT_EQ(rtc::Optional<bool>(true),
305 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700306
307 DestroyAudioRtpSender();
308}
309
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700310// Test that the stream is muted when the track is disabled, and unmuted when
311// the track is enabled.
312TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
313 CreateAudioRtpSender();
314
315 audio_track_->set_enabled(false);
316 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
317
318 audio_track_->set_enabled(true);
319 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
320
321 DestroyAudioRtpSender();
322}
323
324// Test that the volume is set to 0 when the track is disabled, and back to
325// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700326TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
327 CreateAudioRtpReceiver();
328
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700329 double volume;
330 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
331 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700332
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700333 audio_track_->set_enabled(false);
334 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
335 EXPECT_EQ(0, volume);
336
deadbeef70ab1a12015-09-28 16:53:55 -0700337 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700338 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
339 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700340
341 DestroyAudioRtpReceiver();
342}
343
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344// Currently no action is taken when a remote video track is disabled or
345// enabled, so there's nothing to test here, other than what is normally
346// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700347TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
348 CreateVideoRtpSender();
349
deadbeef70ab1a12015-09-28 16:53:55 -0700350 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700351 video_track_->set_enabled(true);
352
353 DestroyVideoRtpSender();
354}
355
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700356// Test that the state of the video track created by the VideoRtpReceiver is
357// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100358TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
359 CreateVideoRtpReceiver();
360
361 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
362 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
363 video_track_->GetSource()->state());
364
365 DestroyVideoRtpReceiver();
366
367 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
368 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
369 video_track_->GetSource()->state());
370}
371
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700372// Currently no action is taken when a remote video track is disabled or
373// enabled, so there's nothing to test here, other than what is normally
374// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700375TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
376 CreateVideoRtpReceiver();
377
378 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700379 video_track_->set_enabled(true);
380
381 DestroyVideoRtpReceiver();
382}
383
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384// Test that the AudioRtpReceiver applies volume changes from the track source
385// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700386TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
387 CreateAudioRtpReceiver();
388
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700389 double volume;
390 audio_track_->GetSource()->SetVolume(0.5);
391 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
392 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700393
394 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700395 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700396 audio_track_->GetSource()->SetVolume(0.8);
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700399
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700400 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700401 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700402 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
403 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700404
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700405 // Try changing volume one more time.
406 audio_track_->GetSource()->SetVolume(0.9);
407 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
408 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700409
410 DestroyAudioRtpReceiver();
411}
412
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700413// Test that the media channel isn't enabled for sending if the audio sender
414// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800415TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700416 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800417 rtc::scoped_refptr<AudioTrackInterface> track =
418 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419
420 // Track but no SSRC.
421 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
422 VerifyVoiceChannelNoInput();
423
424 // SSRC but no track.
425 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
426 audio_rtp_sender_->SetSsrc(kAudioSsrc);
427 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800428}
429
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700430// Test that the media channel isn't enabled for sending if the video sender
431// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800432TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700433 video_rtp_sender_ = new VideoRtpSender(video_channel_);
434
435 // Track but no SSRC.
436 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
437 VerifyVideoChannelNoInput();
438
439 // SSRC but no track.
440 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
441 video_rtp_sender_->SetSsrc(kVideoSsrc);
442 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800443}
444
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700445// Test that the media channel is enabled for sending when the audio sender
446// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800447TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800449 rtc::scoped_refptr<AudioTrackInterface> track =
450 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700451 audio_rtp_sender_->SetSsrc(kAudioSsrc);
452 audio_rtp_sender_->SetTrack(track);
453 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800454
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700455 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800456}
457
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700458// Test that the media channel is enabled for sending when the audio sender
459// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800460TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800462 rtc::scoped_refptr<AudioTrackInterface> track =
463 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464 audio_rtp_sender_->SetTrack(track);
465 audio_rtp_sender_->SetSsrc(kAudioSsrc);
466 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800467
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700468 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800469}
470
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471// Test that the media channel is enabled for sending when the video sender
472// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800473TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700474 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700475 video_rtp_sender_ = new VideoRtpSender(video_channel_);
476 video_rtp_sender_->SetSsrc(kVideoSsrc);
477 video_rtp_sender_->SetTrack(video_track_);
478 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800479
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800481}
482
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700483// Test that the media channel is enabled for sending when the video sender
484// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800485TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700486 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700487 video_rtp_sender_ = new VideoRtpSender(video_channel_);
488 video_rtp_sender_->SetTrack(video_track_);
489 video_rtp_sender_->SetSsrc(kVideoSsrc);
490 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800491
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700492 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800493}
494
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700495// Test that the media channel stops sending when the audio sender's SSRC is set
496// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800497TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800499
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700500 audio_rtp_sender_->SetSsrc(0);
501 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800502}
503
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504// Test that the media channel stops sending when the video sender's SSRC is set
505// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800506TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700507 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800508
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700509 audio_rtp_sender_->SetSsrc(0);
510 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800511}
512
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513// Test that the media channel stops sending when the audio sender's track is
514// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800515TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
519 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800520}
521
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522// Test that the media channel stops sending when the video sender's track is
523// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800524TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800526
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527 video_rtp_sender_->SetSsrc(0);
528 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800529}
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that when the audio sender's SSRC is changed, the media channel stops
532// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800533TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800535
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
537 VerifyVoiceChannelNoInput(kAudioSsrc);
538 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 audio_rtp_sender_ = nullptr;
541 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800542}
543
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544// Test that when the audio sender's SSRC is changed, the media channel stops
545// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800546TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800548
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549 video_rtp_sender_->SetSsrc(kVideoSsrc2);
550 VerifyVideoChannelNoInput(kVideoSsrc);
551 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800552
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553 video_rtp_sender_ = nullptr;
554 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800555}
556
skvladdc1c62c2016-03-16 19:07:43 -0700557TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
558 CreateAudioRtpSender();
559
skvladdc1c62c2016-03-16 19:07:43 -0700560 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700562 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
563
564 DestroyAudioRtpSender();
565}
566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
568 CreateAudioRtpSender();
569
570 EXPECT_EQ(-1, voice_media_channel_->max_bps());
571 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
572 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800573 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
574 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
576
577 // Read back the parameters and verify they have been changed.
578 params = audio_rtp_sender_->GetParameters();
579 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800580 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581
582 // Verify that the audio channel received the new parameters.
583 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
584 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800585 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586
587 // Verify that the global bitrate limit has not been changed.
588 EXPECT_EQ(-1, voice_media_channel_->max_bps());
589
590 DestroyAudioRtpSender();
591}
592
skvladdc1c62c2016-03-16 19:07:43 -0700593TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
594 CreateVideoRtpSender();
595
skvladdc1c62c2016-03-16 19:07:43 -0700596 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700598 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
599
600 DestroyVideoRtpSender();
601}
602
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
604 CreateVideoRtpSender();
605
606 EXPECT_EQ(-1, video_media_channel_->max_bps());
607 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
608 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800609 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
610 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700611 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
612
613 // Read back the parameters and verify they have been changed.
614 params = video_rtp_sender_->GetParameters();
615 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800616 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617
618 // Verify that the video channel received the new parameters.
619 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
620 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800621 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622
623 // Verify that the global bitrate limit has not been changed.
624 EXPECT_EQ(-1, video_media_channel_->max_bps());
625
626 DestroyVideoRtpSender();
627}
628
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700629TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
630 CreateAudioRtpReceiver();
631
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700632 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700633 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700634 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
635
636 DestroyAudioRtpReceiver();
637}
638
639TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
640 CreateVideoRtpReceiver();
641
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700642 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700643 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700644 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
645
646 DestroyVideoRtpReceiver();
647}
648
pbos5214a0a2016-12-16 15:39:11 -0800649// Test that makes sure that a video track content hint translates to the proper
650// value for sources that are not screencast.
651TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
652 CreateVideoRtpSender();
653
654 video_track_->set_enabled(true);
655
656 // |video_track_| is not screencast by default.
657 EXPECT_EQ(rtc::Optional<bool>(false),
658 video_media_channel_->options().is_screencast);
659 // No content hint should be set by default.
660 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
661 video_track_->content_hint());
662 // Setting detailed should turn a non-screencast source into screencast mode.
663 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
664 EXPECT_EQ(rtc::Optional<bool>(true),
665 video_media_channel_->options().is_screencast);
666 // Removing the content hint should turn the track back into non-screencast
667 // mode.
668 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
669 EXPECT_EQ(rtc::Optional<bool>(false),
670 video_media_channel_->options().is_screencast);
671 // Setting fluid should remain in non-screencast mode (its default).
672 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
673 EXPECT_EQ(rtc::Optional<bool>(false),
674 video_media_channel_->options().is_screencast);
675
676 DestroyVideoRtpSender();
677}
678
679// Test that makes sure that a video track content hint translates to the proper
680// value for screencast sources.
681TEST_F(RtpSenderReceiverTest,
682 PropagatesVideoTrackContentHintForScreencastSource) {
683 CreateVideoRtpSender(true);
684
685 video_track_->set_enabled(true);
686
687 // |video_track_| with a screencast source should be screencast by default.
688 EXPECT_EQ(rtc::Optional<bool>(true),
689 video_media_channel_->options().is_screencast);
690 // No content hint should be set by default.
691 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
692 video_track_->content_hint());
693 // Setting fluid should turn a screencast source into non-screencast mode.
694 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
695 EXPECT_EQ(rtc::Optional<bool>(false),
696 video_media_channel_->options().is_screencast);
697 // Removing the content hint should turn the track back into screencast mode.
698 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
699 EXPECT_EQ(rtc::Optional<bool>(true),
700 video_media_channel_->options().is_screencast);
701 // Setting detailed should still remain in screencast mode (its default).
702 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
703 EXPECT_EQ(rtc::Optional<bool>(true),
704 video_media_channel_->options().is_screencast);
705
706 DestroyVideoRtpSender();
707}
708
709// Test that makes sure any content hints that are set on a track before
710// VideoRtpSender is ready to send are still applied when it gets ready to send.
711TEST_F(RtpSenderReceiverTest,
712 PropagatesVideoTrackContentHintSetBeforeEnabling) {
713 AddVideoTrack();
714 // Setting detailed overrides the default non-screencast mode. This should be
715 // applied even if the track is set on construction.
716 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
deadbeefe814a0d2017-02-25 18:15:09 -0800717 video_rtp_sender_ =
718 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
719 local_stream_->label(), video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800720 video_track_->set_enabled(true);
721
722 // Sender is not ready to send (no SSRC) so no option should have been set.
723 EXPECT_EQ(rtc::Optional<bool>(),
724 video_media_channel_->options().is_screencast);
725
726 // Verify that the content hint is accounted for when video_rtp_sender_ does
727 // get enabled.
728 video_rtp_sender_->SetSsrc(kVideoSsrc);
729 EXPECT_EQ(rtc::Optional<bool>(true),
730 video_media_channel_->options().is_screencast);
731
732 // And removing the hint should go back to false (to verify that false was
733 // default correctly).
734 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
735 EXPECT_EQ(rtc::Optional<bool>(false),
736 video_media_channel_->options().is_screencast);
737
738 DestroyVideoRtpSender();
739}
740
deadbeef20cb0c12017-02-01 20:27:00 -0800741TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
742 CreateAudioRtpSender();
743 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
744}
745
746TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
747 CreateVideoRtpSender();
748 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
749}
750
751// Test that the DTMF sender is really using |voice_channel_|, and thus returns
752// true/false from CanSendDtmf based on what |voice_channel_| returns.
753TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
754 AddDtmfCodec();
755 CreateAudioRtpSender();
756 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
757 ASSERT_NE(nullptr, dtmf_sender);
758 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
759}
760
761TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
762 CreateAudioRtpSender();
763 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
764 ASSERT_NE(nullptr, dtmf_sender);
765 // DTMF codec has not been added, as it was in the above test.
766 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
767}
768
769TEST_F(RtpSenderReceiverTest, InsertDtmf) {
770 AddDtmfCodec();
771 CreateAudioRtpSender();
772 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
773 ASSERT_NE(nullptr, dtmf_sender);
774
775 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
776
777 // Insert DTMF
778 const int expected_duration = 90;
779 dtmf_sender->InsertDtmf("012", expected_duration, 100);
780
781 // Verify
782 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
783 kDefaultTimeout);
784 const uint32_t send_ssrc =
785 voice_media_channel_->send_streams()[0].first_ssrc();
786 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
787 send_ssrc, 0, expected_duration));
788 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
789 send_ssrc, 1, expected_duration));
790 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
791 send_ssrc, 2, expected_duration));
792}
793
794// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
795// destroyed, which is needed for the DTMF sender.
796TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
797 CreateAudioRtpSender();
798 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
799 audio_rtp_sender_ = nullptr;
800 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
801}
802
deadbeef70ab1a12015-09-28 16:53:55 -0700803} // namespace webrtc