blob: 837f6b79c9c7502827aab003aca04afcd4816ccd [file] [log] [blame]
deadbeef70ab1a12015-09-28 16:53:55 -07001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
deadbeef70ab1a12015-09-28 16:53:55 -07003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
deadbeef70ab1a12015-09-28 16:53:55 -07009 */
10
kwibergd1fe2812016-04-27 06:47:29 -070011#include <memory>
deadbeef70ab1a12015-09-28 16:53:55 -070012#include <string>
Tommif888bb52015-12-12 01:37:01 +010013#include <utility>
deadbeef70ab1a12015-09-28 16:53:55 -070014
Seth Hampson24722b32017-12-22 09:36:42 -080015#include "api/rtpparameters.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "media/base/fakemediaengine.h"
Steve Antonc9e15602017-11-06 15:40:09 -080017#include "media/base/rtpdataengine.h"
Seth Hampson2d2c8882018-05-16 16:02:32 -070018#include "media/base/testutils.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "media/engine/fakewebrtccall.h"
Zhi Huange830e682018-03-30 10:48:35 -070020#include "p2p/base/fakedtlstransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "pc/audiotrack.h"
22#include "pc/channelmanager.h"
23#include "pc/localaudiosource.h"
24#include "pc/mediastream.h"
25#include "pc/remoteaudiosource.h"
26#include "pc/rtpreceiver.h"
27#include "pc/rtpsender.h"
28#include "pc/streamcollection.h"
29#include "pc/test/fakevideotracksource.h"
30#include "pc/videotrack.h"
31#include "pc/videotracksource.h"
32#include "rtc_base/gunit.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "test/gmock.h"
34#include "test/gtest.h"
deadbeef70ab1a12015-09-28 16:53:55 -070035
36using ::testing::_;
37using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070038using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070039using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070040
deadbeef20cb0c12017-02-01 20:27:00 -080041namespace {
42
Seth Hampson845e8782018-03-02 11:34:10 -080043static const char kStreamId1[] = "local_stream_1";
deadbeef70ab1a12015-09-28 16:53:55 -070044static const char kVideoTrackId[] = "video_1";
45static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020046static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080047static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020048static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080049static const uint32_t kAudioSsrc2 = 101;
deadbeef20cb0c12017-02-01 20:27:00 -080050static const int kDefaultTimeout = 10000; // 10 seconds.
deadbeef20cb0c12017-02-01 20:27:00 -080051} // namespace
deadbeef70ab1a12015-09-28 16:53:55 -070052
53namespace webrtc {
54
deadbeef20cb0c12017-02-01 20:27:00 -080055class RtpSenderReceiverTest : public testing::Test,
56 public sigslot::has_slots<> {
tkchin3784b4a2016-06-24 19:31:47 -070057 public:
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070058 RtpSenderReceiverTest()
Steve Anton47136dd2018-01-12 10:49:35 -080059 : network_thread_(rtc::Thread::Current()),
60 worker_thread_(rtc::Thread::Current()),
61 // Create fake media engine/etc. so we can create channels to use to
62 // test RtpSenders/RtpReceivers.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070063 media_engine_(new cricket::FakeMediaEngine()),
Karl Wiberg918f50c2018-07-05 11:40:33 +020064 channel_manager_(absl::WrapUnique(media_engine_),
65 absl::make_unique<cricket::RtpDataEngine>(),
Steve Anton47136dd2018-01-12 10:49:35 -080066 worker_thread_,
67 network_thread_),
Sebastian Jansson8f83b422018-02-21 13:07:13 +010068 fake_call_(),
Seth Hampson845e8782018-03-02 11:34:10 -080069 local_stream_(MediaStream::Create(kStreamId1)) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070070 // Create channels to be used by the RtpSenders and RtpReceivers.
71 channel_manager_.Init();
deadbeef7af91dd2016-12-13 11:29:11 -080072 bool srtp_required = true;
Karl Wiberg918f50c2018-07-05 11:40:33 +020073 rtp_dtls_transport_ = absl::make_unique<cricket::FakeDtlsTransport>(
Zhi Huange830e682018-03-30 10:48:35 -070074 "fake_dtls_transport", cricket::ICE_CANDIDATE_COMPONENT_RTP);
75 rtp_transport_ = CreateDtlsSrtpTransport();
76
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070077 voice_channel_ = channel_manager_.CreateVoiceChannel(
Zhi Huange830e682018-03-30 10:48:35 -070078 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
79 rtc::Thread::Current(), cricket::CN_AUDIO, srtp_required,
80 rtc::CryptoOptions(), cricket::AudioOptions());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070081 video_channel_ = channel_manager_.CreateVideoChannel(
Zhi Huange830e682018-03-30 10:48:35 -070082 &fake_call_, cricket::MediaConfig(), rtp_transport_.get(),
83 rtc::Thread::Current(), cricket::CN_VIDEO, srtp_required,
84 rtc::CryptoOptions(), cricket::VideoOptions());
deadbeef20cb0c12017-02-01 20:27:00 -080085 voice_channel_->Enable(true);
86 video_channel_->Enable(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -070087 voice_media_channel_ = media_engine_->GetVoiceChannel(0);
88 video_media_channel_ = media_engine_->GetVideoChannel(0);
89 RTC_CHECK(voice_channel_);
90 RTC_CHECK(video_channel_);
91 RTC_CHECK(voice_media_channel_);
92 RTC_CHECK(video_media_channel_);
93
94 // Create streams for predefined SSRCs. Streams need to exist in order
95 // for the senders and receievers to apply parameters to them.
96 // Normally these would be created by SetLocalDescription and
97 // SetRemoteDescription.
98 voice_media_channel_->AddSendStream(
99 cricket::StreamParams::CreateLegacy(kAudioSsrc));
100 voice_media_channel_->AddRecvStream(
101 cricket::StreamParams::CreateLegacy(kAudioSsrc));
102 voice_media_channel_->AddSendStream(
103 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
104 voice_media_channel_->AddRecvStream(
105 cricket::StreamParams::CreateLegacy(kAudioSsrc2));
106 video_media_channel_->AddSendStream(
107 cricket::StreamParams::CreateLegacy(kVideoSsrc));
108 video_media_channel_->AddRecvStream(
109 cricket::StreamParams::CreateLegacy(kVideoSsrc));
110 video_media_channel_->AddSendStream(
111 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
112 video_media_channel_->AddRecvStream(
113 cricket::StreamParams::CreateLegacy(kVideoSsrc2));
tkchin3784b4a2016-06-24 19:31:47 -0700114 }
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700115
Zhi Huange830e682018-03-30 10:48:35 -0700116 std::unique_ptr<webrtc::RtpTransportInternal> CreateDtlsSrtpTransport() {
Karl Wiberg918f50c2018-07-05 11:40:33 +0200117 auto dtls_srtp_transport = absl::make_unique<webrtc::DtlsSrtpTransport>(
118 /*rtcp_mux_required=*/true);
Zhi Huange830e682018-03-30 10:48:35 -0700119 dtls_srtp_transport->SetDtlsTransports(rtp_dtls_transport_.get(),
120 /*rtcp_dtls_transport=*/nullptr);
121 return dtls_srtp_transport;
122 }
123
deadbeef20cb0c12017-02-01 20:27:00 -0800124 // Needed to use DTMF sender.
125 void AddDtmfCodec() {
126 cricket::AudioSendParameters params;
127 const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
128 0, 1);
129 params.codecs.push_back(kTelephoneEventCodec);
130 voice_media_channel_->SetSendParameters(params);
131 }
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700132
pbos5214a0a2016-12-16 15:39:11 -0800133 void AddVideoTrack() { AddVideoTrack(false); }
134
135 void AddVideoTrack(bool is_screencast) {
perkja3ede6c2016-03-08 01:27:48 +0100136 rtc::scoped_refptr<VideoTrackSourceInterface> source(
pbos5214a0a2016-12-16 15:39:11 -0800137 FakeVideoTrackSource::Create(is_screencast));
perkj773be362017-07-31 23:22:01 -0700138 video_track_ =
139 VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
deadbeefe814a0d2017-02-25 18:15:09 -0800140 EXPECT_TRUE(local_stream_->AddTrack(video_track_));
deadbeef70ab1a12015-09-28 16:53:55 -0700141 }
142
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700143 void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
144
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +0100145 void CreateAudioRtpSender(
146 const rtc::scoped_refptr<LocalAudioSource>& source) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700147 audio_track_ = AudioTrack::Create(kAudioTrackId, source);
deadbeefe814a0d2017-02-25 18:15:09 -0800148 EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
Steve Anton47136dd2018-01-12 10:49:35 -0800149 audio_rtp_sender_ =
Steve Anton111fdfd2018-06-25 13:03:36 -0700150 new AudioRtpSender(worker_thread_, audio_track_->id(), nullptr);
151 ASSERT_TRUE(audio_rtp_sender_->SetTrack(audio_track_));
152 audio_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800153 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800154 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800155 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
156 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700157 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700158 }
159
Steve Anton02ee47c2018-01-10 16:26:06 -0800160 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700161 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, /*id=*/"", nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800162 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800163 }
164
deadbeef20cb0c12017-02-01 20:27:00 -0800165 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
166
Seth Hampson2d2c8882018-05-16 16:02:32 -0700167 void CreateVideoRtpSender(uint32_t ssrc) {
168 CreateVideoRtpSender(false, ssrc);
169 }
170
pbos5214a0a2016-12-16 15:39:11 -0800171 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
172
Seth Hampson2d2c8882018-05-16 16:02:32 -0700173 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800174 AddVideoTrack(is_screencast);
Steve Anton111fdfd2018-06-25 13:03:36 -0700175 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
176 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
177 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800178 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700179 video_rtp_sender_->SetSsrc(ssrc);
180 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700181 }
182
Steve Anton02ee47c2018-01-10 16:26:06 -0800183 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton111fdfd2018-06-25 13:03:36 -0700184 video_rtp_sender_ = new VideoRtpSender(worker_thread_, /*id=*/"");
Steve Anton57858b32018-02-15 15:19:50 -0800185 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800186 }
187
deadbeef70ab1a12015-09-28 16:53:55 -0700188 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700189 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700190 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700191 }
192
193 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700194 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700195 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700196 }
197
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100198 void CreateAudioRtpReceiver(
199 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
200 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800201 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800202 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800203 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700204 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700205 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700206 }
207
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100208 void CreateVideoRtpReceiver(
209 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800210 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800211 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800212 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800213 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100214 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700215 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700216 }
217
218 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700219 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700220 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700221 }
222
223 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700224 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700225 VerifyVideoChannelNoOutput();
226 }
227
228 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
229
230 void VerifyVoiceChannelInput(uint32_t ssrc) {
231 // Verify that the media channel has an audio source, and the stream isn't
232 // muted.
233 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
234 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
235 }
236
237 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
238
239 void VerifyVideoChannelInput(uint32_t ssrc) {
240 // Verify that the media channel has a video source,
241 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
242 }
243
244 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
245
246 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
247 // Verify that the media channel's source is reset.
248 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
249 }
250
251 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
252
253 void VerifyVideoChannelNoInput(uint32_t ssrc) {
254 // Verify that the media channel's source is reset.
255 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
256 }
257
258 void VerifyVoiceChannelOutput() {
259 // Verify that the volume is initialized to 1.
260 double volume;
261 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
262 EXPECT_EQ(1, volume);
263 }
264
265 void VerifyVideoChannelOutput() {
266 // Verify that the media channel has a sink.
267 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
268 }
269
270 void VerifyVoiceChannelNoOutput() {
271 // Verify that the volume is reset to 0.
272 double volume;
273 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
274 EXPECT_EQ(0, volume);
275 }
276
277 void VerifyVideoChannelNoOutput() {
278 // Verify that the media channel's sink is reset.
279 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700280 }
281
282 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800283 rtc::Thread* const network_thread_;
284 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700285 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700286 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
287 // the |channel_manager|.
288 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
289 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800290 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700291 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700292 cricket::ChannelManager channel_manager_;
293 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700294 cricket::VoiceChannel* voice_channel_;
295 cricket::VideoChannel* video_channel_;
296 cricket::FakeVoiceMediaChannel* voice_media_channel_;
297 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700298 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
299 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
300 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
301 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800302 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700303 rtc::scoped_refptr<VideoTrackInterface> video_track_;
304 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800305 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700306};
307
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700308// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700309// and disassociated with an AudioRtpSender.
310TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
311 CreateAudioRtpSender();
312 DestroyAudioRtpSender();
313}
314
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700315// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700316// disassociated with a VideoRtpSender.
317TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
318 CreateVideoRtpSender();
319 DestroyVideoRtpSender();
320}
321
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700322// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700323// associated and disassociated with an AudioRtpReceiver.
324TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
325 CreateAudioRtpReceiver();
326 DestroyAudioRtpReceiver();
327}
328
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700329// Test that |video_channel_| is updated when a remote video track is
330// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700331TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
332 CreateVideoRtpReceiver();
333 DestroyVideoRtpReceiver();
334}
335
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100336TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
337 CreateAudioRtpReceiver({local_stream_});
338 DestroyAudioRtpReceiver();
339}
340
341TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
342 CreateVideoRtpReceiver({local_stream_});
343 DestroyVideoRtpReceiver();
344}
345
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700346// Test that the AudioRtpSender applies options from the local audio source.
347TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
348 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100349 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800350 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700351 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700352
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100353 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700354
355 DestroyAudioRtpSender();
356}
357
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700358// Test that the stream is muted when the track is disabled, and unmuted when
359// the track is enabled.
360TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
361 CreateAudioRtpSender();
362
363 audio_track_->set_enabled(false);
364 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
365
366 audio_track_->set_enabled(true);
367 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
368
369 DestroyAudioRtpSender();
370}
371
372// Test that the volume is set to 0 when the track is disabled, and back to
373// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700374TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
375 CreateAudioRtpReceiver();
376
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700377 double volume;
378 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
379 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700380
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700381 audio_track_->set_enabled(false);
382 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
383 EXPECT_EQ(0, volume);
384
deadbeef70ab1a12015-09-28 16:53:55 -0700385 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700386 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
387 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700388
389 DestroyAudioRtpReceiver();
390}
391
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700392// Currently no action is taken when a remote video track is disabled or
393// enabled, so there's nothing to test here, other than what is normally
394// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700395TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
396 CreateVideoRtpSender();
397
deadbeef70ab1a12015-09-28 16:53:55 -0700398 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700399 video_track_->set_enabled(true);
400
401 DestroyVideoRtpSender();
402}
403
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700404// Test that the state of the video track created by the VideoRtpReceiver is
405// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100406TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
407 CreateVideoRtpReceiver();
408
409 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
410 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
411 video_track_->GetSource()->state());
412
413 DestroyVideoRtpReceiver();
414
415 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
416 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
417 video_track_->GetSource()->state());
418}
419
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700420// Currently no action is taken when a remote video track is disabled or
421// enabled, so there's nothing to test here, other than what is normally
422// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700423TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
424 CreateVideoRtpReceiver();
425
426 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700427 video_track_->set_enabled(true);
428
429 DestroyVideoRtpReceiver();
430}
431
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700432// Test that the AudioRtpReceiver applies volume changes from the track source
433// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700434TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
435 CreateAudioRtpReceiver();
436
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700437 double volume;
438 audio_track_->GetSource()->SetVolume(0.5);
439 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
440 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700441
442 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700443 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700444 audio_track_->GetSource()->SetVolume(0.8);
445 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
446 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700447
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700448 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700449 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700450 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
451 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700452
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700453 // Try changing volume one more time.
454 audio_track_->GetSource()->SetVolume(0.9);
455 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
456 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700457
458 DestroyAudioRtpReceiver();
459}
460
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700461// Test that the media channel isn't enabled for sending if the audio sender
462// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800463TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800464 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800465 rtc::scoped_refptr<AudioTrackInterface> track =
466 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700467
468 // Track but no SSRC.
469 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
470 VerifyVoiceChannelNoInput();
471
472 // SSRC but no track.
473 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
474 audio_rtp_sender_->SetSsrc(kAudioSsrc);
475 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800476}
477
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700478// Test that the media channel isn't enabled for sending if the video sender
479// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800480TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800481 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700482
483 // Track but no SSRC.
484 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
485 VerifyVideoChannelNoInput();
486
487 // SSRC but no track.
488 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
489 video_rtp_sender_->SetSsrc(kVideoSsrc);
490 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800491}
492
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700493// Test that the media channel is enabled for sending when the audio sender
494// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800495TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800496 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800497 rtc::scoped_refptr<AudioTrackInterface> track =
498 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700499 audio_rtp_sender_->SetSsrc(kAudioSsrc);
500 audio_rtp_sender_->SetTrack(track);
501 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800502
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700503 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800504}
505
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700506// Test that the media channel is enabled for sending when the audio sender
507// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800508TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800509 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800510 rtc::scoped_refptr<AudioTrackInterface> track =
511 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700512 audio_rtp_sender_->SetTrack(track);
513 audio_rtp_sender_->SetSsrc(kAudioSsrc);
514 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800515
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700516 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800517}
518
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700519// Test that the media channel is enabled for sending when the video sender
520// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800521TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700522 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800523 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700524 video_rtp_sender_->SetSsrc(kVideoSsrc);
525 video_rtp_sender_->SetTrack(video_track_);
526 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800527
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700528 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800529}
530
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700531// Test that the media channel is enabled for sending when the video sender
532// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800533TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700534 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800535 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700536 video_rtp_sender_->SetTrack(video_track_);
537 video_rtp_sender_->SetSsrc(kVideoSsrc);
538 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800539
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700540 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800541}
542
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700543// Test that the media channel stops sending when the audio sender's SSRC is set
544// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800545TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700546 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800547
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700548 audio_rtp_sender_->SetSsrc(0);
549 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800550}
551
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700552// Test that the media channel stops sending when the video sender's SSRC is set
553// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800554TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700555 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800556
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700557 audio_rtp_sender_->SetSsrc(0);
558 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800559}
560
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700561// Test that the media channel stops sending when the audio sender's track is
562// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800563TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700564 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800565
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700566 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
567 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800568}
569
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700570// Test that the media channel stops sending when the video sender's track is
571// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800572TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700573 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800574
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700575 video_rtp_sender_->SetSsrc(0);
576 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800577}
578
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700579// Test that when the audio sender's SSRC is changed, the media channel stops
580// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800581TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700582 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800583
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700584 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
585 VerifyVoiceChannelNoInput(kAudioSsrc);
586 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800587
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700588 audio_rtp_sender_ = nullptr;
589 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800590}
591
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700592// Test that when the audio sender's SSRC is changed, the media channel stops
593// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800594TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700595 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800596
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700597 video_rtp_sender_->SetSsrc(kVideoSsrc2);
598 VerifyVideoChannelNoInput(kVideoSsrc);
599 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800600
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700601 video_rtp_sender_ = nullptr;
602 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800603}
604
skvladdc1c62c2016-03-16 19:07:43 -0700605TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
606 CreateAudioRtpSender();
607
skvladdc1c62c2016-03-16 19:07:43 -0700608 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700609 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800610 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700611
612 DestroyAudioRtpSender();
613}
614
Florent Castellicebf50f2018-05-03 15:31:53 +0200615TEST_F(RtpSenderReceiverTest,
616 AudioSenderMustCallGetParametersBeforeSetParameters) {
617 CreateAudioRtpSender();
618
619 RtpParameters params;
620 RTCError result = audio_rtp_sender_->SetParameters(params);
621 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
622
623 DestroyAudioRtpSender();
624}
625
626TEST_F(RtpSenderReceiverTest,
627 AudioSenderSetParametersInvalidatesTransactionId) {
628 CreateAudioRtpSender();
629
630 RtpParameters params = audio_rtp_sender_->GetParameters();
631 EXPECT_EQ(1u, params.encodings.size());
632 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
633 RTCError result = audio_rtp_sender_->SetParameters(params);
634 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
635
636 DestroyAudioRtpSender();
637}
638
639TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
640 CreateAudioRtpSender();
641
642 RtpParameters params = audio_rtp_sender_->GetParameters();
643 params.transaction_id = "";
644 RTCError result = audio_rtp_sender_->SetParameters(params);
645 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
646
647 DestroyAudioRtpSender();
648}
649
650TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
651 CreateAudioRtpSender();
652
653 RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200654 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200655 auto saved_transaction_id = params.transaction_id;
656 params = audio_rtp_sender_->GetParameters();
657 EXPECT_NE(saved_transaction_id, params.transaction_id);
658
659 DestroyAudioRtpSender();
660}
661
662TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
663 CreateAudioRtpSender();
664
665 RtpParameters params = audio_rtp_sender_->GetParameters();
666 RtpParameters second_params = audio_rtp_sender_->GetParameters();
667
668 RTCError result = audio_rtp_sender_->SetParameters(params);
669 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700670 DestroyAudioRtpSender();
671}
672
673TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
674 CreateAudioRtpSender();
675 RtpParameters params = audio_rtp_sender_->GetParameters();
676 EXPECT_EQ(1u, params.encodings.size());
677
Florent Castelli87b3c512018-07-18 16:00:28 +0200678 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700679 params.mid = "dummy_mid";
680 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
681 audio_rtp_sender_->SetParameters(params).type());
682 params = audio_rtp_sender_->GetParameters();
683
Seth Hampson2d2c8882018-05-16 16:02:32 -0700684 DestroyAudioRtpSender();
685}
686
687TEST_F(RtpSenderReceiverTest,
688 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
689 CreateAudioRtpSender();
690 RtpParameters params = audio_rtp_sender_->GetParameters();
691 EXPECT_EQ(1u, params.encodings.size());
692
693 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200694 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -0700695 params.encodings[0].codec_payload_type = 1;
696 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
697 audio_rtp_sender_->SetParameters(params).type());
698 params = audio_rtp_sender_->GetParameters();
699
700 params.encodings[0].fec = RtpFecParameters();
701 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
702 audio_rtp_sender_->SetParameters(params).type());
703 params = audio_rtp_sender_->GetParameters();
704
705 params.encodings[0].rtx = RtpRtxParameters();
706 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
707 audio_rtp_sender_->SetParameters(params).type());
708 params = audio_rtp_sender_->GetParameters();
709
710 params.encodings[0].dtx = DtxStatus::ENABLED;
711 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
712 audio_rtp_sender_->SetParameters(params).type());
713 params = audio_rtp_sender_->GetParameters();
714
715 params.encodings[0].ptime = 1;
716 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
717 audio_rtp_sender_->SetParameters(params).type());
718 params = audio_rtp_sender_->GetParameters();
719
Seth Hampson2d2c8882018-05-16 16:02:32 -0700720 params.encodings[0].scale_resolution_down_by = 2.0;
721 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
722 audio_rtp_sender_->SetParameters(params).type());
723 params = audio_rtp_sender_->GetParameters();
724
725 params.encodings[0].rid = "dummy_rid";
726 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
727 audio_rtp_sender_->SetParameters(params).type());
728 params = audio_rtp_sender_->GetParameters();
729
730 params.encodings[0].dependency_rids.push_back("dummy_rid");
731 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
732 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200733
734 DestroyAudioRtpSender();
735}
736
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700737TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
738 CreateAudioRtpSender();
739
740 EXPECT_EQ(-1, voice_media_channel_->max_bps());
741 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200742 EXPECT_EQ(1U, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800743 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100744 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800745 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700746
747 // Read back the parameters and verify they have been changed.
748 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200749 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100750 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700751
752 // Verify that the audio channel received the new parameters.
753 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200754 EXPECT_EQ(1U, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100755 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700756
757 // Verify that the global bitrate limit has not been changed.
758 EXPECT_EQ(-1, voice_media_channel_->max_bps());
759
760 DestroyAudioRtpSender();
761}
762
Seth Hampson24722b32017-12-22 09:36:42 -0800763TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
764 CreateAudioRtpSender();
765
766 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200767 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800768 EXPECT_EQ(webrtc::kDefaultBitratePriority,
769 params.encodings[0].bitrate_priority);
770 double new_bitrate_priority = 2.0;
771 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800772 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800773
774 params = audio_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200775 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800776 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
777
778 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200779 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -0800780 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
781
782 DestroyAudioRtpSender();
783}
784
skvladdc1c62c2016-03-16 19:07:43 -0700785TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
786 CreateVideoRtpSender();
787
skvladdc1c62c2016-03-16 19:07:43 -0700788 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700789 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800790 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700791
792 DestroyVideoRtpSender();
793}
794
Florent Castellicebf50f2018-05-03 15:31:53 +0200795TEST_F(RtpSenderReceiverTest,
796 VideoSenderMustCallGetParametersBeforeSetParameters) {
797 CreateVideoRtpSender();
798
799 RtpParameters params;
800 RTCError result = video_rtp_sender_->SetParameters(params);
801 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
802
803 DestroyVideoRtpSender();
804}
805
806TEST_F(RtpSenderReceiverTest,
807 VideoSenderSetParametersInvalidatesTransactionId) {
808 CreateVideoRtpSender();
809
810 RtpParameters params = video_rtp_sender_->GetParameters();
811 EXPECT_EQ(1u, params.encodings.size());
812 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
813 RTCError result = video_rtp_sender_->SetParameters(params);
814 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
815
816 DestroyVideoRtpSender();
817}
818
819TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
820 CreateVideoRtpSender();
821
822 RtpParameters params = video_rtp_sender_->GetParameters();
823 params.transaction_id = "";
824 RTCError result = video_rtp_sender_->SetParameters(params);
825 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
826
827 DestroyVideoRtpSender();
828}
829
830TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
831 CreateVideoRtpSender();
832
833 RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200834 EXPECT_NE(params.transaction_id.size(), 0U);
Florent Castellicebf50f2018-05-03 15:31:53 +0200835 auto saved_transaction_id = params.transaction_id;
836 params = video_rtp_sender_->GetParameters();
837 EXPECT_NE(saved_transaction_id, params.transaction_id);
838
839 DestroyVideoRtpSender();
840}
841
842TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
843 CreateVideoRtpSender();
844
845 RtpParameters params = video_rtp_sender_->GetParameters();
846 RtpParameters second_params = video_rtp_sender_->GetParameters();
847
848 RTCError result = video_rtp_sender_->SetParameters(params);
849 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
850
851 DestroyVideoRtpSender();
852}
853
Seth Hampson2d2c8882018-05-16 16:02:32 -0700854TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
855 CreateVideoRtpSender();
856 RtpParameters params = video_rtp_sender_->GetParameters();
857 EXPECT_EQ(1u, params.encodings.size());
858
Florent Castelli87b3c512018-07-18 16:00:28 +0200859 // Unimplemented RtpParameters: mid
Seth Hampson2d2c8882018-05-16 16:02:32 -0700860 params.mid = "dummy_mid";
861 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
862 video_rtp_sender_->SetParameters(params).type());
863 params = video_rtp_sender_->GetParameters();
864
Seth Hampson2d2c8882018-05-16 16:02:32 -0700865 DestroyVideoRtpSender();
866}
867
868TEST_F(RtpSenderReceiverTest,
869 VideoSenderCantSetUnimplementedEncodingParameters) {
870 CreateVideoRtpSender();
871 RtpParameters params = video_rtp_sender_->GetParameters();
872 EXPECT_EQ(1u, params.encodings.size());
873
874 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
Ă…sa Persson8c1bf952018-09-13 10:42:19 +0200875 // scale_resolution_down_by, scale_framerate_down_by, rid, dependency_rids.
Seth Hampson2d2c8882018-05-16 16:02:32 -0700876 params.encodings[0].codec_payload_type = 1;
877 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
878 video_rtp_sender_->SetParameters(params).type());
879 params = video_rtp_sender_->GetParameters();
880
881 params.encodings[0].fec = RtpFecParameters();
882 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
883 video_rtp_sender_->SetParameters(params).type());
884 params = video_rtp_sender_->GetParameters();
885
886 params.encodings[0].rtx = RtpRtxParameters();
887 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
888 video_rtp_sender_->SetParameters(params).type());
889 params = video_rtp_sender_->GetParameters();
890
891 params.encodings[0].dtx = DtxStatus::ENABLED;
892 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
893 video_rtp_sender_->SetParameters(params).type());
894 params = video_rtp_sender_->GetParameters();
895
896 params.encodings[0].ptime = 1;
897 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
898 video_rtp_sender_->SetParameters(params).type());
899 params = video_rtp_sender_->GetParameters();
900
Seth Hampson2d2c8882018-05-16 16:02:32 -0700901 params.encodings[0].scale_resolution_down_by = 2.0;
902 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
903 video_rtp_sender_->SetParameters(params).type());
904 params = video_rtp_sender_->GetParameters();
905
906 params.encodings[0].rid = "dummy_rid";
907 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
908 video_rtp_sender_->SetParameters(params).type());
909 params = video_rtp_sender_->GetParameters();
910
911 params.encodings[0].dependency_rids.push_back("dummy_rid");
912 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
913 video_rtp_sender_->SetParameters(params).type());
914
915 DestroyVideoRtpSender();
916}
917
918// A video sender can have multiple simulcast layers, in which case it will
919// contain multiple RtpEncodingParameters. This tests that if this is the case
920// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
921// for any encodings besides at index 0, because these are both implemented
922// "per-sender."
923TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
924 // Add a simulcast specific send stream that contains 2 encoding parameters.
925 std::vector<uint32_t> ssrcs({1, 2});
926 cricket::StreamParams stream_params =
927 cricket::CreateSimStreamParams("cname", ssrcs);
928 video_media_channel_->AddSendStream(stream_params);
929 uint32_t primary_ssrc = stream_params.first_ssrc();
930 CreateVideoRtpSender(primary_ssrc);
931 RtpParameters params = video_rtp_sender_->GetParameters();
932 EXPECT_EQ(ssrcs.size(), params.encodings.size());
933
934 params.encodings[1].bitrate_priority = 2.0;
935 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
936 video_rtp_sender_->SetParameters(params).type());
937 params = video_rtp_sender_->GetParameters();
938
Seth Hampson2d2c8882018-05-16 16:02:32 -0700939 DestroyVideoRtpSender();
940}
941
Ă…sa Persson55659812018-06-18 17:51:32 +0200942TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrate) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700943 CreateVideoRtpSender();
944
945 EXPECT_EQ(-1, video_media_channel_->max_bps());
946 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200947 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200948 EXPECT_FALSE(params.encodings[0].min_bitrate_bps);
deadbeefe702b302017-02-04 12:09:01 -0800949 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Ă…sa Persson55659812018-06-18 17:51:32 +0200950 params.encodings[0].min_bitrate_bps = 100;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100951 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800952 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700953
954 // Read back the parameters and verify they have been changed.
955 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200956 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200957 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100958 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700959
960 // Verify that the video channel received the new parameters.
961 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +0200962 EXPECT_EQ(1U, params.encodings.size());
Ă…sa Persson55659812018-06-18 17:51:32 +0200963 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
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, video_media_channel_->max_bps());
968
969 DestroyVideoRtpSender();
970}
971
Ă…sa Persson55659812018-06-18 17:51:32 +0200972TEST_F(RtpSenderReceiverTest, SetVideoMinMaxSendBitrateSimulcast) {
973 // Add a simulcast specific send stream that contains 2 encoding parameters.
974 std::vector<uint32_t> ssrcs({1, 2});
975 cricket::StreamParams stream_params =
976 cricket::CreateSimStreamParams("cname", ssrcs);
977 video_media_channel_->AddSendStream(stream_params);
978 uint32_t primary_ssrc = stream_params.first_ssrc();
979 CreateVideoRtpSender(primary_ssrc);
980
981 RtpParameters params = video_rtp_sender_->GetParameters();
982 EXPECT_EQ(ssrcs.size(), params.encodings.size());
983 params.encodings[0].min_bitrate_bps = 100;
984 params.encodings[0].max_bitrate_bps = 1000;
985 params.encodings[1].min_bitrate_bps = 200;
986 params.encodings[1].max_bitrate_bps = 2000;
987 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
988
989 // Verify that the video channel received the new parameters.
990 params = video_media_channel_->GetRtpSendParameters(primary_ssrc);
991 EXPECT_EQ(ssrcs.size(), params.encodings.size());
992 EXPECT_EQ(100, params.encodings[0].min_bitrate_bps);
993 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
994 EXPECT_EQ(200, params.encodings[1].min_bitrate_bps);
995 EXPECT_EQ(2000, params.encodings[1].max_bitrate_bps);
996
997 DestroyVideoRtpSender();
998}
999
Seth Hampson24722b32017-12-22 09:36:42 -08001000TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1001 CreateVideoRtpSender();
1002
1003 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001004 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001005 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1006 params.encodings[0].bitrate_priority);
1007 double new_bitrate_priority = 2.0;
1008 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001009 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001010
1011 params = video_rtp_sender_->GetParameters();
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001012 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001013 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1014
1015 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
Mirko Bonadeie12c1fe2018-07-03 12:53:23 +02001016 EXPECT_EQ(1U, params.encodings.size());
Seth Hampson24722b32017-12-22 09:36:42 -08001017 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1018
1019 DestroyVideoRtpSender();
1020}
1021
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001022TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1023 CreateAudioRtpReceiver();
1024
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001025 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001026 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1028
1029 DestroyAudioRtpReceiver();
1030}
1031
1032TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1033 CreateVideoRtpReceiver();
1034
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001035 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001036 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001037 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1038
1039 DestroyVideoRtpReceiver();
1040}
1041
pbos5214a0a2016-12-16 15:39:11 -08001042// Test that makes sure that a video track content hint translates to the proper
1043// value for sources that are not screencast.
1044TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1045 CreateVideoRtpSender();
1046
1047 video_track_->set_enabled(true);
1048
1049 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001050 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001051 // No content hint should be set by default.
1052 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1053 video_track_->content_hint());
1054 // Setting detailed should turn a non-screencast source into screencast mode.
1055 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001056 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001057 // Removing the content hint should turn the track back into non-screencast
1058 // mode.
1059 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001060 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001061 // Setting fluid should remain in non-screencast mode (its default).
1062 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001063 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001064 // Setting text should have the same effect as Detailed
1065 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1066 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001067
1068 DestroyVideoRtpSender();
1069}
1070
1071// Test that makes sure that a video track content hint translates to the proper
1072// value for screencast sources.
1073TEST_F(RtpSenderReceiverTest,
1074 PropagatesVideoTrackContentHintForScreencastSource) {
1075 CreateVideoRtpSender(true);
1076
1077 video_track_->set_enabled(true);
1078
1079 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001080 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001081 // No content hint should be set by default.
1082 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1083 video_track_->content_hint());
1084 // Setting fluid should turn a screencast source into non-screencast mode.
1085 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001086 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001087 // Removing the content hint should turn the track back into screencast mode.
1088 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001089 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001090 // Setting detailed should still remain in screencast mode (its default).
1091 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001092 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
Harald Alvestrandc19ab072018-06-18 08:53:10 +02001093 // Setting text should have the same effect as Detailed
1094 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kText);
1095 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001096
1097 DestroyVideoRtpSender();
1098}
1099
1100// Test that makes sure any content hints that are set on a track before
1101// VideoRtpSender is ready to send are still applied when it gets ready to send.
1102TEST_F(RtpSenderReceiverTest,
1103 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1104 AddVideoTrack();
1105 // Setting detailed overrides the default non-screencast mode. This should be
1106 // applied even if the track is set on construction.
1107 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Steve Anton111fdfd2018-06-25 13:03:36 -07001108 video_rtp_sender_ = new VideoRtpSender(worker_thread_, video_track_->id());
1109 ASSERT_TRUE(video_rtp_sender_->SetTrack(video_track_));
1110 video_rtp_sender_->set_stream_ids({local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -08001111 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001112 video_track_->set_enabled(true);
1113
1114 // Sender is not ready to send (no SSRC) so no option should have been set.
Danil Chapovalov66cadcc2018-06-19 16:47:43 +02001115 EXPECT_EQ(absl::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001116
1117 // Verify that the content hint is accounted for when video_rtp_sender_ does
1118 // get enabled.
1119 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001120 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001121
1122 // And removing the hint should go back to false (to verify that false was
1123 // default correctly).
1124 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001125 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001126
1127 DestroyVideoRtpSender();
1128}
1129
deadbeef20cb0c12017-02-01 20:27:00 -08001130TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1131 CreateAudioRtpSender();
1132 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1133}
1134
1135TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1136 CreateVideoRtpSender();
1137 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1138}
1139
1140// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1141// true/false from CanSendDtmf based on what |voice_channel_| returns.
1142TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1143 AddDtmfCodec();
1144 CreateAudioRtpSender();
1145 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1146 ASSERT_NE(nullptr, dtmf_sender);
1147 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1148}
1149
1150TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1151 CreateAudioRtpSender();
1152 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1153 ASSERT_NE(nullptr, dtmf_sender);
1154 // DTMF codec has not been added, as it was in the above test.
1155 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1156}
1157
1158TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1159 AddDtmfCodec();
1160 CreateAudioRtpSender();
1161 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1162 ASSERT_NE(nullptr, dtmf_sender);
1163
1164 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1165
1166 // Insert DTMF
1167 const int expected_duration = 90;
1168 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1169
1170 // Verify
1171 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1172 kDefaultTimeout);
1173 const uint32_t send_ssrc =
1174 voice_media_channel_->send_streams()[0].first_ssrc();
1175 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1176 send_ssrc, 0, expected_duration));
1177 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1178 send_ssrc, 1, expected_duration));
1179 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1180 send_ssrc, 2, expected_duration));
1181}
1182
1183// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1184// destroyed, which is needed for the DTMF sender.
1185TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1186 CreateAudioRtpSender();
1187 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1188 audio_rtp_sender_ = nullptr;
1189 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1190}
1191
deadbeef70ab1a12015-09-28 16:53:55 -07001192} // namespace webrtc