blob: 1f015f66996a46df6d1362463fe8ae8048dd6411 [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
Yves Gerey3e707812018-11-28 16:47:49 +010011#include <stddef.h>
12#include <cstdint>
kwibergd1fe2812016-04-27 06:47:29 -070013#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070014#include <string>
Tommif888bb52015-12-12 01:37:01 +010015#include <utility>
Yves Gerey3e707812018-11-28 16:47:49 +010016#include <vector>
deadbeef70ab1a12015-09-28 16:53:55 -070017
Yves Gerey3e707812018-11-28 16:47:49 +010018#include "absl/memory/memory.h"
19#include "absl/types/optional.h"
20#include "api/audio_options.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "api/crypto/crypto_options.h"
22#include "api/crypto/frame_decryptor_interface.h"
23#include "api/crypto/frame_encryptor_interface.h"
24#include "api/dtmf_sender_interface.h"
25#include "api/media_stream_interface.h"
26#include "api/rtc_error.h"
27#include "api/rtp_parameters.h"
Mirko Bonadeid9708072019-01-25 20:26:48 +010028#include "api/scoped_refptr.h"
Benjamin Wright84583f62018-10-04 14:22:34 -070029#include "api/test/fake_frame_decryptor.h"
30#include "api/test/fake_frame_encryptor.h"
Yves Gerey3e707812018-11-28 16:47:49 +010031#include "logging/rtc_event_log/rtc_event_log.h"
32#include "media/base/codec.h"
Steve Anton10542f22019-01-11 09:11:00 -080033#include "media/base/fake_media_engine.h"
34#include "media/base/media_channel.h"
35#include "media/base/media_config.h"
36#include "media/base/media_engine.h"
37#include "media/base/rtp_data_engine.h"
38#include "media/base/stream_params.h"
39#include "media/base/test_utils.h"
40#include "media/engine/fake_webrtc_call.h"
41#include "p2p/base/dtls_transport_internal.h"
42#include "p2p/base/fake_dtls_transport.h"
43#include "p2p/base/p2p_constants.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010044#include "pc/audio_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080045#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010046#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080047#include "pc/channel_manager.h"
48#include "pc/dtls_srtp_transport.h"
49#include "pc/local_audio_source.h"
50#include "pc/media_stream.h"
Ruslan Burakov7ea46052019-02-16 02:07:05 +010051#include "pc/remote_audio_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080052#include "pc/rtp_receiver.h"
53#include "pc/rtp_sender.h"
54#include "pc/rtp_transport_internal.h"
55#include "pc/test/fake_video_track_source.h"
Ruslan Burakov501bfba2019-02-11 10:29:19 +010056#include "pc/video_rtp_receiver.h"
Steve Anton10542f22019-01-11 09:11:00 -080057#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010058#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020059#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010060#include "rtc_base/third_party/sigslot/sigslot.h"
61#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#include "test/gmock.h"
63#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070064
65using ::testing::_;
66using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070067using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070068using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070069
deadbeef20cb0c12017-02-01 20:27:00 -080070namespace {
71
Seth Hampson845e8782018-03-02 11:34:10 -080072static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070073static const char kVideoTrackId[] = "video_1";
74static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020075static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080076static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020077static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080078static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020079static const uint32_t kVideoSsrcSimulcast = 102;
80static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080081static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080082} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070083
84namespace webrtc {
85
deadbeef20cb0c12017-02-01 20:27:00 -080086class RtpSenderReceiverTest : public testing::Test,
87 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070088 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070089 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080090 : network_thread_(rtc::Thread::Current()),
91 worker_thread_(rtc::Thread::Current()),
92 // Create fake media engine/etc. so we can create channels to use to
93 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070094 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020095 channel_manager_(absl::WrapUnique(media_engine_),
96 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080097 worker_thread_,
98 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010099 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -0800100 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700101 // Create channels to be used by the RtpSenders and RtpReceivers.
102 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800103 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200104 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700105 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
106 rtp_transport_ = CreateDtlsSrtpTransport();
107
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700108 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700109 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700110 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800111 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
112 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700113 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700114 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100115 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800116 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
117 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800118 voice_channel_->Enable(true);
119 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700120 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
121 video_media_channel_ = media_engine_->GetVideoChannel(0);
122 RTC_CHECK(voice_channel_);
123 RTC_CHECK(video_channel_);
124 RTC_CHECK(voice_media_channel_);
125 RTC_CHECK(video_media_channel_);
126
127 // Create streams for predefined SSRCs. Streams need to exist in order
128 // for the senders and receievers to apply parameters to them.
129 // Normally these would be created by SetLocalDescription and
130 // SetRemoteDescription.
131 voice_media_channel_->AddSendStream(
132 cricket::StreamParams::CreateLegacy(kAudioSsrc));
133 voice_media_channel_->AddRecvStream(
134 cricket::StreamParams::CreateLegacy(kAudioSsrc));
135 voice_media_channel_->AddSendStream(
136 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
137 voice_media_channel_->AddRecvStream(
138 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
139 video_media_channel_->AddSendStream(
140 cricket::StreamParams::CreateLegacy(kVideoSsrc));
141 video_media_channel_->AddRecvStream(
142 cricket::StreamParams::CreateLegacy(kVideoSsrc));
143 video_media_channel_->AddSendStream(
144 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
145 video_media_channel_->AddRecvStream(
146 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700147 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700148
Zhi Huange830e682018-03-30 10:48:35 -0700149 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200150 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
151 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700152 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
153 /*rtcp_dtls_transport=*/nullptr);
154 return dtls_srtp_transport;
155 }
156
deadbeef20cb0c12017-02-01 20:27:00 -0800157 // Needed to use DTMF sender.
158 void AddDtmfCodec() {
159 cricket::AudioSendParameters params;
160 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
161 0, 1);
162 params.codecs.push_back(kTelephoneEventCodec);
163 voice_media_channel_->SetSendParameters(params);
164 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700165
pbos5214a0a2016-12-16 15:39:11 -0800166 void AddVideoTrack() { AddVideoTrack(false); }
167
168 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100169 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800170 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700171 video_track_ =
172 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800173 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700174 }
175
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700176 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
177
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100178 void CreateAudioRtpSender(
179 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700180 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800181 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800182 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700183 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
184 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
185 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800186 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800187 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800188 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
189 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
Steve Anton02ee47c2018-01-10 16:26:06 -0800193 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700194 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800195 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800196 }
197
deadbeef20cb0c12017-02-01 20:27:00 -0800198 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
199
Seth Hampson2d2c8882018-05-16 16:02:32 -0700200 void CreateVideoRtpSender(uint32_t ssrc) {
201 CreateVideoRtpSender(false, ssrc);
202 }
203
pbos5214a0a2016-12-16 15:39:11 -0800204 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
205
Florent Castelli892acf02018-10-01 22:47:20 +0200206 void CreateVideoRtpSenderWithSimulcast(
207 int num_layers = kVideoSimulcastLayerCount) {
208 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100209 ssrcs.reserve(num_layers);
Florent Castelli892acf02018-10-01 22:47:20 +0200210 for (int i = 0; i < num_layers; ++i)
211 ssrcs.push_back(kVideoSsrcSimulcast + i);
212 cricket::StreamParams stream_params =
213 cricket::CreateSimStreamParams("cname", ssrcs);
214 video_media_channel_->AddSendStream(stream_params);
215 uint32_t primary_ssrc = stream_params.first_ssrc();
216 CreateVideoRtpSender(primary_ssrc);
217 }
218
Seth Hampson2d2c8882018-05-16 16:02:32 -0700219 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800220 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700221 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
222 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
223 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800224 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700225 video_rtp_sender_->SetSsrc(ssrc);
226 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700227 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800228 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700229 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800230 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800231 }
232
deadbeef70ab1a12015-09-28 16:53:55 -0700233 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700234 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700235 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700236 }
237
238 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700239 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700240 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700241 }
242
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100243 void CreateAudioRtpReceiver(
244 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100245 audio_rtp_receiver_ =
246 new AudioRtpReceiver(rtc::Thread::Current(), kAudioTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800247 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800248 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700249 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700250 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700251 }
252
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100253 void CreateVideoRtpReceiver(
254 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100255 video_rtp_receiver_ =
256 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800257 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800258 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100259 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700260 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700261 }
262
Florent Castelli38332cd2018-11-20 14:08:06 +0100263 void CreateVideoRtpReceiverWithSimulcast(
264 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
265 int num_layers = kVideoSimulcastLayerCount) {
266 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100267 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100268 for (int i = 0; i < num_layers; ++i)
269 ssrcs.push_back(kVideoSsrcSimulcast + i);
270 cricket::StreamParams stream_params =
271 cricket::CreateSimStreamParams("cname", ssrcs);
272 video_media_channel_->AddRecvStream(stream_params);
273 uint32_t primary_ssrc = stream_params.first_ssrc();
274
Mirko Bonadei05cf6be2019-01-31 21:38:12 +0100275 video_rtp_receiver_ =
276 new VideoRtpReceiver(rtc::Thread::Current(), kVideoTrackId, streams);
Florent Castelli38332cd2018-11-20 14:08:06 +0100277 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
278 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
279 video_track_ = video_rtp_receiver_->video_track();
280 }
281
deadbeef70ab1a12015-09-28 16:53:55 -0700282 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700283 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700284 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700285 }
286
287 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700288 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700289 VerifyVideoChannelNoOutput();
290 }
291
292 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
293
294 void VerifyVoiceChannelInput(uint32_t ssrc) {
295 // Verify that the media channel has an audio source, and the stream isn't
296 // muted.
297 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
298 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
299 }
300
301 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
302
303 void VerifyVideoChannelInput(uint32_t ssrc) {
304 // Verify that the media channel has a video source,
305 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
306 }
307
308 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
309
310 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
311 // Verify that the media channel's source is reset.
312 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
313 }
314
315 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
316
317 void VerifyVideoChannelNoInput(uint32_t ssrc) {
318 // Verify that the media channel's source is reset.
319 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
320 }
321
322 void VerifyVoiceChannelOutput() {
323 // Verify that the volume is initialized to 1.
324 double volume;
325 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
326 EXPECT_EQ(1, volume);
327 }
328
329 void VerifyVideoChannelOutput() {
330 // Verify that the media channel has a sink.
331 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
332 }
333
334 void VerifyVoiceChannelNoOutput() {
335 // Verify that the volume is reset to 0.
336 double volume;
337 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
338 EXPECT_EQ(0, volume);
339 }
340
341 void VerifyVideoChannelNoOutput() {
342 // Verify that the media channel's sink is reset.
343 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700344 }
345
346 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800347 rtc::Thread* const network_thread_;
348 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700349 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700350 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
351 // the |channel_manager|.
352 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
353 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800354 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700356 cricket::ChannelManager channel_manager_;
357 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700358 cricket::VoiceChannel* voice_channel_;
359 cricket::VideoChannel* video_channel_;
360 cricket::FakeVoiceMediaChannel* voice_media_channel_;
361 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700362 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
363 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
364 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
365 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800366 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700367 rtc::scoped_refptr<VideoTrackInterface> video_track_;
368 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800369 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800370 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700371};
372
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700373// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700374// and disassociated with an AudioRtpSender.
375TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
376 CreateAudioRtpSender();
377 DestroyAudioRtpSender();
378}
379
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700380// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700381// disassociated with a VideoRtpSender.
382TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
383 CreateVideoRtpSender();
384 DestroyVideoRtpSender();
385}
386
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700387// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700388// associated and disassociated with an AudioRtpReceiver.
389TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
390 CreateAudioRtpReceiver();
391 DestroyAudioRtpReceiver();
392}
393
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700394// Test that |video_channel_| is updated when a remote video track is
395// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700396TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
397 CreateVideoRtpReceiver();
398 DestroyVideoRtpReceiver();
399}
400
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100401TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
402 CreateAudioRtpReceiver({local_stream_});
403 DestroyAudioRtpReceiver();
404}
405
406TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
407 CreateVideoRtpReceiver({local_stream_});
408 DestroyVideoRtpReceiver();
409}
410
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700411// Test that the AudioRtpSender applies options from the local audio source.
412TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
413 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100414 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800415 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700416 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700417
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100418 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700419
420 DestroyAudioRtpSender();
421}
422
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700423// Test that the stream is muted when the track is disabled, and unmuted when
424// the track is enabled.
425TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
426 CreateAudioRtpSender();
427
428 audio_track_->set_enabled(false);
429 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
430
431 audio_track_->set_enabled(true);
432 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
433
434 DestroyAudioRtpSender();
435}
436
437// Test that the volume is set to 0 when the track is disabled, and back to
438// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700439TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
440 CreateAudioRtpReceiver();
441
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700442 double volume;
443 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
444 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700445
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700446 audio_track_->set_enabled(false);
447 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
448 EXPECT_EQ(0, volume);
449
deadbeef70ab1a12015-09-28 16:53:55 -0700450 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700451 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
452 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700453
454 DestroyAudioRtpReceiver();
455}
456
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700457// Currently no action is taken when a remote video track is disabled or
458// enabled, so there's nothing to test here, other than what is normally
459// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700460TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
461 CreateVideoRtpSender();
462
deadbeef70ab1a12015-09-28 16:53:55 -0700463 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700464 video_track_->set_enabled(true);
465
466 DestroyVideoRtpSender();
467}
468
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700469// Test that the state of the video track created by the VideoRtpReceiver is
470// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100471TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
472 CreateVideoRtpReceiver();
473
474 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
475 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
476 video_track_->GetSource()->state());
477
478 DestroyVideoRtpReceiver();
479
480 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
481 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
482 video_track_->GetSource()->state());
483}
484
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700485// Currently no action is taken when a remote video track is disabled or
486// enabled, so there's nothing to test here, other than what is normally
487// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700488TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
489 CreateVideoRtpReceiver();
490
491 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700492 video_track_->set_enabled(true);
493
494 DestroyVideoRtpReceiver();
495}
496
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700497// Test that the AudioRtpReceiver applies volume changes from the track source
498// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700499TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
500 CreateAudioRtpReceiver();
501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 double volume;
503 audio_track_->GetSource()->SetVolume(0.5);
504 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
505 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700506
507 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700508 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700509 audio_track_->GetSource()->SetVolume(0.8);
510 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
511 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700512
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700513 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700514 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
516 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518 // Try changing volume one more time.
519 audio_track_->GetSource()->SetVolume(0.9);
520 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
521 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700522
523 DestroyAudioRtpReceiver();
524}
525
Ruslan Burakov7ea46052019-02-16 02:07:05 +0100526TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatencyCaching) {
527 absl::optional<int> delay_ms; // In milliseconds.
528 double latency_s = 0.5; // In seconds.
529 rtc::scoped_refptr<RemoteAudioSource> source =
530 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
531
532 // Check default value.
533 EXPECT_DOUBLE_EQ(source->GetLatency(), 0.0);
534
535 // Check caching behaviour.
536 source->SetLatency(latency_s);
537 EXPECT_DOUBLE_EQ(source->GetLatency(), latency_s);
538
539 // Check that cached value applied on the start.
540 source->Start(voice_media_channel_, kAudioSsrc);
541 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
542 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
543
544 // Check that setting latency changes delay.
545 latency_s = 0.8;
546 source->SetLatency(latency_s);
547 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
548 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
549 EXPECT_DOUBLE_EQ(latency_s, source->GetLatency());
550
551 // Check that if underlying delay is changed then remote source will reflect
552 // it.
553 delay_ms = 300;
554 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc,
555 delay_ms.value());
556 EXPECT_DOUBLE_EQ(source->GetLatency(), delay_ms.value() / 1000.0);
557
558 // Check that after stop we get last cached value.
559 source->Stop(voice_media_channel_, kAudioSsrc);
560 EXPECT_DOUBLE_EQ(latency_s, source->GetLatency());
561
562 // Check that if we start source again with new ssrc then cached value is
563 // applied.
564 source->Start(voice_media_channel_, kAudioSsrc2);
565 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc2);
566 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
567
568 // Check rounding behavior.
569 source->SetLatency(2 / 1000.0);
570 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc2);
571 EXPECT_EQ(0, delay_ms.value_or(-1));
572 EXPECT_DOUBLE_EQ(0, source->GetLatency());
573}
574
575TEST_F(RtpSenderReceiverTest, RemoteAudioSourceLatencyNoCaching) {
576 int delay_ms = 300; // In milliseconds.
577 rtc::scoped_refptr<RemoteAudioSource> source =
578 new rtc::RefCountedObject<RemoteAudioSource>(rtc::Thread::Current());
579
580 // Set it to value different from default zero.
581 voice_media_channel_->SetBaseMinimumPlayoutDelayMs(kAudioSsrc, delay_ms);
582
583 // Check that calling GetLatency on the source that hasn't been started yet
584 // won't trigger caching.
585 EXPECT_DOUBLE_EQ(source->GetLatency(), 0);
586 source->Start(voice_media_channel_, kAudioSsrc);
587 EXPECT_DOUBLE_EQ(source->GetLatency(), delay_ms / 1000.0);
588}
589
590TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetLatency) {
591 CreateAudioRtpReceiver();
592
593 absl::optional<int> delay_ms; // In milliseconds.
594 double latency_s = 0.5; // In seconds.
595 audio_track_->GetSource()->SetLatency(latency_s);
596 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
597 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
598
599 // Disabling the track should take no effect on previously set value.
600 audio_track_->set_enabled(false);
601 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
602 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
603
604 // When the track is disabled, we still should be able to set latency.
605 latency_s = 0.3;
606 audio_track_->GetSource()->SetLatency(latency_s);
607 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
608 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
609
610 // Enabling the track should take no effect on previously set value.
611 audio_track_->set_enabled(true);
612 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
613 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
614
615 // We still should be able to change latency.
616 latency_s = 0.0;
617 audio_track_->GetSource()->SetLatency(latency_s);
618 delay_ms = voice_media_channel_->GetBaseMinimumPlayoutDelayMs(kAudioSsrc);
619 EXPECT_EQ(0, delay_ms.value_or(-1));
620 EXPECT_DOUBLE_EQ(latency_s, delay_ms.value_or(0) / 1000.0);
621}
622
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623// Test that the media channel isn't enabled for sending if the audio sender
624// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800625TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800626 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800627 rtc::scoped_refptr<AudioTrackInterface> track =
628 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700629
630 // Track but no SSRC.
631 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
632 VerifyVoiceChannelNoInput();
633
634 // SSRC but no track.
635 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
636 audio_rtp_sender_->SetSsrc(kAudioSsrc);
637 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800638}
639
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700640// Test that the media channel isn't enabled for sending if the video sender
641// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800642TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800643 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644
645 // Track but no SSRC.
646 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
647 VerifyVideoChannelNoInput();
648
649 // SSRC but no track.
650 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
651 video_rtp_sender_->SetSsrc(kVideoSsrc);
652 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800653}
654
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700655// Test that the media channel is enabled for sending when the audio sender
656// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800657TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800658 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800659 rtc::scoped_refptr<AudioTrackInterface> track =
660 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700661 audio_rtp_sender_->SetSsrc(kAudioSsrc);
662 audio_rtp_sender_->SetTrack(track);
663 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800664
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700665 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800666}
667
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700668// Test that the media channel is enabled for sending when the audio sender
669// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800670TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800671 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800672 rtc::scoped_refptr<AudioTrackInterface> track =
673 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700674 audio_rtp_sender_->SetTrack(track);
675 audio_rtp_sender_->SetSsrc(kAudioSsrc);
676 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800677
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700678 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800679}
680
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700681// Test that the media channel is enabled for sending when the video sender
682// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800683TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700684 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800685 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700686 video_rtp_sender_->SetSsrc(kVideoSsrc);
687 video_rtp_sender_->SetTrack(video_track_);
688 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800689
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700690 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800691}
692
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700693// Test that the media channel is enabled for sending when the video sender
694// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800695TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700696 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800697 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700698 video_rtp_sender_->SetTrack(video_track_);
699 video_rtp_sender_->SetSsrc(kVideoSsrc);
700 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800701
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700702 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800703}
704
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700705// Test that the media channel stops sending when the audio sender's SSRC is set
706// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800707TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700708 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800709
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700710 audio_rtp_sender_->SetSsrc(0);
711 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800712}
713
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700714// Test that the media channel stops sending when the video sender's SSRC is set
715// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800716TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700717 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800718
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700719 audio_rtp_sender_->SetSsrc(0);
720 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800721}
722
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700723// Test that the media channel stops sending when the audio sender's track is
724// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800725TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700726 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800727
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700728 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
729 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800730}
731
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700732// Test that the media channel stops sending when the video sender's track is
733// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800734TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700735 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800736
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737 video_rtp_sender_->SetSsrc(0);
738 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800739}
740
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700741// Test that when the audio sender's SSRC is changed, the media channel stops
742// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800743TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700744 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800745
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
747 VerifyVoiceChannelNoInput(kAudioSsrc);
748 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800749
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700750 audio_rtp_sender_ = nullptr;
751 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800752}
753
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700754// Test that when the audio sender's SSRC is changed, the media channel stops
755// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800756TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700757 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800758
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700759 video_rtp_sender_->SetSsrc(kVideoSsrc2);
760 VerifyVideoChannelNoInput(kVideoSsrc);
761 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800762
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700763 video_rtp_sender_ = nullptr;
764 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800765}
766
skvladdc1c62c2016-03-16 19:07:43 -0700767TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
768 CreateAudioRtpSender();
769
skvladdc1c62c2016-03-16 19:07:43 -0700770 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700771 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800772 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700773
774 DestroyAudioRtpSender();
775}
776
Florent Castelli892acf02018-10-01 22:47:20 +0200777TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
778 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
779
780 RtpParameters params = audio_rtp_sender_->GetParameters();
781 ASSERT_EQ(1u, params.encodings.size());
782 params.encodings[0].max_bitrate_bps = 90000;
783 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
784
785 params = audio_rtp_sender_->GetParameters();
786 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
787 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
788
789 DestroyAudioRtpSender();
790}
791
792TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
793 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
794 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
795
796 audio_rtp_sender_ =
797 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
798 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
799 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
800
801 std::vector<RtpEncodingParameters> init_encodings(1);
802 init_encodings[0].max_bitrate_bps = 60000;
803 audio_rtp_sender_->set_init_send_encodings(init_encodings);
804
805 RtpParameters params = audio_rtp_sender_->GetParameters();
806 ASSERT_EQ(1u, params.encodings.size());
807 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
808
809 // Simulate the setLocalDescription call
810 std::vector<uint32_t> ssrcs(1, 1);
811 cricket::StreamParams stream_params =
812 cricket::CreateSimStreamParams("cname", ssrcs);
813 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800814 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200815 audio_rtp_sender_->SetSsrc(1);
816
817 params = audio_rtp_sender_->GetParameters();
818 ASSERT_EQ(1u, params.encodings.size());
819 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
820
821 DestroyAudioRtpSender();
822}
823
824TEST_F(RtpSenderReceiverTest,
825 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
826 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
827
828 RtpParameters params;
829 RTCError result = audio_rtp_sender_->SetParameters(params);
830 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
831 DestroyAudioRtpSender();
832}
833
Florent Castellicebf50f2018-05-03 15:31:53 +0200834TEST_F(RtpSenderReceiverTest,
835 AudioSenderMustCallGetParametersBeforeSetParameters) {
836 CreateAudioRtpSender();
837
838 RtpParameters params;
839 RTCError result = audio_rtp_sender_->SetParameters(params);
840 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
841
842 DestroyAudioRtpSender();
843}
844
845TEST_F(RtpSenderReceiverTest,
846 AudioSenderSetParametersInvalidatesTransactionId) {
847 CreateAudioRtpSender();
848
849 RtpParameters params = audio_rtp_sender_->GetParameters();
850 EXPECT_EQ(1u, params.encodings.size());
851 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
852 RTCError result = audio_rtp_sender_->SetParameters(params);
853 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
854
855 DestroyAudioRtpSender();
856}
857
858TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
859 CreateAudioRtpSender();
860
861 RtpParameters params = audio_rtp_sender_->GetParameters();
862 params.transaction_id = "";
863 RTCError result = audio_rtp_sender_->SetParameters(params);
864 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
865
866 DestroyAudioRtpSender();
867}
868
869TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
870 CreateAudioRtpSender();
871
872 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200873 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200874 auto saved_transaction_id = params.transaction_id;
875 params = audio_rtp_sender_->GetParameters();
876 EXPECT_NE(saved_transaction_id, params.transaction_id);
877
878 DestroyAudioRtpSender();
879}
880
881TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
882 CreateAudioRtpSender();
883
884 RtpParameters params = audio_rtp_sender_->GetParameters();
885 RtpParameters second_params = audio_rtp_sender_->GetParameters();
886
887 RTCError result = audio_rtp_sender_->SetParameters(params);
888 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700889 DestroyAudioRtpSender();
890}
891
892TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
893 CreateAudioRtpSender();
894 RtpParameters params = audio_rtp_sender_->GetParameters();
895 EXPECT_EQ(1u, params.encodings.size());
896
Florent Castelli87b3c512018-07-18 16:00:28 +0200897 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700898 params.mid = "dummy_mid";
899 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
900 audio_rtp_sender_->SetParameters(params).type());
901 params = audio_rtp_sender_->GetParameters();
902
Seth Hampson2d2c8882018-05-16 16:02:32 -0700903 DestroyAudioRtpSender();
904}
905
906TEST_F(RtpSenderReceiverTest,
907 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
908 CreateAudioRtpSender();
909 RtpParameters params = audio_rtp_sender_->GetParameters();
910 EXPECT_EQ(1u, params.encodings.size());
911
Henrik Grunelle1301a82018-12-13 12:13:22 +0000912 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -0800913 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000914 params.encodings[0].codec_payload_type = 1;
915 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
916 audio_rtp_sender_->SetParameters(params).type());
917 params = audio_rtp_sender_->GetParameters();
918
Seth Hampson2d2c8882018-05-16 16:02:32 -0700919 params.encodings[0].fec = RtpFecParameters();
920 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
921 audio_rtp_sender_->SetParameters(params).type());
922 params = audio_rtp_sender_->GetParameters();
923
924 params.encodings[0].rtx = RtpRtxParameters();
925 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
926 audio_rtp_sender_->SetParameters(params).type());
927 params = audio_rtp_sender_->GetParameters();
928
929 params.encodings[0].dtx = DtxStatus::ENABLED;
930 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
931 audio_rtp_sender_->SetParameters(params).type());
932 params = audio_rtp_sender_->GetParameters();
933
934 params.encodings[0].ptime = 1;
935 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
936 audio_rtp_sender_->SetParameters(params).type());
937 params = audio_rtp_sender_->GetParameters();
938
Seth Hampson2d2c8882018-05-16 16:02:32 -0700939 params.encodings[0].dependency_rids.push_back("dummy_rid");
940 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
941 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200942
943 DestroyAudioRtpSender();
944}
945
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700946TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
947 CreateAudioRtpSender();
948
949 EXPECT_EQ(-1, voice_media_channel_->max_bps());
950 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200951 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800952 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100953 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800954 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700955
956 // Read back the parameters and verify they have been changed.
957 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200958 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100959 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700960
961 // Verify that the audio channel received the new parameters.
962 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200963 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100964 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700965
966 // Verify that the global bitrate limit has not been changed.
967 EXPECT_EQ(-1, voice_media_channel_->max_bps());
968
969 DestroyAudioRtpSender();
970}
971
Seth Hampson24722b32017-12-22 09:36:42 -0800972TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
973 CreateAudioRtpSender();
974
975 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200976 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800977 EXPECT_EQ(webrtc::kDefaultBitratePriority,
978 params.encodings[0].bitrate_priority);
979 double new_bitrate_priority = 2.0;
980 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800981 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800982
983 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200984 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800985 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
986
987 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200988 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800989 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
990
991 DestroyAudioRtpSender();
992}
993
skvladdc1c62c2016-03-16 19:07:43 -0700994TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
995 CreateVideoRtpSender();
996
skvladdc1c62c2016-03-16 19:07:43 -0700997 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700998 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800999 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -07001000
1001 DestroyVideoRtpSender();
1002}
1003
Florent Castelli892acf02018-10-01 22:47:20 +02001004TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
1005 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
1006
1007 RtpParameters params = video_rtp_sender_->GetParameters();
1008 ASSERT_EQ(1u, params.encodings.size());
1009 params.encodings[0].max_bitrate_bps = 90000;
1010 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1011
1012 params = video_rtp_sender_->GetParameters();
1013 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1014 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
1015
1016 DestroyVideoRtpSender();
1017}
1018
1019TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
1020 AddVideoTrack(false);
1021
1022 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1023 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1024 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1025
1026 std::vector<RtpEncodingParameters> init_encodings(2);
1027 init_encodings[0].max_bitrate_bps = 60000;
1028 init_encodings[1].max_bitrate_bps = 900000;
1029 video_rtp_sender_->set_init_send_encodings(init_encodings);
1030
1031 RtpParameters params = video_rtp_sender_->GetParameters();
1032 ASSERT_EQ(2u, params.encodings.size());
1033 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1034 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1035
1036 // Simulate the setLocalDescription call
1037 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001038 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001039 for (int i = 0; i < 2; ++i)
1040 ssrcs.push_back(kVideoSsrcSimulcast + i);
1041 cricket::StreamParams stream_params =
1042 cricket::CreateSimStreamParams("cname", ssrcs);
1043 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001044 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001045 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1046
1047 params = video_rtp_sender_->GetParameters();
1048 ASSERT_EQ(2u, params.encodings.size());
1049 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1050 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
1051
1052 DestroyVideoRtpSender();
1053}
1054
1055TEST_F(RtpSenderReceiverTest,
1056 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
1057 AddVideoTrack(false);
1058
1059 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1060 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1061 video_rtp_sender_->set_stream_ids({local_stream_->id()});
1062
1063 std::vector<RtpEncodingParameters> init_encodings(1);
1064 init_encodings[0].max_bitrate_bps = 60000;
1065 video_rtp_sender_->set_init_send_encodings(init_encodings);
1066
1067 RtpParameters params = video_rtp_sender_->GetParameters();
1068 ASSERT_EQ(1u, params.encodings.size());
1069 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1070
1071 // Simulate the setLocalDescription call as if the user used SDP munging
1072 // to enable simulcast
1073 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +01001074 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +02001075 for (int i = 0; i < 2; ++i)
1076 ssrcs.push_back(kVideoSsrcSimulcast + i);
1077 cricket::StreamParams stream_params =
1078 cricket::CreateSimStreamParams("cname", ssrcs);
1079 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001080 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +02001081 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
1082
1083 params = video_rtp_sender_->GetParameters();
1084 ASSERT_EQ(2u, params.encodings.size());
1085 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
1086
1087 DestroyVideoRtpSender();
1088}
1089
1090TEST_F(RtpSenderReceiverTest,
1091 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
1092 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
1093
1094 RtpParameters params;
1095 RTCError result = video_rtp_sender_->SetParameters(params);
1096 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1097 DestroyVideoRtpSender();
1098}
1099
Florent Castellicebf50f2018-05-03 15:31:53 +02001100TEST_F(RtpSenderReceiverTest,
1101 VideoSenderMustCallGetParametersBeforeSetParameters) {
1102 CreateVideoRtpSender();
1103
1104 RtpParameters params;
1105 RTCError result = video_rtp_sender_->SetParameters(params);
1106 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1107
1108 DestroyVideoRtpSender();
1109}
1110
1111TEST_F(RtpSenderReceiverTest,
1112 VideoSenderSetParametersInvalidatesTransactionId) {
1113 CreateVideoRtpSender();
1114
1115 RtpParameters params = video_rtp_sender_->GetParameters();
1116 EXPECT_EQ(1u, params.encodings.size());
1117 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1118 RTCError result = video_rtp_sender_->SetParameters(params);
1119 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1120
1121 DestroyVideoRtpSender();
1122}
1123
1124TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1125 CreateVideoRtpSender();
1126
1127 RtpParameters params = video_rtp_sender_->GetParameters();
1128 params.transaction_id = "";
1129 RTCError result = video_rtp_sender_->SetParameters(params);
1130 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1131
1132 DestroyVideoRtpSender();
1133}
1134
1135TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1136 CreateVideoRtpSender();
1137
1138 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001139 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001140 auto saved_transaction_id = params.transaction_id;
1141 params = video_rtp_sender_->GetParameters();
1142 EXPECT_NE(saved_transaction_id, params.transaction_id);
1143
1144 DestroyVideoRtpSender();
1145}
1146
1147TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1148 CreateVideoRtpSender();
1149
1150 RtpParameters params = video_rtp_sender_->GetParameters();
1151 RtpParameters second_params = video_rtp_sender_->GetParameters();
1152
1153 RTCError result = video_rtp_sender_->SetParameters(params);
1154 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1155
1156 DestroyVideoRtpSender();
1157}
1158
Seth Hampson2d2c8882018-05-16 16:02:32 -07001159TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1160 CreateVideoRtpSender();
1161 RtpParameters params = video_rtp_sender_->GetParameters();
1162 EXPECT_EQ(1u, params.encodings.size());
1163
Florent Castelli87b3c512018-07-18 16:00:28 +02001164 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001165 params.mid = "dummy_mid";
1166 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1167 video_rtp_sender_->SetParameters(params).type());
1168 params = video_rtp_sender_->GetParameters();
1169
Seth Hampson2d2c8882018-05-16 16:02:32 -07001170 DestroyVideoRtpSender();
1171}
1172
1173TEST_F(RtpSenderReceiverTest,
1174 VideoSenderCantSetUnimplementedEncodingParameters) {
1175 CreateVideoRtpSender();
1176 RtpParameters params = video_rtp_sender_->GetParameters();
1177 EXPECT_EQ(1u, params.encodings.size());
1178
Henrik Grunelle1301a82018-12-13 12:13:22 +00001179 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001180 // scale_framerate_down_by, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001181 params.encodings[0].codec_payload_type = 1;
1182 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1183 video_rtp_sender_->SetParameters(params).type());
1184 params = video_rtp_sender_->GetParameters();
1185
Seth Hampson2d2c8882018-05-16 16:02:32 -07001186 params.encodings[0].fec = RtpFecParameters();
1187 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1188 video_rtp_sender_->SetParameters(params).type());
1189 params = video_rtp_sender_->GetParameters();
1190
1191 params.encodings[0].rtx = RtpRtxParameters();
1192 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1193 video_rtp_sender_->SetParameters(params).type());
1194 params = video_rtp_sender_->GetParameters();
1195
1196 params.encodings[0].dtx = DtxStatus::ENABLED;
1197 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1198 video_rtp_sender_->SetParameters(params).type());
1199 params = video_rtp_sender_->GetParameters();
1200
1201 params.encodings[0].ptime = 1;
1202 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1203 video_rtp_sender_->SetParameters(params).type());
1204 params = video_rtp_sender_->GetParameters();
1205
Seth Hampson2d2c8882018-05-16 16:02:32 -07001206 params.encodings[0].dependency_rids.push_back("dummy_rid");
1207 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1208 video_rtp_sender_->SetParameters(params).type());
1209
1210 DestroyVideoRtpSender();
1211}
1212
Amit Hilbuchaa584152019-02-06 17:09:52 -08001213TEST_F(RtpSenderReceiverTest, VideoSenderCanSetRid) {
1214 CreateVideoRtpSender();
1215 RtpParameters params = video_rtp_sender_->GetParameters();
1216 EXPECT_EQ(1u, params.encodings.size());
1217 const std::string rid = "dummy_rid";
1218 params.encodings[0].rid = rid;
1219 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1220 params = video_rtp_sender_->GetParameters();
1221 EXPECT_EQ(1u, params.encodings.size());
1222 EXPECT_EQ(rid, params.encodings[0].rid);
1223
1224 DestroyVideoRtpSender();
1225}
1226
Florent Castellic1a0bcb2019-01-29 14:26:48 +01001227TEST_F(RtpSenderReceiverTest, VideoSenderCanSetScaleResolutionDownBy) {
1228 CreateVideoRtpSender();
1229
1230 RtpParameters params = video_rtp_sender_->GetParameters();
1231 params.encodings[0].scale_resolution_down_by = 2;
1232
1233 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1234 params = video_rtp_sender_->GetParameters();
1235 EXPECT_EQ(2, params.encodings[0].scale_resolution_down_by);
1236
1237 DestroyVideoRtpSender();
1238}
1239
1240TEST_F(RtpSenderReceiverTest, VideoSenderDetectInvalidScaleResolutionDownBy) {
1241 CreateVideoRtpSender();
1242
1243 RtpParameters params = video_rtp_sender_->GetParameters();
1244 params.encodings[0].scale_resolution_down_by = 0.5;
1245 RTCError result = video_rtp_sender_->SetParameters(params);
1246 EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.type());
1247
1248 DestroyVideoRtpSender();
1249}
1250
Florent Castelli892acf02018-10-01 22:47:20 +02001251TEST_F(RtpSenderReceiverTest,
1252 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1253 CreateVideoRtpSenderWithSimulcast();
1254 RtpParameters params = video_rtp_sender_->GetParameters();
1255 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1256
Henrik Grunelle1301a82018-12-13 12:13:22 +00001257 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Amit Hilbuchaa584152019-02-06 17:09:52 -08001258 // scale_framerate_down_by, dependency_rids.
Florent Castelli892acf02018-10-01 22:47:20 +02001259 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001260 params.encodings[i].codec_payload_type = 1;
1261 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1262 video_rtp_sender_->SetParameters(params).type());
1263 params = video_rtp_sender_->GetParameters();
1264
Florent Castelli892acf02018-10-01 22:47:20 +02001265 params.encodings[i].fec = RtpFecParameters();
1266 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1267 video_rtp_sender_->SetParameters(params).type());
1268 params = video_rtp_sender_->GetParameters();
1269
1270 params.encodings[i].rtx = RtpRtxParameters();
1271 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1272 video_rtp_sender_->SetParameters(params).type());
1273 params = video_rtp_sender_->GetParameters();
1274
1275 params.encodings[i].dtx = DtxStatus::ENABLED;
1276 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1277 video_rtp_sender_->SetParameters(params).type());
1278 params = video_rtp_sender_->GetParameters();
1279
1280 params.encodings[i].ptime = 1;
1281 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1282 video_rtp_sender_->SetParameters(params).type());
1283 params = video_rtp_sender_->GetParameters();
1284
Florent Castelli892acf02018-10-01 22:47:20 +02001285 params.encodings[i].dependency_rids.push_back("dummy_rid");
1286 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1287 video_rtp_sender_->SetParameters(params).type());
1288 }
1289
1290 DestroyVideoRtpSender();
1291}
1292
Seth Hampson2d2c8882018-05-16 16:02:32 -07001293// A video sender can have multiple simulcast layers, in which case it will
1294// contain multiple RtpEncodingParameters. This tests that if this is the case
1295// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1296// for any encodings besides at index 0, because these are both implemented
1297// "per-sender."
1298TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1299 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001300 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001301 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001302 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001303
1304 params.encodings[1].bitrate_priority = 2.0;
1305 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1306 video_rtp_sender_->SetParameters(params).type());
1307 params = video_rtp_sender_->GetParameters();
1308
Seth Hampson2d2c8882018-05-16 16:02:32 -07001309 DestroyVideoRtpSender();
1310}
1311
Florent Castelli892acf02018-10-01 22:47:20 +02001312TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1313 // Add a simulcast specific send stream that contains 2 encoding parameters.
1314 CreateVideoRtpSenderWithSimulcast();
1315 RtpParameters params = video_rtp_sender_->GetParameters();
1316 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1317
1318 for (size_t i = 0; i < params.encodings.size(); i++) {
1319 params.encodings[i].ssrc = 1337;
1320 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1321 video_rtp_sender_->SetParameters(params).type());
1322 params = video_rtp_sender_->GetParameters();
1323 }
1324
1325 DestroyVideoRtpSender();
1326}
1327
Ă…sa Persson55659812018-06-18 17:51:32 +02001328TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001329 CreateVideoRtpSender();
1330
1331 EXPECT_EQ(-1, video_media_channel_->max_bps());
1332 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001333 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001334 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001335 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001336 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001337 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001338 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001339
1340 // Read back the parameters and verify they have been changed.
1341 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001342 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001343 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001344 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001345
1346 // Verify that the video channel received the new parameters.
1347 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001348 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001349 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001350 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001351
1352 // Verify that the global bitrate limit has not been changed.
1353 EXPECT_EQ(-1, video_media_channel_->max_bps());
1354
1355 DestroyVideoRtpSender();
1356}
1357
Ă…sa Persson55659812018-06-18 17:51:32 +02001358TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1359 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001360 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001361
1362 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001363 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001364 params.encodings[0].min_bitrate_bps = 100;
1365 params.encodings[0].max_bitrate_bps = 1000;
1366 params.encodings[1].min_bitrate_bps = 200;
1367 params.encodings[1].max_bitrate_bps = 2000;
1368 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1369
1370 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001371 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1372 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001373 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1374 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1375 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1376 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1377
1378 DestroyVideoRtpSender();
1379}
1380
Seth Hampson24722b32017-12-22 09:36:42 -08001381TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1382 CreateVideoRtpSender();
1383
1384 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001385 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001386 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1387 params.encodings[0].bitrate_priority);
1388 double new_bitrate_priority = 2.0;
1389 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001390 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001391
1392 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001393 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001394 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1395
1396 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001397 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001398 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1399
1400 DestroyVideoRtpSender();
1401}
1402
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001403TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1404 CreateAudioRtpReceiver();
1405
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001406 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001407 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001408 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1409
1410 DestroyAudioRtpReceiver();
1411}
1412
1413TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1414 CreateVideoRtpReceiver();
1415
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001416 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001417 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001418 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1419
1420 DestroyVideoRtpReceiver();
1421}
1422
Florent Castelli38332cd2018-11-20 14:08:06 +01001423TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1424 CreateVideoRtpReceiverWithSimulcast({}, 2);
1425
1426 RtpParameters params = video_rtp_receiver_->GetParameters();
1427 EXPECT_EQ(2u, params.encodings.size());
1428
1429 DestroyVideoRtpReceiver();
1430}
1431
pbos5214a0a2016-12-16 15:39:11 -08001432// Test that makes sure that a video track content hint translates to the proper
1433// value for sources that are not screencast.
1434TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1435 CreateVideoRtpSender();
1436
1437 video_track_->set_enabled(true);
1438
1439 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001440 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001441 // No content hint should be set by default.
1442 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1443 video_track_->content_hint());
1444 // Setting detailed should turn a non-screencast source into screencast mode.
1445 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001446 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001447 // Removing the content hint should turn the track back into non-screencast
1448 // mode.
1449 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001450 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001451 // Setting fluid should remain in non-screencast mode (its default).
1452 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001453 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001454 // Setting text should have the same effect as Detailed
1455 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1456 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001457
1458 DestroyVideoRtpSender();
1459}
1460
1461// Test that makes sure that a video track content hint translates to the proper
1462// value for screencast sources.
1463TEST_F(RtpSenderReceiverTest,
1464 PropagatesVideoTrackContentHintForScreencastSource) {
1465 CreateVideoRtpSender(true);
1466
1467 video_track_->set_enabled(true);
1468
1469 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001470 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001471 // No content hint should be set by default.
1472 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1473 video_track_->content_hint());
1474 // Setting fluid should turn a screencast source into non-screencast mode.
1475 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001476 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001477 // Removing the content hint should turn the track back into screencast mode.
1478 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001479 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001480 // Setting detailed should still remain in screencast mode (its default).
1481 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001482 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001483 // Setting text should have the same effect as Detailed
1484 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1485 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001486
1487 DestroyVideoRtpSender();
1488}
1489
1490// Test that makes sure any content hints that are set on a track before
1491// VideoRtpSender is ready to send are still applied when it gets ready to send.
1492TEST_F(RtpSenderReceiverTest,
1493 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1494 AddVideoTrack();
1495 // Setting detailed overrides the default non-screencast mode. This should be
1496 // applied even if the track is set on construction.
1497 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001498 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1499 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1500 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001501 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001502 video_track_->set_enabled(true);
1503
1504 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001505 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001506
1507 // Verify that the content hint is accounted for when video_rtp_sender_ does
1508 // get enabled.
1509 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001510 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001511
1512 // And removing the hint should go back to false (to verify that false was
1513 // default correctly).
1514 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001515 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001516
1517 DestroyVideoRtpSender();
1518}
1519
deadbeef20cb0c12017-02-01 20:27:00 -08001520TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1521 CreateAudioRtpSender();
1522 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1523}
1524
1525TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1526 CreateVideoRtpSender();
1527 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1528}
1529
1530// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1531// true/false from CanSendDtmf based on what |voice_channel_| returns.
1532TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1533 AddDtmfCodec();
1534 CreateAudioRtpSender();
1535 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1536 ASSERT_NE(nullptr, dtmf_sender);
1537 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1538}
1539
1540TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1541 CreateAudioRtpSender();
1542 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1543 ASSERT_NE(nullptr, dtmf_sender);
1544 // DTMF codec has not been added, as it was in the above test.
1545 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1546}
1547
1548TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1549 AddDtmfCodec();
1550 CreateAudioRtpSender();
1551 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1552 ASSERT_NE(nullptr, dtmf_sender);
1553
1554 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1555
1556 // Insert DTMF
1557 const int expected_duration = 90;
1558 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1559
1560 // Verify
1561 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1562 kDefaultTimeout);
1563 const uint32_t send_ssrc =
1564 voice_media_channel_->send_streams()[0].first_ssrc();
1565 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1566 send_ssrc, 0, expected_duration));
1567 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1568 send_ssrc, 1, expected_duration));
1569 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1570 send_ssrc, 2, expected_duration));
1571}
1572
1573// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1574// destroyed, which is needed for the DTMF sender.
1575TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1576 CreateAudioRtpSender();
1577 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1578 audio_rtp_sender_ = nullptr;
1579 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1580}
1581
Benjamin Wright84583f62018-10-04 14:22:34 -07001582// Validate that the default FrameEncryptor setting is nullptr.
1583TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1584 CreateAudioRtpSender();
1585 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1586 new FakeFrameEncryptor());
1587 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1588 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1589 EXPECT_EQ(fake_frame_encryptor.get(),
1590 audio_rtp_sender_->GetFrameEncryptor().get());
1591}
1592
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001593// Validate that setting a FrameEncryptor after the send stream is stopped does
1594// nothing.
1595TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1596 CreateAudioRtpSender();
1597 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1598 new FakeFrameEncryptor());
1599 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1600 audio_rtp_sender_->Stop();
1601 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1602 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1603}
1604
Benjamin Wright84583f62018-10-04 14:22:34 -07001605// Validate that the default FrameEncryptor setting is nullptr.
1606TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1607 CreateAudioRtpReceiver();
1608 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1609 new FakeFrameDecryptor());
1610 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1611 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1612 EXPECT_EQ(fake_frame_decryptor.get(),
1613 audio_rtp_receiver_->GetFrameDecryptor().get());
1614}
1615
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001616// Validate that the default FrameEncryptor setting is nullptr.
1617TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1618 CreateAudioRtpReceiver();
1619 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1620 new FakeFrameDecryptor());
1621 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1622 audio_rtp_receiver_->Stop();
1623 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1624 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1625}
1626
1627// Validate that the default FrameEncryptor setting is nullptr.
1628TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1629 CreateVideoRtpSender();
1630 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1631 new FakeFrameEncryptor());
1632 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1633 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1634 EXPECT_EQ(fake_frame_encryptor.get(),
1635 video_rtp_sender_->GetFrameEncryptor().get());
1636}
1637
1638// Validate that setting a FrameEncryptor after the send stream is stopped does
1639// nothing.
1640TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1641 CreateVideoRtpSender();
1642 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1643 new FakeFrameEncryptor());
1644 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1645 video_rtp_sender_->Stop();
1646 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1647 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1648}
1649
1650// Validate that the default FrameEncryptor setting is nullptr.
1651TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1652 CreateVideoRtpReceiver();
1653 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1654 new FakeFrameDecryptor());
1655 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1656 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1657 EXPECT_EQ(fake_frame_decryptor.get(),
1658 video_rtp_receiver_->GetFrameDecryptor().get());
1659}
1660
1661// Validate that the default FrameEncryptor setting is nullptr.
1662TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1663 CreateVideoRtpReceiver();
1664 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1665 new FakeFrameDecryptor());
1666 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1667 video_rtp_receiver_->Stop();
1668 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1669 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1670}
1671
deadbeef70ab1a12015-09-28 16:53:55 -07001672} // namespace webrtc