blob: be0e975cce5c603d71f2ca168fd57fc224f91ae7 [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()),
Steve Antonc9e15602017-11-06 15:40:09 -080064 channel_manager_(rtc::WrapUnique(media_engine_),
65 rtc::MakeUnique<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;
Zhi Huange830e682018-03-30 10:48:35 -070073 rtp_dtls_transport_ = rtc::MakeUnique<cricket::FakeDtlsTransport>(
74 "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() {
Zhi Huange830e682018-03-30 10:48:35 -0700117 auto dtls_srtp_transport =
Zhi Huang365381f2018-04-13 16:44:34 -0700118 rtc::MakeUnique<webrtc::DtlsSrtpTransport>(/*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_ =
150 new AudioRtpSender(worker_thread_, local_stream_->GetAudioTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700151 {local_stream_->id()}, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800152 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
deadbeeffac06552015-11-25 11:26:01 -0800153 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef20cb0c12017-02-01 20:27:00 -0800154 audio_rtp_sender_->GetOnDestroyedSignal()->connect(
155 this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700156 VerifyVoiceChannelInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700157 }
158
Steve Anton02ee47c2018-01-10 16:26:06 -0800159 void CreateAudioRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800160 audio_rtp_sender_ = new AudioRtpSender(worker_thread_, nullptr);
Steve Anton57858b32018-02-15 15:19:50 -0800161 audio_rtp_sender_->SetVoiceMediaChannel(voice_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800162 }
163
deadbeef20cb0c12017-02-01 20:27:00 -0800164 void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
165
Seth Hampson2d2c8882018-05-16 16:02:32 -0700166 void CreateVideoRtpSender(uint32_t ssrc) {
167 CreateVideoRtpSender(false, ssrc);
168 }
169
pbos5214a0a2016-12-16 15:39:11 -0800170 void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
171
Seth Hampson2d2c8882018-05-16 16:02:32 -0700172 void CreateVideoRtpSender(bool is_screencast, uint32_t ssrc = kVideoSsrc) {
pbos5214a0a2016-12-16 15:39:11 -0800173 AddVideoTrack(is_screencast);
Steve Anton47136dd2018-01-12 10:49:35 -0800174 video_rtp_sender_ =
175 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
Seth Hampson13b8bad2018-03-13 16:05:28 -0700176 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -0800177 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Seth Hampson2d2c8882018-05-16 16:02:32 -0700178 video_rtp_sender_->SetSsrc(ssrc);
179 VerifyVideoChannelInput(ssrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700180 }
181
Steve Anton02ee47c2018-01-10 16:26:06 -0800182 void CreateVideoRtpSenderWithNoTrack() {
Steve Anton47136dd2018-01-12 10:49:35 -0800183 video_rtp_sender_ = new VideoRtpSender(worker_thread_);
Steve Anton57858b32018-02-15 15:19:50 -0800184 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
Steve Anton02ee47c2018-01-10 16:26:06 -0800185 }
186
deadbeef70ab1a12015-09-28 16:53:55 -0700187 void DestroyAudioRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700188 audio_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700189 VerifyVoiceChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700190 }
191
192 void DestroyVideoRtpSender() {
deadbeef70ab1a12015-09-28 16:53:55 -0700193 video_rtp_sender_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700194 VerifyVideoChannelNoInput();
deadbeef70ab1a12015-09-28 16:53:55 -0700195 }
196
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100197 void CreateAudioRtpReceiver(
198 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
199 audio_rtp_receiver_ = new AudioRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800200 rtc::Thread::Current(), kAudioTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800201 audio_rtp_receiver_->SetVoiceMediaChannel(voice_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800202 audio_rtp_receiver_->SetupMediaChannel(kAudioSsrc);
perkjd61bf802016-03-24 03:16:19 -0700203 audio_track_ = audio_rtp_receiver_->audio_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700204 VerifyVoiceChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700205 }
206
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100207 void CreateVideoRtpReceiver(
208 std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams = {}) {
deadbeefe814a0d2017-02-25 18:15:09 -0800209 video_rtp_receiver_ = new VideoRtpReceiver(
Steve Antond3679212018-01-17 17:41:02 -0800210 rtc::Thread::Current(), kVideoTrackId, std::move(streams));
Steve Anton57858b32018-02-15 15:19:50 -0800211 video_rtp_receiver_->SetVideoMediaChannel(video_media_channel_);
Steve Antond3679212018-01-17 17:41:02 -0800212 video_rtp_receiver_->SetupMediaChannel(kVideoSsrc);
perkjf0dcfe22016-03-10 18:32:00 +0100213 video_track_ = video_rtp_receiver_->video_track();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700214 VerifyVideoChannelOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700215 }
216
217 void DestroyAudioRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700218 audio_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700219 VerifyVoiceChannelNoOutput();
deadbeef70ab1a12015-09-28 16:53:55 -0700220 }
221
222 void DestroyVideoRtpReceiver() {
deadbeef70ab1a12015-09-28 16:53:55 -0700223 video_rtp_receiver_ = nullptr;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700224 VerifyVideoChannelNoOutput();
225 }
226
227 void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
228
229 void VerifyVoiceChannelInput(uint32_t ssrc) {
230 // Verify that the media channel has an audio source, and the stream isn't
231 // muted.
232 EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
233 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
234 }
235
236 void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
237
238 void VerifyVideoChannelInput(uint32_t ssrc) {
239 // Verify that the media channel has a video source,
240 EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
241 }
242
243 void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
244
245 void VerifyVoiceChannelNoInput(uint32_t ssrc) {
246 // Verify that the media channel's source is reset.
247 EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
248 }
249
250 void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
251
252 void VerifyVideoChannelNoInput(uint32_t ssrc) {
253 // Verify that the media channel's source is reset.
254 EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
255 }
256
257 void VerifyVoiceChannelOutput() {
258 // Verify that the volume is initialized to 1.
259 double volume;
260 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
261 EXPECT_EQ(1, volume);
262 }
263
264 void VerifyVideoChannelOutput() {
265 // Verify that the media channel has a sink.
266 EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
267 }
268
269 void VerifyVoiceChannelNoOutput() {
270 // Verify that the volume is reset to 0.
271 double volume;
272 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
273 EXPECT_EQ(0, volume);
274 }
275
276 void VerifyVideoChannelNoOutput() {
277 // Verify that the media channel's sink is reset.
278 EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
deadbeef70ab1a12015-09-28 16:53:55 -0700279 }
280
281 protected:
Steve Anton47136dd2018-01-12 10:49:35 -0800282 rtc::Thread* const network_thread_;
283 rtc::Thread* const worker_thread_;
skvlad11a9cbf2016-10-07 11:53:05 -0700284 webrtc::RtcEventLogNullImpl event_log_;
Zhi Huange830e682018-03-30 10:48:35 -0700285 // The |rtp_dtls_transport_| and |rtp_transport_| should be destroyed after
286 // the |channel_manager|.
287 std::unique_ptr<cricket::DtlsTransportInternal> rtp_dtls_transport_;
288 std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
deadbeef112b2e92017-02-10 20:13:37 -0800289 // |media_engine_| is actually owned by |channel_manager_|.
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700290 cricket::FakeMediaEngine* media_engine_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700291 cricket::ChannelManager channel_manager_;
292 cricket::FakeCall fake_call_;
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700293 cricket::VoiceChannel* voice_channel_;
294 cricket::VideoChannel* video_channel_;
295 cricket::FakeVoiceMediaChannel* voice_media_channel_;
296 cricket::FakeVideoMediaChannel* video_media_channel_;
deadbeef70ab1a12015-09-28 16:53:55 -0700297 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
298 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
299 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
300 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
deadbeefe814a0d2017-02-25 18:15:09 -0800301 rtc::scoped_refptr<MediaStreamInterface> local_stream_;
deadbeef70ab1a12015-09-28 16:53:55 -0700302 rtc::scoped_refptr<VideoTrackInterface> video_track_;
303 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
deadbeef20cb0c12017-02-01 20:27:00 -0800304 bool audio_sender_destroyed_signal_fired_ = false;
deadbeef70ab1a12015-09-28 16:53:55 -0700305};
306
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700307// Test that |voice_channel_| is updated when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700308// and disassociated with an AudioRtpSender.
309TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
310 CreateAudioRtpSender();
311 DestroyAudioRtpSender();
312}
313
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700314// Test that |video_channel_| is updated when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700315// disassociated with a VideoRtpSender.
316TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
317 CreateVideoRtpSender();
318 DestroyVideoRtpSender();
319}
320
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700321// Test that |voice_channel_| is updated when a remote audio track is
deadbeef70ab1a12015-09-28 16:53:55 -0700322// associated and disassociated with an AudioRtpReceiver.
323TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
324 CreateAudioRtpReceiver();
325 DestroyAudioRtpReceiver();
326}
327
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700328// Test that |video_channel_| is updated when a remote video track is
329// associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700330TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
331 CreateVideoRtpReceiver();
332 DestroyVideoRtpReceiver();
333}
334
Henrik Boström9e6fd2b2017-11-21 13:41:51 +0100335TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiverWithStreams) {
336 CreateAudioRtpReceiver({local_stream_});
337 DestroyAudioRtpReceiver();
338}
339
340TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiverWithStreams) {
341 CreateVideoRtpReceiver({local_stream_});
342 DestroyVideoRtpReceiver();
343}
344
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700345// Test that the AudioRtpSender applies options from the local audio source.
346TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
347 cricket::AudioOptions options;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100348 options.echo_cancellation = true;
deadbeef757146b2017-02-10 21:26:48 -0800349 auto source = LocalAudioSource::Create(&options);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700350 CreateAudioRtpSender(source.get());
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700351
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100352 EXPECT_EQ(true, voice_media_channel_->options().echo_cancellation);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700353
354 DestroyAudioRtpSender();
355}
356
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700357// Test that the stream is muted when the track is disabled, and unmuted when
358// the track is enabled.
359TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
360 CreateAudioRtpSender();
361
362 audio_track_->set_enabled(false);
363 EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
364
365 audio_track_->set_enabled(true);
366 EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
367
368 DestroyAudioRtpSender();
369}
370
371// Test that the volume is set to 0 when the track is disabled, and back to
372// 1 when the track is enabled.
deadbeef70ab1a12015-09-28 16:53:55 -0700373TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
374 CreateAudioRtpReceiver();
375
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700376 double volume;
377 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
378 EXPECT_EQ(1, volume);
Taylor Brandstetter2d549172016-06-24 14:18:22 -0700379
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700380 audio_track_->set_enabled(false);
381 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
382 EXPECT_EQ(0, volume);
383
deadbeef70ab1a12015-09-28 16:53:55 -0700384 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700385 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
386 EXPECT_EQ(1, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700387
388 DestroyAudioRtpReceiver();
389}
390
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700391// Currently no action is taken when a remote video track is disabled or
392// enabled, so there's nothing to test here, other than what is normally
393// verified in DestroyVideoRtpSender.
deadbeef70ab1a12015-09-28 16:53:55 -0700394TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
395 CreateVideoRtpSender();
396
deadbeef70ab1a12015-09-28 16:53:55 -0700397 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700398 video_track_->set_enabled(true);
399
400 DestroyVideoRtpSender();
401}
402
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700403// Test that the state of the video track created by the VideoRtpReceiver is
404// updated when the receiver is destroyed.
perkjf0dcfe22016-03-10 18:32:00 +0100405TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
406 CreateVideoRtpReceiver();
407
408 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
409 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
410 video_track_->GetSource()->state());
411
412 DestroyVideoRtpReceiver();
413
414 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
415 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
416 video_track_->GetSource()->state());
417}
418
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700419// Currently no action is taken when a remote video track is disabled or
420// enabled, so there's nothing to test here, other than what is normally
421// verified in DestroyVideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700422TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
423 CreateVideoRtpReceiver();
424
425 video_track_->set_enabled(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700426 video_track_->set_enabled(true);
427
428 DestroyVideoRtpReceiver();
429}
430
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700431// Test that the AudioRtpReceiver applies volume changes from the track source
432// to the media channel.
deadbeef70ab1a12015-09-28 16:53:55 -0700433TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
434 CreateAudioRtpReceiver();
435
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700436 double volume;
437 audio_track_->GetSource()->SetVolume(0.5);
438 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
439 EXPECT_EQ(0.5, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700440
441 // Disable the audio track, this should prevent setting the volume.
deadbeef70ab1a12015-09-28 16:53:55 -0700442 audio_track_->set_enabled(false);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700443 audio_track_->GetSource()->SetVolume(0.8);
444 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
445 EXPECT_EQ(0, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700446
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700447 // When the track is enabled, the previously set volume should take effect.
deadbeef70ab1a12015-09-28 16:53:55 -0700448 audio_track_->set_enabled(true);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700449 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
450 EXPECT_EQ(0.8, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700451
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700452 // Try changing volume one more time.
453 audio_track_->GetSource()->SetVolume(0.9);
454 EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
455 EXPECT_EQ(0.9, volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700456
457 DestroyAudioRtpReceiver();
458}
459
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700460// Test that the media channel isn't enabled for sending if the audio sender
461// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800462TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800463 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800464 rtc::scoped_refptr<AudioTrackInterface> track =
465 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700466
467 // Track but no SSRC.
468 EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
469 VerifyVoiceChannelNoInput();
470
471 // SSRC but no track.
472 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
473 audio_rtp_sender_->SetSsrc(kAudioSsrc);
474 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800475}
476
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700477// Test that the media channel isn't enabled for sending if the video sender
478// doesn't have both a track and SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800479TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800480 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700481
482 // Track but no SSRC.
483 EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
484 VerifyVideoChannelNoInput();
485
486 // SSRC but no track.
487 EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
488 video_rtp_sender_->SetSsrc(kVideoSsrc);
489 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800490}
491
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700492// Test that the media channel is enabled for sending when the audio sender
493// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800494TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800495 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800496 rtc::scoped_refptr<AudioTrackInterface> track =
497 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700498 audio_rtp_sender_->SetSsrc(kAudioSsrc);
499 audio_rtp_sender_->SetTrack(track);
500 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800501
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700502 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800503}
504
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700505// Test that the media channel is enabled for sending when the audio sender
506// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800507TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
Steve Anton02ee47c2018-01-10 16:26:06 -0800508 CreateAudioRtpSenderWithNoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800509 rtc::scoped_refptr<AudioTrackInterface> track =
510 AudioTrack::Create(kAudioTrackId, nullptr);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700511 audio_rtp_sender_->SetTrack(track);
512 audio_rtp_sender_->SetSsrc(kAudioSsrc);
513 VerifyVoiceChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800514
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700515 DestroyAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800516}
517
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700518// Test that the media channel is enabled for sending when the video sender
519// has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800520TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700521 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800522 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700523 video_rtp_sender_->SetSsrc(kVideoSsrc);
524 video_rtp_sender_->SetTrack(video_track_);
525 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800526
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700527 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800528}
529
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700530// Test that the media channel is enabled for sending when the video sender
531// has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800532TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700533 AddVideoTrack();
Steve Anton02ee47c2018-01-10 16:26:06 -0800534 CreateVideoRtpSenderWithNoTrack();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700535 video_rtp_sender_->SetTrack(video_track_);
536 video_rtp_sender_->SetSsrc(kVideoSsrc);
537 VerifyVideoChannelInput();
deadbeeffac06552015-11-25 11:26:01 -0800538
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700539 DestroyVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800540}
541
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700542// Test that the media channel stops sending when the audio sender's SSRC is set
543// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800544TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700545 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800546
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700547 audio_rtp_sender_->SetSsrc(0);
548 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800549}
550
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700551// Test that the media channel stops sending when the video sender's SSRC is set
552// to 0.
deadbeeffac06552015-11-25 11:26:01 -0800553TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700554 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800555
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700556 audio_rtp_sender_->SetSsrc(0);
557 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800558}
559
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700560// Test that the media channel stops sending when the audio sender's track is
561// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800562TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700563 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800564
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700565 EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
566 VerifyVoiceChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800567}
568
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700569// Test that the media channel stops sending when the video sender's track is
570// set to null.
deadbeeffac06552015-11-25 11:26:01 -0800571TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700572 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800573
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700574 video_rtp_sender_->SetSsrc(0);
575 VerifyVideoChannelNoInput();
deadbeeffac06552015-11-25 11:26:01 -0800576}
577
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700578// Test that when the audio sender's SSRC is changed, the media channel stops
579// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800580TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700581 CreateAudioRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800582
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700583 audio_rtp_sender_->SetSsrc(kAudioSsrc2);
584 VerifyVoiceChannelNoInput(kAudioSsrc);
585 VerifyVoiceChannelInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800586
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700587 audio_rtp_sender_ = nullptr;
588 VerifyVoiceChannelNoInput(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800589}
590
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700591// Test that when the audio sender's SSRC is changed, the media channel stops
592// sending with the old SSRC and starts sending with the new one.
deadbeeffac06552015-11-25 11:26:01 -0800593TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700594 CreateVideoRtpSender();
deadbeeffac06552015-11-25 11:26:01 -0800595
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700596 video_rtp_sender_->SetSsrc(kVideoSsrc2);
597 VerifyVideoChannelNoInput(kVideoSsrc);
598 VerifyVideoChannelInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800599
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700600 video_rtp_sender_ = nullptr;
601 VerifyVideoChannelNoInput(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800602}
603
skvladdc1c62c2016-03-16 19:07:43 -0700604TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
605 CreateAudioRtpSender();
606
skvladdc1c62c2016-03-16 19:07:43 -0700607 RtpParameters params = audio_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700608 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800609 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700610
611 DestroyAudioRtpSender();
612}
613
Florent Castellicebf50f2018-05-03 15:31:53 +0200614TEST_F(RtpSenderReceiverTest,
615 AudioSenderMustCallGetParametersBeforeSetParameters) {
616 CreateAudioRtpSender();
617
618 RtpParameters params;
619 RTCError result = audio_rtp_sender_->SetParameters(params);
620 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
621
622 DestroyAudioRtpSender();
623}
624
625TEST_F(RtpSenderReceiverTest,
626 AudioSenderSetParametersInvalidatesTransactionId) {
627 CreateAudioRtpSender();
628
629 RtpParameters params = audio_rtp_sender_->GetParameters();
630 EXPECT_EQ(1u, params.encodings.size());
631 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
632 RTCError result = audio_rtp_sender_->SetParameters(params);
633 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
634
635 DestroyAudioRtpSender();
636}
637
638TEST_F(RtpSenderReceiverTest, AudioSenderDetectTransactionIdModification) {
639 CreateAudioRtpSender();
640
641 RtpParameters params = audio_rtp_sender_->GetParameters();
642 params.transaction_id = "";
643 RTCError result = audio_rtp_sender_->SetParameters(params);
644 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
645
646 DestroyAudioRtpSender();
647}
648
649TEST_F(RtpSenderReceiverTest, AudioSenderCheckTransactionIdRefresh) {
650 CreateAudioRtpSender();
651
652 RtpParameters params = audio_rtp_sender_->GetParameters();
653 EXPECT_NE(params.transaction_id.size(), 0);
654 auto saved_transaction_id = params.transaction_id;
655 params = audio_rtp_sender_->GetParameters();
656 EXPECT_NE(saved_transaction_id, params.transaction_id);
657
658 DestroyAudioRtpSender();
659}
660
661TEST_F(RtpSenderReceiverTest, AudioSenderSetParametersOldValueFail) {
662 CreateAudioRtpSender();
663
664 RtpParameters params = audio_rtp_sender_->GetParameters();
665 RtpParameters second_params = audio_rtp_sender_->GetParameters();
666
667 RTCError result = audio_rtp_sender_->SetParameters(params);
668 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
Seth Hampson2d2c8882018-05-16 16:02:32 -0700669 DestroyAudioRtpSender();
670}
671
672TEST_F(RtpSenderReceiverTest, AudioSenderCantSetUnimplementedRtpParameters) {
673 CreateAudioRtpSender();
674 RtpParameters params = audio_rtp_sender_->GetParameters();
675 EXPECT_EQ(1u, params.encodings.size());
676
677 // Unimplemented RtpParameters: mid, header_extensions,
678 // degredation_preference.
679 params.mid = "dummy_mid";
680 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
681 audio_rtp_sender_->SetParameters(params).type());
682 params = audio_rtp_sender_->GetParameters();
683
684 params.header_extensions.emplace_back();
685 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
686 audio_rtp_sender_->SetParameters(params).type());
687 params = audio_rtp_sender_->GetParameters();
688
689 ASSERT_EQ(DegradationPreference::BALANCED, params.degradation_preference);
690 params.degradation_preference = DegradationPreference::MAINTAIN_FRAMERATE;
691 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
692 audio_rtp_sender_->SetParameters(params).type());
693
694 DestroyAudioRtpSender();
695}
696
697TEST_F(RtpSenderReceiverTest,
698 AudioSenderCantSetUnimplementedRtpEncodingParameters) {
699 CreateAudioRtpSender();
700 RtpParameters params = audio_rtp_sender_->GetParameters();
701 EXPECT_EQ(1u, params.encodings.size());
702
703 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
704 // max_framerate, scale_resolution_down_by, scale_framerate_down_by, rid,
705 // dependency_rids.
706 params.encodings[0].codec_payload_type = 1;
707 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
708 audio_rtp_sender_->SetParameters(params).type());
709 params = audio_rtp_sender_->GetParameters();
710
711 params.encodings[0].fec = RtpFecParameters();
712 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
713 audio_rtp_sender_->SetParameters(params).type());
714 params = audio_rtp_sender_->GetParameters();
715
716 params.encodings[0].rtx = RtpRtxParameters();
717 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
718 audio_rtp_sender_->SetParameters(params).type());
719 params = audio_rtp_sender_->GetParameters();
720
721 params.encodings[0].dtx = DtxStatus::ENABLED;
722 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
723 audio_rtp_sender_->SetParameters(params).type());
724 params = audio_rtp_sender_->GetParameters();
725
726 params.encodings[0].ptime = 1;
727 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
728 audio_rtp_sender_->SetParameters(params).type());
729 params = audio_rtp_sender_->GetParameters();
730
731 params.encodings[0].max_framerate = 1;
732 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
733 audio_rtp_sender_->SetParameters(params).type());
734 params = audio_rtp_sender_->GetParameters();
735
736 params.encodings[0].scale_resolution_down_by = 2.0;
737 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
738 audio_rtp_sender_->SetParameters(params).type());
739 params = audio_rtp_sender_->GetParameters();
740
741 params.encodings[0].rid = "dummy_rid";
742 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
743 audio_rtp_sender_->SetParameters(params).type());
744 params = audio_rtp_sender_->GetParameters();
745
746 params.encodings[0].dependency_rids.push_back("dummy_rid");
747 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
748 audio_rtp_sender_->SetParameters(params).type());
Florent Castellicebf50f2018-05-03 15:31:53 +0200749
750 DestroyAudioRtpSender();
751}
752
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700753TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
754 CreateAudioRtpSender();
755
756 EXPECT_EQ(-1, voice_media_channel_->max_bps());
757 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
758 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800759 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100760 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800761 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700762
763 // Read back the parameters and verify they have been changed.
764 params = audio_rtp_sender_->GetParameters();
765 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100766 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700767
768 // Verify that the audio channel received the new parameters.
769 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
770 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100771 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700772
773 // Verify that the global bitrate limit has not been changed.
774 EXPECT_EQ(-1, voice_media_channel_->max_bps());
775
776 DestroyAudioRtpSender();
777}
778
Seth Hampson24722b32017-12-22 09:36:42 -0800779TEST_F(RtpSenderReceiverTest, SetAudioBitratePriority) {
780 CreateAudioRtpSender();
781
782 webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
783 EXPECT_EQ(1, params.encodings.size());
784 EXPECT_EQ(webrtc::kDefaultBitratePriority,
785 params.encodings[0].bitrate_priority);
786 double new_bitrate_priority = 2.0;
787 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -0800788 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -0800789
790 params = audio_rtp_sender_->GetParameters();
791 EXPECT_EQ(1, params.encodings.size());
792 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
793
794 params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
795 EXPECT_EQ(1, params.encodings.size());
796 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
797
798 DestroyAudioRtpSender();
799}
800
skvladdc1c62c2016-03-16 19:07:43 -0700801TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
802 CreateVideoRtpSender();
803
skvladdc1c62c2016-03-16 19:07:43 -0700804 RtpParameters params = video_rtp_sender_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700805 EXPECT_EQ(1u, params.encodings.size());
Zach Steinba37b4b2018-01-23 15:02:36 -0800806 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
skvladdc1c62c2016-03-16 19:07:43 -0700807
808 DestroyVideoRtpSender();
809}
810
Florent Castellicebf50f2018-05-03 15:31:53 +0200811TEST_F(RtpSenderReceiverTest,
812 VideoSenderMustCallGetParametersBeforeSetParameters) {
813 CreateVideoRtpSender();
814
815 RtpParameters params;
816 RTCError result = video_rtp_sender_->SetParameters(params);
817 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
818
819 DestroyVideoRtpSender();
820}
821
822TEST_F(RtpSenderReceiverTest,
823 VideoSenderSetParametersInvalidatesTransactionId) {
824 CreateVideoRtpSender();
825
826 RtpParameters params = video_rtp_sender_->GetParameters();
827 EXPECT_EQ(1u, params.encodings.size());
828 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
829 RTCError result = video_rtp_sender_->SetParameters(params);
830 EXPECT_EQ(RTCErrorType::INVALID_STATE, result.type());
831
832 DestroyVideoRtpSender();
833}
834
835TEST_F(RtpSenderReceiverTest, VideoSenderDetectTransactionIdModification) {
836 CreateVideoRtpSender();
837
838 RtpParameters params = video_rtp_sender_->GetParameters();
839 params.transaction_id = "";
840 RTCError result = video_rtp_sender_->SetParameters(params);
841 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
842
843 DestroyVideoRtpSender();
844}
845
846TEST_F(RtpSenderReceiverTest, VideoSenderCheckTransactionIdRefresh) {
847 CreateVideoRtpSender();
848
849 RtpParameters params = video_rtp_sender_->GetParameters();
850 EXPECT_NE(params.transaction_id.size(), 0);
851 auto saved_transaction_id = params.transaction_id;
852 params = video_rtp_sender_->GetParameters();
853 EXPECT_NE(saved_transaction_id, params.transaction_id);
854
855 DestroyVideoRtpSender();
856}
857
858TEST_F(RtpSenderReceiverTest, VideoSenderSetParametersOldValueFail) {
859 CreateVideoRtpSender();
860
861 RtpParameters params = video_rtp_sender_->GetParameters();
862 RtpParameters second_params = video_rtp_sender_->GetParameters();
863
864 RTCError result = video_rtp_sender_->SetParameters(params);
865 EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
866
867 DestroyVideoRtpSender();
868}
869
Seth Hampson2d2c8882018-05-16 16:02:32 -0700870TEST_F(RtpSenderReceiverTest, VideoSenderCantSetUnimplementedRtpParameters) {
871 CreateVideoRtpSender();
872 RtpParameters params = video_rtp_sender_->GetParameters();
873 EXPECT_EQ(1u, params.encodings.size());
874
875 // Unimplemented RtpParameters: mid, header_extensions,
876 // degredation_preference.
877 params.mid = "dummy_mid";
878 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
879 video_rtp_sender_->SetParameters(params).type());
880 params = video_rtp_sender_->GetParameters();
881
882 params.header_extensions.emplace_back();
883 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
884 video_rtp_sender_->SetParameters(params).type());
885 params = video_rtp_sender_->GetParameters();
886
887 ASSERT_EQ(DegradationPreference::BALANCED, params.degradation_preference);
888 params.degradation_preference = DegradationPreference::MAINTAIN_FRAMERATE;
889 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
890 video_rtp_sender_->SetParameters(params).type());
891
892 DestroyVideoRtpSender();
893}
894
895TEST_F(RtpSenderReceiverTest,
896 VideoSenderCantSetUnimplementedEncodingParameters) {
897 CreateVideoRtpSender();
898 RtpParameters params = video_rtp_sender_->GetParameters();
899 EXPECT_EQ(1u, params.encodings.size());
900
901 // Unimplemented RtpParameters: codec_payload_type, fec, rtx, dtx, ptime,
902 // max_framerate, scale_resolution_down_by, scale_framerate_down_by, rid,
903 // dependency_rids.
904 params.encodings[0].codec_payload_type = 1;
905 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
906 video_rtp_sender_->SetParameters(params).type());
907 params = video_rtp_sender_->GetParameters();
908
909 params.encodings[0].fec = RtpFecParameters();
910 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
911 video_rtp_sender_->SetParameters(params).type());
912 params = video_rtp_sender_->GetParameters();
913
914 params.encodings[0].rtx = RtpRtxParameters();
915 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
916 video_rtp_sender_->SetParameters(params).type());
917 params = video_rtp_sender_->GetParameters();
918
919 params.encodings[0].dtx = DtxStatus::ENABLED;
920 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
921 video_rtp_sender_->SetParameters(params).type());
922 params = video_rtp_sender_->GetParameters();
923
924 params.encodings[0].ptime = 1;
925 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
926 video_rtp_sender_->SetParameters(params).type());
927 params = video_rtp_sender_->GetParameters();
928
929 params.encodings[0].max_framerate = 1;
930 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
931 video_rtp_sender_->SetParameters(params).type());
932 params = video_rtp_sender_->GetParameters();
933
934 params.encodings[0].scale_resolution_down_by = 2.0;
935 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
936 video_rtp_sender_->SetParameters(params).type());
937 params = video_rtp_sender_->GetParameters();
938
939 params.encodings[0].rid = "dummy_rid";
940 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
941 video_rtp_sender_->SetParameters(params).type());
942 params = video_rtp_sender_->GetParameters();
943
944 params.encodings[0].dependency_rids.push_back("dummy_rid");
945 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
946 video_rtp_sender_->SetParameters(params).type());
947
948 DestroyVideoRtpSender();
949}
950
951// A video sender can have multiple simulcast layers, in which case it will
952// contain multiple RtpEncodingParameters. This tests that if this is the case
953// (simulcast), then we can't set the bitrate_priority, or max_bitrate_bps
954// for any encodings besides at index 0, because these are both implemented
955// "per-sender."
956TEST_F(RtpSenderReceiverTest, VideoSenderCantSetPerSenderEncodingParameters) {
957 // Add a simulcast specific send stream that contains 2 encoding parameters.
958 std::vector<uint32_t> ssrcs({1, 2});
959 cricket::StreamParams stream_params =
960 cricket::CreateSimStreamParams("cname", ssrcs);
961 video_media_channel_->AddSendStream(stream_params);
962 uint32_t primary_ssrc = stream_params.first_ssrc();
963 CreateVideoRtpSender(primary_ssrc);
964 RtpParameters params = video_rtp_sender_->GetParameters();
965 EXPECT_EQ(ssrcs.size(), params.encodings.size());
966
967 params.encodings[1].bitrate_priority = 2.0;
968 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
969 video_rtp_sender_->SetParameters(params).type());
970 params = video_rtp_sender_->GetParameters();
971
972 params.encodings[1].max_bitrate_bps = 200000;
973 EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
974 video_rtp_sender_->SetParameters(params).type());
975
976 DestroyVideoRtpSender();
977}
978
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700979TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
980 CreateVideoRtpSender();
981
982 EXPECT_EQ(-1, video_media_channel_->max_bps());
983 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
984 EXPECT_EQ(1, params.encodings.size());
deadbeefe702b302017-02-04 12:09:01 -0800985 EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100986 params.encodings[0].max_bitrate_bps = 1000;
Zach Steinba37b4b2018-01-23 15:02:36 -0800987 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700988
989 // Read back the parameters and verify they have been changed.
990 params = video_rtp_sender_->GetParameters();
991 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100992 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700993
994 // Verify that the video channel received the new parameters.
995 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
996 EXPECT_EQ(1, params.encodings.size());
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +0100997 EXPECT_EQ(1000, params.encodings[0].max_bitrate_bps);
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -0700998
999 // Verify that the global bitrate limit has not been changed.
1000 EXPECT_EQ(-1, video_media_channel_->max_bps());
1001
1002 DestroyVideoRtpSender();
1003}
1004
Seth Hampson24722b32017-12-22 09:36:42 -08001005TEST_F(RtpSenderReceiverTest, SetVideoBitratePriority) {
1006 CreateVideoRtpSender();
1007
1008 webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
1009 EXPECT_EQ(1, params.encodings.size());
1010 EXPECT_EQ(webrtc::kDefaultBitratePriority,
1011 params.encodings[0].bitrate_priority);
1012 double new_bitrate_priority = 2.0;
1013 params.encodings[0].bitrate_priority = new_bitrate_priority;
Zach Steinba37b4b2018-01-23 15:02:36 -08001014 EXPECT_TRUE(video_rtp_sender_->SetParameters(params).ok());
Seth Hampson24722b32017-12-22 09:36:42 -08001015
1016 params = video_rtp_sender_->GetParameters();
1017 EXPECT_EQ(1, params.encodings.size());
1018 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1019
1020 params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
1021 EXPECT_EQ(1, params.encodings.size());
1022 EXPECT_EQ(new_bitrate_priority, params.encodings[0].bitrate_priority);
1023
1024 DestroyVideoRtpSender();
1025}
1026
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001027TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
1028 CreateAudioRtpReceiver();
1029
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001030 RtpParameters params = audio_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001031 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001032 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
1033
1034 DestroyAudioRtpReceiver();
1035}
1036
1037TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
1038 CreateVideoRtpReceiver();
1039
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001040 RtpParameters params = video_rtp_receiver_->GetParameters();
Taylor Brandstetterba29c6a2016-06-27 16:30:35 -07001041 EXPECT_EQ(1u, params.encodings.size());
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -07001042 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
1043
1044 DestroyVideoRtpReceiver();
1045}
1046
pbos5214a0a2016-12-16 15:39:11 -08001047// Test that makes sure that a video track content hint translates to the proper
1048// value for sources that are not screencast.
1049TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
1050 CreateVideoRtpSender();
1051
1052 video_track_->set_enabled(true);
1053
1054 // |video_track_| is not screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001055 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001056 // No content hint should be set by default.
1057 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1058 video_track_->content_hint());
1059 // Setting detailed should turn a non-screencast source into screencast mode.
1060 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001061 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001062 // Removing the content hint should turn the track back into non-screencast
1063 // mode.
1064 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001065 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001066 // Setting fluid should remain in non-screencast mode (its default).
1067 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001068 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001069
1070 DestroyVideoRtpSender();
1071}
1072
1073// Test that makes sure that a video track content hint translates to the proper
1074// value for screencast sources.
1075TEST_F(RtpSenderReceiverTest,
1076 PropagatesVideoTrackContentHintForScreencastSource) {
1077 CreateVideoRtpSender(true);
1078
1079 video_track_->set_enabled(true);
1080
1081 // |video_track_| with a screencast source should be screencast by default.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001082 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001083 // No content hint should be set by default.
1084 EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
1085 video_track_->content_hint());
1086 // Setting fluid should turn a screencast source into non-screencast mode.
1087 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001088 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001089 // Removing the content hint should turn the track back into screencast mode.
1090 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001091 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001092 // Setting detailed should still remain in screencast mode (its default).
1093 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001094 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001095
1096 DestroyVideoRtpSender();
1097}
1098
1099// Test that makes sure any content hints that are set on a track before
1100// VideoRtpSender is ready to send are still applied when it gets ready to send.
1101TEST_F(RtpSenderReceiverTest,
1102 PropagatesVideoTrackContentHintSetBeforeEnabling) {
1103 AddVideoTrack();
1104 // Setting detailed overrides the default non-screencast mode. This should be
1105 // applied even if the track is set on construction.
1106 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
Seth Hampson13b8bad2018-03-13 16:05:28 -07001107 video_rtp_sender_ =
1108 new VideoRtpSender(worker_thread_, local_stream_->GetVideoTracks()[0],
1109 {local_stream_->id()});
Steve Anton57858b32018-02-15 15:19:50 -08001110 video_rtp_sender_->SetVideoMediaChannel(video_media_channel_);
pbos5214a0a2016-12-16 15:39:11 -08001111 video_track_->set_enabled(true);
1112
1113 // Sender is not ready to send (no SSRC) so no option should have been set.
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001114 EXPECT_EQ(rtc::nullopt, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001115
1116 // Verify that the content hint is accounted for when video_rtp_sender_ does
1117 // get enabled.
1118 video_rtp_sender_->SetSsrc(kVideoSsrc);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001119 EXPECT_EQ(true, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001120
1121 // And removing the hint should go back to false (to verify that false was
1122 // default correctly).
1123 video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +01001124 EXPECT_EQ(false, video_media_channel_->options().is_screencast);
pbos5214a0a2016-12-16 15:39:11 -08001125
1126 DestroyVideoRtpSender();
1127}
1128
deadbeef20cb0c12017-02-01 20:27:00 -08001129TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
1130 CreateAudioRtpSender();
1131 EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
1132}
1133
1134TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
1135 CreateVideoRtpSender();
1136 EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
1137}
1138
1139// Test that the DTMF sender is really using |voice_channel_|, and thus returns
1140// true/false from CanSendDtmf based on what |voice_channel_| returns.
1141TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
1142 AddDtmfCodec();
1143 CreateAudioRtpSender();
1144 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1145 ASSERT_NE(nullptr, dtmf_sender);
1146 EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
1147}
1148
1149TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
1150 CreateAudioRtpSender();
1151 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1152 ASSERT_NE(nullptr, dtmf_sender);
1153 // DTMF codec has not been added, as it was in the above test.
1154 EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
1155}
1156
1157TEST_F(RtpSenderReceiverTest, InsertDtmf) {
1158 AddDtmfCodec();
1159 CreateAudioRtpSender();
1160 auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
1161 ASSERT_NE(nullptr, dtmf_sender);
1162
1163 EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
1164
1165 // Insert DTMF
1166 const int expected_duration = 90;
1167 dtmf_sender->InsertDtmf("012", expected_duration, 100);
1168
1169 // Verify
1170 ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
1171 kDefaultTimeout);
1172 const uint32_t send_ssrc =
1173 voice_media_channel_->send_streams()[0].first_ssrc();
1174 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
1175 send_ssrc, 0, expected_duration));
1176 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
1177 send_ssrc, 1, expected_duration));
1178 EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
1179 send_ssrc, 2, expected_duration));
1180}
1181
1182// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
1183// destroyed, which is needed for the DTMF sender.
1184TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
1185 CreateAudioRtpSender();
1186 EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
1187 audio_rtp_sender_ = nullptr;
1188 EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
1189}
1190
deadbeef70ab1a12015-09-28 16:53:55 -07001191} // namespace webrtc