blob: 5795ba76b0f49bba5c10eb65778151ba86aa3fec [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"
Seth Hampson2d2c8882018-05-16 16:02:32 -070018#include "media/base/testutils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 10:48:35 -070020#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "pc/audiotrack.h"
22#include "pc/channelmanager.h"
23#include "pc/localaudiosource.h"
24#include "pc/mediastream.h"
25#include "pc/remoteaudiosource.h"
26#include "pc/rtpreceiver.h"
27#include "pc/rtpsender.h"
28#include "pc/streamcollection.h"
29#include "pc/test/fakevideotracksource.h"
30#include "pc/videotrack.h"
31#include "pc/videotracksource.h"
32#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "test/gmock.h"
34#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070035
36using ::testing::_;
37using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070038using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070039using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070040
deadbeef20cb0c12017-02-01 20:27:00 -080041namespace {
42
Seth Hampson845e8782018-03-02 11:34:10 -080043static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070044static const char kVideoTrackId[] = "video_1";
45static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020046static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080047static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020048static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080049static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080050static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080051} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070052
53namespace webrtc {
54
deadbeef20cb0c12017-02-01 20:27:00 -080055class RtpSenderReceiverTest : public testing::Test,
56 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070057 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070058 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080059 : network_thread_(rtc::Thread::Current()),
60 worker_thread_(rtc::Thread::Current()),
61 // Create fake media engine/etc. so we can create channels to use to
62 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070063 media_engine_(new cricket::FakeMediaEngine()),
Steve Antonc9e15602017-11-06 15:40:09 -080064 channel_manager_(rtc::WrapUnique(media_engine_),
65 rtc::MakeUnique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080066 worker_thread_,
67 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010068 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080069 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070070 // Create channels to be used by the RtpSenders and RtpReceivers.
71 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080072 bool srtp_required = true;
Zhi Huange830e682018-03-30 10:48:35 -070073 rtp_dtls_transport_ = rtc::MakeUnique<cricket::FakeDtlsTransport>(
74 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
75 rtp_transport_ = CreateDtlsSrtpTransport();
76
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070078 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
79 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
80 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070081 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070082 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
83 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
84 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080085 voice_channel_->Enable(true);
86 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070087 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
88 video_media_channel_ = media_engine_->GetVideoChannel(0);
89 RTC_CHECK(voice_channel_);
90 RTC_CHECK(video_channel_);
91 RTC_CHECK(voice_media_channel_);
92 RTC_CHECK(video_media_channel_);
93
94 // Create streams for predefined SSRCs. Streams need to exist in order
95 // for the senders and receievers to apply parameters to them.
96 // Normally these would be created by SetLocalDescription and
97 // SetRemoteDescription.
98 voice_media_channel_->AddSendStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
100 voice_media_channel_->AddRecvStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc));
102 voice_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
104 voice_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
106 video_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
108 video_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc));
110 video_media_channel_->AddSendStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
112 video_media_channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700114 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700115
Zhi Huange830e682018-03-30 10:48:35 -0700116 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Zhi Huange830e682018-03-30 10:48:35 -0700117 auto dtls_srtp_transport =
Zhi Huang365381f2018-04-13 16:44:34 -0700118 rtc::MakeUnique<webrtc::DtlsSrtpTransport>(/*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700119 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
120 /*rtcp_dtls_transport=*/nullptr);
121 return dtls_srtp_transport;
122 }
123
deadbeef20cb0c12017-02-01 20:27:00 -0800124 // Needed to use DTMF sender.
125 void AddDtmfCodec() {
126 cricket::AudioSendParameters params;
127 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
128 0, 1);
129 params.codecs.push_back(kTelephoneEventCodec);
130 voice_media_channel_->SetSendParameters(params);
131 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700132
pbos5214a0a2016-12-16 15:39:11 -0800133 void AddVideoTrack() { AddVideoTrack(false); }
134
135 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100136 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800137 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700138 video_track_ =
139 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800140 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700141 }
142
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700143 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
144
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100145 void CreateAudioRtpSender(
146 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700147 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800148 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800149 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700150 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
151 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
152 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800153 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800154 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800155 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
156 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700157 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700158 }
159
Steve Anton02ee47c2018-01-10 16:26:06 -0800160 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700161 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800162 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800163 }
164
deadbeef20cb0c12017-02-01 20:27:00 -0800165 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
166
Seth Hampson2d2c8882018-05-16 16:02:32 -0700167 void CreateVideoRtpSender(uint32_t ssrc) {
168 CreateVideoRtpSender(false, ssrc);
169 }
170
pbos5214a0a2016-12-16 15:39:11 -0800171 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
172
Seth Hampson2d2c8882018-05-16 16:02:32 -0700173 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800174 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700175 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
176 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
177 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800178 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700179 video_rtp_sender_->SetSsrc(ssrc);
180 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700181 }
182
Steve Anton02ee47c2018-01-10 16:26:06 -0800183 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700184 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Steve Anton57858b32018-02-15 15:19:50 -0800185 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800186 }
187
deadbeef70ab1a12015-09-28 16:53:55 -0700188 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700189 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
193 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700194 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700196 }
197
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100198 void CreateAudioRtpReceiver(
199 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
200 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800201 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800202 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800203 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700204 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700205 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700206 }
207
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100208 void CreateVideoRtpReceiver(
209 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800210 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800211 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800212 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800213 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100214 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700215 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700216 }
217
218 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700219 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700221 }
222
223 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700224 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700225 VerifyVideoChannelNoOutput();
226 }
227
228 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
229
230 void VerifyVoiceChannelInput(uint32_t ssrc) {
231 // Verify that the media channel has an audio source, and the stream isn't
232 // muted.
233 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
234 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
235 }
236
237 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
238
239 void VerifyVideoChannelInput(uint32_t ssrc) {
240 // Verify that the media channel has a video source,
241 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
242 }
243
244 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
245
246 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
247 // Verify that the media channel's source is reset.
248 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
249 }
250
251 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
252
253 void VerifyVideoChannelNoInput(uint32_t ssrc) {
254 // Verify that the media channel's source is reset.
255 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
256 }
257
258 void VerifyVoiceChannelOutput() {
259 // Verify that the volume is initialized to 1.
260 double volume;
261 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
262 EXPECT_EQ(1, volume);
263 }
264
265 void VerifyVideoChannelOutput() {
266 // Verify that the media channel has a sink.
267 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
268 }
269
270 void VerifyVoiceChannelNoOutput() {
271 // Verify that the volume is reset to 0.
272 double volume;
273 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
274 EXPECT_EQ(0, volume);
275 }
276
277 void VerifyVideoChannelNoOutput() {
278 // Verify that the media channel's sink is reset.
279 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700280 }
281
282 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800283 rtc::Thread* const network_thread_;
284 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700285 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700286 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
287 // the |channel_manager|.
288 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
289 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800290 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700291 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292 cricket::ChannelManager channel_manager_;
293 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294 cricket::VoiceChannel* voice_channel_;
295 cricket::VideoChannel* video_channel_;
296 cricket::FakeVoiceMediaChannel* voice_media_channel_;
297 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700298 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
299 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
300 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
301 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800302 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700303 rtc::scoped_refptr<VideoTrackInterface> video_track_;
304 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800305 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700306};
307
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700309// and disassociated with an AudioRtpSender.
310TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
311 CreateAudioRtpSender();
312 DestroyAudioRtpSender();
313}
314
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700316// disassociated with a VideoRtpSender.
317TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
318 CreateVideoRtpSender();
319 DestroyVideoRtpSender();
320}
321
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700322// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700323// associated and disassociated with an AudioRtpReceiver.
324TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
325 CreateAudioRtpReceiver();
326 DestroyAudioRtpReceiver();
327}
328
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700329// Test that |video_channel_| is updated when a remote video track is
330// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700331TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
332 CreateVideoRtpReceiver();
333 DestroyVideoRtpReceiver();
334}
335
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100336TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
337 CreateAudioRtpReceiver({local_stream_});
338 DestroyAudioRtpReceiver();
339}
340
341TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
342 CreateVideoRtpReceiver({local_stream_});
343 DestroyVideoRtpReceiver();
344}
345
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700346// Test that the AudioRtpSender applies options from the local audio source.
347TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
348 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100349 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800350 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700352
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100353 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700354
355 DestroyAudioRtpSender();
356}
357
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700358// Test that the stream is muted when the track is disabled, and unmuted when
359// the track is enabled.
360TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
361 CreateAudioRtpSender();
362
363 audio_track_->set_enabled(false);
364 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
365
366 audio_track_->set_enabled(true);
367 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
368
369 DestroyAudioRtpSender();
370}
371
372// Test that the volume is set to 0 when the track is disabled, and back to
373// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700374TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
375 CreateAudioRtpReceiver();
376
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700377 double volume;
378 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
379 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700380
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700381 audio_track_->set_enabled(false);
382 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
383 EXPECT_EQ(0, volume);
384
deadbeef70ab1a12015-09-28 16:53:55 -0700385 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
387 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700388
389 DestroyAudioRtpReceiver();
390}
391
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700392// Currently no action is taken when a remote video track is disabled or
393// enabled, so there's nothing to test here, other than what is normally
394// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700395TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
396 CreateVideoRtpSender();
397
deadbeef70ab1a12015-09-28 16:53:55 -0700398 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700399 video_track_->set_enabled(true);
400
401 DestroyVideoRtpSender();
402}
403
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700404// Test that the state of the video track created by the VideoRtpReceiver is
405// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100406TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
407 CreateVideoRtpReceiver();
408
409 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
410 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
411 video_track_->GetSource()->state());
412
413 DestroyVideoRtpReceiver();
414
415 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
416 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
417 video_track_->GetSource()->state());
418}
419
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700420// Currently no action is taken when a remote video track is disabled or
421// enabled, so there's nothing to test here, other than what is normally
422// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700423TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
424 CreateVideoRtpReceiver();
425
426 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700427 video_track_->set_enabled(true);
428
429 DestroyVideoRtpReceiver();
430}
431
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700432// Test that the AudioRtpReceiver applies volume changes from the track source
433// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700434TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
435 CreateAudioRtpReceiver();
436
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700437 double volume;
438 audio_track_->GetSource()->SetVolume(0.5);
439 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
440 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700441
442 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700443 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700444 audio_track_->GetSource()->SetVolume(0.8);
445 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
446 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700447
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700449 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
451 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700452
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700453 // Try changing volume one more time.
454 audio_track_->GetSource()->SetVolume(0.9);
455 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
456 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700457
458 DestroyAudioRtpReceiver();
459}
460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461// Test that the media channel isn't enabled for sending if the audio sender
462// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800463TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800464 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800465 rtc::scoped_refptr<AudioTrackInterface> track =
466 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467
468 // Track but no SSRC.
469 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
470 VerifyVoiceChannelNoInput();
471
472 // SSRC but no track.
473 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
474 audio_rtp_sender_->SetSsrc(kAudioSsrc);
475 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800476}
477
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700478// Test that the media channel isn't enabled for sending if the video sender
479// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800480TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800481 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482
483 // Track but no SSRC.
484 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
485 VerifyVideoChannelNoInput();
486
487 // SSRC but no track.
488 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
489 video_rtp_sender_->SetSsrc(kVideoSsrc);
490 VerifyVideoChannelNoInput();
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 audio sender
494// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800496 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800497 rtc::scoped_refptr<AudioTrackInterface> track =
498 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 audio_rtp_sender_->SetSsrc(kAudioSsrc);
500 audio_rtp_sender_->SetTrack(track);
501 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800502
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800504}
505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506// Test that the media channel is enabled for sending when the audio sender
507// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800508TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800509 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800510 rtc::scoped_refptr<AudioTrackInterface> track =
511 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 audio_rtp_sender_->SetTrack(track);
513 audio_rtp_sender_->SetSsrc(kAudioSsrc);
514 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800515
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800517}
518
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519// Test that the media channel is enabled for sending when the video sender
520// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800521TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700522 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800523 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524 video_rtp_sender_->SetSsrc(kVideoSsrc);
525 video_rtp_sender_->SetTrack(video_track_);
526 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800529}
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that the media channel is enabled for sending when the video sender
532// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800533TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700534 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800535 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536 video_rtp_sender_->SetTrack(video_track_);
537 video_rtp_sender_->SetSsrc(kVideoSsrc);
538 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800541}
542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543// Test that the media channel stops sending when the audio sender's SSRC is set
544// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800545TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800547
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700548 audio_rtp_sender_->SetSsrc(0);
549 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800550}
551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552// Test that the media channel stops sending when the video sender's SSRC is set
553// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800554TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800556
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700557 audio_rtp_sender_->SetSsrc(0);
558 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800559}
560
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561// Test that the media channel stops sending when the audio sender's track is
562// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800563TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
567 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// Test that the media channel stops sending when the video sender's track is
571// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800572TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800574
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575 video_rtp_sender_->SetSsrc(0);
576 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800577}
578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579// Test that when the audio sender's SSRC is changed, the media channel stops
580// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800581TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800583
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700584 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
585 VerifyVoiceChannelNoInput(kAudioSsrc);
586 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800587
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 audio_rtp_sender_ = nullptr;
589 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800590}
591
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592// Test that when the audio sender's SSRC is changed, the media channel stops
593// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800594TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800596
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 video_rtp_sender_->SetSsrc(kVideoSsrc2);
598 VerifyVideoChannelNoInput(kVideoSsrc);
599 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601 video_rtp_sender_ = nullptr;
602 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800603}
604
skvladdc1c62c2016-03-16 19:07:43 -0700605TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
606 CreateAudioRtpSender();
607
skvladdc1c62c2016-03-16 19:07:43 -0700608 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800610 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700611
612 DestroyAudioRtpSender();
613}
614
Florent Castellicebf50f2018-05-03 15:31:53 +0200615TEST_F(RtpSenderReceiverTest,
616 AudioSenderMustCallGetParametersBeforeSetParameters) {
617 CreateAudioRtpSender();
618
619 RtpParameters params;
620 RTCError result = audio_rtp_sender_->SetParameters(params);
621 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
622
623 DestroyAudioRtpSender();
624}
625
626TEST_F(RtpSenderReceiverTest,
627 AudioSenderSetParametersInvalidatesTransactionId) {
628 CreateAudioRtpSender();
629
630 RtpParameters params = audio_rtp_sender_->GetParameters();
631 EXPECT_EQ(1u, params.encodings.size());
632 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
633 RTCError result = audio_rtp_sender_->SetParameters(params);
634 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
635
636 DestroyAudioRtpSender();
637}
638
639TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
640 CreateAudioRtpSender();
641
642 RtpParameters params = audio_rtp_sender_->GetParameters();
643 params.transaction_id = "";
644 RTCError result = audio_rtp_sender_->SetParameters(params);
645 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
646
647 DestroyAudioRtpSender();
648}
649
650TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
651 CreateAudioRtpSender();
652
653 RtpParameters params = audio_rtp_sender_->GetParameters();
654 EXPECT_NE(params.transaction_id.size(), 0);
655 auto saved_transaction_id = params.transaction_id;
656 params = audio_rtp_sender_->GetParameters();
657 EXPECT_NE(saved_transaction_id, params.transaction_id);
658
659 DestroyAudioRtpSender();
660}
661
662TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
663 CreateAudioRtpSender();
664
665 RtpParameters params = audio_rtp_sender_->GetParameters();
666 RtpParameters second_params = audio_rtp_sender_->GetParameters();
667
668 RTCError result = audio_rtp_sender_->SetParameters(params);
669 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700670 DestroyAudioRtpSender();
671}
672
673TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
674 CreateAudioRtpSender();
675 RtpParameters params = audio_rtp_sender_->GetParameters();
676 EXPECT_EQ(1u, params.encodings.size());
677
678 // Unimplemented RtpParameters: mid, header_extensions,
679 // degredation_preference.
680 params.mid = "dummy_mid";
681 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
682 audio_rtp_sender_->SetParameters(params).type());
683 params = audio_rtp_sender_->GetParameters();
684
Seth Hampson2d2c8882018-05-16 16:02:32 -0700685 ASSERT_EQ(DegradationPreference::BALANCED, params.degradation_preference);
686 params.degradation_preference = DegradationPreference::MAINTAIN_FRAMERATE;
687 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
688 audio_rtp_sender_->SetParameters(params).type());
689
690 DestroyAudioRtpSender();
691}
692
693TEST_F(RtpSenderReceiverTest,
694 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
695 CreateAudioRtpSender();
696 RtpParameters params = audio_rtp_sender_->GetParameters();
697 EXPECT_EQ(1u, params.encodings.size());
698
699 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
700 // max_framerate, scale_resolution_down_by, scale_framerate_down_by, rid,
701 // dependency_rids.
702 params.encodings[0].codec_payload_type = 1;
703 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
704 audio_rtp_sender_->SetParameters(params).type());
705 params = audio_rtp_sender_->GetParameters();
706
707 params.encodings[0].fec = RtpFecParameters();
708 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
709 audio_rtp_sender_->SetParameters(params).type());
710 params = audio_rtp_sender_->GetParameters();
711
712 params.encodings[0].rtx = RtpRtxParameters();
713 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
714 audio_rtp_sender_->SetParameters(params).type());
715 params = audio_rtp_sender_->GetParameters();
716
717 params.encodings[0].dtx = DtxStatus::ENABLED;
718 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
719 audio_rtp_sender_->SetParameters(params).type());
720 params = audio_rtp_sender_->GetParameters();
721
722 params.encodings[0].ptime = 1;
723 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
724 audio_rtp_sender_->SetParameters(params).type());
725 params = audio_rtp_sender_->GetParameters();
726
727 params.encodings[0].max_framerate = 1;
728 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
729 audio_rtp_sender_->SetParameters(params).type());
730 params = audio_rtp_sender_->GetParameters();
731
732 params.encodings[0].scale_resolution_down_by = 2.0;
733 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
734 audio_rtp_sender_->SetParameters(params).type());
735 params = audio_rtp_sender_->GetParameters();
736
737 params.encodings[0].rid = "dummy_rid";
738 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
739 audio_rtp_sender_->SetParameters(params).type());
740 params = audio_rtp_sender_->GetParameters();
741
742 params.encodings[0].dependency_rids.push_back("dummy_rid");
743 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
744 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200745
746 DestroyAudioRtpSender();
747}
748
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700749TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
750 CreateAudioRtpSender();
751
752 EXPECT_EQ(-1, voice_media_channel_->max_bps());
753 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
754 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800755 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100756 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800757 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700758
759 // Read back the parameters and verify they have been changed.
760 params = audio_rtp_sender_->GetParameters();
761 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100762 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763
764 // Verify that the audio channel received the new parameters.
765 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
766 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100767 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700768
769 // Verify that the global bitrate limit has not been changed.
770 EXPECT_EQ(-1, voice_media_channel_->max_bps());
771
772 DestroyAudioRtpSender();
773}
774
Seth Hampson24722b32017-12-22 09:36:42 -0800775TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
776 CreateAudioRtpSender();
777
778 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
779 EXPECT_EQ(1, params.encodings.size());
780 EXPECT_EQ(webrtc::kDefaultBitratePriority,
781 params.encodings[0].bitrate_priority);
782 double new_bitrate_priority = 2.0;
783 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800784 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800785
786 params = audio_rtp_sender_->GetParameters();
787 EXPECT_EQ(1, params.encodings.size());
788 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
789
790 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
791 EXPECT_EQ(1, params.encodings.size());
792 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
793
794 DestroyAudioRtpSender();
795}
796
skvladdc1c62c2016-03-16 19:07:43 -0700797TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
798 CreateVideoRtpSender();
799
skvladdc1c62c2016-03-16 19:07:43 -0700800 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700801 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800802 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700803
804 DestroyVideoRtpSender();
805}
806
Florent Castellicebf50f2018-05-03 15:31:53 +0200807TEST_F(RtpSenderReceiverTest,
808 VideoSenderMustCallGetParametersBeforeSetParameters) {
809 CreateVideoRtpSender();
810
811 RtpParameters params;
812 RTCError result = video_rtp_sender_->SetParameters(params);
813 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
814
815 DestroyVideoRtpSender();
816}
817
818TEST_F(RtpSenderReceiverTest,
819 VideoSenderSetParametersInvalidatesTransactionId) {
820 CreateVideoRtpSender();
821
822 RtpParameters params = video_rtp_sender_->GetParameters();
823 EXPECT_EQ(1u, params.encodings.size());
824 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
825 RTCError result = video_rtp_sender_->SetParameters(params);
826 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
827
828 DestroyVideoRtpSender();
829}
830
831TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
832 CreateVideoRtpSender();
833
834 RtpParameters params = video_rtp_sender_->GetParameters();
835 params.transaction_id = "";
836 RTCError result = video_rtp_sender_->SetParameters(params);
837 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
838
839 DestroyVideoRtpSender();
840}
841
842TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
843 CreateVideoRtpSender();
844
845 RtpParameters params = video_rtp_sender_->GetParameters();
846 EXPECT_NE(params.transaction_id.size(), 0);
847 auto saved_transaction_id = params.transaction_id;
848 params = video_rtp_sender_->GetParameters();
849 EXPECT_NE(saved_transaction_id, params.transaction_id);
850
851 DestroyVideoRtpSender();
852}
853
854TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
855 CreateVideoRtpSender();
856
857 RtpParameters params = video_rtp_sender_->GetParameters();
858 RtpParameters second_params = video_rtp_sender_->GetParameters();
859
860 RTCError result = video_rtp_sender_->SetParameters(params);
861 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
862
863 DestroyVideoRtpSender();
864}
865
Seth Hampson2d2c8882018-05-16 16:02:32 -0700866TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
867 CreateVideoRtpSender();
868 RtpParameters params = video_rtp_sender_->GetParameters();
869 EXPECT_EQ(1u, params.encodings.size());
870
871 // Unimplemented RtpParameters: mid, header_extensions,
872 // degredation_preference.
873 params.mid = "dummy_mid";
874 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
875 video_rtp_sender_->SetParameters(params).type());
876 params = video_rtp_sender_->GetParameters();
877
Seth Hampson2d2c8882018-05-16 16:02:32 -0700878 ASSERT_EQ(DegradationPreference::BALANCED, params.degradation_preference);
879 params.degradation_preference = DegradationPreference::MAINTAIN_FRAMERATE;
880 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
881 video_rtp_sender_->SetParameters(params).type());
882
883 DestroyVideoRtpSender();
884}
885
886TEST_F(RtpSenderReceiverTest,
887 VideoSenderCantSetUnimplementedEncodingParameters) {
888 CreateVideoRtpSender();
889 RtpParameters params = video_rtp_sender_->GetParameters();
890 EXPECT_EQ(1u, params.encodings.size());
891
892 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
893 // max_framerate, scale_resolution_down_by, scale_framerate_down_by, rid,
894 // dependency_rids.
895 params.encodings[0].codec_payload_type = 1;
896 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
897 video_rtp_sender_->SetParameters(params).type());
898 params = video_rtp_sender_->GetParameters();
899
900 params.encodings[0].fec = RtpFecParameters();
901 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
902 video_rtp_sender_->SetParameters(params).type());
903 params = video_rtp_sender_->GetParameters();
904
905 params.encodings[0].rtx = RtpRtxParameters();
906 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
907 video_rtp_sender_->SetParameters(params).type());
908 params = video_rtp_sender_->GetParameters();
909
910 params.encodings[0].dtx = DtxStatus::ENABLED;
911 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
912 video_rtp_sender_->SetParameters(params).type());
913 params = video_rtp_sender_->GetParameters();
914
915 params.encodings[0].ptime = 1;
916 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
917 video_rtp_sender_->SetParameters(params).type());
918 params = video_rtp_sender_->GetParameters();
919
920 params.encodings[0].max_framerate = 1;
921 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
922 video_rtp_sender_->SetParameters(params).type());
923 params = video_rtp_sender_->GetParameters();
924
925 params.encodings[0].scale_resolution_down_by = 2.0;
926 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
927 video_rtp_sender_->SetParameters(params).type());
928 params = video_rtp_sender_->GetParameters();
929
930 params.encodings[0].rid = "dummy_rid";
931 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
932 video_rtp_sender_->SetParameters(params).type());
933 params = video_rtp_sender_->GetParameters();
934
935 params.encodings[0].dependency_rids.push_back("dummy_rid");
936 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
937 video_rtp_sender_->SetParameters(params).type());
938
939 DestroyVideoRtpSender();
940}
941
942// A video sender can have multiple simulcast layers, in which case it will
943// contain multiple RtpEncodingParameters. This tests that if this is the case
944// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
945// for any encodings besides at index 0, because these are both implemented
946// "per-sender."
947TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
948 // Add a simulcast specific send stream that contains 2 encoding parameters.
949 std::vector<uint32_t> ssrcs({1, 2});
950 cricket::StreamParams stream_params =
951 cricket::CreateSimStreamParams("cname", ssrcs);
952 video_media_channel_->AddSendStream(stream_params);
953 uint32_t primary_ssrc = stream_params.first_ssrc();
954 CreateVideoRtpSender(primary_ssrc);
955 RtpParameters params = video_rtp_sender_->GetParameters();
956 EXPECT_EQ(ssrcs.size(), params.encodings.size());
957
958 params.encodings[1].bitrate_priority = 2.0;
959 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
960 video_rtp_sender_->SetParameters(params).type());
961 params = video_rtp_sender_->GetParameters();
962
Seth Hampson2d2c8882018-05-16 16:02:32 -0700963 DestroyVideoRtpSender();
964}
965
Ă…sa Persson55659812018-06-18 17:51:32 +0200966TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700967 CreateVideoRtpSender();
968
969 EXPECT_EQ(-1, video_media_channel_->max_bps());
970 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
971 EXPECT_EQ(1, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200972 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -0800973 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +0200974 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100975 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800976 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700977
978 // Read back the parameters and verify they have been changed.
979 params = video_rtp_sender_->GetParameters();
980 EXPECT_EQ(1, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200981 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100982 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700983
984 // Verify that the video channel received the new parameters.
985 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
986 EXPECT_EQ(1, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200987 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100988 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700989
990 // Verify that the global bitrate limit has not been changed.
991 EXPECT_EQ(-1, video_media_channel_->max_bps());
992
993 DestroyVideoRtpSender();
994}
995
Ă…sa Persson55659812018-06-18 17:51:32 +0200996TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
997 // Add a simulcast specific send stream that contains 2 encoding parameters.
998 std::vector<uint32_t> ssrcs({1, 2});
999 cricket::StreamParams stream_params =
1000 cricket::CreateSimStreamParams("cname", ssrcs);
1001 video_media_channel_->AddSendStream(stream_params);
1002 uint32_t primary_ssrc = stream_params.first_ssrc();
1003 CreateVideoRtpSender(primary_ssrc);
1004
1005 RtpParameters params = video_rtp_sender_->GetParameters();
1006 EXPECT_EQ(ssrcs.size(), params.encodings.size());
1007 params.encodings[0].min_bitrate_bps = 100;
1008 params.encodings[0].max_bitrate_bps = 1000;
1009 params.encodings[1].min_bitrate_bps = 200;
1010 params.encodings[1].max_bitrate_bps = 2000;
1011 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1012
1013 // Verify that the video channel received the new parameters.
1014 params = video_media_channel_->GetRtpSendParameters(primary_ssrc);
1015 EXPECT_EQ(ssrcs.size(), params.encodings.size());
1016 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1017 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1018 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1019 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1020
1021 DestroyVideoRtpSender();
1022}
1023
Seth Hampson24722b32017-12-22 09:36:42 -08001024TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1025 CreateVideoRtpSender();
1026
1027 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1028 EXPECT_EQ(1, params.encodings.size());
1029 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1030 params.encodings[0].bitrate_priority);
1031 double new_bitrate_priority = 2.0;
1032 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001033 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001034
1035 params = video_rtp_sender_->GetParameters();
1036 EXPECT_EQ(1, params.encodings.size());
1037 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1038
1039 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
1040 EXPECT_EQ(1, params.encodings.size());
1041 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1042
1043 DestroyVideoRtpSender();
1044}
1045
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001046TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1047 CreateAudioRtpReceiver();
1048
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001049 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001050 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001051 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1052
1053 DestroyAudioRtpReceiver();
1054}
1055
1056TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1057 CreateVideoRtpReceiver();
1058
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001059 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001060 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001061 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1062
1063 DestroyVideoRtpReceiver();
1064}
1065
pbos5214a0a2016-12-16 15:39:11 -08001066// Test that makes sure that a video track content hint translates to the proper
1067// value for sources that are not screencast.
1068TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1069 CreateVideoRtpSender();
1070
1071 video_track_->set_enabled(true);
1072
1073 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001074 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001075 // No content hint should be set by default.
1076 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1077 video_track_->content_hint());
1078 // Setting detailed should turn a non-screencast source into screencast mode.
1079 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001080 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001081 // Removing the content hint should turn the track back into non-screencast
1082 // mode.
1083 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001084 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001085 // Setting fluid should remain in non-screencast mode (its default).
1086 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001087 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001088 // Setting text should have the same effect as Detailed
1089 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1090 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001091
1092 DestroyVideoRtpSender();
1093}
1094
1095// Test that makes sure that a video track content hint translates to the proper
1096// value for screencast sources.
1097TEST_F(RtpSenderReceiverTest,
1098 PropagatesVideoTrackContentHintForScreencastSource) {
1099 CreateVideoRtpSender(true);
1100
1101 video_track_->set_enabled(true);
1102
1103 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001104 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001105 // No content hint should be set by default.
1106 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1107 video_track_->content_hint());
1108 // Setting fluid should turn a screencast source into non-screencast mode.
1109 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001110 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001111 // Removing the content hint should turn the track back into screencast mode.
1112 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001113 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001114 // Setting detailed should still remain in screencast mode (its default).
1115 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001116 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001117 // Setting text should have the same effect as Detailed
1118 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1119 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001120
1121 DestroyVideoRtpSender();
1122}
1123
1124// Test that makes sure any content hints that are set on a track before
1125// VideoRtpSender is ready to send are still applied when it gets ready to send.
1126TEST_F(RtpSenderReceiverTest,
1127 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1128 AddVideoTrack();
1129 // Setting detailed overrides the default non-screencast mode. This should be
1130 // applied even if the track is set on construction.
1131 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001132 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1133 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1134 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -08001135 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001136 video_track_->set_enabled(true);
1137
1138 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001139 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001140
1141 // Verify that the content hint is accounted for when video_rtp_sender_ does
1142 // get enabled.
1143 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001144 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001145
1146 // And removing the hint should go back to false (to verify that false was
1147 // default correctly).
1148 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001149 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001150
1151 DestroyVideoRtpSender();
1152}
1153
deadbeef20cb0c12017-02-01 20:27:00 -08001154TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1155 CreateAudioRtpSender();
1156 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1157}
1158
1159TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1160 CreateVideoRtpSender();
1161 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1162}
1163
1164// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1165// true/false from CanSendDtmf based on what |voice_channel_| returns.
1166TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1167 AddDtmfCodec();
1168 CreateAudioRtpSender();
1169 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1170 ASSERT_NE(nullptr, dtmf_sender);
1171 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1172}
1173
1174TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1175 CreateAudioRtpSender();
1176 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1177 ASSERT_NE(nullptr, dtmf_sender);
1178 // DTMF codec has not been added, as it was in the above test.
1179 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1180}
1181
1182TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1183 AddDtmfCodec();
1184 CreateAudioRtpSender();
1185 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1186 ASSERT_NE(nullptr, dtmf_sender);
1187
1188 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1189
1190 // Insert DTMF
1191 const int expected_duration = 90;
1192 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1193
1194 // Verify
1195 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1196 kDefaultTimeout);
1197 const uint32_t send_ssrc =
1198 voice_media_channel_->send_streams()[0].first_ssrc();
1199 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1200 send_ssrc, 0, expected_duration));
1201 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1202 send_ssrc, 1, expected_duration));
1203 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1204 send_ssrc, 2, expected_duration));
1205}
1206
1207// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1208// destroyed, which is needed for the DTMF sender.
1209TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1210 CreateAudioRtpSender();
1211 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1212 audio_rtp_sender_ = nullptr;
1213 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1214}
1215
deadbeef70ab1a12015-09-28 16:53:55 -07001216} // namespace webrtc