blob: 07ff6a3865446474a2186e2b691e8ffc9ca90344 [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"
Benjamin Wright84583f62018-10-04 14:22:34 -070016#include "api/test/fake_frame_decryptor.h"
17#include "api/test/fake_frame_encryptor.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080019#include "media/base/rtpdataengine.h"
Seth Hampson2d2c8882018-05-16 16:02:32 -070020#include "media/base/testutils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 10:48:35 -070022#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "pc/audiotrack.h"
24#include "pc/channelmanager.h"
25#include "pc/localaudiosource.h"
26#include "pc/mediastream.h"
27#include "pc/remoteaudiosource.h"
28#include "pc/rtpreceiver.h"
29#include "pc/rtpsender.h"
30#include "pc/streamcollection.h"
31#include "pc/test/fakevideotracksource.h"
32#include "pc/videotrack.h"
33#include "pc/videotracksource.h"
34#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "test/gmock.h"
36#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070037
38using ::testing::_;
39using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070040using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070041using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070042
deadbeef20cb0c12017-02-01 20:27:00 -080043namespace {
44
Seth Hampson845e8782018-03-02 11:34:10 -080045static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070046static const char kVideoTrackId[] = "video_1";
47static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020048static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080049static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020050static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080051static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020052static const uint32_t kVideoSsrcSimulcast = 102;
53static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080054static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080055} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070056
57namespace webrtc {
58
deadbeef20cb0c12017-02-01 20:27:00 -080059class RtpSenderReceiverTest : public testing::Test,
60 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070061 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070062 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080063 : network_thread_(rtc::Thread::Current()),
64 worker_thread_(rtc::Thread::Current()),
65 // Create fake media engine/etc. so we can create channels to use to
66 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070067 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020068 channel_manager_(absl::WrapUnique(media_engine_),
69 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080070 worker_thread_,
71 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010072 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080073 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070074 // Create channels to be used by the RtpSenders and RtpReceivers.
75 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080076 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +020077 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -070078 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
79 rtp_transport_ = CreateDtlsSrtpTransport();
80
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070081 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070082 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
83 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
Oleh Prypin8f4bc412018-10-11 21:10:39 +000084 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070085 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070086 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
87 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
Oleh Prypin8f4bc412018-10-11 21:10:39 +000088 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080089 voice_channel_->Enable(true);
90 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070091 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
92 video_media_channel_ = media_engine_->GetVideoChannel(0);
93 RTC_CHECK(voice_channel_);
94 RTC_CHECK(video_channel_);
95 RTC_CHECK(voice_media_channel_);
96 RTC_CHECK(video_media_channel_);
97
98 // Create streams for predefined SSRCs. Streams need to exist in order
99 // for the senders and receievers to apply parameters to them.
100 // Normally these would be created by SetLocalDescription and
101 // SetRemoteDescription.
102 voice_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc));
104 voice_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc));
106 voice_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
108 voice_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
110 video_media_channel_->AddSendStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc));
112 video_media_channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc));
114 video_media_channel_->AddSendStream(
115 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
116 video_media_channel_->AddRecvStream(
117 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700118 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700119
Zhi Huange830e682018-03-30 10:48:35 -0700120 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200121 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
122 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700123 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
124 /*rtcp_dtls_transport=*/nullptr);
125 return dtls_srtp_transport;
126 }
127
deadbeef20cb0c12017-02-01 20:27:00 -0800128 // Needed to use DTMF sender.
129 void AddDtmfCodec() {
130 cricket::AudioSendParameters params;
131 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
132 0, 1);
133 params.codecs.push_back(kTelephoneEventCodec);
134 voice_media_channel_->SetSendParameters(params);
135 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700136
pbos5214a0a2016-12-16 15:39:11 -0800137 void AddVideoTrack() { AddVideoTrack(false); }
138
139 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100140 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800141 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700142 video_track_ =
143 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800144 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700145 }
146
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700147 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
148
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100149 void CreateAudioRtpSender(
150 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700151 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800152 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800153 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700154 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
155 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
156 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800157 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800158 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800159 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
160 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700161 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
Steve Anton02ee47c2018-01-10 16:26:06 -0800164 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700165 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800166 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800167 }
168
deadbeef20cb0c12017-02-01 20:27:00 -0800169 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
170
Seth Hampson2d2c8882018-05-16 16:02:32 -0700171 void CreateVideoRtpSender(uint32_t ssrc) {
172 CreateVideoRtpSender(false, ssrc);
173 }
174
pbos5214a0a2016-12-16 15:39:11 -0800175 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
176
Florent Castelli892acf02018-10-01 22:47:20 +0200177 void CreateVideoRtpSenderWithSimulcast(
178 int num_layers = kVideoSimulcastLayerCount) {
179 std::vector<uint32_t> ssrcs;
180 for (int i = 0; i < num_layers; ++i)
181 ssrcs.push_back(kVideoSsrcSimulcast + i);
182 cricket::StreamParams stream_params =
183 cricket::CreateSimStreamParams("cname", ssrcs);
184 video_media_channel_->AddSendStream(stream_params);
185 uint32_t primary_ssrc = stream_params.first_ssrc();
186 CreateVideoRtpSender(primary_ssrc);
187 }
188
Seth Hampson2d2c8882018-05-16 16:02:32 -0700189 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800190 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700191 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
192 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
193 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800194 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700195 video_rtp_sender_->SetSsrc(ssrc);
196 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700197 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800198 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700199 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Steve Anton57858b32018-02-15 15:19:50 -0800200 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800201 }
202
deadbeef70ab1a12015-09-28 16:53:55 -0700203 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700204 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700205 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700206 }
207
208 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700209 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700210 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700211 }
212
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100213 void CreateAudioRtpReceiver(
214 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
215 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800216 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800217 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800218 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700219 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700221 }
222
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100223 void CreateVideoRtpReceiver(
224 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800225 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800226 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800227 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800228 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100229 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700230 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700231 }
232
233 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700234 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700235 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700236 }
237
238 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700239 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700240 VerifyVideoChannelNoOutput();
241 }
242
243 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
244
245 void VerifyVoiceChannelInput(uint32_t ssrc) {
246 // Verify that the media channel has an audio source, and the stream isn't
247 // muted.
248 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
249 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
250 }
251
252 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
253
254 void VerifyVideoChannelInput(uint32_t ssrc) {
255 // Verify that the media channel has a video source,
256 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
257 }
258
259 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
260
261 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
262 // Verify that the media channel's source is reset.
263 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
264 }
265
266 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
267
268 void VerifyVideoChannelNoInput(uint32_t ssrc) {
269 // Verify that the media channel's source is reset.
270 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
271 }
272
273 void VerifyVoiceChannelOutput() {
274 // Verify that the volume is initialized to 1.
275 double volume;
276 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
277 EXPECT_EQ(1, volume);
278 }
279
280 void VerifyVideoChannelOutput() {
281 // Verify that the media channel has a sink.
282 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
283 }
284
285 void VerifyVoiceChannelNoOutput() {
286 // Verify that the volume is reset to 0.
287 double volume;
288 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
289 EXPECT_EQ(0, volume);
290 }
291
292 void VerifyVideoChannelNoOutput() {
293 // Verify that the media channel's sink is reset.
294 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700295 }
296
297 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800298 rtc::Thread* const network_thread_;
299 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700300 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700301 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
302 // the |channel_manager|.
303 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
304 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800305 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700306 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700307 cricket::ChannelManager channel_manager_;
308 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700309 cricket::VoiceChannel* voice_channel_;
310 cricket::VideoChannel* video_channel_;
311 cricket::FakeVoiceMediaChannel* voice_media_channel_;
312 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700313 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
314 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
315 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
316 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800317 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700318 rtc::scoped_refptr<VideoTrackInterface> video_track_;
319 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800320 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700321};
322
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700323// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700324// and disassociated with an AudioRtpSender.
325TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
326 CreateAudioRtpSender();
327 DestroyAudioRtpSender();
328}
329
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700330// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700331// disassociated with a VideoRtpSender.
332TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
333 CreateVideoRtpSender();
334 DestroyVideoRtpSender();
335}
336
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700337// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700338// associated and disassociated with an AudioRtpReceiver.
339TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
340 CreateAudioRtpReceiver();
341 DestroyAudioRtpReceiver();
342}
343
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700344// Test that |video_channel_| is updated when a remote video track is
345// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700346TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
347 CreateVideoRtpReceiver();
348 DestroyVideoRtpReceiver();
349}
350
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100351TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
352 CreateAudioRtpReceiver({local_stream_});
353 DestroyAudioRtpReceiver();
354}
355
356TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
357 CreateVideoRtpReceiver({local_stream_});
358 DestroyVideoRtpReceiver();
359}
360
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700361// Test that the AudioRtpSender applies options from the local audio source.
362TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
363 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100364 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800365 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700366 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700367
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100368 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700369
370 DestroyAudioRtpSender();
371}
372
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700373// Test that the stream is muted when the track is disabled, and unmuted when
374// the track is enabled.
375TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
376 CreateAudioRtpSender();
377
378 audio_track_->set_enabled(false);
379 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
380
381 audio_track_->set_enabled(true);
382 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
383
384 DestroyAudioRtpSender();
385}
386
387// Test that the volume is set to 0 when the track is disabled, and back to
388// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700389TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
390 CreateAudioRtpReceiver();
391
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700392 double volume;
393 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
394 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700395
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700396 audio_track_->set_enabled(false);
397 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
398 EXPECT_EQ(0, volume);
399
deadbeef70ab1a12015-09-28 16:53:55 -0700400 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700401 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
402 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700403
404 DestroyAudioRtpReceiver();
405}
406
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700407// Currently no action is taken when a remote video track is disabled or
408// enabled, so there's nothing to test here, other than what is normally
409// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700410TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
411 CreateVideoRtpSender();
412
deadbeef70ab1a12015-09-28 16:53:55 -0700413 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700414 video_track_->set_enabled(true);
415
416 DestroyVideoRtpSender();
417}
418
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419// Test that the state of the video track created by the VideoRtpReceiver is
420// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100421TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
422 CreateVideoRtpReceiver();
423
424 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
425 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
426 video_track_->GetSource()->state());
427
428 DestroyVideoRtpReceiver();
429
430 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
431 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
432 video_track_->GetSource()->state());
433}
434
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700435// Currently no action is taken when a remote video track is disabled or
436// enabled, so there's nothing to test here, other than what is normally
437// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700438TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
439 CreateVideoRtpReceiver();
440
441 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700442 video_track_->set_enabled(true);
443
444 DestroyVideoRtpReceiver();
445}
446
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700447// Test that the AudioRtpReceiver applies volume changes from the track source
448// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700449TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
450 CreateAudioRtpReceiver();
451
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700452 double volume;
453 audio_track_->GetSource()->SetVolume(0.5);
454 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
455 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700456
457 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700458 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700459 audio_track_->GetSource()->SetVolume(0.8);
460 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
461 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700462
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700463 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700464 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700465 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
466 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700467
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700468 // Try changing volume one more time.
469 audio_track_->GetSource()->SetVolume(0.9);
470 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
471 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700472
473 DestroyAudioRtpReceiver();
474}
475
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700476// Test that the media channel isn't enabled for sending if the audio sender
477// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800478TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800479 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800480 rtc::scoped_refptr<AudioTrackInterface> track =
481 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482
483 // Track but no SSRC.
484 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
485 VerifyVoiceChannelNoInput();
486
487 // SSRC but no track.
488 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
489 audio_rtp_sender_->SetSsrc(kAudioSsrc);
490 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that the media channel isn't enabled for sending if the video sender
494// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800496 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497
498 // Track but no SSRC.
499 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
500 VerifyVideoChannelNoInput();
501
502 // SSRC but no track.
503 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
504 video_rtp_sender_->SetSsrc(kVideoSsrc);
505 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800506}
507
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700508// Test that the media channel is enabled for sending when the audio sender
509// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800510TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800511 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800512 rtc::scoped_refptr<AudioTrackInterface> track =
513 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700514 audio_rtp_sender_->SetSsrc(kAudioSsrc);
515 audio_rtp_sender_->SetTrack(track);
516 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800519}
520
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700521// Test that the media channel is enabled for sending when the audio sender
522// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800523TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800524 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800525 rtc::scoped_refptr<AudioTrackInterface> track =
526 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527 audio_rtp_sender_->SetTrack(track);
528 audio_rtp_sender_->SetSsrc(kAudioSsrc);
529 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800532}
533
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700534// Test that the media channel is enabled for sending when the video sender
535// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800536TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700537 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800538 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 video_rtp_sender_->SetSsrc(kVideoSsrc);
540 video_rtp_sender_->SetTrack(video_track_);
541 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800544}
545
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546// Test that the media channel is enabled for sending when the video sender
547// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800548TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700549 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800550 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551 video_rtp_sender_->SetTrack(video_track_);
552 video_rtp_sender_->SetSsrc(kVideoSsrc);
553 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800556}
557
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700558// Test that the media channel stops sending when the audio sender's SSRC is set
559// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800560TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800562
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563 audio_rtp_sender_->SetSsrc(0);
564 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800565}
566
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700567// Test that the media channel stops sending when the video sender's SSRC is set
568// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800569TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800571
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572 audio_rtp_sender_->SetSsrc(0);
573 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800574}
575
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700576// Test that the media channel stops sending when the audio sender's track is
577// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800578TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800580
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
582 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800583}
584
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700585// Test that the media channel stops sending when the video sender's track is
586// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800587TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 video_rtp_sender_->SetSsrc(0);
591 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800592}
593
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700594// Test that when the audio sender's SSRC is changed, the media channel stops
595// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800596TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800598
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700599 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
600 VerifyVoiceChannelNoInput(kAudioSsrc);
601 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800602
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700603 audio_rtp_sender_ = nullptr;
604 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800605}
606
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700607// Test that when the audio sender's SSRC is changed, the media channel stops
608// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800609TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800611
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700612 video_rtp_sender_->SetSsrc(kVideoSsrc2);
613 VerifyVideoChannelNoInput(kVideoSsrc);
614 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800615
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700616 video_rtp_sender_ = nullptr;
617 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800618}
619
skvladdc1c62c2016-03-16 19:07:43 -0700620TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
621 CreateAudioRtpSender();
622
skvladdc1c62c2016-03-16 19:07:43 -0700623 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700624 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800625 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700626
627 DestroyAudioRtpSender();
628}
629
Florent Castelli892acf02018-10-01 22:47:20 +0200630TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
631 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
632
633 RtpParameters params = audio_rtp_sender_->GetParameters();
634 ASSERT_EQ(1u, params.encodings.size());
635 params.encodings[0].max_bitrate_bps = 90000;
636 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
637
638 params = audio_rtp_sender_->GetParameters();
639 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
640 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
641
642 DestroyAudioRtpSender();
643}
644
645TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
646 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
647 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
648
649 audio_rtp_sender_ =
650 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
651 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
652 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
653
654 std::vector<RtpEncodingParameters> init_encodings(1);
655 init_encodings[0].max_bitrate_bps = 60000;
656 audio_rtp_sender_->set_init_send_encodings(init_encodings);
657
658 RtpParameters params = audio_rtp_sender_->GetParameters();
659 ASSERT_EQ(1u, params.encodings.size());
660 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
661
662 // Simulate the setLocalDescription call
663 std::vector<uint32_t> ssrcs(1, 1);
664 cricket::StreamParams stream_params =
665 cricket::CreateSimStreamParams("cname", ssrcs);
666 voice_media_channel_->AddSendStream(stream_params);
667 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
668 audio_rtp_sender_->SetSsrc(1);
669
670 params = audio_rtp_sender_->GetParameters();
671 ASSERT_EQ(1u, params.encodings.size());
672 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
673
674 DestroyAudioRtpSender();
675}
676
677TEST_F(RtpSenderReceiverTest,
678 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
679 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
680
681 RtpParameters params;
682 RTCError result = audio_rtp_sender_->SetParameters(params);
683 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
684 DestroyAudioRtpSender();
685}
686
Florent Castellicebf50f2018-05-03 15:31:53 +0200687TEST_F(RtpSenderReceiverTest,
688 AudioSenderMustCallGetParametersBeforeSetParameters) {
689 CreateAudioRtpSender();
690
691 RtpParameters params;
692 RTCError result = audio_rtp_sender_->SetParameters(params);
693 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
694
695 DestroyAudioRtpSender();
696}
697
698TEST_F(RtpSenderReceiverTest,
699 AudioSenderSetParametersInvalidatesTransactionId) {
700 CreateAudioRtpSender();
701
702 RtpParameters params = audio_rtp_sender_->GetParameters();
703 EXPECT_EQ(1u, params.encodings.size());
704 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
705 RTCError result = audio_rtp_sender_->SetParameters(params);
706 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
707
708 DestroyAudioRtpSender();
709}
710
711TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
712 CreateAudioRtpSender();
713
714 RtpParameters params = audio_rtp_sender_->GetParameters();
715 params.transaction_id = "";
716 RTCError result = audio_rtp_sender_->SetParameters(params);
717 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
718
719 DestroyAudioRtpSender();
720}
721
722TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
723 CreateAudioRtpSender();
724
725 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200726 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200727 auto saved_transaction_id = params.transaction_id;
728 params = audio_rtp_sender_->GetParameters();
729 EXPECT_NE(saved_transaction_id, params.transaction_id);
730
731 DestroyAudioRtpSender();
732}
733
734TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
735 CreateAudioRtpSender();
736
737 RtpParameters params = audio_rtp_sender_->GetParameters();
738 RtpParameters second_params = audio_rtp_sender_->GetParameters();
739
740 RTCError result = audio_rtp_sender_->SetParameters(params);
741 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700742 DestroyAudioRtpSender();
743}
744
745TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
746 CreateAudioRtpSender();
747 RtpParameters params = audio_rtp_sender_->GetParameters();
748 EXPECT_EQ(1u, params.encodings.size());
749
Florent Castelli87b3c512018-07-18 16:00:28 +0200750 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700751 params.mid = "dummy_mid";
752 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
753 audio_rtp_sender_->SetParameters(params).type());
754 params = audio_rtp_sender_->GetParameters();
755
Seth Hampson2d2c8882018-05-16 16:02:32 -0700756 DestroyAudioRtpSender();
757}
758
759TEST_F(RtpSenderReceiverTest,
760 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
761 CreateAudioRtpSender();
762 RtpParameters params = audio_rtp_sender_->GetParameters();
763 EXPECT_EQ(1u, params.encodings.size());
764
765 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200766 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -0700767 params.encodings[0].codec_payload_type = 1;
768 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
769 audio_rtp_sender_->SetParameters(params).type());
770 params = audio_rtp_sender_->GetParameters();
771
772 params.encodings[0].fec = RtpFecParameters();
773 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
774 audio_rtp_sender_->SetParameters(params).type());
775 params = audio_rtp_sender_->GetParameters();
776
777 params.encodings[0].rtx = RtpRtxParameters();
778 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
779 audio_rtp_sender_->SetParameters(params).type());
780 params = audio_rtp_sender_->GetParameters();
781
782 params.encodings[0].dtx = DtxStatus::ENABLED;
783 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
784 audio_rtp_sender_->SetParameters(params).type());
785 params = audio_rtp_sender_->GetParameters();
786
787 params.encodings[0].ptime = 1;
788 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
789 audio_rtp_sender_->SetParameters(params).type());
790 params = audio_rtp_sender_->GetParameters();
791
Seth Hampson2d2c8882018-05-16 16:02:32 -0700792 params.encodings[0].scale_resolution_down_by = 2.0;
793 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
794 audio_rtp_sender_->SetParameters(params).type());
795 params = audio_rtp_sender_->GetParameters();
796
797 params.encodings[0].rid = "dummy_rid";
798 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
799 audio_rtp_sender_->SetParameters(params).type());
800 params = audio_rtp_sender_->GetParameters();
801
802 params.encodings[0].dependency_rids.push_back("dummy_rid");
803 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
804 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200805
806 DestroyAudioRtpSender();
807}
808
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700809TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
810 CreateAudioRtpSender();
811
812 EXPECT_EQ(-1, voice_media_channel_->max_bps());
813 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200814 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800815 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100816 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800817 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700818
819 // Read back the parameters and verify they have been changed.
820 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200821 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100822 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700823
824 // Verify that the audio channel received the new parameters.
825 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200826 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100827 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700828
829 // Verify that the global bitrate limit has not been changed.
830 EXPECT_EQ(-1, voice_media_channel_->max_bps());
831
832 DestroyAudioRtpSender();
833}
834
Seth Hampson24722b32017-12-22 09:36:42 -0800835TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
836 CreateAudioRtpSender();
837
838 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200839 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800840 EXPECT_EQ(webrtc::kDefaultBitratePriority,
841 params.encodings[0].bitrate_priority);
842 double new_bitrate_priority = 2.0;
843 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800844 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800845
846 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200847 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800848 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
849
850 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200851 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800852 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
853
854 DestroyAudioRtpSender();
855}
856
skvladdc1c62c2016-03-16 19:07:43 -0700857TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
858 CreateVideoRtpSender();
859
skvladdc1c62c2016-03-16 19:07:43 -0700860 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700861 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800862 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700863
864 DestroyVideoRtpSender();
865}
866
Florent Castelli892acf02018-10-01 22:47:20 +0200867TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
868 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
869
870 RtpParameters params = video_rtp_sender_->GetParameters();
871 ASSERT_EQ(1u, params.encodings.size());
872 params.encodings[0].max_bitrate_bps = 90000;
873 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
874
875 params = video_rtp_sender_->GetParameters();
876 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
877 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
878
879 DestroyVideoRtpSender();
880}
881
882TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
883 AddVideoTrack(false);
884
885 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
886 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
887 video_rtp_sender_->set_stream_ids({local_stream_->id()});
888
889 std::vector<RtpEncodingParameters> init_encodings(2);
890 init_encodings[0].max_bitrate_bps = 60000;
891 init_encodings[1].max_bitrate_bps = 900000;
892 video_rtp_sender_->set_init_send_encodings(init_encodings);
893
894 RtpParameters params = video_rtp_sender_->GetParameters();
895 ASSERT_EQ(2u, params.encodings.size());
896 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
897 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
898
899 // Simulate the setLocalDescription call
900 std::vector<uint32_t> ssrcs;
901 for (int i = 0; i < 2; ++i)
902 ssrcs.push_back(kVideoSsrcSimulcast + i);
903 cricket::StreamParams stream_params =
904 cricket::CreateSimStreamParams("cname", ssrcs);
905 video_media_channel_->AddSendStream(stream_params);
906 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
907 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
908
909 params = video_rtp_sender_->GetParameters();
910 ASSERT_EQ(2u, params.encodings.size());
911 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
912 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
913
914 DestroyVideoRtpSender();
915}
916
917TEST_F(RtpSenderReceiverTest,
918 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
919 AddVideoTrack(false);
920
921 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
922 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
923 video_rtp_sender_->set_stream_ids({local_stream_->id()});
924
925 std::vector<RtpEncodingParameters> init_encodings(1);
926 init_encodings[0].max_bitrate_bps = 60000;
927 video_rtp_sender_->set_init_send_encodings(init_encodings);
928
929 RtpParameters params = video_rtp_sender_->GetParameters();
930 ASSERT_EQ(1u, params.encodings.size());
931 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
932
933 // Simulate the setLocalDescription call as if the user used SDP munging
934 // to enable simulcast
935 std::vector<uint32_t> ssrcs;
936 for (int i = 0; i < 2; ++i)
937 ssrcs.push_back(kVideoSsrcSimulcast + i);
938 cricket::StreamParams stream_params =
939 cricket::CreateSimStreamParams("cname", ssrcs);
940 video_media_channel_->AddSendStream(stream_params);
941 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
942 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
943
944 params = video_rtp_sender_->GetParameters();
945 ASSERT_EQ(2u, params.encodings.size());
946 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
947
948 DestroyVideoRtpSender();
949}
950
951TEST_F(RtpSenderReceiverTest,
952 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
953 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
954
955 RtpParameters params;
956 RTCError result = video_rtp_sender_->SetParameters(params);
957 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
958 DestroyVideoRtpSender();
959}
960
Florent Castellicebf50f2018-05-03 15:31:53 +0200961TEST_F(RtpSenderReceiverTest,
962 VideoSenderMustCallGetParametersBeforeSetParameters) {
963 CreateVideoRtpSender();
964
965 RtpParameters params;
966 RTCError result = video_rtp_sender_->SetParameters(params);
967 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
968
969 DestroyVideoRtpSender();
970}
971
972TEST_F(RtpSenderReceiverTest,
973 VideoSenderSetParametersInvalidatesTransactionId) {
974 CreateVideoRtpSender();
975
976 RtpParameters params = video_rtp_sender_->GetParameters();
977 EXPECT_EQ(1u, params.encodings.size());
978 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
979 RTCError result = video_rtp_sender_->SetParameters(params);
980 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
981
982 DestroyVideoRtpSender();
983}
984
985TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
986 CreateVideoRtpSender();
987
988 RtpParameters params = video_rtp_sender_->GetParameters();
989 params.transaction_id = "";
990 RTCError result = video_rtp_sender_->SetParameters(params);
991 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
992
993 DestroyVideoRtpSender();
994}
995
996TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
997 CreateVideoRtpSender();
998
999 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001000 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001001 auto saved_transaction_id = params.transaction_id;
1002 params = video_rtp_sender_->GetParameters();
1003 EXPECT_NE(saved_transaction_id, params.transaction_id);
1004
1005 DestroyVideoRtpSender();
1006}
1007
1008TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1009 CreateVideoRtpSender();
1010
1011 RtpParameters params = video_rtp_sender_->GetParameters();
1012 RtpParameters second_params = video_rtp_sender_->GetParameters();
1013
1014 RTCError result = video_rtp_sender_->SetParameters(params);
1015 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1016
1017 DestroyVideoRtpSender();
1018}
1019
Seth Hampson2d2c8882018-05-16 16:02:32 -07001020TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1021 CreateVideoRtpSender();
1022 RtpParameters params = video_rtp_sender_->GetParameters();
1023 EXPECT_EQ(1u, params.encodings.size());
1024
Florent Castelli87b3c512018-07-18 16:00:28 +02001025 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001026 params.mid = "dummy_mid";
1027 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1028 video_rtp_sender_->SetParameters(params).type());
1029 params = video_rtp_sender_->GetParameters();
1030
Seth Hampson2d2c8882018-05-16 16:02:32 -07001031 DestroyVideoRtpSender();
1032}
1033
1034TEST_F(RtpSenderReceiverTest,
1035 VideoSenderCantSetUnimplementedEncodingParameters) {
1036 CreateVideoRtpSender();
1037 RtpParameters params = video_rtp_sender_->GetParameters();
1038 EXPECT_EQ(1u, params.encodings.size());
1039
1040 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +02001041 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -07001042 params.encodings[0].codec_payload_type = 1;
1043 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1044 video_rtp_sender_->SetParameters(params).type());
1045 params = video_rtp_sender_->GetParameters();
1046
1047 params.encodings[0].fec = RtpFecParameters();
1048 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1049 video_rtp_sender_->SetParameters(params).type());
1050 params = video_rtp_sender_->GetParameters();
1051
1052 params.encodings[0].rtx = RtpRtxParameters();
1053 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1054 video_rtp_sender_->SetParameters(params).type());
1055 params = video_rtp_sender_->GetParameters();
1056
1057 params.encodings[0].dtx = DtxStatus::ENABLED;
1058 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1059 video_rtp_sender_->SetParameters(params).type());
1060 params = video_rtp_sender_->GetParameters();
1061
1062 params.encodings[0].ptime = 1;
1063 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1064 video_rtp_sender_->SetParameters(params).type());
1065 params = video_rtp_sender_->GetParameters();
1066
Seth Hampson2d2c8882018-05-16 16:02:32 -07001067 params.encodings[0].scale_resolution_down_by = 2.0;
1068 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1069 video_rtp_sender_->SetParameters(params).type());
1070 params = video_rtp_sender_->GetParameters();
1071
1072 params.encodings[0].rid = "dummy_rid";
1073 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1074 video_rtp_sender_->SetParameters(params).type());
1075 params = video_rtp_sender_->GetParameters();
1076
1077 params.encodings[0].dependency_rids.push_back("dummy_rid");
1078 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1079 video_rtp_sender_->SetParameters(params).type());
1080
1081 DestroyVideoRtpSender();
1082}
1083
Florent Castelli892acf02018-10-01 22:47:20 +02001084TEST_F(RtpSenderReceiverTest,
1085 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1086 CreateVideoRtpSenderWithSimulcast();
1087 RtpParameters params = video_rtp_sender_->GetParameters();
1088 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1089
1090 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
1091 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1092 for (size_t i = 0; i < params.encodings.size(); i++) {
1093 params.encodings[i].codec_payload_type = 1;
1094 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1095 video_rtp_sender_->SetParameters(params).type());
1096 params = video_rtp_sender_->GetParameters();
1097
1098 params.encodings[i].fec = RtpFecParameters();
1099 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1100 video_rtp_sender_->SetParameters(params).type());
1101 params = video_rtp_sender_->GetParameters();
1102
1103 params.encodings[i].rtx = RtpRtxParameters();
1104 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1105 video_rtp_sender_->SetParameters(params).type());
1106 params = video_rtp_sender_->GetParameters();
1107
1108 params.encodings[i].dtx = DtxStatus::ENABLED;
1109 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1110 video_rtp_sender_->SetParameters(params).type());
1111 params = video_rtp_sender_->GetParameters();
1112
1113 params.encodings[i].ptime = 1;
1114 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1115 video_rtp_sender_->SetParameters(params).type());
1116 params = video_rtp_sender_->GetParameters();
1117
1118 params.encodings[i].scale_resolution_down_by = 2.0;
1119 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1120 video_rtp_sender_->SetParameters(params).type());
1121 params = video_rtp_sender_->GetParameters();
1122
1123 params.encodings[i].rid = "dummy_rid";
1124 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1125 video_rtp_sender_->SetParameters(params).type());
1126 params = video_rtp_sender_->GetParameters();
1127
1128 params.encodings[i].dependency_rids.push_back("dummy_rid");
1129 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1130 video_rtp_sender_->SetParameters(params).type());
1131 }
1132
1133 DestroyVideoRtpSender();
1134}
1135
Seth Hampson2d2c8882018-05-16 16:02:32 -07001136// A video sender can have multiple simulcast layers, in which case it will
1137// contain multiple RtpEncodingParameters. This tests that if this is the case
1138// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1139// for any encodings besides at index 0, because these are both implemented
1140// "per-sender."
1141TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1142 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001143 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001144 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001145 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001146
1147 params.encodings[1].bitrate_priority = 2.0;
1148 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1149 video_rtp_sender_->SetParameters(params).type());
1150 params = video_rtp_sender_->GetParameters();
1151
Seth Hampson2d2c8882018-05-16 16:02:32 -07001152 DestroyVideoRtpSender();
1153}
1154
Florent Castelli892acf02018-10-01 22:47:20 +02001155TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1156 // Add a simulcast specific send stream that contains 2 encoding parameters.
1157 CreateVideoRtpSenderWithSimulcast();
1158 RtpParameters params = video_rtp_sender_->GetParameters();
1159 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1160
1161 for (size_t i = 0; i < params.encodings.size(); i++) {
1162 params.encodings[i].ssrc = 1337;
1163 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1164 video_rtp_sender_->SetParameters(params).type());
1165 params = video_rtp_sender_->GetParameters();
1166 }
1167
1168 DestroyVideoRtpSender();
1169}
1170
Ă…sa Persson55659812018-06-18 17:51:32 +02001171TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001172 CreateVideoRtpSender();
1173
1174 EXPECT_EQ(-1, video_media_channel_->max_bps());
1175 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001176 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001177 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001178 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001179 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001180 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001181 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001182
1183 // Read back the parameters and verify they have been changed.
1184 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001185 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001186 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001187 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001188
1189 // Verify that the video channel received the new parameters.
1190 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001191 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001192 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001193 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001194
1195 // Verify that the global bitrate limit has not been changed.
1196 EXPECT_EQ(-1, video_media_channel_->max_bps());
1197
1198 DestroyVideoRtpSender();
1199}
1200
Ă…sa Persson55659812018-06-18 17:51:32 +02001201TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1202 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001203 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001204
1205 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001206 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001207 params.encodings[0].min_bitrate_bps = 100;
1208 params.encodings[0].max_bitrate_bps = 1000;
1209 params.encodings[1].min_bitrate_bps = 200;
1210 params.encodings[1].max_bitrate_bps = 2000;
1211 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1212
1213 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001214 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1215 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001216 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1217 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1218 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1219 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1220
1221 DestroyVideoRtpSender();
1222}
1223
Seth Hampson24722b32017-12-22 09:36:42 -08001224TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1225 CreateVideoRtpSender();
1226
1227 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001228 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001229 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1230 params.encodings[0].bitrate_priority);
1231 double new_bitrate_priority = 2.0;
1232 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001233 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001234
1235 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001236 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001237 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1238
1239 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001240 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001241 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1242
1243 DestroyVideoRtpSender();
1244}
1245
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001246TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1247 CreateAudioRtpReceiver();
1248
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001249 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001250 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001251 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1252
1253 DestroyAudioRtpReceiver();
1254}
1255
1256TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1257 CreateVideoRtpReceiver();
1258
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001259 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001260 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001261 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1262
1263 DestroyVideoRtpReceiver();
1264}
1265
pbos5214a0a2016-12-16 15:39:11 -08001266// Test that makes sure that a video track content hint translates to the proper
1267// value for sources that are not screencast.
1268TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1269 CreateVideoRtpSender();
1270
1271 video_track_->set_enabled(true);
1272
1273 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001274 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001275 // No content hint should be set by default.
1276 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1277 video_track_->content_hint());
1278 // Setting detailed should turn a non-screencast source into screencast mode.
1279 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001280 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001281 // Removing the content hint should turn the track back into non-screencast
1282 // mode.
1283 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001284 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001285 // Setting fluid should remain in non-screencast mode (its default).
1286 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001287 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001288 // Setting text should have the same effect as Detailed
1289 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1290 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001291
1292 DestroyVideoRtpSender();
1293}
1294
1295// Test that makes sure that a video track content hint translates to the proper
1296// value for screencast sources.
1297TEST_F(RtpSenderReceiverTest,
1298 PropagatesVideoTrackContentHintForScreencastSource) {
1299 CreateVideoRtpSender(true);
1300
1301 video_track_->set_enabled(true);
1302
1303 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001304 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001305 // No content hint should be set by default.
1306 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1307 video_track_->content_hint());
1308 // Setting fluid should turn a screencast source into non-screencast mode.
1309 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001310 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001311 // Removing the content hint should turn the track back into screencast mode.
1312 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001313 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001314 // Setting detailed should still remain in screencast mode (its default).
1315 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001316 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001317 // Setting text should have the same effect as Detailed
1318 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1319 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001320
1321 DestroyVideoRtpSender();
1322}
1323
1324// Test that makes sure any content hints that are set on a track before
1325// VideoRtpSender is ready to send are still applied when it gets ready to send.
1326TEST_F(RtpSenderReceiverTest,
1327 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1328 AddVideoTrack();
1329 // Setting detailed overrides the default non-screencast mode. This should be
1330 // applied even if the track is set on construction.
1331 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001332 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1333 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1334 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -08001335 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001336 video_track_->set_enabled(true);
1337
1338 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001339 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001340
1341 // Verify that the content hint is accounted for when video_rtp_sender_ does
1342 // get enabled.
1343 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001344 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001345
1346 // And removing the hint should go back to false (to verify that false was
1347 // default correctly).
1348 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001349 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001350
1351 DestroyVideoRtpSender();
1352}
1353
deadbeef20cb0c12017-02-01 20:27:00 -08001354TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1355 CreateAudioRtpSender();
1356 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1357}
1358
1359TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1360 CreateVideoRtpSender();
1361 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1362}
1363
1364// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1365// true/false from CanSendDtmf based on what |voice_channel_| returns.
1366TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1367 AddDtmfCodec();
1368 CreateAudioRtpSender();
1369 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1370 ASSERT_NE(nullptr, dtmf_sender);
1371 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1372}
1373
1374TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1375 CreateAudioRtpSender();
1376 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1377 ASSERT_NE(nullptr, dtmf_sender);
1378 // DTMF codec has not been added, as it was in the above test.
1379 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1380}
1381
1382TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1383 AddDtmfCodec();
1384 CreateAudioRtpSender();
1385 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1386 ASSERT_NE(nullptr, dtmf_sender);
1387
1388 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1389
1390 // Insert DTMF
1391 const int expected_duration = 90;
1392 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1393
1394 // Verify
1395 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1396 kDefaultTimeout);
1397 const uint32_t send_ssrc =
1398 voice_media_channel_->send_streams()[0].first_ssrc();
1399 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1400 send_ssrc, 0, expected_duration));
1401 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1402 send_ssrc, 1, expected_duration));
1403 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1404 send_ssrc, 2, expected_duration));
1405}
1406
1407// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1408// destroyed, which is needed for the DTMF sender.
1409TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1410 CreateAudioRtpSender();
1411 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1412 audio_rtp_sender_ = nullptr;
1413 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1414}
1415
Benjamin Wright84583f62018-10-04 14:22:34 -07001416// Validate that the default FrameEncryptor setting is nullptr.
1417TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1418 CreateAudioRtpSender();
1419 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1420 new FakeFrameEncryptor());
1421 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1422 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1423 EXPECT_EQ(fake_frame_encryptor.get(),
1424 audio_rtp_sender_->GetFrameEncryptor().get());
1425}
1426
1427// Validate that the default FrameEncryptor setting is nullptr.
1428TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1429 CreateAudioRtpReceiver();
1430 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1431 new FakeFrameDecryptor());
1432 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1433 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1434 EXPECT_EQ(fake_frame_decryptor.get(),
1435 audio_rtp_receiver_->GetFrameDecryptor().get());
1436}
1437
deadbeef70ab1a12015-09-28 16:53:55 -07001438} // namespace webrtc