blob: 69089a5dbb4d316ca8b293e6ff1866581d11be51 [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
Seth Hampson24722b32017-12-22 09:36:42 -080015#include "api/rtpparameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080017#include "media/base/rtpdataengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 10:48:35 -070019#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "pc/audiotrack.h"
21#include "pc/channelmanager.h"
22#include "pc/localaudiosource.h"
23#include "pc/mediastream.h"
24#include "pc/remoteaudiosource.h"
25#include "pc/rtpreceiver.h"
26#include "pc/rtpsender.h"
27#include "pc/streamcollection.h"
28#include "pc/test/fakevideotracksource.h"
29#include "pc/videotrack.h"
30#include "pc/videotracksource.h"
31#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020032#include "test/gmock.h"
33#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070034
35using ::testing::_;
36using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070037using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070038using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070039
deadbeef20cb0c12017-02-01 20:27:00 -080040namespace {
41
Seth Hampson845e8782018-03-02 11:34:10 -080042static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070043static const char kVideoTrackId[] = "video_1";
44static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020045static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080046static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020047static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080048static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080049static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080050} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070051
52namespace webrtc {
53
deadbeef20cb0c12017-02-01 20:27:00 -080054class RtpSenderReceiverTest : public testing::Test,
55 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070056 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070057 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080058 : network_thread_(rtc::Thread::Current()),
59 worker_thread_(rtc::Thread::Current()),
60 // Create fake media engine/etc. so we can create channels to use to
61 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070062 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080063 channel_manager_(rtc::WrapUnique(media_engine_),
64 rtc::MakeUnique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080065 worker_thread_,
66 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010067 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080068 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070069 // Create channels to be used by the RtpSenders and RtpReceivers.
70 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080071 bool srtp_required = true;
Zhi Huange830e682018-03-30 10:48:35 -070072 rtp_dtls_transport_ = rtc::MakeUnique<cricket::FakeDtlsTransport>(
73 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
74 rtp_transport_ = CreateDtlsSrtpTransport();
75
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070076 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070077 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
78 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
79 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070080 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070081 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
82 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
83 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080084 voice_channel_->Enable(true);
85 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070086 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
87 video_media_channel_ = media_engine_->GetVideoChannel(0);
88 RTC_CHECK(voice_channel_);
89 RTC_CHECK(video_channel_);
90 RTC_CHECK(voice_media_channel_);
91 RTC_CHECK(video_media_channel_);
92
93 // Create streams for predefined SSRCs. Streams need to exist in order
94 // for the senders and receievers to apply parameters to them.
95 // Normally these would be created by SetLocalDescription and
96 // SetRemoteDescription.
97 voice_media_channel_->AddSendStream(
98 cricket::StreamParams::CreateLegacy(kAudioSsrc));
99 voice_media_channel_->AddRecvStream(
100 cricket::StreamParams::CreateLegacy(kAudioSsrc));
101 voice_media_channel_->AddSendStream(
102 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
103 voice_media_channel_->AddRecvStream(
104 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
105 video_media_channel_->AddSendStream(
106 cricket::StreamParams::CreateLegacy(kVideoSsrc));
107 video_media_channel_->AddRecvStream(
108 cricket::StreamParams::CreateLegacy(kVideoSsrc));
109 video_media_channel_->AddSendStream(
110 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
111 video_media_channel_->AddRecvStream(
112 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700113 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700114
Zhi Huange830e682018-03-30 10:48:35 -0700115 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
116 auto rtp_transport =
117 rtc::MakeUnique<webrtc::RtpTransport>(/*rtcp_mux_required=*/true);
118 auto srtp_transport =
119 rtc::MakeUnique<webrtc::SrtpTransport>(std::move(rtp_transport));
120 auto dtls_srtp_transport =
121 rtc::MakeUnique<webrtc::DtlsSrtpTransport>(std::move(srtp_transport));
122 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
123 /*rtcp_dtls_transport=*/nullptr);
124 return dtls_srtp_transport;
125 }
126
deadbeef20cb0c12017-02-01 20:27:00 -0800127 // Needed to use DTMF sender.
128 void AddDtmfCodec() {
129 cricket::AudioSendParameters params;
130 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
131 0, 1);
132 params.codecs.push_back(kTelephoneEventCodec);
133 voice_media_channel_->SetSendParameters(params);
134 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700135
pbos5214a0a2016-12-16 15:39:11 -0800136 void AddVideoTrack() { AddVideoTrack(false); }
137
138 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100139 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800140 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700141 video_track_ =
142 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800143 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700144 }
145
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700146 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
147
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100148 void CreateAudioRtpSender(
149 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700150 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800151 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800152 audio_rtp_sender_ =
153 new AudioRtpSender(worker_thread_, local_stream_->GetAudioTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700154 {local_stream_->id()}, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800155 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800156 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800157 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
158 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700159 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700160 }
161
Steve Anton02ee47c2018-01-10 16:26:06 -0800162 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800163 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800164 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800165 }
166
deadbeef20cb0c12017-02-01 20:27:00 -0800167 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
168
pbos5214a0a2016-12-16 15:39:11 -0800169 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
170
171 void CreateVideoRtpSender(bool is_screencast) {
172 AddVideoTrack(is_screencast);
Steve Anton47136dd2018-01-12 10:49:35 -0800173 video_rtp_sender_ =
174 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700175 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800176 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800177 video_rtp_sender_->SetSsrc(kVideoSsrc);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700178 VerifyVideoChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700179 }
180
Steve Anton02ee47c2018-01-10 16:26:06 -0800181 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800182 video_rtp_sender_ = new VideoRtpSender(worker_thread_);
Steve Anton57858b32018-02-15 15:19:50 -0800183 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800184 }
185
deadbeef70ab1a12015-09-28 16:53:55 -0700186 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700187 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700188 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700189 }
190
191 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700192 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700193 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700194 }
195
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100196 void CreateAudioRtpReceiver(
197 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
198 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800199 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800200 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800201 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700202 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700203 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700204 }
205
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100206 void CreateVideoRtpReceiver(
207 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800208 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800209 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800210 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800211 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100212 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700213 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700214 }
215
216 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700217 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700218 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700219 }
220
221 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700222 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700223 VerifyVideoChannelNoOutput();
224 }
225
226 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
227
228 void VerifyVoiceChannelInput(uint32_t ssrc) {
229 // Verify that the media channel has an audio source, and the stream isn't
230 // muted.
231 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
232 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
233 }
234
235 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
236
237 void VerifyVideoChannelInput(uint32_t ssrc) {
238 // Verify that the media channel has a video source,
239 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
240 }
241
242 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
243
244 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
245 // Verify that the media channel's source is reset.
246 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
247 }
248
249 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
250
251 void VerifyVideoChannelNoInput(uint32_t ssrc) {
252 // Verify that the media channel's source is reset.
253 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
254 }
255
256 void VerifyVoiceChannelOutput() {
257 // Verify that the volume is initialized to 1.
258 double volume;
259 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
260 EXPECT_EQ(1, volume);
261 }
262
263 void VerifyVideoChannelOutput() {
264 // Verify that the media channel has a sink.
265 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
266 }
267
268 void VerifyVoiceChannelNoOutput() {
269 // Verify that the volume is reset to 0.
270 double volume;
271 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
272 EXPECT_EQ(0, volume);
273 }
274
275 void VerifyVideoChannelNoOutput() {
276 // Verify that the media channel's sink is reset.
277 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700278 }
279
280 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800281 rtc::Thread* const network_thread_;
282 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700283 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700284 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
285 // the |channel_manager|.
286 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
287 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800288 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700290 cricket::ChannelManager channel_manager_;
291 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292 cricket::VoiceChannel* voice_channel_;
293 cricket::VideoChannel* video_channel_;
294 cricket::FakeVoiceMediaChannel* voice_media_channel_;
295 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700296 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
297 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
298 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
299 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800300 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700301 rtc::scoped_refptr<VideoTrackInterface> video_track_;
302 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800303 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700304};
305
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700307// and disassociated with an AudioRtpSender.
308TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
309 CreateAudioRtpSender();
310 DestroyAudioRtpSender();
311}
312
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700313// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700314// disassociated with a VideoRtpSender.
315TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
316 CreateVideoRtpSender();
317 DestroyVideoRtpSender();
318}
319
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700320// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700321// associated and disassociated with an AudioRtpReceiver.
322TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
323 CreateAudioRtpReceiver();
324 DestroyAudioRtpReceiver();
325}
326
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700327// Test that |video_channel_| is updated when a remote video track is
328// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700329TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
330 CreateVideoRtpReceiver();
331 DestroyVideoRtpReceiver();
332}
333
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100334TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
335 CreateAudioRtpReceiver({local_stream_});
336 DestroyAudioRtpReceiver();
337}
338
339TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
340 CreateVideoRtpReceiver({local_stream_});
341 DestroyVideoRtpReceiver();
342}
343
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344// Test that the AudioRtpSender applies options from the local audio source.
345TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
346 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100347 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800348 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700349 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700350
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100351 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700352
353 DestroyAudioRtpSender();
354}
355
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700356// Test that the stream is muted when the track is disabled, and unmuted when
357// the track is enabled.
358TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
359 CreateAudioRtpSender();
360
361 audio_track_->set_enabled(false);
362 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
363
364 audio_track_->set_enabled(true);
365 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
366
367 DestroyAudioRtpSender();
368}
369
370// Test that the volume is set to 0 when the track is disabled, and back to
371// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700372TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
373 CreateAudioRtpReceiver();
374
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700375 double volume;
376 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
377 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700378
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700379 audio_track_->set_enabled(false);
380 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
381 EXPECT_EQ(0, volume);
382
deadbeef70ab1a12015-09-28 16:53:55 -0700383 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
385 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700386
387 DestroyAudioRtpReceiver();
388}
389
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700390// Currently no action is taken when a remote video track is disabled or
391// enabled, so there's nothing to test here, other than what is normally
392// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700393TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
394 CreateVideoRtpSender();
395
deadbeef70ab1a12015-09-28 16:53:55 -0700396 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700397 video_track_->set_enabled(true);
398
399 DestroyVideoRtpSender();
400}
401
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700402// Test that the state of the video track created by the VideoRtpReceiver is
403// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100404TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
405 CreateVideoRtpReceiver();
406
407 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
408 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
409 video_track_->GetSource()->state());
410
411 DestroyVideoRtpReceiver();
412
413 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
414 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
415 video_track_->GetSource()->state());
416}
417
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700418// Currently no action is taken when a remote video track is disabled or
419// enabled, so there's nothing to test here, other than what is normally
420// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700421TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
422 CreateVideoRtpReceiver();
423
424 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700425 video_track_->set_enabled(true);
426
427 DestroyVideoRtpReceiver();
428}
429
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700430// Test that the AudioRtpReceiver applies volume changes from the track source
431// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700432TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
433 CreateAudioRtpReceiver();
434
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435 double volume;
436 audio_track_->GetSource()->SetVolume(0.5);
437 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
438 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700439
440 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700441 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700442 audio_track_->GetSource()->SetVolume(0.8);
443 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
444 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700445
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700446 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700447 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
449 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700450
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700451 // Try changing volume one more time.
452 audio_track_->GetSource()->SetVolume(0.9);
453 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
454 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700455
456 DestroyAudioRtpReceiver();
457}
458
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700459// Test that the media channel isn't enabled for sending if the audio sender
460// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800461TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800462 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800463 rtc::scoped_refptr<AudioTrackInterface> track =
464 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700465
466 // Track but no SSRC.
467 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
468 VerifyVoiceChannelNoInput();
469
470 // SSRC but no track.
471 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
472 audio_rtp_sender_->SetSsrc(kAudioSsrc);
473 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800474}
475
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700476// Test that the media channel isn't enabled for sending if the video sender
477// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800478TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800479 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480
481 // Track but no SSRC.
482 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
483 VerifyVideoChannelNoInput();
484
485 // SSRC but no track.
486 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
487 video_rtp_sender_->SetSsrc(kVideoSsrc);
488 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800489}
490
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700491// Test that the media channel is enabled for sending when the audio sender
492// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800493TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800494 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800495 rtc::scoped_refptr<AudioTrackInterface> track =
496 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497 audio_rtp_sender_->SetSsrc(kAudioSsrc);
498 audio_rtp_sender_->SetTrack(track);
499 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800500
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700501 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800502}
503
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700504// Test that the media channel is enabled for sending when the audio sender
505// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800506TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800507 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800508 rtc::scoped_refptr<AudioTrackInterface> track =
509 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 audio_rtp_sender_->SetTrack(track);
511 audio_rtp_sender_->SetSsrc(kAudioSsrc);
512 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800513
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800515}
516
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700517// Test that the media channel is enabled for sending when the video sender
518// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800519TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700520 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800521 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700522 video_rtp_sender_->SetSsrc(kVideoSsrc);
523 video_rtp_sender_->SetTrack(video_track_);
524 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800525
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700526 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800527}
528
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529// Test that the media channel is enabled for sending when the video sender
530// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800531TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700532 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800533 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534 video_rtp_sender_->SetTrack(video_track_);
535 video_rtp_sender_->SetSsrc(kVideoSsrc);
536 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800537
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700538 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800539}
540
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700541// Test that the media channel stops sending when the audio sender's SSRC is set
542// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800543TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
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(0);
547 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800548}
549
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700550// Test that the media channel stops sending when the video sender's SSRC is set
551// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800552TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 audio_rtp_sender_->SetSsrc(0);
556 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800557}
558
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559// Test that the media channel stops sending when the audio sender's track is
560// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800561TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700562 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800563
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
565 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800566}
567
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568// Test that the media channel stops sending when the video sender's track is
569// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800570TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700571 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800572
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 video_rtp_sender_->SetSsrc(0);
574 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800575}
576
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700577// Test that when the audio sender's SSRC is changed, the media channel stops
578// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800579TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700580 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800581
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
583 VerifyVoiceChannelNoInput(kAudioSsrc);
584 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800585
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 audio_rtp_sender_ = nullptr;
587 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800588}
589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590// Test that when the audio sender's SSRC is changed, the media channel stops
591// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800592TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800594
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 video_rtp_sender_->SetSsrc(kVideoSsrc2);
596 VerifyVideoChannelNoInput(kVideoSsrc);
597 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800598
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599 video_rtp_sender_ = nullptr;
600 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800601}
602
skvladdc1c62c2016-03-16 19:07:43 -0700603TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
604 CreateAudioRtpSender();
605
skvladdc1c62c2016-03-16 19:07:43 -0700606 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800608 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700609
610 DestroyAudioRtpSender();
611}
612
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700613TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
614 CreateAudioRtpSender();
615
616 EXPECT_EQ(-1, voice_media_channel_->max_bps());
617 webrtc::RtpParameters params = audio_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;
Zach Steinba37b4b2018-01-23 15:02:36 -0800621 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622
623 // Read back the parameters and verify they have been changed.
624 params = audio_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 audio channel received the new parameters.
629 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
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, voice_media_channel_->max_bps());
635
636 DestroyAudioRtpSender();
637}
638
Seth Hampson24722b32017-12-22 09:36:42 -0800639TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
640 CreateAudioRtpSender();
641
642 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
643 EXPECT_EQ(1, params.encodings.size());
644 EXPECT_EQ(webrtc::kDefaultBitratePriority,
645 params.encodings[0].bitrate_priority);
646 double new_bitrate_priority = 2.0;
647 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800648 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800649
650 params = audio_rtp_sender_->GetParameters();
651 EXPECT_EQ(1, params.encodings.size());
652 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
653
654 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
655 EXPECT_EQ(1, params.encodings.size());
656 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
657
658 DestroyAudioRtpSender();
659}
660
skvladdc1c62c2016-03-16 19:07:43 -0700661TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
662 CreateVideoRtpSender();
663
skvladdc1c62c2016-03-16 19:07:43 -0700664 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800666 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700667
668 DestroyVideoRtpSender();
669}
670
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
672 CreateVideoRtpSender();
673
674 EXPECT_EQ(-1, video_media_channel_->max_bps());
675 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
676 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800677 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100678 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800679 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700680
681 // Read back the parameters and verify they have been changed.
682 params = video_rtp_sender_->GetParameters();
683 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100684 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700685
686 // Verify that the video channel received the new parameters.
687 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
688 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100689 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700690
691 // Verify that the global bitrate limit has not been changed.
692 EXPECT_EQ(-1, video_media_channel_->max_bps());
693
694 DestroyVideoRtpSender();
695}
696
Seth Hampson24722b32017-12-22 09:36:42 -0800697TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
698 CreateVideoRtpSender();
699
700 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
701 EXPECT_EQ(1, params.encodings.size());
702 EXPECT_EQ(webrtc::kDefaultBitratePriority,
703 params.encodings[0].bitrate_priority);
704 double new_bitrate_priority = 2.0;
705 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800706 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800707
708 params = video_rtp_sender_->GetParameters();
709 EXPECT_EQ(1, params.encodings.size());
710 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
711
712 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
713 EXPECT_EQ(1, params.encodings.size());
714 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
715
716 DestroyVideoRtpSender();
717}
718
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700719TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
720 CreateAudioRtpReceiver();
721
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700722 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700723 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700724 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
725
726 DestroyAudioRtpReceiver();
727}
728
729TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
730 CreateVideoRtpReceiver();
731
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700732 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700733 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700734 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
735
736 DestroyVideoRtpReceiver();
737}
738
pbos5214a0a2016-12-16 15:39:11 -0800739// Test that makes sure that a video track content hint translates to the proper
740// value for sources that are not screencast.
741TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
742 CreateVideoRtpSender();
743
744 video_track_->set_enabled(true);
745
746 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100747 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800748 // No content hint should be set by default.
749 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
750 video_track_->content_hint());
751 // Setting detailed should turn a non-screencast source into screencast mode.
752 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100753 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800754 // Removing the content hint should turn the track back into non-screencast
755 // mode.
756 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100757 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800758 // Setting fluid should remain in non-screencast mode (its default).
759 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100760 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800761
762 DestroyVideoRtpSender();
763}
764
765// Test that makes sure that a video track content hint translates to the proper
766// value for screencast sources.
767TEST_F(RtpSenderReceiverTest,
768 PropagatesVideoTrackContentHintForScreencastSource) {
769 CreateVideoRtpSender(true);
770
771 video_track_->set_enabled(true);
772
773 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100774 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800775 // No content hint should be set by default.
776 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
777 video_track_->content_hint());
778 // Setting fluid should turn a screencast source into non-screencast mode.
779 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100780 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800781 // Removing the content hint should turn the track back into screencast mode.
782 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100783 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800784 // Setting detailed should still remain in screencast mode (its default).
785 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100786 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800787
788 DestroyVideoRtpSender();
789}
790
791// Test that makes sure any content hints that are set on a track before
792// VideoRtpSender is ready to send are still applied when it gets ready to send.
793TEST_F(RtpSenderReceiverTest,
794 PropagatesVideoTrackContentHintSetBeforeEnabling) {
795 AddVideoTrack();
796 // Setting detailed overrides the default non-screencast mode. This should be
797 // applied even if the track is set on construction.
798 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Seth Hampson13b8bad2018-03-13 16:05:28 -0700799 video_rtp_sender_ =
800 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
801 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800802 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -0800803 video_track_->set_enabled(true);
804
805 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100806 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800807
808 // Verify that the content hint is accounted for when video_rtp_sender_ does
809 // get enabled.
810 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100811 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800812
813 // And removing the hint should go back to false (to verify that false was
814 // default correctly).
815 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100816 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -0800817
818 DestroyVideoRtpSender();
819}
820
deadbeef20cb0c12017-02-01 20:27:00 -0800821TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
822 CreateAudioRtpSender();
823 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
824}
825
826TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
827 CreateVideoRtpSender();
828 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
829}
830
831// Test that the DTMF sender is really using |voice_channel_|, and thus returns
832// true/false from CanSendDtmf based on what |voice_channel_| returns.
833TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
834 AddDtmfCodec();
835 CreateAudioRtpSender();
836 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
837 ASSERT_NE(nullptr, dtmf_sender);
838 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
839}
840
841TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
842 CreateAudioRtpSender();
843 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
844 ASSERT_NE(nullptr, dtmf_sender);
845 // DTMF codec has not been added, as it was in the above test.
846 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
847}
848
849TEST_F(RtpSenderReceiverTest, InsertDtmf) {
850 AddDtmfCodec();
851 CreateAudioRtpSender();
852 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
853 ASSERT_NE(nullptr, dtmf_sender);
854
855 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
856
857 // Insert DTMF
858 const int expected_duration = 90;
859 dtmf_sender->InsertDtmf("012", expected_duration, 100);
860
861 // Verify
862 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
863 kDefaultTimeout);
864 const uint32_t send_ssrc =
865 voice_media_channel_->send_streams()[0].first_ssrc();
866 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
867 send_ssrc, 0, expected_duration));
868 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
869 send_ssrc, 1, expected_duration));
870 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
871 send_ssrc, 2, expected_duration));
872}
873
874// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
875// destroyed, which is needed for the DTMF sender.
876TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
877 CreateAudioRtpSender();
878 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
879 audio_rtp_sender_ = nullptr;
880 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
881}
882
deadbeef70ab1a12015-09-28 16:53:55 -0700883} // namespace webrtc