blob: 03bb84b656db04cceaef71eb6f004e2e5b6021c7 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080016#include "media/base/rtpdataengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "media/engine/fakewebrtccall.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "pc/audiotrack.h"
19#include "pc/channelmanager.h"
20#include "pc/localaudiosource.h"
21#include "pc/mediastream.h"
22#include "pc/remoteaudiosource.h"
23#include "pc/rtpreceiver.h"
24#include "pc/rtpsender.h"
25#include "pc/streamcollection.h"
Zhi Huangb5261582017-09-29 10:51:43 -070026#include "pc/test/faketransportcontroller.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020027#include "pc/test/fakevideotracksource.h"
28#include "pc/videotrack.h"
29#include "pc/videotracksource.h"
30#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "test/gmock.h"
32#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070033
34using ::testing::_;
35using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070036using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070037using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070038
deadbeef20cb0c12017-02-01 20:27:00 -080039namespace {
40
deadbeef70ab1a12015-09-28 16:53:55 -070041static const char kStreamLabel1[] = "local_stream_1";
42static const char kVideoTrackId[] = "video_1";
43static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020044static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080045static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020046static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080047static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080048static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080049} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070050
51namespace webrtc {
52
deadbeef20cb0c12017-02-01 20:27:00 -080053class RtpSenderReceiverTest : public testing::Test,
54 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070055 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070056 RtpSenderReceiverTest()
57 : // Create fake media engine/etc. so we can create channels to use to
deadbeefe814a0d2017-02-25 18:15:09 -080058 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070059 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080060 channel_manager_(rtc::WrapUnique(media_engine_),
61 rtc::MakeUnique<cricket::RtpDataEngine>(),
62 rtc::Thread::Current(),
63 rtc::Thread::Current()),
skvlad11a9cbf2016-10-07 11:53:05 -070064 fake_call_(Call::Config(&event_log_)),
deadbeefe814a0d2017-02-25 18:15:09 -080065 local_stream_(MediaStream::Create(kStreamLabel1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070066 // Create channels to be used by the RtpSenders and RtpReceivers.
67 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080068 bool srtp_required = true;
zhihuangb2cdd932017-01-19 16:54:25 -080069 cricket::DtlsTransportInternal* rtp_transport =
70 fake_transport_controller_.CreateDtlsTransport(
zhihuangf5b251b2017-01-12 19:37:48 -080071 cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070072 voice_channel_ = channel_manager_.CreateVoiceChannel(
nisseeaabdf62017-05-05 02:23:02 -070073 &fake_call_, cricket::MediaConfig(),
74 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080075 cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070076 video_channel_ = channel_manager_.CreateVideoChannel(
nisseeaabdf62017-05-05 02:23:02 -070077 &fake_call_, cricket::MediaConfig(),
78 rtp_transport, nullptr, rtc::Thread::Current(),
deadbeef1a2183d2017-02-10 23:44:49 -080079 cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080080 voice_channel_->Enable(true);
81 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070082 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
83 video_media_channel_ = media_engine_->GetVideoChannel(0);
84 RTC_CHECK(voice_channel_);
85 RTC_CHECK(video_channel_);
86 RTC_CHECK(voice_media_channel_);
87 RTC_CHECK(video_media_channel_);
88
89 // Create streams for predefined SSRCs. Streams need to exist in order
90 // for the senders and receievers to apply parameters to them.
91 // Normally these would be created by SetLocalDescription and
92 // SetRemoteDescription.
93 voice_media_channel_->AddSendStream(
94 cricket::StreamParams::CreateLegacy(kAudioSsrc));
95 voice_media_channel_->AddRecvStream(
96 cricket::StreamParams::CreateLegacy(kAudioSsrc));
97 voice_media_channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
99 voice_media_channel_->AddRecvStream(
100 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
101 video_media_channel_->AddSendStream(
102 cricket::StreamParams::CreateLegacy(kVideoSsrc));
103 video_media_channel_->AddRecvStream(
104 cricket::StreamParams::CreateLegacy(kVideoSsrc));
105 video_media_channel_->AddSendStream(
106 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
107 video_media_channel_->AddRecvStream(
108 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700109 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700110
deadbeef20cb0c12017-02-01 20:27:00 -0800111 // Needed to use DTMF sender.
112 void AddDtmfCodec() {
113 cricket::AudioSendParameters params;
114 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
115 0, 1);
116 params.codecs.push_back(kTelephoneEventCodec);
117 voice_media_channel_->SetSendParameters(params);
118 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700119
pbos5214a0a2016-12-16 15:39:11 -0800120 void AddVideoTrack() { AddVideoTrack(false); }
121
122 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100123 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800124 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700125 video_track_ =
126 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800127 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700128 }
129
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700130 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
131
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100132 void CreateAudioRtpSender(
133 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700134 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800135 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
deadbeeffac06552015-11-25 11:26:01 -0800136 audio_rtp_sender_ =
deadbeefe814a0d2017-02-25 18:15:09 -0800137 new AudioRtpSender(local_stream_->GetAudioTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700138 {local_stream_->label()}, voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800139 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800140 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
141 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700142 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
deadbeef20cb0c12017-02-01 20:27:00 -0800145 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
146
pbos5214a0a2016-12-16 15:39:11 -0800147 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
148
149 void CreateVideoRtpSender(bool is_screencast) {
150 AddVideoTrack(is_screencast);
deadbeefe814a0d2017-02-25 18:15:09 -0800151 video_rtp_sender_ =
152 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700153 {local_stream_->label()}, video_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800154 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700155 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700156 }
157
158 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700159 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700160 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700161 }
162
163 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700164 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700166 }
167
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100168 void CreateAudioRtpReceiver(
169 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
170 audio_rtp_receiver_ = new AudioRtpReceiver(
171 kAudioTrackId, std::move(streams), 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
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100176 void CreateVideoRtpReceiver(
177 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800178 video_rtp_receiver_ = new VideoRtpReceiver(
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100179 kVideoTrackId, std::move(streams), rtc::Thread::Current(), kVideoSsrc,
180 video_channel_);
perkjf0dcfe22016-03-10 18:32:00 +0100181 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700182 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700183 }
184
185 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700186 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700187 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700188 }
189
190 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700191 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700192 VerifyVideoChannelNoOutput();
193 }
194
195 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
196
197 void VerifyVoiceChannelInput(uint32_t ssrc) {
198 // Verify that the media channel has an audio source, and the stream isn't
199 // muted.
200 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
201 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
202 }
203
204 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
205
206 void VerifyVideoChannelInput(uint32_t ssrc) {
207 // Verify that the media channel has a video source,
208 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
209 }
210
211 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
212
213 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
214 // Verify that the media channel's source is reset.
215 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
216 }
217
218 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
219
220 void VerifyVideoChannelNoInput(uint32_t ssrc) {
221 // Verify that the media channel's source is reset.
222 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
223 }
224
225 void VerifyVoiceChannelOutput() {
226 // Verify that the volume is initialized to 1.
227 double volume;
228 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
229 EXPECT_EQ(1, volume);
230 }
231
232 void VerifyVideoChannelOutput() {
233 // Verify that the media channel has a sink.
234 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
235 }
236
237 void VerifyVoiceChannelNoOutput() {
238 // Verify that the volume is reset to 0.
239 double volume;
240 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
241 EXPECT_EQ(0, volume);
242 }
243
244 void VerifyVideoChannelNoOutput() {
245 // Verify that the media channel's sink is reset.
246 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700247 }
248
249 protected:
skvlad11a9cbf2016-10-07 11:53:05 -0700250 webrtc::RtcEventLogNullImpl event_log_;
deadbeef112b2e92017-02-10 20:13:37 -0800251 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700252 cricket::FakeMediaEngine* media_engine_;
253 cricket::FakeTransportController fake_transport_controller_;
254 cricket::ChannelManager channel_manager_;
255 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700256 cricket::VoiceChannel* voice_channel_;
257 cricket::VideoChannel* video_channel_;
258 cricket::FakeVoiceMediaChannel* voice_media_channel_;
259 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700260 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
261 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
262 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
263 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800264 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700265 rtc::scoped_refptr<VideoTrackInterface> video_track_;
266 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800267 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700268};
269
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700270// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700271// and disassociated with an AudioRtpSender.
272TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
273 CreateAudioRtpSender();
274 DestroyAudioRtpSender();
275}
276
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700277// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700278// disassociated with a VideoRtpSender.
279TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
280 CreateVideoRtpSender();
281 DestroyVideoRtpSender();
282}
283
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700284// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700285// associated and disassociated with an AudioRtpReceiver.
286TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
287 CreateAudioRtpReceiver();
288 DestroyAudioRtpReceiver();
289}
290
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700291// Test that |video_channel_| is updated when a remote video track is
292// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700293TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
294 CreateVideoRtpReceiver();
295 DestroyVideoRtpReceiver();
296}
297
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100298TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
299 CreateAudioRtpReceiver({local_stream_});
300 DestroyAudioRtpReceiver();
301}
302
303TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
304 CreateVideoRtpReceiver({local_stream_});
305 DestroyVideoRtpReceiver();
306}
307
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308// Test that the AudioRtpSender applies options from the local audio source.
309TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
310 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100311 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800312 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700313 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700314
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100315 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700316
317 DestroyAudioRtpSender();
318}
319
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700320// Test that the stream is muted when the track is disabled, and unmuted when
321// the track is enabled.
322TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
323 CreateAudioRtpSender();
324
325 audio_track_->set_enabled(false);
326 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
327
328 audio_track_->set_enabled(true);
329 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
330
331 DestroyAudioRtpSender();
332}
333
334// Test that the volume is set to 0 when the track is disabled, and back to
335// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700336TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
337 CreateAudioRtpReceiver();
338
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700339 double volume;
340 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
341 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700342
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700343 audio_track_->set_enabled(false);
344 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
345 EXPECT_EQ(0, volume);
346
deadbeef70ab1a12015-09-28 16:53:55 -0700347 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700348 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
349 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700350
351 DestroyAudioRtpReceiver();
352}
353
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700354// Currently no action is taken when a remote video track is disabled or
355// enabled, so there's nothing to test here, other than what is normally
356// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700357TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
358 CreateVideoRtpSender();
359
deadbeef70ab1a12015-09-28 16:53:55 -0700360 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700361 video_track_->set_enabled(true);
362
363 DestroyVideoRtpSender();
364}
365
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700366// Test that the state of the video track created by the VideoRtpReceiver is
367// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100368TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
369 CreateVideoRtpReceiver();
370
371 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
372 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
373 video_track_->GetSource()->state());
374
375 DestroyVideoRtpReceiver();
376
377 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
378 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
379 video_track_->GetSource()->state());
380}
381
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700382// Currently no action is taken when a remote video track is disabled or
383// enabled, so there's nothing to test here, other than what is normally
384// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700385TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
386 CreateVideoRtpReceiver();
387
388 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700389 video_track_->set_enabled(true);
390
391 DestroyVideoRtpReceiver();
392}
393
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394// Test that the AudioRtpReceiver applies volume changes from the track source
395// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700396TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
397 CreateAudioRtpReceiver();
398
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700399 double volume;
400 audio_track_->GetSource()->SetVolume(0.5);
401 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
402 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700403
404 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700405 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700406 audio_track_->GetSource()->SetVolume(0.8);
407 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
408 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700409
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700410 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700411 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700412 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
413 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700414
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700415 // Try changing volume one more time.
416 audio_track_->GetSource()->SetVolume(0.9);
417 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
418 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700419
420 DestroyAudioRtpReceiver();
421}
422
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700423// Test that the media channel isn't enabled for sending if the audio sender
424// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800425TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700426 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800427 rtc::scoped_refptr<AudioTrackInterface> track =
428 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700429
430 // Track but no SSRC.
431 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
432 VerifyVoiceChannelNoInput();
433
434 // SSRC but no track.
435 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
436 audio_rtp_sender_->SetSsrc(kAudioSsrc);
437 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800438}
439
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700440// Test that the media channel isn't enabled for sending if the video sender
441// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800442TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 video_rtp_sender_ = new VideoRtpSender(video_channel_);
444
445 // Track but no SSRC.
446 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
447 VerifyVideoChannelNoInput();
448
449 // SSRC but no track.
450 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
451 video_rtp_sender_->SetSsrc(kVideoSsrc);
452 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800453}
454
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700455// Test that the media channel is enabled for sending when the audio sender
456// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800457TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700458 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800459 rtc::scoped_refptr<AudioTrackInterface> track =
460 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461 audio_rtp_sender_->SetSsrc(kAudioSsrc);
462 audio_rtp_sender_->SetTrack(track);
463 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800464
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700465 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800466}
467
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700468// Test that the media channel is enabled for sending when the audio sender
469// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800470TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700471 audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800472 rtc::scoped_refptr<AudioTrackInterface> track =
473 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474 audio_rtp_sender_->SetTrack(track);
475 audio_rtp_sender_->SetSsrc(kAudioSsrc);
476 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800477
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700478 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800479}
480
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700481// Test that the media channel is enabled for sending when the video sender
482// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800483TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700484 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700485 video_rtp_sender_ = new VideoRtpSender(video_channel_);
486 video_rtp_sender_->SetSsrc(kVideoSsrc);
487 video_rtp_sender_->SetTrack(video_track_);
488 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800489
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700490 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that the media channel is enabled for sending when the video sender
494// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700496 AddVideoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 video_rtp_sender_ = new VideoRtpSender(video_channel_);
498 video_rtp_sender_->SetTrack(video_track_);
499 video_rtp_sender_->SetSsrc(kVideoSsrc);
500 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800503}
504
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505// Test that the media channel stops sending when the audio sender's SSRC is set
506// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800507TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700508 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 audio_rtp_sender_->SetSsrc(0);
511 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800512}
513
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514// Test that the media channel stops sending when the video sender's SSRC is set
515// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800516TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800518
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519 audio_rtp_sender_->SetSsrc(0);
520 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800521}
522
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523// Test that the media channel stops sending when the audio sender's track is
524// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800525TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
529 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800530}
531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532// Test that the media channel stops sending when the video sender's track is
533// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800534TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800536
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537 video_rtp_sender_->SetSsrc(0);
538 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800539}
540
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700541// Test that when the audio sender's SSRC is changed, the media channel stops
542// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800543TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
547 VerifyVoiceChannelNoInput(kAudioSsrc);
548 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800549
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550 audio_rtp_sender_ = nullptr;
551 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800552}
553
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700554// Test that when the audio sender's SSRC is changed, the media channel stops
555// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800556TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700557 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800558
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 video_rtp_sender_->SetSsrc(kVideoSsrc2);
560 VerifyVideoChannelNoInput(kVideoSsrc);
561 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800562
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563 video_rtp_sender_ = nullptr;
564 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800565}
566
skvladdc1c62c2016-03-16 19:07:43 -0700567TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
568 CreateAudioRtpSender();
569
skvladdc1c62c2016-03-16 19:07:43 -0700570 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700572 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
573
574 DestroyAudioRtpSender();
575}
576
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700577TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
578 CreateAudioRtpSender();
579
580 EXPECT_EQ(-1, voice_media_channel_->max_bps());
581 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
582 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800583 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100584 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700585 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
586
587 // Read back the parameters and verify they have been changed.
588 params = audio_rtp_sender_->GetParameters();
589 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100590 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591
592 // Verify that the audio channel received the new parameters.
593 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
594 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100595 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596
597 // Verify that the global bitrate limit has not been changed.
598 EXPECT_EQ(-1, voice_media_channel_->max_bps());
599
600 DestroyAudioRtpSender();
601}
602
skvladdc1c62c2016-03-16 19:07:43 -0700603TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
604 CreateVideoRtpSender();
605
skvladdc1c62c2016-03-16 19:07:43 -0700606 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607 EXPECT_EQ(1u, params.encodings.size());
skvladdc1c62c2016-03-16 19:07:43 -0700608 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
609
610 DestroyVideoRtpSender();
611}
612
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
614 CreateVideoRtpSender();
615
616 EXPECT_EQ(-1, video_media_channel_->max_bps());
617 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
618 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800619 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100620 params.encodings[0].max_bitrate_bps = 1000;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700621 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
622
623 // Read back the parameters and verify they have been changed.
624 params = video_rtp_sender_->GetParameters();
625 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100626 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700627
628 // Verify that the video channel received the new parameters.
629 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
630 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100631 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700632
633 // Verify that the global bitrate limit has not been changed.
634 EXPECT_EQ(-1, video_media_channel_->max_bps());
635
636 DestroyVideoRtpSender();
637}
638
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700639TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
640 CreateAudioRtpReceiver();
641
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700642 RtpParameters params = audio_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(audio_rtp_receiver_->SetParameters(params));
645
646 DestroyAudioRtpReceiver();
647}
648
649TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
650 CreateVideoRtpReceiver();
651
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700652 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700653 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700654 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
655
656 DestroyVideoRtpReceiver();
657}
658
pbos5214a0a2016-12-16 15:39:11 -0800659// Test that makes sure that a video track content hint translates to the proper
660// value for sources that are not screencast.
661TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
662 CreateVideoRtpSender();
663
664 video_track_->set_enabled(true);
665
666 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100667 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800668 // No content hint should be set by default.
669 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
670 video_track_->content_hint());
671 // Setting detailed should turn a non-screencast source into screencast mode.
672 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100673 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800674 // Removing the content hint should turn the track back into non-screencast
675 // mode.
676 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100677 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800678 // Setting fluid should remain in non-screencast mode (its default).
679 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100680 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800681
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.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100694 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800695 // No content hint should be set by default.
696 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
697 video_track_->content_hint());
698 // Setting fluid should turn a screencast source into non-screencast mode.
699 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100700 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800701 // Removing the content hint should turn the track back into screencast mode.
702 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100703 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800704 // Setting detailed should still remain in screencast mode (its default).
705 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100706 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800707
708 DestroyVideoRtpSender();
709}
710
711// Test that makes sure any content hints that are set on a track before
712// VideoRtpSender is ready to send are still applied when it gets ready to send.
713TEST_F(RtpSenderReceiverTest,
714 PropagatesVideoTrackContentHintSetBeforeEnabling) {
715 AddVideoTrack();
716 // Setting detailed overrides the default non-screencast mode. This should be
717 // applied even if the track is set on construction.
718 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
deadbeefe814a0d2017-02-25 18:15:09 -0800719 video_rtp_sender_ =
720 new VideoRtpSender(local_stream_->GetVideoTracks()[0],
Steve Anton8ffb9c32017-08-31 15:45:38 -0700721 {local_stream_->label()}, video_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800722 video_track_->set_enabled(true);
723
724 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100725 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800726
727 // Verify that the content hint is accounted for when video_rtp_sender_ does
728 // get enabled.
729 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100730 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800731
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);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100735 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800736
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