blob: 4bcbb51884e1889ed3713c651a165eee2cc6c6c6 [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();
deadbeefac22f702017-01-12 21:59:29 -080073 bool rtcp_mux_required = true;
deadbeef7af91dd2016-12-13 11:29:11 -080074 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080075 cricket::DtlsTransportInternal* rtp_transport =
76 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080077 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070078 voice_channel_ = channel_manager_.CreateVoiceChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080079 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
deadbeefac22f702017-01-12 21:59:29 -080080 cricket::CN_AUDIO, nullptr, rtcp_mux_required, srtp_required,
zhihuangf5b251b2017-01-12 19:37:48 -080081 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070082 video_channel_ = channel_manager_.CreateVideoChannel(
zhihuangf5b251b2017-01-12 19:37:48 -080083 &fake_media_controller_, rtp_transport, nullptr, rtc::Thread::Current(),
deadbeefac22f702017-01-12 21:59:29 -080084 cricket::CN_VIDEO, nullptr, rtcp_mux_required, srtp_required,
zhihuangf5b251b2017-01-12 19:37:48 -080085 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080086 voice_channel_->Enable(true);
87 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070088 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
89 video_media_channel_ = media_engine_->GetVideoChannel(0);
90 RTC_CHECK(voice_channel_);
91 RTC_CHECK(video_channel_);
92 RTC_CHECK(voice_media_channel_);
93 RTC_CHECK(video_media_channel_);
94
95 // Create streams for predefined SSRCs. Streams need to exist in order
96 // for the senders and receievers to apply parameters to them.
97 // Normally these would be created by SetLocalDescription and
98 // SetRemoteDescription.
99 voice_media_channel_->AddSendStream(
100 cricket::StreamParams::CreateLegacy(kAudioSsrc));
101 voice_media_channel_->AddRecvStream(
102 cricket::StreamParams::CreateLegacy(kAudioSsrc));
103 voice_media_channel_->AddSendStream(
104 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
105 voice_media_channel_->AddRecvStream(
106 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
107 video_media_channel_->AddSendStream(
108 cricket::StreamParams::CreateLegacy(kVideoSsrc));
109 video_media_channel_->AddRecvStream(
110 cricket::StreamParams::CreateLegacy(kVideoSsrc));
111 video_media_channel_->AddSendStream(
112 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
113 video_media_channel_->AddRecvStream(
114 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700115 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700116
deadbeef20cb0c12017-02-01 20:27:00 -0800117 // Needed to use DTMF sender.
118 void AddDtmfCodec() {
119 cricket::AudioSendParameters params;
120 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
121 0, 1);
122 params.codecs.push_back(kTelephoneEventCodec);
123 voice_media_channel_->SetSendParameters(params);
124 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700125
pbos5214a0a2016-12-16 15:39:11 -0800126 void AddVideoTrack() { AddVideoTrack(false); }
127
128 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100129 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800130 FakeVideoTrackSource::Create(is_screencast));
deadbeef70ab1a12015-09-28 16:53:55 -0700131 video_track_ = VideoTrack::Create(kVideoTrackId, source);
132 EXPECT_TRUE(stream_->AddTrack(video_track_));
133 }
134
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
136
137 void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
138 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeef70ab1a12015-09-28 16:53:55 -0700139 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800140 audio_rtp_sender_ =
141 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800143 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800144 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
145 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700146 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700147 }
148
deadbeef20cb0c12017-02-01 20:27:00 -0800149 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
150
pbos5214a0a2016-12-16 15:39:11 -0800151 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
152
153 void CreateVideoRtpSender(bool is_screencast) {
154 AddVideoTrack(is_screencast);
deadbeef70ab1a12015-09-28 16:53:55 -0700155 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700156 stream_->label(), video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800157 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700158 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700159 }
160
161 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700162 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700163 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700164 }
165
166 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700167 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700168 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700169 }
170
171 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800172 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100173 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700174 EXPECT_TRUE(stream_->AddTrack(audio_track_));
perkjd61bf802016-03-24 03:16:19 -0700175 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700176 kAudioSsrc, voice_channel_);
perkjd61bf802016-03-24 03:16:19 -0700177 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700178 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700179 }
180
181 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100182 video_rtp_receiver_ =
183 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700184 kVideoSsrc, video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100185 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700186 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700187 }
188
189 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700190 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700191 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700192 }
193
194 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700195 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700196 VerifyVideoChannelNoOutput();
197 }
198
199 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
200
201 void VerifyVoiceChannelInput(uint32_t ssrc) {
202 // Verify that the media channel has an audio source, and the stream isn't
203 // muted.
204 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
205 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
206 }
207
208 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
209
210 void VerifyVideoChannelInput(uint32_t ssrc) {
211 // Verify that the media channel has a video source,
212 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
213 }
214
215 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
216
217 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
218 // Verify that the media channel's source is reset.
219 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
220 }
221
222 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
223
224 void VerifyVideoChannelNoInput(uint32_t ssrc) {
225 // Verify that the media channel's source is reset.
226 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
227 }
228
229 void VerifyVoiceChannelOutput() {
230 // Verify that the volume is initialized to 1.
231 double volume;
232 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
233 EXPECT_EQ(1, volume);
234 }
235
236 void VerifyVideoChannelOutput() {
237 // Verify that the media channel has a sink.
238 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
239 }
240
241 void VerifyVoiceChannelNoOutput() {
242 // Verify that the volume is reset to 0.
243 double volume;
244 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
245 EXPECT_EQ(0, volume);
246 }
247
248 void VerifyVideoChannelNoOutput() {
249 // Verify that the media channel's sink is reset.
250 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700251 }
252
253 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700254 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800255 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700256 cricket::FakeMediaEngine* media_engine_;
257 cricket::FakeTransportController fake_transport_controller_;
258 cricket::ChannelManager channel_manager_;
259 cricket::FakeCall fake_call_;
260 cricket::FakeMediaController fake_media_controller_;
261 cricket::VoiceChannel* voice_channel_;
262 cricket::VideoChannel* video_channel_;
263 cricket::FakeVoiceMediaChannel* voice_media_channel_;
264 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700265 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
266 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
267 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
268 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
269 rtc::scoped_refptr<MediaStreamInterface> stream_;
270 rtc::scoped_refptr<VideoTrackInterface> video_track_;
271 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800272 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700273};
274
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700275// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700276// and disassociated with an AudioRtpSender.
277TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
278 CreateAudioRtpSender();
279 DestroyAudioRtpSender();
280}
281
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700282// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700283// disassociated with a VideoRtpSender.
284TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
285 CreateVideoRtpSender();
286 DestroyVideoRtpSender();
287}
288
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700290// associated and disassociated with an AudioRtpReceiver.
291TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
292 CreateAudioRtpReceiver();
293 DestroyAudioRtpReceiver();
294}
295
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700296// Test that |video_channel_| is updated when a remote video track is
297// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700298TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
299 CreateVideoRtpReceiver();
300 DestroyVideoRtpReceiver();
301}
302
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700303// Test that the AudioRtpSender applies options from the local audio source.
304TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
305 cricket::AudioOptions options;
306 options.echo_cancellation = rtc::Optional<bool>(true);
deadbeef757146b2017-02-10 21:26:48 -0800307 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700309
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700310 EXPECT_EQ(rtc::Optional<bool>(true),
311 voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700312
313 DestroyAudioRtpSender();
314}
315
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700316// Test that the stream is muted when the track is disabled, and unmuted when
317// the track is enabled.
318TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
319 CreateAudioRtpSender();
320
321 audio_track_->set_enabled(false);
322 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
323
324 audio_track_->set_enabled(true);
325 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
326
327 DestroyAudioRtpSender();
328}
329
330// Test that the volume is set to 0 when the track is disabled, and back to
331// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700332TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
333 CreateAudioRtpReceiver();
334
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700335 double volume;
336 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
337 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700338
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700339 audio_track_->set_enabled(false);
340 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
341 EXPECT_EQ(0, volume);
342
deadbeef70ab1a12015-09-28 16:53:55 -0700343 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
345 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700346
347 DestroyAudioRtpReceiver();
348}
349
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700350// Currently no action is taken when a remote video track is disabled or
351// enabled, so there's nothing to test here, other than what is normally
352// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700353TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
354 CreateVideoRtpSender();
355
deadbeef70ab1a12015-09-28 16:53:55 -0700356 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700357 video_track_->set_enabled(true);
358
359 DestroyVideoRtpSender();
360}
361
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700362// Test that the state of the video track created by the VideoRtpReceiver is
363// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100364TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
365 CreateVideoRtpReceiver();
366
367 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
368 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
369 video_track_->GetSource()->state());
370
371 DestroyVideoRtpReceiver();
372
373 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
374 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
375 video_track_->GetSource()->state());
376}
377
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700378// Currently no action is taken when a remote video track is disabled or
379// enabled, so there's nothing to test here, other than what is normally
380// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700381TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
382 CreateVideoRtpReceiver();
383
384 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700385 video_track_->set_enabled(true);
386
387 DestroyVideoRtpReceiver();
388}
389
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700390// Test that the AudioRtpReceiver applies volume changes from the track source
391// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700392TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
393 CreateAudioRtpReceiver();
394
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700395 double volume;
396 audio_track_->GetSource()->SetVolume(0.5);
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700399
400 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700401 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700402 audio_track_->GetSource()->SetVolume(0.8);
403 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
404 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700405
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700406 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700407 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700408 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
409 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700410
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411 // Try changing volume one more time.
412 audio_track_->GetSource()->SetVolume(0.9);
413 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
414 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700415
416 DestroyAudioRtpReceiver();
417}
418
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419// Test that the media channel isn't enabled for sending if the audio sender
420// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800421TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700422 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800423 rtc::scoped_refptr<AudioTrackInterface> track =
424 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700425
426 // Track but no SSRC.
427 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
428 VerifyVoiceChannelNoInput();
429
430 // SSRC but no track.
431 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
432 audio_rtp_sender_->SetSsrc(kAudioSsrc);
433 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800434}
435
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700436// Test that the media channel isn't enabled for sending if the video sender
437// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800438TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700439 video_rtp_sender_ = new VideoRtpSender(video_channel_);
440
441 // Track but no SSRC.
442 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
443 VerifyVideoChannelNoInput();
444
445 // SSRC but no track.
446 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
447 video_rtp_sender_->SetSsrc(kVideoSsrc);
448 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800449}
450
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700451// Test that the media channel is enabled for sending when the audio sender
452// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800453TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800455 rtc::scoped_refptr<AudioTrackInterface> track =
456 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700457 audio_rtp_sender_->SetSsrc(kAudioSsrc);
458 audio_rtp_sender_->SetTrack(track);
459 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800462}
463
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700464// Test that the media channel is enabled for sending when the audio sender
465// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800466TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800468 rtc::scoped_refptr<AudioTrackInterface> track =
469 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700470 audio_rtp_sender_->SetTrack(track);
471 audio_rtp_sender_->SetSsrc(kAudioSsrc);
472 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800473
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800475}
476
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700477// Test that the media channel is enabled for sending when the video sender
478// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800479TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700480 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700481 video_rtp_sender_ = new VideoRtpSender(video_channel_);
482 video_rtp_sender_->SetSsrc(kVideoSsrc);
483 video_rtp_sender_->SetTrack(video_track_);
484 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800485
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700486 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800487}
488
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700489// Test that the media channel is enabled for sending when the video sender
490// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800491TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700492 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493 video_rtp_sender_ = new VideoRtpSender(video_channel_);
494 video_rtp_sender_->SetTrack(video_track_);
495 video_rtp_sender_->SetSsrc(kVideoSsrc);
496 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800497
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800499}
500
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501// Test that the media channel stops sending when the audio sender's SSRC is set
502// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800503TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 audio_rtp_sender_->SetSsrc(0);
507 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800508}
509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510// Test that the media channel stops sending when the video sender's SSRC is set
511// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800512TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 audio_rtp_sender_->SetSsrc(0);
516 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800517}
518
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519// Test that the media channel stops sending when the audio sender's track is
520// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800521TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800523
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
525 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800526}
527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528// Test that the media channel stops sending when the video sender's track is
529// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800530TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800532
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700533 video_rtp_sender_->SetSsrc(0);
534 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800535}
536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537// Test that when the audio sender's SSRC is changed, the media channel stops
538// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800539TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
543 VerifyVoiceChannelNoInput(kAudioSsrc);
544 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 audio_rtp_sender_ = nullptr;
547 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800548}
549
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550// Test that when the audio sender's SSRC is changed, the media channel stops
551// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800552TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 video_rtp_sender_->SetSsrc(kVideoSsrc2);
556 VerifyVideoChannelNoInput(kVideoSsrc);
557 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800558
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 video_rtp_sender_ = nullptr;
560 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800561}
562
skvladdc1c62c2016-03-16 19:07:43 -0700563TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
564 CreateAudioRtpSender();
565
skvladdc1c62c2016-03-16 19:07:43 -0700566 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700568 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
569
570 DestroyAudioRtpSender();
571}
572
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
574 CreateAudioRtpSender();
575
576 EXPECT_EQ(-1, voice_media_channel_->max_bps());
577 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
578 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800579 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
580 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
582
583 // Read back the parameters and verify they have been changed.
584 params = audio_rtp_sender_->GetParameters();
585 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800586 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587
588 // Verify that the audio channel received the new parameters.
589 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
590 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800591 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592
593 // Verify that the global bitrate limit has not been changed.
594 EXPECT_EQ(-1, voice_media_channel_->max_bps());
595
596 DestroyAudioRtpSender();
597}
598
skvladdc1c62c2016-03-16 19:07:43 -0700599TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
600 CreateVideoRtpSender();
601
skvladdc1c62c2016-03-16 19:07:43 -0700602 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700604 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
605
606 DestroyVideoRtpSender();
607}
608
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
610 CreateVideoRtpSender();
611
612 EXPECT_EQ(-1, video_media_channel_->max_bps());
613 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
614 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800615 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
616 params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
618
619 // Read back the parameters and verify they have been changed.
620 params = video_rtp_sender_->GetParameters();
621 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800622 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623
624 // Verify that the video channel received the new parameters.
625 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
626 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800627 EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628
629 // Verify that the global bitrate limit has not been changed.
630 EXPECT_EQ(-1, video_media_channel_->max_bps());
631
632 DestroyVideoRtpSender();
633}
634
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700635TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
636 CreateAudioRtpReceiver();
637
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700638 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700639 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700640 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
641
642 DestroyAudioRtpReceiver();
643}
644
645TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
646 CreateVideoRtpReceiver();
647
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700648 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700649 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700650 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
651
652 DestroyVideoRtpReceiver();
653}
654
pbos5214a0a2016-12-16 15:39:11 -0800655// Test that makes sure that a video track content hint translates to the proper
656// value for sources that are not screencast.
657TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
658 CreateVideoRtpSender();
659
660 video_track_->set_enabled(true);
661
662 // |video_track_| is not screencast by default.
663 EXPECT_EQ(rtc::Optional<bool>(false),
664 video_media_channel_->options().is_screencast);
665 // No content hint should be set by default.
666 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
667 video_track_->content_hint());
668 // Setting detailed should turn a non-screencast source into screencast mode.
669 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
670 EXPECT_EQ(rtc::Optional<bool>(true),
671 video_media_channel_->options().is_screencast);
672 // Removing the content hint should turn the track back into non-screencast
673 // mode.
674 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
675 EXPECT_EQ(rtc::Optional<bool>(false),
676 video_media_channel_->options().is_screencast);
677 // Setting fluid should remain in non-screencast mode (its default).
678 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
679 EXPECT_EQ(rtc::Optional<bool>(false),
680 video_media_channel_->options().is_screencast);
681
682 DestroyVideoRtpSender();
683}
684
685// Test that makes sure that a video track content hint translates to the proper
686// value for screencast sources.
687TEST_F(RtpSenderReceiverTest,
688 PropagatesVideoTrackContentHintForScreencastSource) {
689 CreateVideoRtpSender(true);
690
691 video_track_->set_enabled(true);
692
693 // |video_track_| with a screencast source should be screencast by default.
694 EXPECT_EQ(rtc::Optional<bool>(true),
695 video_media_channel_->options().is_screencast);
696 // No content hint should be set by default.
697 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
698 video_track_->content_hint());
699 // Setting fluid should turn a screencast source into non-screencast mode.
700 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
701 EXPECT_EQ(rtc::Optional<bool>(false),
702 video_media_channel_->options().is_screencast);
703 // Removing the content hint should turn the track back into screencast mode.
704 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
705 EXPECT_EQ(rtc::Optional<bool>(true),
706 video_media_channel_->options().is_screencast);
707 // Setting detailed should still remain in screencast mode (its default).
708 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
709 EXPECT_EQ(rtc::Optional<bool>(true),
710 video_media_channel_->options().is_screencast);
711
712 DestroyVideoRtpSender();
713}
714
715// Test that makes sure any content hints that are set on a track before
716// VideoRtpSender is ready to send are still applied when it gets ready to send.
717TEST_F(RtpSenderReceiverTest,
718 PropagatesVideoTrackContentHintSetBeforeEnabling) {
719 AddVideoTrack();
720 // Setting detailed overrides the default non-screencast mode. This should be
721 // applied even if the track is set on construction.
722 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
723 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
724 stream_->label(), video_channel_);
725 video_track_->set_enabled(true);
726
727 // Sender is not ready to send (no SSRC) so no option should have been set.
728 EXPECT_EQ(rtc::Optional<bool>(),
729 video_media_channel_->options().is_screencast);
730
731 // Verify that the content hint is accounted for when video_rtp_sender_ does
732 // get enabled.
733 video_rtp_sender_->SetSsrc(kVideoSsrc);
734 EXPECT_EQ(rtc::Optional<bool>(true),
735 video_media_channel_->options().is_screencast);
736
737 // And removing the hint should go back to false (to verify that false was
738 // default correctly).
739 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
740 EXPECT_EQ(rtc::Optional<bool>(false),
741 video_media_channel_->options().is_screencast);
742
743 DestroyVideoRtpSender();
744}
745
deadbeef20cb0c12017-02-01 20:27:00 -0800746TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
747 CreateAudioRtpSender();
748 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
749}
750
751TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
752 CreateVideoRtpSender();
753 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
754}
755
756// Test that the DTMF sender is really using |voice_channel_|, and thus returns
757// true/false from CanSendDtmf based on what |voice_channel_| returns.
758TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
759 AddDtmfCodec();
760 CreateAudioRtpSender();
761 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
762 ASSERT_NE(nullptr, dtmf_sender);
763 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
764}
765
766TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
767 CreateAudioRtpSender();
768 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
769 ASSERT_NE(nullptr, dtmf_sender);
770 // DTMF codec has not been added, as it was in the above test.
771 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
772}
773
774TEST_F(RtpSenderReceiverTest, InsertDtmf) {
775 AddDtmfCodec();
776 CreateAudioRtpSender();
777 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
778 ASSERT_NE(nullptr, dtmf_sender);
779
780 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
781
782 // Insert DTMF
783 const int expected_duration = 90;
784 dtmf_sender->InsertDtmf("012", expected_duration, 100);
785
786 // Verify
787 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
788 kDefaultTimeout);
789 const uint32_t send_ssrc =
790 voice_media_channel_->send_streams()[0].first_ssrc();
791 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
792 send_ssrc, 0, expected_duration));
793 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
794 send_ssrc, 1, expected_duration));
795 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
796 send_ssrc, 2, expected_duration));
797}
798
799// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
800// destroyed, which is needed for the DTMF sender.
801TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
802 CreateAudioRtpSender();
803 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
804 audio_rtp_sender_ = nullptr;
805 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
806}
807
deadbeef70ab1a12015-09-28 16:53:55 -0700808} // namespace webrtc