blob: 2af2ebf066ea2cff64f342d98f3a217d629c66a4 [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;
Florent Castelli892acf02018-10-01 22:47:20 +020050static const uint32_t kVideoSsrcSimulcast = 102;
51static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080052static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080053} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070054
55namespace webrtc {
56
deadbeef20cb0c12017-02-01 20:27:00 -080057class RtpSenderReceiverTest : public testing::Test,
58 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070059 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070060 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080061 : network_thread_(rtc::Thread::Current()),
62 worker_thread_(rtc::Thread::Current()),
63 // Create fake media engine/etc. so we can create channels to use to
64 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070065 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020066 channel_manager_(absl::WrapUnique(media_engine_),
67 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080068 worker_thread_,
69 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010070 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080071 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070072 // Create channels to be used by the RtpSenders and RtpReceivers.
73 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080074 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +020075 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -070076 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
77 rtp_transport_ = CreateDtlsSrtpTransport();
78
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070079 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070080 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
81 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
82 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070083 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070084 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
85 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
86 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080087 voice_channel_->Enable(true);
88 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070089 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
90 video_media_channel_ = media_engine_->GetVideoChannel(0);
91 RTC_CHECK(voice_channel_);
92 RTC_CHECK(video_channel_);
93 RTC_CHECK(voice_media_channel_);
94 RTC_CHECK(video_media_channel_);
95
96 // Create streams for predefined SSRCs. Streams need to exist in order
97 // for the senders and receievers to apply parameters to them.
98 // Normally these would be created by SetLocalDescription and
99 // SetRemoteDescription.
100 voice_media_channel_->AddSendStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc));
102 voice_media_channel_->AddRecvStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc));
104 voice_media_channel_->AddSendStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
106 voice_media_channel_->AddRecvStream(
107 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
108 video_media_channel_->AddSendStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc));
110 video_media_channel_->AddRecvStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc));
112 video_media_channel_->AddSendStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
114 video_media_channel_->AddRecvStream(
115 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700116 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700117
Zhi Huange830e682018-03-30 10:48:35 -0700118 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200119 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
120 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700121 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
122 /*rtcp_dtls_transport=*/nullptr);
123 return dtls_srtp_transport;
124 }
125
deadbeef20cb0c12017-02-01 20:27:00 -0800126 // Needed to use DTMF sender.
127 void AddDtmfCodec() {
128 cricket::AudioSendParameters params;
129 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
130 0, 1);
131 params.codecs.push_back(kTelephoneEventCodec);
132 voice_media_channel_->SetSendParameters(params);
133 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700134
pbos5214a0a2016-12-16 15:39:11 -0800135 void AddVideoTrack() { AddVideoTrack(false); }
136
137 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100138 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800139 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700140 video_track_ =
141 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800142 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700145 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
146
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100147 void CreateAudioRtpSender(
148 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700149 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800150 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800151 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700152 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
153 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
154 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800155 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800156 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800157 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
158 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700159 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700160 }
161
Steve Anton02ee47c2018-01-10 16:26:06 -0800162 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700163 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800164 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800165 }
166
deadbeef20cb0c12017-02-01 20:27:00 -0800167 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
168
Seth Hampson2d2c8882018-05-16 16:02:32 -0700169 void CreateVideoRtpSender(uint32_t ssrc) {
170 CreateVideoRtpSender(false, ssrc);
171 }
172
pbos5214a0a2016-12-16 15:39:11 -0800173 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
174
Florent Castelli892acf02018-10-01 22:47:20 +0200175 void CreateVideoRtpSenderWithSimulcast(
176 int num_layers = kVideoSimulcastLayerCount) {
177 std::vector<uint32_t> ssrcs;
178 for (int i = 0; i < num_layers; ++i)
179 ssrcs.push_back(kVideoSsrcSimulcast + i);
180 cricket::StreamParams stream_params =
181 cricket::CreateSimStreamParams("cname", ssrcs);
182 video_media_channel_->AddSendStream(stream_params);
183 uint32_t primary_ssrc = stream_params.first_ssrc();
184 CreateVideoRtpSender(primary_ssrc);
185 }
186
Seth Hampson2d2c8882018-05-16 16:02:32 -0700187 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800188 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700189 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
190 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
191 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800192 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700193 video_rtp_sender_->SetSsrc(ssrc);
194 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700195 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800196 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700197 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Steve Anton57858b32018-02-15 15:19:50 -0800198 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800199 }
200
deadbeef70ab1a12015-09-28 16:53:55 -0700201 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700202 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700203 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700204 }
205
206 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700207 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700208 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700209 }
210
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100211 void CreateAudioRtpReceiver(
212 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
213 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800214 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800215 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800216 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700217 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700218 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700219 }
220
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100221 void CreateVideoRtpReceiver(
222 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800223 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800224 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800225 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800226 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100227 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700228 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700229 }
230
231 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700232 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700233 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700234 }
235
236 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700237 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700238 VerifyVideoChannelNoOutput();
239 }
240
241 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
242
243 void VerifyVoiceChannelInput(uint32_t ssrc) {
244 // Verify that the media channel has an audio source, and the stream isn't
245 // muted.
246 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
247 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
248 }
249
250 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
251
252 void VerifyVideoChannelInput(uint32_t ssrc) {
253 // Verify that the media channel has a video source,
254 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
255 }
256
257 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
258
259 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
260 // Verify that the media channel's source is reset.
261 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
262 }
263
264 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
265
266 void VerifyVideoChannelNoInput(uint32_t ssrc) {
267 // Verify that the media channel's source is reset.
268 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
269 }
270
271 void VerifyVoiceChannelOutput() {
272 // Verify that the volume is initialized to 1.
273 double volume;
274 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
275 EXPECT_EQ(1, volume);
276 }
277
278 void VerifyVideoChannelOutput() {
279 // Verify that the media channel has a sink.
280 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
281 }
282
283 void VerifyVoiceChannelNoOutput() {
284 // Verify that the volume is reset to 0.
285 double volume;
286 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
287 EXPECT_EQ(0, volume);
288 }
289
290 void VerifyVideoChannelNoOutput() {
291 // Verify that the media channel's sink is reset.
292 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700293 }
294
295 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800296 rtc::Thread* const network_thread_;
297 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700298 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700299 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
300 // the |channel_manager|.
301 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
302 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800303 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700304 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700305 cricket::ChannelManager channel_manager_;
306 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700307 cricket::VoiceChannel* voice_channel_;
308 cricket::VideoChannel* video_channel_;
309 cricket::FakeVoiceMediaChannel* voice_media_channel_;
310 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700311 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
312 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
313 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
314 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800315 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700316 rtc::scoped_refptr<VideoTrackInterface> video_track_;
317 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800318 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700319};
320
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700321// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700322// and disassociated with an AudioRtpSender.
323TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
324 CreateAudioRtpSender();
325 DestroyAudioRtpSender();
326}
327
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700328// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700329// disassociated with a VideoRtpSender.
330TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
331 CreateVideoRtpSender();
332 DestroyVideoRtpSender();
333}
334
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700335// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700336// associated and disassociated with an AudioRtpReceiver.
337TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
338 CreateAudioRtpReceiver();
339 DestroyAudioRtpReceiver();
340}
341
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700342// Test that |video_channel_| is updated when a remote video track is
343// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700344TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
345 CreateVideoRtpReceiver();
346 DestroyVideoRtpReceiver();
347}
348
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100349TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
350 CreateAudioRtpReceiver({local_stream_});
351 DestroyAudioRtpReceiver();
352}
353
354TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
355 CreateVideoRtpReceiver({local_stream_});
356 DestroyVideoRtpReceiver();
357}
358
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700359// Test that the AudioRtpSender applies options from the local audio source.
360TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
361 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100362 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800363 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700364 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700365
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100366 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700367
368 DestroyAudioRtpSender();
369}
370
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700371// Test that the stream is muted when the track is disabled, and unmuted when
372// the track is enabled.
373TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
374 CreateAudioRtpSender();
375
376 audio_track_->set_enabled(false);
377 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
378
379 audio_track_->set_enabled(true);
380 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
381
382 DestroyAudioRtpSender();
383}
384
385// Test that the volume is set to 0 when the track is disabled, and back to
386// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700387TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
388 CreateAudioRtpReceiver();
389
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700390 double volume;
391 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
392 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700393
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394 audio_track_->set_enabled(false);
395 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
396 EXPECT_EQ(0, volume);
397
deadbeef70ab1a12015-09-28 16:53:55 -0700398 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700399 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
400 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700401
402 DestroyAudioRtpReceiver();
403}
404
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700405// Currently no action is taken when a remote video track is disabled or
406// enabled, so there's nothing to test here, other than what is normally
407// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700408TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
409 CreateVideoRtpSender();
410
deadbeef70ab1a12015-09-28 16:53:55 -0700411 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700412 video_track_->set_enabled(true);
413
414 DestroyVideoRtpSender();
415}
416
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700417// Test that the state of the video track created by the VideoRtpReceiver is
418// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100419TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
420 CreateVideoRtpReceiver();
421
422 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
423 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
424 video_track_->GetSource()->state());
425
426 DestroyVideoRtpReceiver();
427
428 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
429 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
430 video_track_->GetSource()->state());
431}
432
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700433// Currently no action is taken when a remote video track is disabled or
434// enabled, so there's nothing to test here, other than what is normally
435// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700436TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
437 CreateVideoRtpReceiver();
438
439 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700440 video_track_->set_enabled(true);
441
442 DestroyVideoRtpReceiver();
443}
444
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700445// Test that the AudioRtpReceiver applies volume changes from the track source
446// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700447TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
448 CreateAudioRtpReceiver();
449
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450 double volume;
451 audio_track_->GetSource()->SetVolume(0.5);
452 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
453 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700454
455 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700456 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700457 audio_track_->GetSource()->SetVolume(0.8);
458 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
459 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700462 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700463 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
464 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700465
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466 // Try changing volume one more time.
467 audio_track_->GetSource()->SetVolume(0.9);
468 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
469 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700470
471 DestroyAudioRtpReceiver();
472}
473
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700474// Test that the media channel isn't enabled for sending if the audio sender
475// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800476TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800477 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800478 rtc::scoped_refptr<AudioTrackInterface> track =
479 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700480
481 // Track but no SSRC.
482 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
483 VerifyVoiceChannelNoInput();
484
485 // SSRC but no track.
486 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
487 audio_rtp_sender_->SetSsrc(kAudioSsrc);
488 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800489}
490
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700491// Test that the media channel isn't enabled for sending if the video sender
492// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800493TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800494 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700495
496 // Track but no SSRC.
497 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
498 VerifyVideoChannelNoInput();
499
500 // SSRC but no track.
501 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
502 video_rtp_sender_->SetSsrc(kVideoSsrc);
503 VerifyVideoChannelNoInput();
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 first.
deadbeeffac06552015-11-25 11:26:01 -0800508TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
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_->SetSsrc(kAudioSsrc);
513 audio_rtp_sender_->SetTrack(track);
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 audio sender
520// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800521TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800522 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800523 rtc::scoped_refptr<AudioTrackInterface> track =
524 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700525 audio_rtp_sender_->SetTrack(track);
526 audio_rtp_sender_->SetSsrc(kAudioSsrc);
527 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800528
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800530}
531
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700532// Test that the media channel is enabled for sending when the video sender
533// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800534TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700535 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800536 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700537 video_rtp_sender_->SetSsrc(kVideoSsrc);
538 video_rtp_sender_->SetTrack(video_track_);
539 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800540
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700541 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800542}
543
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544// Test that the media channel is enabled for sending when the video sender
545// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800546TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700547 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800548 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700549 video_rtp_sender_->SetTrack(video_track_);
550 video_rtp_sender_->SetSsrc(kVideoSsrc);
551 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800552
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700553 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800554}
555
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556// Test that the media channel stops sending when the audio sender's SSRC is set
557// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800558TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700559 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800560
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 audio_rtp_sender_->SetSsrc(0);
562 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800563}
564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565// Test that the media channel stops sending when the video sender's SSRC is set
566// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800567TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570 audio_rtp_sender_->SetSsrc(0);
571 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800572}
573
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574// Test that the media channel stops sending when the audio sender's track is
575// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800576TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700577 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
580 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800581}
582
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583// Test that the media channel stops sending when the video sender's track is
584// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800585TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800587
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 video_rtp_sender_->SetSsrc(0);
589 VerifyVideoChannelNoInput();
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, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800596
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
598 VerifyVoiceChannelNoInput(kAudioSsrc);
599 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601 audio_rtp_sender_ = nullptr;
602 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800603}
604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605// Test that when the audio sender's SSRC is changed, the media channel stops
606// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800607TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 video_rtp_sender_->SetSsrc(kVideoSsrc2);
611 VerifyVideoChannelNoInput(kVideoSsrc);
612 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614 video_rtp_sender_ = nullptr;
615 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800616}
617
skvladdc1c62c2016-03-16 19:07:43 -0700618TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
619 CreateAudioRtpSender();
620
skvladdc1c62c2016-03-16 19:07:43 -0700621 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700622 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800623 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700624
625 DestroyAudioRtpSender();
626}
627
Florent Castelli892acf02018-10-01 22:47:20 +0200628TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
629 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
630
631 RtpParameters params = audio_rtp_sender_->GetParameters();
632 ASSERT_EQ(1u, params.encodings.size());
633 params.encodings[0].max_bitrate_bps = 90000;
634 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
635
636 params = audio_rtp_sender_->GetParameters();
637 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
638 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
639
640 DestroyAudioRtpSender();
641}
642
643TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
644 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
645 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
646
647 audio_rtp_sender_ =
648 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
649 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
650 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
651
652 std::vector<RtpEncodingParameters> init_encodings(1);
653 init_encodings[0].max_bitrate_bps = 60000;
654 audio_rtp_sender_->set_init_send_encodings(init_encodings);
655
656 RtpParameters params = audio_rtp_sender_->GetParameters();
657 ASSERT_EQ(1u, params.encodings.size());
658 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
659
660 // Simulate the setLocalDescription call
661 std::vector<uint32_t> ssrcs(1, 1);
662 cricket::StreamParams stream_params =
663 cricket::CreateSimStreamParams("cname", ssrcs);
664 voice_media_channel_->AddSendStream(stream_params);
665 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
666 audio_rtp_sender_->SetSsrc(1);
667
668 params = audio_rtp_sender_->GetParameters();
669 ASSERT_EQ(1u, params.encodings.size());
670 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
671
672 DestroyAudioRtpSender();
673}
674
675TEST_F(RtpSenderReceiverTest,
676 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
677 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
678
679 RtpParameters params;
680 RTCError result = audio_rtp_sender_->SetParameters(params);
681 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
682 DestroyAudioRtpSender();
683}
684
Florent Castellicebf50f2018-05-03 15:31:53 +0200685TEST_F(RtpSenderReceiverTest,
686 AudioSenderMustCallGetParametersBeforeSetParameters) {
687 CreateAudioRtpSender();
688
689 RtpParameters params;
690 RTCError result = audio_rtp_sender_->SetParameters(params);
691 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
692
693 DestroyAudioRtpSender();
694}
695
696TEST_F(RtpSenderReceiverTest,
697 AudioSenderSetParametersInvalidatesTransactionId) {
698 CreateAudioRtpSender();
699
700 RtpParameters params = audio_rtp_sender_->GetParameters();
701 EXPECT_EQ(1u, params.encodings.size());
702 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
703 RTCError result = audio_rtp_sender_->SetParameters(params);
704 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
705
706 DestroyAudioRtpSender();
707}
708
709TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
710 CreateAudioRtpSender();
711
712 RtpParameters params = audio_rtp_sender_->GetParameters();
713 params.transaction_id = "";
714 RTCError result = audio_rtp_sender_->SetParameters(params);
715 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
716
717 DestroyAudioRtpSender();
718}
719
720TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
721 CreateAudioRtpSender();
722
723 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200724 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200725 auto saved_transaction_id = params.transaction_id;
726 params = audio_rtp_sender_->GetParameters();
727 EXPECT_NE(saved_transaction_id, params.transaction_id);
728
729 DestroyAudioRtpSender();
730}
731
732TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
733 CreateAudioRtpSender();
734
735 RtpParameters params = audio_rtp_sender_->GetParameters();
736 RtpParameters second_params = audio_rtp_sender_->GetParameters();
737
738 RTCError result = audio_rtp_sender_->SetParameters(params);
739 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700740 DestroyAudioRtpSender();
741}
742
743TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
744 CreateAudioRtpSender();
745 RtpParameters params = audio_rtp_sender_->GetParameters();
746 EXPECT_EQ(1u, params.encodings.size());
747
Florent Castelli87b3c512018-07-18 16:00:28 +0200748 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700749 params.mid = "dummy_mid";
750 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
751 audio_rtp_sender_->SetParameters(params).type());
752 params = audio_rtp_sender_->GetParameters();
753
Seth Hampson2d2c8882018-05-16 16:02:32 -0700754 DestroyAudioRtpSender();
755}
756
757TEST_F(RtpSenderReceiverTest,
758 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
759 CreateAudioRtpSender();
760 RtpParameters params = audio_rtp_sender_->GetParameters();
761 EXPECT_EQ(1u, params.encodings.size());
762
763 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200764 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -0700765 params.encodings[0].codec_payload_type = 1;
766 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
767 audio_rtp_sender_->SetParameters(params).type());
768 params = audio_rtp_sender_->GetParameters();
769
770 params.encodings[0].fec = RtpFecParameters();
771 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
772 audio_rtp_sender_->SetParameters(params).type());
773 params = audio_rtp_sender_->GetParameters();
774
775 params.encodings[0].rtx = RtpRtxParameters();
776 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
777 audio_rtp_sender_->SetParameters(params).type());
778 params = audio_rtp_sender_->GetParameters();
779
780 params.encodings[0].dtx = DtxStatus::ENABLED;
781 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
782 audio_rtp_sender_->SetParameters(params).type());
783 params = audio_rtp_sender_->GetParameters();
784
785 params.encodings[0].ptime = 1;
786 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
787 audio_rtp_sender_->SetParameters(params).type());
788 params = audio_rtp_sender_->GetParameters();
789
Seth Hampson2d2c8882018-05-16 16:02:32 -0700790 params.encodings[0].scale_resolution_down_by = 2.0;
791 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
792 audio_rtp_sender_->SetParameters(params).type());
793 params = audio_rtp_sender_->GetParameters();
794
795 params.encodings[0].rid = "dummy_rid";
796 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
797 audio_rtp_sender_->SetParameters(params).type());
798 params = audio_rtp_sender_->GetParameters();
799
800 params.encodings[0].dependency_rids.push_back("dummy_rid");
801 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
802 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200803
804 DestroyAudioRtpSender();
805}
806
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700807TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
808 CreateAudioRtpSender();
809
810 EXPECT_EQ(-1, voice_media_channel_->max_bps());
811 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200812 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800813 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100814 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800815 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700816
817 // Read back the parameters and verify they have been changed.
818 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200819 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100820 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700821
822 // Verify that the audio channel received the new parameters.
823 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200824 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100825 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700826
827 // Verify that the global bitrate limit has not been changed.
828 EXPECT_EQ(-1, voice_media_channel_->max_bps());
829
830 DestroyAudioRtpSender();
831}
832
Seth Hampson24722b32017-12-22 09:36:42 -0800833TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
834 CreateAudioRtpSender();
835
836 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200837 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800838 EXPECT_EQ(webrtc::kDefaultBitratePriority,
839 params.encodings[0].bitrate_priority);
840 double new_bitrate_priority = 2.0;
841 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800842 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800843
844 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200845 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800846 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
847
848 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200849 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800850 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
851
852 DestroyAudioRtpSender();
853}
854
skvladdc1c62c2016-03-16 19:07:43 -0700855TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
856 CreateVideoRtpSender();
857
skvladdc1c62c2016-03-16 19:07:43 -0700858 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700859 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800860 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700861
862 DestroyVideoRtpSender();
863}
864
Florent Castelli892acf02018-10-01 22:47:20 +0200865TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
866 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
867
868 RtpParameters params = video_rtp_sender_->GetParameters();
869 ASSERT_EQ(1u, params.encodings.size());
870 params.encodings[0].max_bitrate_bps = 90000;
871 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
872
873 params = video_rtp_sender_->GetParameters();
874 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
875 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
876
877 DestroyVideoRtpSender();
878}
879
880TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
881 AddVideoTrack(false);
882
883 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
884 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
885 video_rtp_sender_->set_stream_ids({local_stream_->id()});
886
887 std::vector<RtpEncodingParameters> init_encodings(2);
888 init_encodings[0].max_bitrate_bps = 60000;
889 init_encodings[1].max_bitrate_bps = 900000;
890 video_rtp_sender_->set_init_send_encodings(init_encodings);
891
892 RtpParameters params = video_rtp_sender_->GetParameters();
893 ASSERT_EQ(2u, params.encodings.size());
894 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
895 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
896
897 // Simulate the setLocalDescription call
898 std::vector<uint32_t> ssrcs;
899 for (int i = 0; i < 2; ++i)
900 ssrcs.push_back(kVideoSsrcSimulcast + i);
901 cricket::StreamParams stream_params =
902 cricket::CreateSimStreamParams("cname", ssrcs);
903 video_media_channel_->AddSendStream(stream_params);
904 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
905 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
906
907 params = video_rtp_sender_->GetParameters();
908 ASSERT_EQ(2u, params.encodings.size());
909 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
910 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
911
912 DestroyVideoRtpSender();
913}
914
915TEST_F(RtpSenderReceiverTest,
916 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
917 AddVideoTrack(false);
918
919 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
920 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
921 video_rtp_sender_->set_stream_ids({local_stream_->id()});
922
923 std::vector<RtpEncodingParameters> init_encodings(1);
924 init_encodings[0].max_bitrate_bps = 60000;
925 video_rtp_sender_->set_init_send_encodings(init_encodings);
926
927 RtpParameters params = video_rtp_sender_->GetParameters();
928 ASSERT_EQ(1u, params.encodings.size());
929 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
930
931 // Simulate the setLocalDescription call as if the user used SDP munging
932 // to enable simulcast
933 std::vector<uint32_t> ssrcs;
934 for (int i = 0; i < 2; ++i)
935 ssrcs.push_back(kVideoSsrcSimulcast + i);
936 cricket::StreamParams stream_params =
937 cricket::CreateSimStreamParams("cname", ssrcs);
938 video_media_channel_->AddSendStream(stream_params);
939 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
940 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
941
942 params = video_rtp_sender_->GetParameters();
943 ASSERT_EQ(2u, params.encodings.size());
944 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
945
946 DestroyVideoRtpSender();
947}
948
949TEST_F(RtpSenderReceiverTest,
950 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
951 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
952
953 RtpParameters params;
954 RTCError result = video_rtp_sender_->SetParameters(params);
955 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
956 DestroyVideoRtpSender();
957}
958
Florent Castellicebf50f2018-05-03 15:31:53 +0200959TEST_F(RtpSenderReceiverTest,
960 VideoSenderMustCallGetParametersBeforeSetParameters) {
961 CreateVideoRtpSender();
962
963 RtpParameters params;
964 RTCError result = video_rtp_sender_->SetParameters(params);
965 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
966
967 DestroyVideoRtpSender();
968}
969
970TEST_F(RtpSenderReceiverTest,
971 VideoSenderSetParametersInvalidatesTransactionId) {
972 CreateVideoRtpSender();
973
974 RtpParameters params = video_rtp_sender_->GetParameters();
975 EXPECT_EQ(1u, params.encodings.size());
976 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
977 RTCError result = video_rtp_sender_->SetParameters(params);
978 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
979
980 DestroyVideoRtpSender();
981}
982
983TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
984 CreateVideoRtpSender();
985
986 RtpParameters params = video_rtp_sender_->GetParameters();
987 params.transaction_id = "";
988 RTCError result = video_rtp_sender_->SetParameters(params);
989 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
990
991 DestroyVideoRtpSender();
992}
993
994TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
995 CreateVideoRtpSender();
996
997 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200998 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200999 auto saved_transaction_id = params.transaction_id;
1000 params = video_rtp_sender_->GetParameters();
1001 EXPECT_NE(saved_transaction_id, params.transaction_id);
1002
1003 DestroyVideoRtpSender();
1004}
1005
1006TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1007 CreateVideoRtpSender();
1008
1009 RtpParameters params = video_rtp_sender_->GetParameters();
1010 RtpParameters second_params = video_rtp_sender_->GetParameters();
1011
1012 RTCError result = video_rtp_sender_->SetParameters(params);
1013 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1014
1015 DestroyVideoRtpSender();
1016}
1017
Seth Hampson2d2c8882018-05-16 16:02:32 -07001018TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1019 CreateVideoRtpSender();
1020 RtpParameters params = video_rtp_sender_->GetParameters();
1021 EXPECT_EQ(1u, params.encodings.size());
1022
Florent Castelli87b3c512018-07-18 16:00:28 +02001023 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001024 params.mid = "dummy_mid";
1025 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1026 video_rtp_sender_->SetParameters(params).type());
1027 params = video_rtp_sender_->GetParameters();
1028
Seth Hampson2d2c8882018-05-16 16:02:32 -07001029 DestroyVideoRtpSender();
1030}
1031
1032TEST_F(RtpSenderReceiverTest,
1033 VideoSenderCantSetUnimplementedEncodingParameters) {
1034 CreateVideoRtpSender();
1035 RtpParameters params = video_rtp_sender_->GetParameters();
1036 EXPECT_EQ(1u, params.encodings.size());
1037
1038 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +02001039 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -07001040 params.encodings[0].codec_payload_type = 1;
1041 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1042 video_rtp_sender_->SetParameters(params).type());
1043 params = video_rtp_sender_->GetParameters();
1044
1045 params.encodings[0].fec = RtpFecParameters();
1046 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1047 video_rtp_sender_->SetParameters(params).type());
1048 params = video_rtp_sender_->GetParameters();
1049
1050 params.encodings[0].rtx = RtpRtxParameters();
1051 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1052 video_rtp_sender_->SetParameters(params).type());
1053 params = video_rtp_sender_->GetParameters();
1054
1055 params.encodings[0].dtx = DtxStatus::ENABLED;
1056 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1057 video_rtp_sender_->SetParameters(params).type());
1058 params = video_rtp_sender_->GetParameters();
1059
1060 params.encodings[0].ptime = 1;
1061 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1062 video_rtp_sender_->SetParameters(params).type());
1063 params = video_rtp_sender_->GetParameters();
1064
Seth Hampson2d2c8882018-05-16 16:02:32 -07001065 params.encodings[0].scale_resolution_down_by = 2.0;
1066 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1067 video_rtp_sender_->SetParameters(params).type());
1068 params = video_rtp_sender_->GetParameters();
1069
1070 params.encodings[0].rid = "dummy_rid";
1071 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1072 video_rtp_sender_->SetParameters(params).type());
1073 params = video_rtp_sender_->GetParameters();
1074
1075 params.encodings[0].dependency_rids.push_back("dummy_rid");
1076 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1077 video_rtp_sender_->SetParameters(params).type());
1078
1079 DestroyVideoRtpSender();
1080}
1081
Florent Castelli892acf02018-10-01 22:47:20 +02001082TEST_F(RtpSenderReceiverTest,
1083 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1084 CreateVideoRtpSenderWithSimulcast();
1085 RtpParameters params = video_rtp_sender_->GetParameters();
1086 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1087
1088 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
1089 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1090 for (size_t i = 0; i < params.encodings.size(); i++) {
1091 params.encodings[i].codec_payload_type = 1;
1092 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1093 video_rtp_sender_->SetParameters(params).type());
1094 params = video_rtp_sender_->GetParameters();
1095
1096 params.encodings[i].fec = RtpFecParameters();
1097 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1098 video_rtp_sender_->SetParameters(params).type());
1099 params = video_rtp_sender_->GetParameters();
1100
1101 params.encodings[i].rtx = RtpRtxParameters();
1102 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1103 video_rtp_sender_->SetParameters(params).type());
1104 params = video_rtp_sender_->GetParameters();
1105
1106 params.encodings[i].dtx = DtxStatus::ENABLED;
1107 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1108 video_rtp_sender_->SetParameters(params).type());
1109 params = video_rtp_sender_->GetParameters();
1110
1111 params.encodings[i].ptime = 1;
1112 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1113 video_rtp_sender_->SetParameters(params).type());
1114 params = video_rtp_sender_->GetParameters();
1115
1116 params.encodings[i].scale_resolution_down_by = 2.0;
1117 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1118 video_rtp_sender_->SetParameters(params).type());
1119 params = video_rtp_sender_->GetParameters();
1120
1121 params.encodings[i].rid = "dummy_rid";
1122 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1123 video_rtp_sender_->SetParameters(params).type());
1124 params = video_rtp_sender_->GetParameters();
1125
1126 params.encodings[i].dependency_rids.push_back("dummy_rid");
1127 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1128 video_rtp_sender_->SetParameters(params).type());
1129 }
1130
1131 DestroyVideoRtpSender();
1132}
1133
Seth Hampson2d2c8882018-05-16 16:02:32 -07001134// A video sender can have multiple simulcast layers, in which case it will
1135// contain multiple RtpEncodingParameters. This tests that if this is the case
1136// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1137// for any encodings besides at index 0, because these are both implemented
1138// "per-sender."
1139TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1140 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001141 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001142 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001143 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001144
1145 params.encodings[1].bitrate_priority = 2.0;
1146 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1147 video_rtp_sender_->SetParameters(params).type());
1148 params = video_rtp_sender_->GetParameters();
1149
Seth Hampson2d2c8882018-05-16 16:02:32 -07001150 DestroyVideoRtpSender();
1151}
1152
Florent Castelli892acf02018-10-01 22:47:20 +02001153TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1154 // Add a simulcast specific send stream that contains 2 encoding parameters.
1155 CreateVideoRtpSenderWithSimulcast();
1156 RtpParameters params = video_rtp_sender_->GetParameters();
1157 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1158
1159 for (size_t i = 0; i < params.encodings.size(); i++) {
1160 params.encodings[i].ssrc = 1337;
1161 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1162 video_rtp_sender_->SetParameters(params).type());
1163 params = video_rtp_sender_->GetParameters();
1164 }
1165
1166 DestroyVideoRtpSender();
1167}
1168
Ă…sa Persson55659812018-06-18 17:51:32 +02001169TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001170 CreateVideoRtpSender();
1171
1172 EXPECT_EQ(-1, video_media_channel_->max_bps());
1173 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001174 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001175 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001176 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001177 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001178 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001179 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001180
1181 // Read back the parameters and verify they have been changed.
1182 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001183 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001184 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001185 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001186
1187 // Verify that the video channel received the new parameters.
1188 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001189 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001190 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001191 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001192
1193 // Verify that the global bitrate limit has not been changed.
1194 EXPECT_EQ(-1, video_media_channel_->max_bps());
1195
1196 DestroyVideoRtpSender();
1197}
1198
Ă…sa Persson55659812018-06-18 17:51:32 +02001199TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1200 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001201 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001202
1203 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001204 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001205 params.encodings[0].min_bitrate_bps = 100;
1206 params.encodings[0].max_bitrate_bps = 1000;
1207 params.encodings[1].min_bitrate_bps = 200;
1208 params.encodings[1].max_bitrate_bps = 2000;
1209 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1210
1211 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001212 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1213 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001214 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1215 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1216 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1217 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1218
1219 DestroyVideoRtpSender();
1220}
1221
Seth Hampson24722b32017-12-22 09:36:42 -08001222TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1223 CreateVideoRtpSender();
1224
1225 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001226 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001227 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1228 params.encodings[0].bitrate_priority);
1229 double new_bitrate_priority = 2.0;
1230 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001231 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001232
1233 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001234 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001235 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1236
1237 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001238 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001239 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1240
1241 DestroyVideoRtpSender();
1242}
1243
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001244TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1245 CreateAudioRtpReceiver();
1246
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001247 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001248 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001249 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1250
1251 DestroyAudioRtpReceiver();
1252}
1253
1254TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1255 CreateVideoRtpReceiver();
1256
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001257 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001258 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001259 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1260
1261 DestroyVideoRtpReceiver();
1262}
1263
pbos5214a0a2016-12-16 15:39:11 -08001264// Test that makes sure that a video track content hint translates to the proper
1265// value for sources that are not screencast.
1266TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1267 CreateVideoRtpSender();
1268
1269 video_track_->set_enabled(true);
1270
1271 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001272 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001273 // No content hint should be set by default.
1274 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1275 video_track_->content_hint());
1276 // Setting detailed should turn a non-screencast source into screencast mode.
1277 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001278 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001279 // Removing the content hint should turn the track back into non-screencast
1280 // mode.
1281 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001282 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001283 // Setting fluid should remain in non-screencast mode (its default).
1284 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001285 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001286 // Setting text should have the same effect as Detailed
1287 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1288 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001289
1290 DestroyVideoRtpSender();
1291}
1292
1293// Test that makes sure that a video track content hint translates to the proper
1294// value for screencast sources.
1295TEST_F(RtpSenderReceiverTest,
1296 PropagatesVideoTrackContentHintForScreencastSource) {
1297 CreateVideoRtpSender(true);
1298
1299 video_track_->set_enabled(true);
1300
1301 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001302 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001303 // No content hint should be set by default.
1304 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1305 video_track_->content_hint());
1306 // Setting fluid should turn a screencast source into non-screencast mode.
1307 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001308 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001309 // Removing the content hint should turn the track back into screencast mode.
1310 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001311 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001312 // Setting detailed should still remain in screencast mode (its default).
1313 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001314 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001315 // Setting text should have the same effect as Detailed
1316 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1317 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001318
1319 DestroyVideoRtpSender();
1320}
1321
1322// Test that makes sure any content hints that are set on a track before
1323// VideoRtpSender is ready to send are still applied when it gets ready to send.
1324TEST_F(RtpSenderReceiverTest,
1325 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1326 AddVideoTrack();
1327 // Setting detailed overrides the default non-screencast mode. This should be
1328 // applied even if the track is set on construction.
1329 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001330 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1331 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1332 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -08001333 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001334 video_track_->set_enabled(true);
1335
1336 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001337 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001338
1339 // Verify that the content hint is accounted for when video_rtp_sender_ does
1340 // get enabled.
1341 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001342 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001343
1344 // And removing the hint should go back to false (to verify that false was
1345 // default correctly).
1346 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001347 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001348
1349 DestroyVideoRtpSender();
1350}
1351
deadbeef20cb0c12017-02-01 20:27:00 -08001352TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1353 CreateAudioRtpSender();
1354 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1355}
1356
1357TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1358 CreateVideoRtpSender();
1359 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1360}
1361
1362// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1363// true/false from CanSendDtmf based on what |voice_channel_| returns.
1364TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1365 AddDtmfCodec();
1366 CreateAudioRtpSender();
1367 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1368 ASSERT_NE(nullptr, dtmf_sender);
1369 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1370}
1371
1372TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1373 CreateAudioRtpSender();
1374 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1375 ASSERT_NE(nullptr, dtmf_sender);
1376 // DTMF codec has not been added, as it was in the above test.
1377 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1378}
1379
1380TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1381 AddDtmfCodec();
1382 CreateAudioRtpSender();
1383 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1384 ASSERT_NE(nullptr, dtmf_sender);
1385
1386 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1387
1388 // Insert DTMF
1389 const int expected_duration = 90;
1390 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1391
1392 // Verify
1393 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1394 kDefaultTimeout);
1395 const uint32_t send_ssrc =
1396 voice_media_channel_->send_streams()[0].first_ssrc();
1397 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1398 send_ssrc, 0, expected_duration));
1399 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1400 send_ssrc, 1, expected_duration));
1401 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1402 send_ssrc, 2, expected_duration));
1403}
1404
1405// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1406// destroyed, which is needed for the DTMF sender.
1407TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1408 CreateAudioRtpSender();
1409 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1410 audio_rtp_sender_ = nullptr;
1411 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1412}
1413
deadbeef70ab1a12015-09-28 16:53:55 -07001414} // namespace webrtc