blob: 69d0c74e8dd2b3e2499971a14c8296af87e88db2 [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"
44#include "pc/audio_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010045#include "pc/channel.h"
Steve Anton10542f22019-01-11 09:11:00 -080046#include "pc/channel_manager.h"
47#include "pc/dtls_srtp_transport.h"
48#include "pc/local_audio_source.h"
49#include "pc/media_stream.h"
50#include "pc/rtp_receiver.h"
51#include "pc/rtp_sender.h"
52#include "pc/rtp_transport_internal.h"
53#include "pc/test/fake_video_track_source.h"
54#include "pc/video_track.h"
Yves Gerey3e707812018-11-28 16:47:49 +010055#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020056#include "rtc_base/gunit.h"
Yves Gerey3e707812018-11-28 16:47:49 +010057#include "rtc_base/third_party/sigslot/sigslot.h"
58#include "rtc_base/thread.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020059#include "test/gmock.h"
60#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070061
62using ::testing::_;
63using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070064using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070065using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070066
deadbeef20cb0c12017-02-01 20:27:00 -080067namespace {
68
Seth Hampson845e8782018-03-02 11:34:10 -080069static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070070static const char kVideoTrackId[] = "video_1";
71static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020072static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080073static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020074static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080075static const uint32_t kAudioSsrc2 = 101;
Florent Castelli892acf02018-10-01 22:47:20 +020076static const uint32_t kVideoSsrcSimulcast = 102;
77static const uint32_t kVideoSimulcastLayerCount = 2;
deadbeef20cb0c12017-02-01 20:27:00 -080078static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080079} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070080
81namespace webrtc {
82
deadbeef20cb0c12017-02-01 20:27:00 -080083class RtpSenderReceiverTest : public testing::Test,
84 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070085 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070086 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080087 : network_thread_(rtc::Thread::Current()),
88 worker_thread_(rtc::Thread::Current()),
89 // Create fake media engine/etc. so we can create channels to use to
90 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070091 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020092 channel_manager_(absl::WrapUnique(media_engine_),
93 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080094 worker_thread_,
95 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010096 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080097 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070098 // Create channels to be used by the RtpSenders and RtpReceivers.
99 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -0800100 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +0200101 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -0700102 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
103 rtp_transport_ = CreateDtlsSrtpTransport();
104
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700105 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700106 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Anton Sukhanov98a462c2018-10-17 13:15:42 -0700107 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_AUDIO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800108 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
109 cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700110 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -0700111 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
Niels Möller46879152019-01-07 15:54:47 +0100112 /*media_transport=*/nullptr, rtc::Thread::Current(), cricket::CN_VIDEO,
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800113 srtp_required, webrtc::CryptoOptions(), &ssrc_generator_,
114 cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -0800115 voice_channel_->Enable(true);
116 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700117 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
118 video_media_channel_ = media_engine_->GetVideoChannel(0);
119 RTC_CHECK(voice_channel_);
120 RTC_CHECK(video_channel_);
121 RTC_CHECK(voice_media_channel_);
122 RTC_CHECK(video_media_channel_);
123
124 // Create streams for predefined SSRCs. Streams need to exist in order
125 // for the senders and receievers to apply parameters to them.
126 // Normally these would be created by SetLocalDescription and
127 // SetRemoteDescription.
128 voice_media_channel_->AddSendStream(
129 cricket::StreamParams::CreateLegacy(kAudioSsrc));
130 voice_media_channel_->AddRecvStream(
131 cricket::StreamParams::CreateLegacy(kAudioSsrc));
132 voice_media_channel_->AddSendStream(
133 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
134 voice_media_channel_->AddRecvStream(
135 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
136 video_media_channel_->AddSendStream(
137 cricket::StreamParams::CreateLegacy(kVideoSsrc));
138 video_media_channel_->AddRecvStream(
139 cricket::StreamParams::CreateLegacy(kVideoSsrc));
140 video_media_channel_->AddSendStream(
141 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
142 video_media_channel_->AddRecvStream(
143 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700144 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700145
Zhi Huange830e682018-03-30 10:48:35 -0700146 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200147 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
148 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700149 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
150 /*rtcp_dtls_transport=*/nullptr);
151 return dtls_srtp_transport;
152 }
153
deadbeef20cb0c12017-02-01 20:27:00 -0800154 // Needed to use DTMF sender.
155 void AddDtmfCodec() {
156 cricket::AudioSendParameters params;
157 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
158 0, 1);
159 params.codecs.push_back(kTelephoneEventCodec);
160 voice_media_channel_->SetSendParameters(params);
161 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700162
pbos5214a0a2016-12-16 15:39:11 -0800163 void AddVideoTrack() { AddVideoTrack(false); }
164
165 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100166 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800167 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700168 video_track_ =
169 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800170 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700171 }
172
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700173 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
174
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100175 void CreateAudioRtpSender(
176 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700177 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800178 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800179 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700180 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
181 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
182 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800183 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800184 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800185 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
186 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700187 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700188 }
189
Steve Anton02ee47c2018-01-10 16:26:06 -0800190 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700191 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800192 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800193 }
194
deadbeef20cb0c12017-02-01 20:27:00 -0800195 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
196
Seth Hampson2d2c8882018-05-16 16:02:32 -0700197 void CreateVideoRtpSender(uint32_t ssrc) {
198 CreateVideoRtpSender(false, ssrc);
199 }
200
pbos5214a0a2016-12-16 15:39:11 -0800201 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
202
Florent Castelli892acf02018-10-01 22:47:20 +0200203 void CreateVideoRtpSenderWithSimulcast(
204 int num_layers = kVideoSimulcastLayerCount) {
205 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100206 ssrcs.reserve(num_layers);
Florent Castelli892acf02018-10-01 22:47:20 +0200207 for (int i = 0; i < num_layers; ++i)
208 ssrcs.push_back(kVideoSsrcSimulcast + i);
209 cricket::StreamParams stream_params =
210 cricket::CreateSimStreamParams("cname", ssrcs);
211 video_media_channel_->AddSendStream(stream_params);
212 uint32_t primary_ssrc = stream_params.first_ssrc();
213 CreateVideoRtpSender(primary_ssrc);
214 }
215
Seth Hampson2d2c8882018-05-16 16:02:32 -0700216 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800217 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700218 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
219 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
220 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800221 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700222 video_rtp_sender_->SetSsrc(ssrc);
223 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700224 }
Steve Anton02ee47c2018-01-10 16:26:06 -0800225 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700226 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800227 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800228 }
229
deadbeef70ab1a12015-09-28 16:53:55 -0700230 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700231 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700232 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700233 }
234
235 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700236 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700237 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700238 }
239
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100240 void CreateAudioRtpReceiver(
241 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
242 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800243 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800244 audio_rtp_receiver_->SetMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800245 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700246 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700247 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700248 }
249
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100250 void CreateVideoRtpReceiver(
251 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800252 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800253 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800254 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800255 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100256 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700257 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700258 }
259
Florent Castelli38332cd2018-11-20 14:08:06 +0100260 void CreateVideoRtpReceiverWithSimulcast(
261 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {},
262 int num_layers = kVideoSimulcastLayerCount) {
263 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100264 ssrcs.reserve(num_layers);
Florent Castelli38332cd2018-11-20 14:08:06 +0100265 for (int i = 0; i < num_layers; ++i)
266 ssrcs.push_back(kVideoSsrcSimulcast + i);
267 cricket::StreamParams stream_params =
268 cricket::CreateSimStreamParams("cname", ssrcs);
269 video_media_channel_->AddRecvStream(stream_params);
270 uint32_t primary_ssrc = stream_params.first_ssrc();
271
272 video_rtp_receiver_ = new VideoRtpReceiver(
273 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
274 video_rtp_receiver_->SetMediaChannel(video_media_channel_);
275 video_rtp_receiver_->SetupMediaChannel(primary_ssrc);
276 video_track_ = video_rtp_receiver_->video_track();
277 }
278
deadbeef70ab1a12015-09-28 16:53:55 -0700279 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700280 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700281 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700282 }
283
284 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700285 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700286 VerifyVideoChannelNoOutput();
287 }
288
289 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
290
291 void VerifyVoiceChannelInput(uint32_t ssrc) {
292 // Verify that the media channel has an audio source, and the stream isn't
293 // muted.
294 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
295 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
296 }
297
298 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
299
300 void VerifyVideoChannelInput(uint32_t ssrc) {
301 // Verify that the media channel has a video source,
302 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
303 }
304
305 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
306
307 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
308 // Verify that the media channel's source is reset.
309 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
310 }
311
312 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
313
314 void VerifyVideoChannelNoInput(uint32_t ssrc) {
315 // Verify that the media channel's source is reset.
316 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
317 }
318
319 void VerifyVoiceChannelOutput() {
320 // Verify that the volume is initialized to 1.
321 double volume;
322 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
323 EXPECT_EQ(1, volume);
324 }
325
326 void VerifyVideoChannelOutput() {
327 // Verify that the media channel has a sink.
328 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
329 }
330
331 void VerifyVoiceChannelNoOutput() {
332 // Verify that the volume is reset to 0.
333 double volume;
334 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
335 EXPECT_EQ(0, volume);
336 }
337
338 void VerifyVideoChannelNoOutput() {
339 // Verify that the media channel's sink is reset.
340 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700341 }
342
343 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800344 rtc::Thread* const network_thread_;
345 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700346 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700347 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
348 // the |channel_manager|.
349 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
350 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800351 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700352 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700353 cricket::ChannelManager channel_manager_;
354 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700355 cricket::VoiceChannel* voice_channel_;
356 cricket::VideoChannel* video_channel_;
357 cricket::FakeVoiceMediaChannel* voice_media_channel_;
358 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700359 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
360 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
361 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
362 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800363 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700364 rtc::scoped_refptr<VideoTrackInterface> video_track_;
365 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800366 bool audio_sender_destroyed_signal_fired_ = false;
Amit Hilbuchbcd39d42019-01-25 17:13:56 -0800367 rtc::UniqueRandomIdGenerator ssrc_generator_;
deadbeef70ab1a12015-09-28 16:53:55 -0700368};
369
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700370// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700371// and disassociated with an AudioRtpSender.
372TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
373 CreateAudioRtpSender();
374 DestroyAudioRtpSender();
375}
376
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700377// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700378// disassociated with a VideoRtpSender.
379TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
380 CreateVideoRtpSender();
381 DestroyVideoRtpSender();
382}
383
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700384// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700385// associated and disassociated with an AudioRtpReceiver.
386TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
387 CreateAudioRtpReceiver();
388 DestroyAudioRtpReceiver();
389}
390
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700391// Test that |video_channel_| is updated when a remote video track is
392// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700393TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
394 CreateVideoRtpReceiver();
395 DestroyVideoRtpReceiver();
396}
397
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100398TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
399 CreateAudioRtpReceiver({local_stream_});
400 DestroyAudioRtpReceiver();
401}
402
403TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
404 CreateVideoRtpReceiver({local_stream_});
405 DestroyVideoRtpReceiver();
406}
407
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700408// Test that the AudioRtpSender applies options from the local audio source.
409TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
410 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100411 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800412 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700413 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700414
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100415 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700416
417 DestroyAudioRtpSender();
418}
419
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700420// Test that the stream is muted when the track is disabled, and unmuted when
421// the track is enabled.
422TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
423 CreateAudioRtpSender();
424
425 audio_track_->set_enabled(false);
426 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
427
428 audio_track_->set_enabled(true);
429 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
430
431 DestroyAudioRtpSender();
432}
433
434// Test that the volume is set to 0 when the track is disabled, and back to
435// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700436TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
437 CreateAudioRtpReceiver();
438
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700439 double volume;
440 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
441 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700442
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 audio_track_->set_enabled(false);
444 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
445 EXPECT_EQ(0, volume);
446
deadbeef70ab1a12015-09-28 16:53:55 -0700447 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
449 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700450
451 DestroyAudioRtpReceiver();
452}
453
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700454// Currently no action is taken when a remote video track is disabled or
455// enabled, so there's nothing to test here, other than what is normally
456// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700457TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
458 CreateVideoRtpSender();
459
deadbeef70ab1a12015-09-28 16:53:55 -0700460 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700461 video_track_->set_enabled(true);
462
463 DestroyVideoRtpSender();
464}
465
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466// Test that the state of the video track created by the VideoRtpReceiver is
467// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100468TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
469 CreateVideoRtpReceiver();
470
471 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
472 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
473 video_track_->GetSource()->state());
474
475 DestroyVideoRtpReceiver();
476
477 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
478 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
479 video_track_->GetSource()->state());
480}
481
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482// Currently no action is taken when a remote video track is disabled or
483// enabled, so there's nothing to test here, other than what is normally
484// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700485TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
486 CreateVideoRtpReceiver();
487
488 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700489 video_track_->set_enabled(true);
490
491 DestroyVideoRtpReceiver();
492}
493
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700494// Test that the AudioRtpReceiver applies volume changes from the track source
495// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700496TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
497 CreateAudioRtpReceiver();
498
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 double volume;
500 audio_track_->GetSource()->SetVolume(0.5);
501 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
502 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700503
504 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700505 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506 audio_track_->GetSource()->SetVolume(0.8);
507 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
508 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700509
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700510 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700511 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
513 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 // Try changing volume one more time.
516 audio_track_->GetSource()->SetVolume(0.9);
517 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
518 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700519
520 DestroyAudioRtpReceiver();
521}
522
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523// Test that the media channel isn't enabled for sending if the audio sender
524// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800525TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800526 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800527 rtc::scoped_refptr<AudioTrackInterface> track =
528 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700529
530 // Track but no SSRC.
531 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
532 VerifyVoiceChannelNoInput();
533
534 // SSRC but no track.
535 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
536 audio_rtp_sender_->SetSsrc(kAudioSsrc);
537 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800538}
539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540// Test that the media channel isn't enabled for sending if the video sender
541// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800542TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800543 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700544
545 // Track but no SSRC.
546 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
547 VerifyVideoChannelNoInput();
548
549 // SSRC but no track.
550 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
551 video_rtp_sender_->SetSsrc(kVideoSsrc);
552 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800553}
554
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555// Test that the media channel is enabled for sending when the audio sender
556// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800557TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800558 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800559 rtc::scoped_refptr<AudioTrackInterface> track =
560 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561 audio_rtp_sender_->SetSsrc(kAudioSsrc);
562 audio_rtp_sender_->SetTrack(track);
563 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800566}
567
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700568// Test that the media channel is enabled for sending when the audio sender
569// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800570TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800571 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800572 rtc::scoped_refptr<AudioTrackInterface> track =
573 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574 audio_rtp_sender_->SetTrack(track);
575 audio_rtp_sender_->SetSsrc(kAudioSsrc);
576 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800579}
580
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581// Test that the media channel is enabled for sending when the video sender
582// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800583TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700584 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800585 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700586 video_rtp_sender_->SetSsrc(kVideoSsrc);
587 video_rtp_sender_->SetTrack(video_track_);
588 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800589
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700590 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800591}
592
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700593// Test that the media channel is enabled for sending when the video sender
594// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800595TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700596 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800597 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700598 video_rtp_sender_->SetTrack(video_track_);
599 video_rtp_sender_->SetSsrc(kVideoSsrc);
600 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800601
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700602 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800603}
604
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700605// Test that the media channel stops sending when the audio sender's SSRC is set
606// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800607TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800609
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700610 audio_rtp_sender_->SetSsrc(0);
611 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800612}
613
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700614// Test that the media channel stops sending when the video sender's SSRC is set
615// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800616TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700617 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800618
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700619 audio_rtp_sender_->SetSsrc(0);
620 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800621}
622
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700623// Test that the media channel stops sending when the audio sender's track is
624// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800625TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700626 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800627
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700628 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
629 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800630}
631
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700632// Test that the media channel stops sending when the video sender's track is
633// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800634TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700635 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800636
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700637 video_rtp_sender_->SetSsrc(0);
638 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800639}
640
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700641// Test that when the audio sender's SSRC is changed, the media channel stops
642// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800643TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700644 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800645
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700646 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
647 VerifyVoiceChannelNoInput(kAudioSsrc);
648 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800649
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700650 audio_rtp_sender_ = nullptr;
651 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800652}
653
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700654// Test that when the audio sender's SSRC is changed, the media channel stops
655// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800656TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700657 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800658
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700659 video_rtp_sender_->SetSsrc(kVideoSsrc2);
660 VerifyVideoChannelNoInput(kVideoSsrc);
661 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800662
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700663 video_rtp_sender_ = nullptr;
664 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800665}
666
skvladdc1c62c2016-03-16 19:07:43 -0700667TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
668 CreateAudioRtpSender();
669
skvladdc1c62c2016-03-16 19:07:43 -0700670 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700671 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800672 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700673
674 DestroyAudioRtpSender();
675}
676
Florent Castelli892acf02018-10-01 22:47:20 +0200677TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParametersBeforeNegotiation) {
678 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
679
680 RtpParameters params = audio_rtp_sender_->GetParameters();
681 ASSERT_EQ(1u, params.encodings.size());
682 params.encodings[0].max_bitrate_bps = 90000;
683 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
684
685 params = audio_rtp_sender_->GetParameters();
686 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
687 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
688
689 DestroyAudioRtpSender();
690}
691
692TEST_F(RtpSenderReceiverTest, AudioSenderInitParametersMovedAfterNegotiation) {
693 audio_track_ = AudioTrack::Create(kAudioTrackId, nullptr);
694 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
695
696 audio_rtp_sender_ =
697 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
698 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
699 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
700
701 std::vector<RtpEncodingParameters> init_encodings(1);
702 init_encodings[0].max_bitrate_bps = 60000;
703 audio_rtp_sender_->set_init_send_encodings(init_encodings);
704
705 RtpParameters params = audio_rtp_sender_->GetParameters();
706 ASSERT_EQ(1u, params.encodings.size());
707 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
708
709 // Simulate the setLocalDescription call
710 std::vector<uint32_t> ssrcs(1, 1);
711 cricket::StreamParams stream_params =
712 cricket::CreateSimStreamParams("cname", ssrcs);
713 voice_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800714 audio_rtp_sender_->SetMediaChannel(voice_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200715 audio_rtp_sender_->SetSsrc(1);
716
717 params = audio_rtp_sender_->GetParameters();
718 ASSERT_EQ(1u, params.encodings.size());
719 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
720
721 DestroyAudioRtpSender();
722}
723
724TEST_F(RtpSenderReceiverTest,
725 AudioSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
726 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
727
728 RtpParameters params;
729 RTCError result = audio_rtp_sender_->SetParameters(params);
730 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
731 DestroyAudioRtpSender();
732}
733
Florent Castellicebf50f2018-05-03 15:31:53 +0200734TEST_F(RtpSenderReceiverTest,
735 AudioSenderMustCallGetParametersBeforeSetParameters) {
736 CreateAudioRtpSender();
737
738 RtpParameters params;
739 RTCError result = audio_rtp_sender_->SetParameters(params);
740 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
741
742 DestroyAudioRtpSender();
743}
744
745TEST_F(RtpSenderReceiverTest,
746 AudioSenderSetParametersInvalidatesTransactionId) {
747 CreateAudioRtpSender();
748
749 RtpParameters params = audio_rtp_sender_->GetParameters();
750 EXPECT_EQ(1u, params.encodings.size());
751 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
752 RTCError result = audio_rtp_sender_->SetParameters(params);
753 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
754
755 DestroyAudioRtpSender();
756}
757
758TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
759 CreateAudioRtpSender();
760
761 RtpParameters params = audio_rtp_sender_->GetParameters();
762 params.transaction_id = "";
763 RTCError result = audio_rtp_sender_->SetParameters(params);
764 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
765
766 DestroyAudioRtpSender();
767}
768
769TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
770 CreateAudioRtpSender();
771
772 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200773 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200774 auto saved_transaction_id = params.transaction_id;
775 params = audio_rtp_sender_->GetParameters();
776 EXPECT_NE(saved_transaction_id, params.transaction_id);
777
778 DestroyAudioRtpSender();
779}
780
781TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
782 CreateAudioRtpSender();
783
784 RtpParameters params = audio_rtp_sender_->GetParameters();
785 RtpParameters second_params = audio_rtp_sender_->GetParameters();
786
787 RTCError result = audio_rtp_sender_->SetParameters(params);
788 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700789 DestroyAudioRtpSender();
790}
791
792TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
793 CreateAudioRtpSender();
794 RtpParameters params = audio_rtp_sender_->GetParameters();
795 EXPECT_EQ(1u, params.encodings.size());
796
Florent Castelli87b3c512018-07-18 16:00:28 +0200797 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700798 params.mid = "dummy_mid";
799 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
800 audio_rtp_sender_->SetParameters(params).type());
801 params = audio_rtp_sender_->GetParameters();
802
Seth Hampson2d2c8882018-05-16 16:02:32 -0700803 DestroyAudioRtpSender();
804}
805
806TEST_F(RtpSenderReceiverTest,
807 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
808 CreateAudioRtpSender();
809 RtpParameters params = audio_rtp_sender_->GetParameters();
810 EXPECT_EQ(1u, params.encodings.size());
811
Henrik Grunelle1301a82018-12-13 12:13:22 +0000812 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200813 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +0000814 params.encodings[0].codec_payload_type = 1;
815 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
816 audio_rtp_sender_->SetParameters(params).type());
817 params = audio_rtp_sender_->GetParameters();
818
Seth Hampson2d2c8882018-05-16 16:02:32 -0700819 params.encodings[0].fec = RtpFecParameters();
820 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
821 audio_rtp_sender_->SetParameters(params).type());
822 params = audio_rtp_sender_->GetParameters();
823
824 params.encodings[0].rtx = RtpRtxParameters();
825 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
826 audio_rtp_sender_->SetParameters(params).type());
827 params = audio_rtp_sender_->GetParameters();
828
829 params.encodings[0].dtx = DtxStatus::ENABLED;
830 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
831 audio_rtp_sender_->SetParameters(params).type());
832 params = audio_rtp_sender_->GetParameters();
833
834 params.encodings[0].ptime = 1;
835 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
836 audio_rtp_sender_->SetParameters(params).type());
837 params = audio_rtp_sender_->GetParameters();
838
Seth Hampson2d2c8882018-05-16 16:02:32 -0700839 params.encodings[0].scale_resolution_down_by = 2.0;
840 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
841 audio_rtp_sender_->SetParameters(params).type());
842 params = audio_rtp_sender_->GetParameters();
843
844 params.encodings[0].rid = "dummy_rid";
845 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
846 audio_rtp_sender_->SetParameters(params).type());
847 params = audio_rtp_sender_->GetParameters();
848
849 params.encodings[0].dependency_rids.push_back("dummy_rid");
850 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
851 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200852
853 DestroyAudioRtpSender();
854}
855
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700856TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
857 CreateAudioRtpSender();
858
859 EXPECT_EQ(-1, voice_media_channel_->max_bps());
860 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200861 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800862 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100863 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800864 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700865
866 // Read back the parameters and verify they have been changed.
867 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200868 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100869 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700870
871 // Verify that the audio channel received the new parameters.
872 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200873 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100874 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700875
876 // Verify that the global bitrate limit has not been changed.
877 EXPECT_EQ(-1, voice_media_channel_->max_bps());
878
879 DestroyAudioRtpSender();
880}
881
Seth Hampson24722b32017-12-22 09:36:42 -0800882TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
883 CreateAudioRtpSender();
884
885 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200886 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800887 EXPECT_EQ(webrtc::kDefaultBitratePriority,
888 params.encodings[0].bitrate_priority);
889 double new_bitrate_priority = 2.0;
890 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800891 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800892
893 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200894 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800895 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
896
897 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200898 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800899 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
900
901 DestroyAudioRtpSender();
902}
903
skvladdc1c62c2016-03-16 19:07:43 -0700904TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
905 CreateVideoRtpSender();
906
skvladdc1c62c2016-03-16 19:07:43 -0700907 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700908 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800909 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700910
911 DestroyVideoRtpSender();
912}
913
Florent Castelli892acf02018-10-01 22:47:20 +0200914TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParametersBeforeNegotiation) {
915 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
916
917 RtpParameters params = video_rtp_sender_->GetParameters();
918 ASSERT_EQ(1u, params.encodings.size());
919 params.encodings[0].max_bitrate_bps = 90000;
920 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
921
922 params = video_rtp_sender_->GetParameters();
923 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
924 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 90000);
925
926 DestroyVideoRtpSender();
927}
928
929TEST_F(RtpSenderReceiverTest, VideoSenderInitParametersMovedAfterNegotiation) {
930 AddVideoTrack(false);
931
932 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
933 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
934 video_rtp_sender_->set_stream_ids({local_stream_->id()});
935
936 std::vector<RtpEncodingParameters> init_encodings(2);
937 init_encodings[0].max_bitrate_bps = 60000;
938 init_encodings[1].max_bitrate_bps = 900000;
939 video_rtp_sender_->set_init_send_encodings(init_encodings);
940
941 RtpParameters params = video_rtp_sender_->GetParameters();
942 ASSERT_EQ(2u, params.encodings.size());
943 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
944 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
945
946 // Simulate the setLocalDescription call
947 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100948 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200949 for (int i = 0; i < 2; ++i)
950 ssrcs.push_back(kVideoSsrcSimulcast + i);
951 cricket::StreamParams stream_params =
952 cricket::CreateSimStreamParams("cname", ssrcs);
953 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800954 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200955 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
956
957 params = video_rtp_sender_->GetParameters();
958 ASSERT_EQ(2u, params.encodings.size());
959 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
960 EXPECT_EQ(params.encodings[1].max_bitrate_bps, 900000);
961
962 DestroyVideoRtpSender();
963}
964
965TEST_F(RtpSenderReceiverTest,
966 VideoSenderInitParametersMovedAfterManualSimulcastAndNegotiation) {
967 AddVideoTrack(false);
968
969 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
970 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
971 video_rtp_sender_->set_stream_ids({local_stream_->id()});
972
973 std::vector<RtpEncodingParameters> init_encodings(1);
974 init_encodings[0].max_bitrate_bps = 60000;
975 video_rtp_sender_->set_init_send_encodings(init_encodings);
976
977 RtpParameters params = video_rtp_sender_->GetParameters();
978 ASSERT_EQ(1u, params.encodings.size());
979 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
980
981 // Simulate the setLocalDescription call as if the user used SDP munging
982 // to enable simulcast
983 std::vector<uint32_t> ssrcs;
Mirko Bonadei649a4c22019-01-29 10:11:53 +0100984 ssrcs.reserve(2);
Florent Castelli892acf02018-10-01 22:47:20 +0200985 for (int i = 0; i < 2; ++i)
986 ssrcs.push_back(kVideoSsrcSimulcast + i);
987 cricket::StreamParams stream_params =
988 cricket::CreateSimStreamParams("cname", ssrcs);
989 video_media_channel_->AddSendStream(stream_params);
Amit Hilbuchdd9390c2018-11-13 16:26:05 -0800990 video_rtp_sender_->SetMediaChannel(video_media_channel_);
Florent Castelli892acf02018-10-01 22:47:20 +0200991 video_rtp_sender_->SetSsrc(kVideoSsrcSimulcast);
992
993 params = video_rtp_sender_->GetParameters();
994 ASSERT_EQ(2u, params.encodings.size());
995 EXPECT_EQ(params.encodings[0].max_bitrate_bps, 60000);
996
997 DestroyVideoRtpSender();
998}
999
1000TEST_F(RtpSenderReceiverTest,
1001 VideoSenderMustCallGetParametersBeforeSetParametersBeforeNegotiation) {
1002 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
1003
1004 RtpParameters params;
1005 RTCError result = video_rtp_sender_->SetParameters(params);
1006 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1007 DestroyVideoRtpSender();
1008}
1009
Florent Castellicebf50f2018-05-03 15:31:53 +02001010TEST_F(RtpSenderReceiverTest,
1011 VideoSenderMustCallGetParametersBeforeSetParameters) {
1012 CreateVideoRtpSender();
1013
1014 RtpParameters params;
1015 RTCError result = video_rtp_sender_->SetParameters(params);
1016 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1017
1018 DestroyVideoRtpSender();
1019}
1020
1021TEST_F(RtpSenderReceiverTest,
1022 VideoSenderSetParametersInvalidatesTransactionId) {
1023 CreateVideoRtpSender();
1024
1025 RtpParameters params = video_rtp_sender_->GetParameters();
1026 EXPECT_EQ(1u, params.encodings.size());
1027 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1028 RTCError result = video_rtp_sender_->SetParameters(params);
1029 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
1030
1031 DestroyVideoRtpSender();
1032}
1033
1034TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
1035 CreateVideoRtpSender();
1036
1037 RtpParameters params = video_rtp_sender_->GetParameters();
1038 params.transaction_id = "";
1039 RTCError result = video_rtp_sender_->SetParameters(params);
1040 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1041
1042 DestroyVideoRtpSender();
1043}
1044
1045TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
1046 CreateVideoRtpSender();
1047
1048 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001049 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +02001050 auto saved_transaction_id = params.transaction_id;
1051 params = video_rtp_sender_->GetParameters();
1052 EXPECT_NE(saved_transaction_id, params.transaction_id);
1053
1054 DestroyVideoRtpSender();
1055}
1056
1057TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
1058 CreateVideoRtpSender();
1059
1060 RtpParameters params = video_rtp_sender_->GetParameters();
1061 RtpParameters second_params = video_rtp_sender_->GetParameters();
1062
1063 RTCError result = video_rtp_sender_->SetParameters(params);
1064 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
1065
1066 DestroyVideoRtpSender();
1067}
1068
Seth Hampson2d2c8882018-05-16 16:02:32 -07001069TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
1070 CreateVideoRtpSender();
1071 RtpParameters params = video_rtp_sender_->GetParameters();
1072 EXPECT_EQ(1u, params.encodings.size());
1073
Florent Castelli87b3c512018-07-18 16:00:28 +02001074 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -07001075 params.mid = "dummy_mid";
1076 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1077 video_rtp_sender_->SetParameters(params).type());
1078 params = video_rtp_sender_->GetParameters();
1079
Seth Hampson2d2c8882018-05-16 16:02:32 -07001080 DestroyVideoRtpSender();
1081}
1082
1083TEST_F(RtpSenderReceiverTest,
1084 VideoSenderCantSetUnimplementedEncodingParameters) {
1085 CreateVideoRtpSender();
1086 RtpParameters params = video_rtp_sender_->GetParameters();
1087 EXPECT_EQ(1u, params.encodings.size());
1088
Henrik Grunelle1301a82018-12-13 12:13:22 +00001089 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +02001090 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Henrik Grunelle1301a82018-12-13 12:13:22 +00001091 params.encodings[0].codec_payload_type = 1;
1092 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1093 video_rtp_sender_->SetParameters(params).type());
1094 params = video_rtp_sender_->GetParameters();
1095
Seth Hampson2d2c8882018-05-16 16:02:32 -07001096 params.encodings[0].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[0].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[0].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[0].ptime = 1;
1112 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1113 video_rtp_sender_->SetParameters(params).type());
1114 params = video_rtp_sender_->GetParameters();
1115
Seth Hampson2d2c8882018-05-16 16:02:32 -07001116 params.encodings[0].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[0].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[0].dependency_rids.push_back("dummy_rid");
1127 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1128 video_rtp_sender_->SetParameters(params).type());
1129
1130 DestroyVideoRtpSender();
1131}
1132
Florent Castelli892acf02018-10-01 22:47:20 +02001133TEST_F(RtpSenderReceiverTest,
1134 VideoSenderCantSetUnimplementedEncodingParametersWithSimulcast) {
1135 CreateVideoRtpSenderWithSimulcast();
1136 RtpParameters params = video_rtp_sender_->GetParameters();
1137 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1138
Henrik Grunelle1301a82018-12-13 12:13:22 +00001139 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Florent Castelli892acf02018-10-01 22:47:20 +02001140 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
1141 for (size_t i = 0; i < params.encodings.size(); i++) {
Henrik Grunelle1301a82018-12-13 12:13:22 +00001142 params.encodings[i].codec_payload_type = 1;
1143 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1144 video_rtp_sender_->SetParameters(params).type());
1145 params = video_rtp_sender_->GetParameters();
1146
Florent Castelli892acf02018-10-01 22:47:20 +02001147 params.encodings[i].fec = RtpFecParameters();
1148 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1149 video_rtp_sender_->SetParameters(params).type());
1150 params = video_rtp_sender_->GetParameters();
1151
1152 params.encodings[i].rtx = RtpRtxParameters();
1153 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1154 video_rtp_sender_->SetParameters(params).type());
1155 params = video_rtp_sender_->GetParameters();
1156
1157 params.encodings[i].dtx = DtxStatus::ENABLED;
1158 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1159 video_rtp_sender_->SetParameters(params).type());
1160 params = video_rtp_sender_->GetParameters();
1161
1162 params.encodings[i].ptime = 1;
1163 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1164 video_rtp_sender_->SetParameters(params).type());
1165 params = video_rtp_sender_->GetParameters();
1166
1167 params.encodings[i].scale_resolution_down_by = 2.0;
1168 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1169 video_rtp_sender_->SetParameters(params).type());
1170 params = video_rtp_sender_->GetParameters();
1171
1172 params.encodings[i].rid = "dummy_rid";
1173 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1174 video_rtp_sender_->SetParameters(params).type());
1175 params = video_rtp_sender_->GetParameters();
1176
1177 params.encodings[i].dependency_rids.push_back("dummy_rid");
1178 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1179 video_rtp_sender_->SetParameters(params).type());
1180 }
1181
1182 DestroyVideoRtpSender();
1183}
1184
Seth Hampson2d2c8882018-05-16 16:02:32 -07001185// A video sender can have multiple simulcast layers, in which case it will
1186// contain multiple RtpEncodingParameters. This tests that if this is the case
1187// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
1188// for any encodings besides at index 0, because these are both implemented
1189// "per-sender."
1190TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
1191 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001192 CreateVideoRtpSenderWithSimulcast();
Seth Hampson2d2c8882018-05-16 16:02:32 -07001193 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001194 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Seth Hampson2d2c8882018-05-16 16:02:32 -07001195
1196 params.encodings[1].bitrate_priority = 2.0;
1197 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
1198 video_rtp_sender_->SetParameters(params).type());
1199 params = video_rtp_sender_->GetParameters();
1200
Seth Hampson2d2c8882018-05-16 16:02:32 -07001201 DestroyVideoRtpSender();
1202}
1203
Florent Castelli892acf02018-10-01 22:47:20 +02001204TEST_F(RtpSenderReceiverTest, VideoSenderCantSetReadOnlyEncodingParameters) {
1205 // Add a simulcast specific send stream that contains 2 encoding parameters.
1206 CreateVideoRtpSenderWithSimulcast();
1207 RtpParameters params = video_rtp_sender_->GetParameters();
1208 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
1209
1210 for (size_t i = 0; i < params.encodings.size(); i++) {
1211 params.encodings[i].ssrc = 1337;
1212 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
1213 video_rtp_sender_->SetParameters(params).type());
1214 params = video_rtp_sender_->GetParameters();
1215 }
1216
1217 DestroyVideoRtpSender();
1218}
1219
Ă…sa Persson55659812018-06-18 17:51:32 +02001220TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001221 CreateVideoRtpSender();
1222
1223 EXPECT_EQ(-1, video_media_channel_->max_bps());
1224 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001225 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001226 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -08001227 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +02001228 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001229 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -08001230 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001231
1232 // Read back the parameters and verify they have been changed.
1233 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001234 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001235 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001236 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001237
1238 // Verify that the video channel received the new parameters.
1239 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001240 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001241 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001242 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001243
1244 // Verify that the global bitrate limit has not been changed.
1245 EXPECT_EQ(-1, video_media_channel_->max_bps());
1246
1247 DestroyVideoRtpSender();
1248}
1249
Ă…sa Persson55659812018-06-18 17:51:32 +02001250TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
1251 // Add a simulcast specific send stream that contains 2 encoding parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001252 CreateVideoRtpSenderWithSimulcast();
Ă…sa Persson55659812018-06-18 17:51:32 +02001253
1254 RtpParameters params = video_rtp_sender_->GetParameters();
Florent Castelli892acf02018-10-01 22:47:20 +02001255 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001256 params.encodings[0].min_bitrate_bps = 100;
1257 params.encodings[0].max_bitrate_bps = 1000;
1258 params.encodings[1].min_bitrate_bps = 200;
1259 params.encodings[1].max_bitrate_bps = 2000;
1260 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
1261
1262 // Verify that the video channel received the new parameters.
Florent Castelli892acf02018-10-01 22:47:20 +02001263 params = video_media_channel_->GetRtpSendParameters(kVideoSsrcSimulcast);
1264 EXPECT_EQ(kVideoSimulcastLayerCount, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +02001265 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
1266 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
1267 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
1268 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
1269
1270 DestroyVideoRtpSender();
1271}
1272
Seth Hampson24722b32017-12-22 09:36:42 -08001273TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1274 CreateVideoRtpSender();
1275
1276 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001277 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001278 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1279 params.encodings[0].bitrate_priority);
1280 double new_bitrate_priority = 2.0;
1281 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001282 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001283
1284 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001285 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001286 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1287
1288 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001289 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001290 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1291
1292 DestroyVideoRtpSender();
1293}
1294
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001295TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1296 CreateAudioRtpReceiver();
1297
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001298 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001299 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001300 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1301
1302 DestroyAudioRtpReceiver();
1303}
1304
1305TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1306 CreateVideoRtpReceiver();
1307
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001308 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001309 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001310 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1311
1312 DestroyVideoRtpReceiver();
1313}
1314
Florent Castelli38332cd2018-11-20 14:08:06 +01001315TEST_F(RtpSenderReceiverTest, VideoReceiverCanGetParametersWithSimulcast) {
1316 CreateVideoRtpReceiverWithSimulcast({}, 2);
1317
1318 RtpParameters params = video_rtp_receiver_->GetParameters();
1319 EXPECT_EQ(2u, params.encodings.size());
1320
1321 DestroyVideoRtpReceiver();
1322}
1323
pbos5214a0a2016-12-16 15:39:11 -08001324// Test that makes sure that a video track content hint translates to the proper
1325// value for sources that are not screencast.
1326TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1327 CreateVideoRtpSender();
1328
1329 video_track_->set_enabled(true);
1330
1331 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001332 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001333 // No content hint should be set by default.
1334 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1335 video_track_->content_hint());
1336 // Setting detailed should turn a non-screencast source into screencast mode.
1337 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001338 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001339 // Removing the content hint should turn the track back into non-screencast
1340 // mode.
1341 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001342 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001343 // Setting fluid should remain in non-screencast mode (its default).
1344 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001345 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001346 // Setting text should have the same effect as Detailed
1347 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1348 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001349
1350 DestroyVideoRtpSender();
1351}
1352
1353// Test that makes sure that a video track content hint translates to the proper
1354// value for screencast sources.
1355TEST_F(RtpSenderReceiverTest,
1356 PropagatesVideoTrackContentHintForScreencastSource) {
1357 CreateVideoRtpSender(true);
1358
1359 video_track_->set_enabled(true);
1360
1361 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001362 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001363 // No content hint should be set by default.
1364 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1365 video_track_->content_hint());
1366 // Setting fluid should turn a screencast source into non-screencast mode.
1367 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001368 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001369 // Removing the content hint should turn the track back into screencast mode.
1370 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001371 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001372 // Setting detailed should still remain in screencast mode (its default).
1373 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001374 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001375 // Setting text should have the same effect as Detailed
1376 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1377 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001378
1379 DestroyVideoRtpSender();
1380}
1381
1382// Test that makes sure any content hints that are set on a track before
1383// VideoRtpSender is ready to send are still applied when it gets ready to send.
1384TEST_F(RtpSenderReceiverTest,
1385 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1386 AddVideoTrack();
1387 // Setting detailed overrides the default non-screencast mode. This should be
1388 // applied even if the track is set on construction.
1389 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001390 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1391 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1392 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Amit Hilbuchdd9390c2018-11-13 16:26:05 -08001393 video_rtp_sender_->SetMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001394 video_track_->set_enabled(true);
1395
1396 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001397 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001398
1399 // Verify that the content hint is accounted for when video_rtp_sender_ does
1400 // get enabled.
1401 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001402 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001403
1404 // And removing the hint should go back to false (to verify that false was
1405 // default correctly).
1406 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001407 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001408
1409 DestroyVideoRtpSender();
1410}
1411
deadbeef20cb0c12017-02-01 20:27:00 -08001412TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1413 CreateAudioRtpSender();
1414 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1415}
1416
1417TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1418 CreateVideoRtpSender();
1419 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1420}
1421
1422// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1423// true/false from CanSendDtmf based on what |voice_channel_| returns.
1424TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1425 AddDtmfCodec();
1426 CreateAudioRtpSender();
1427 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1428 ASSERT_NE(nullptr, dtmf_sender);
1429 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1430}
1431
1432TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1433 CreateAudioRtpSender();
1434 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1435 ASSERT_NE(nullptr, dtmf_sender);
1436 // DTMF codec has not been added, as it was in the above test.
1437 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1438}
1439
1440TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1441 AddDtmfCodec();
1442 CreateAudioRtpSender();
1443 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1444 ASSERT_NE(nullptr, dtmf_sender);
1445
1446 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1447
1448 // Insert DTMF
1449 const int expected_duration = 90;
1450 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1451
1452 // Verify
1453 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1454 kDefaultTimeout);
1455 const uint32_t send_ssrc =
1456 voice_media_channel_->send_streams()[0].first_ssrc();
1457 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1458 send_ssrc, 0, expected_duration));
1459 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1460 send_ssrc, 1, expected_duration));
1461 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1462 send_ssrc, 2, expected_duration));
1463}
1464
1465// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1466// destroyed, which is needed for the DTMF sender.
1467TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1468 CreateAudioRtpSender();
1469 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1470 audio_rtp_sender_ = nullptr;
1471 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1472}
1473
Benjamin Wright84583f62018-10-04 14:22:34 -07001474// Validate that the default FrameEncryptor setting is nullptr.
1475TEST_F(RtpSenderReceiverTest, AudioSenderCanSetFrameEncryptor) {
1476 CreateAudioRtpSender();
1477 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1478 new FakeFrameEncryptor());
1479 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1480 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1481 EXPECT_EQ(fake_frame_encryptor.get(),
1482 audio_rtp_sender_->GetFrameEncryptor().get());
1483}
1484
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001485// Validate that setting a FrameEncryptor after the send stream is stopped does
1486// nothing.
1487TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
1488 CreateAudioRtpSender();
1489 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1490 new FakeFrameEncryptor());
1491 EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
1492 audio_rtp_sender_->Stop();
1493 audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1494 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1495}
1496
Benjamin Wright84583f62018-10-04 14:22:34 -07001497// Validate that the default FrameEncryptor setting is nullptr.
1498TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
1499 CreateAudioRtpReceiver();
1500 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1501 new FakeFrameDecryptor());
1502 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1503 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1504 EXPECT_EQ(fake_frame_decryptor.get(),
1505 audio_rtp_receiver_->GetFrameDecryptor().get());
1506}
1507
Benjamin Wrightc462a6e2018-10-26 13:16:16 -07001508// Validate that the default FrameEncryptor setting is nullptr.
1509TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
1510 CreateAudioRtpReceiver();
1511 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1512 new FakeFrameDecryptor());
1513 EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
1514 audio_rtp_receiver_->Stop();
1515 audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1516 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1517}
1518
1519// Validate that the default FrameEncryptor setting is nullptr.
1520TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
1521 CreateVideoRtpSender();
1522 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1523 new FakeFrameEncryptor());
1524 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1525 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1526 EXPECT_EQ(fake_frame_encryptor.get(),
1527 video_rtp_sender_->GetFrameEncryptor().get());
1528}
1529
1530// Validate that setting a FrameEncryptor after the send stream is stopped does
1531// nothing.
1532TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
1533 CreateVideoRtpSender();
1534 rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
1535 new FakeFrameEncryptor());
1536 EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
1537 video_rtp_sender_->Stop();
1538 video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
1539 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1540}
1541
1542// Validate that the default FrameEncryptor setting is nullptr.
1543TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
1544 CreateVideoRtpReceiver();
1545 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1546 new FakeFrameDecryptor());
1547 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1548 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1549 EXPECT_EQ(fake_frame_decryptor.get(),
1550 video_rtp_receiver_->GetFrameDecryptor().get());
1551}
1552
1553// Validate that the default FrameEncryptor setting is nullptr.
1554TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
1555 CreateVideoRtpReceiver();
1556 rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
1557 new FakeFrameDecryptor());
1558 EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
1559 video_rtp_receiver_->Stop();
1560 video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
1561 // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
1562}
1563
deadbeef70ab1a12015-09-28 16:53:55 -07001564} // namespace webrtc