blob: 3db9d5e00ee1d57af9ba98fd106b30c6aec21518 [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
deadbeef70ab1a12015-09-28 16:53:55 -070015#include "testing/gmock/include/gmock/gmock.h"
16#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010017#include "webrtc/api/audiotrack.h"
18#include "webrtc/api/mediastream.h"
19#include "webrtc/api/remoteaudiosource.h"
20#include "webrtc/api/rtpreceiver.h"
21#include "webrtc/api/rtpsender.h"
22#include "webrtc/api/streamcollection.h"
nisseaf510af2016-03-21 08:20:42 -070023#include "webrtc/api/test/fakevideotracksource.h"
perkj0d3eef22016-03-09 02:39:17 +010024#include "webrtc/api/videotracksource.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010025#include "webrtc/api/videotrack.h"
deadbeef70ab1a12015-09-28 16:53:55 -070026#include "webrtc/base/gunit.h"
kjellandera96e2d72016-02-04 23:52:28 -080027#include "webrtc/media/base/mediachannel.h"
deadbeef70ab1a12015-09-28 16:53:55 -070028
29using ::testing::_;
30using ::testing::Exactly;
deadbeef5dd42fd2016-05-02 16:20:01 -070031using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070032using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070033
34static const char kStreamLabel1[] = "local_stream_1";
35static const char kVideoTrackId[] = "video_1";
36static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020037static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080038static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020039static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080040static const uint32_t kAudioSsrc2 = 101;
deadbeef70ab1a12015-09-28 16:53:55 -070041
42namespace webrtc {
43
44// Helper class to test RtpSender/RtpReceiver.
45class MockAudioProvider : public AudioProviderInterface {
46 public:
nisseef8b61e2016-04-29 06:09:15 -070047 // TODO(nisse): Valid overrides commented out, because the gmock
48 // methods don't use any override declarations, and we want to avoid
49 // warnings from -Winconsistent-missing-override. See
50 // http://crbug.com/428099.
51 ~MockAudioProvider() /* override */ {}
Tommif888bb52015-12-12 01:37:01 +010052
solenbergd4cec0d2015-10-09 08:55:48 -070053 MOCK_METHOD2(SetAudioPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020054 void(uint32_t ssrc,
solenbergd4cec0d2015-10-09 08:55:48 -070055 bool enable));
deadbeef70ab1a12015-09-28 16:53:55 -070056 MOCK_METHOD4(SetAudioSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020057 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070058 bool enable,
59 const cricket::AudioOptions& options,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080060 cricket::AudioSource* source));
Peter Boström0c4e06b2015-10-07 12:23:21 +020061 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070062 MOCK_CONST_METHOD1(GetAudioRtpSendParameters, RtpParameters(uint32_t ssrc));
63 MOCK_METHOD2(SetAudioRtpSendParameters,
64 bool(uint32_t ssrc, const RtpParameters&));
65 MOCK_CONST_METHOD1(GetAudioRtpReceiveParameters,
66 RtpParameters(uint32_t ssrc));
67 MOCK_METHOD2(SetAudioRtpReceiveParameters,
skvladdc1c62c2016-03-16 19:07:43 -070068 bool(uint32_t ssrc, const RtpParameters&));
Tommif888bb52015-12-12 01:37:01 +010069
nisseef8b61e2016-04-29 06:09:15 -070070 void SetRawAudioSink(
71 uint32_t, std::unique_ptr<AudioSinkInterface> sink) /* override */ {
deadbeef2d110be2016-01-13 12:00:26 -080072 sink_ = std::move(sink);
Tommif888bb52015-12-12 01:37:01 +010073 }
74
75 private:
kwibergd1fe2812016-04-27 06:47:29 -070076 std::unique_ptr<AudioSinkInterface> sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070077};
78
79// Helper class to test RtpSender/RtpReceiver.
80class MockVideoProvider : public VideoProviderInterface {
81 public:
82 virtual ~MockVideoProvider() {}
nisse2ded9b12016-04-08 02:23:55 -070083 MOCK_METHOD2(SetSource,
84 bool(uint32_t ssrc,
85 rtc::VideoSourceInterface<cricket::VideoFrame>* source));
deadbeef70ab1a12015-09-28 16:53:55 -070086 MOCK_METHOD3(SetVideoPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020087 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070088 bool enable,
nisse08582ff2016-02-04 01:24:52 -080089 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
deadbeef70ab1a12015-09-28 16:53:55 -070090 MOCK_METHOD3(SetVideoSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020091 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070092 bool enable,
93 const cricket::VideoOptions* options));
skvladdc1c62c2016-03-16 19:07:43 -070094
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070095 MOCK_CONST_METHOD1(GetVideoRtpSendParameters, RtpParameters(uint32_t ssrc));
96 MOCK_METHOD2(SetVideoRtpSendParameters,
97 bool(uint32_t ssrc, const RtpParameters&));
98 MOCK_CONST_METHOD1(GetVideoRtpReceiveParameters,
99 RtpParameters(uint32_t ssrc));
100 MOCK_METHOD2(SetVideoRtpReceiveParameters,
skvladdc1c62c2016-03-16 19:07:43 -0700101 bool(uint32_t ssrc, const RtpParameters&));
deadbeef70ab1a12015-09-28 16:53:55 -0700102};
103
deadbeef70ab1a12015-09-28 16:53:55 -0700104class RtpSenderReceiverTest : public testing::Test {
105 public:
106 virtual void SetUp() {
107 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -0800108 }
109
nisseaf510af2016-03-21 08:20:42 -0700110 void AddVideoTrack() {
perkja3ede6c2016-03-08 01:27:48 +0100111 rtc::scoped_refptr<VideoTrackSourceInterface> source(
nisseaf510af2016-03-21 08:20:42 -0700112 FakeVideoTrackSource::Create());
deadbeef70ab1a12015-09-28 16:53:55 -0700113 video_track_ = VideoTrack::Create(kVideoTrackId, source);
114 EXPECT_TRUE(stream_->AddTrack(video_track_));
115 }
116
117 void CreateAudioRtpSender() {
118 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
119 EXPECT_TRUE(stream_->AddTrack(audio_track_));
120 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800121 audio_rtp_sender_ =
122 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
123 &audio_provider_, nullptr);
124 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700125 }
126
127 void CreateVideoRtpSender() {
nisseaf510af2016-03-21 08:20:42 -0700128 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700129 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700130 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
131 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800132 stream_->label(), &video_provider_);
133 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700134 }
135
136 void DestroyAudioRtpSender() {
137 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
138 .Times(1);
139 audio_rtp_sender_ = nullptr;
140 }
141
142 void DestroyVideoRtpSender() {
nisse2ded9b12016-04-08 02:23:55 -0700143 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, NULL)).Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700144 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
145 video_rtp_sender_ = nullptr;
146 }
147
148 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800149 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100150 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700151 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700152 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
perkjd61bf802016-03-24 03:16:19 -0700153 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
deadbeef70ab1a12015-09-28 16:53:55 -0700154 kAudioSsrc, &audio_provider_);
perkjd61bf802016-03-24 03:16:19 -0700155 audio_track_ = audio_rtp_receiver_->audio_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700156 }
157
158 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100159 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
160 video_rtp_receiver_ =
161 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
162 kVideoSsrc, &video_provider_);
163 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700164 }
165
166 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700167 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700168 audio_rtp_receiver_ = nullptr;
169 }
170
171 void DestroyVideoRtpReceiver() {
172 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
173 video_rtp_receiver_ = nullptr;
174 }
175
176 protected:
177 MockAudioProvider audio_provider_;
178 MockVideoProvider video_provider_;
179 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
180 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
181 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
182 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
183 rtc::scoped_refptr<MediaStreamInterface> stream_;
184 rtc::scoped_refptr<VideoTrackInterface> video_track_;
185 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
186};
187
188// Test that |audio_provider_| is notified when an audio track is associated
189// and disassociated with an AudioRtpSender.
190TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
191 CreateAudioRtpSender();
192 DestroyAudioRtpSender();
193}
194
195// Test that |video_provider_| is notified when a video track is associated and
196// disassociated with a VideoRtpSender.
197TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
198 CreateVideoRtpSender();
199 DestroyVideoRtpSender();
200}
201
202// Test that |audio_provider_| is notified when a remote audio and track is
203// associated and disassociated with an AudioRtpReceiver.
204TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
205 CreateAudioRtpReceiver();
206 DestroyAudioRtpReceiver();
207}
208
209// Test that |video_provider_| is notified when a remote
210// video track is associated and disassociated with a VideoRtpReceiver.
211TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
212 CreateVideoRtpReceiver();
213 DestroyVideoRtpReceiver();
214}
215
216TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
217 CreateAudioRtpSender();
218
219 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
220 audio_track_->set_enabled(false);
221
222 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
223 audio_track_->set_enabled(true);
224
225 DestroyAudioRtpSender();
226}
227
228TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
229 CreateAudioRtpReceiver();
230
solenbergd4cec0d2015-10-09 08:55:48 -0700231 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700232 audio_track_->set_enabled(false);
233
solenbergd4cec0d2015-10-09 08:55:48 -0700234 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700235 audio_track_->set_enabled(true);
236
237 DestroyAudioRtpReceiver();
238}
239
240TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
241 CreateVideoRtpSender();
242
243 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
244 video_track_->set_enabled(false);
245
246 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
247 video_track_->set_enabled(true);
248
249 DestroyVideoRtpSender();
250}
251
perkjf0dcfe22016-03-10 18:32:00 +0100252TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
253 CreateVideoRtpReceiver();
254
255 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
256 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
257 video_track_->GetSource()->state());
258
259 DestroyVideoRtpReceiver();
260
261 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
262 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
263 video_track_->GetSource()->state());
264}
265
deadbeef70ab1a12015-09-28 16:53:55 -0700266TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
267 CreateVideoRtpReceiver();
268
269 video_track_->set_enabled(false);
270
271 video_track_->set_enabled(true);
272
273 DestroyVideoRtpReceiver();
274}
275
276TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
277 CreateAudioRtpReceiver();
278
279 double volume = 0.5;
280 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
281 audio_track_->GetSource()->SetVolume(volume);
282
283 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700284 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700285 audio_track_->set_enabled(false);
286 audio_track_->GetSource()->SetVolume(1.0);
287
solenbergd4cec0d2015-10-09 08:55:48 -0700288 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700289 audio_track_->set_enabled(true);
290
291 double new_volume = 0.8;
292 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
293 audio_track_->GetSource()->SetVolume(new_volume);
294
295 DestroyAudioRtpReceiver();
296}
297
deadbeeffac06552015-11-25 11:26:01 -0800298// Test that provider methods aren't called without both a track and an SSRC.
299TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
300 rtc::scoped_refptr<AudioRtpSender> sender =
301 new AudioRtpSender(&audio_provider_, nullptr);
302 rtc::scoped_refptr<AudioTrackInterface> track =
303 AudioTrack::Create(kAudioTrackId, nullptr);
304 EXPECT_TRUE(sender->SetTrack(track));
305 EXPECT_TRUE(sender->SetTrack(nullptr));
306 sender->SetSsrc(kAudioSsrc);
307 sender->SetSsrc(0);
308 // Just let it get destroyed and make sure it doesn't call any methods on the
309 // provider interface.
310}
311
312// Test that provider methods aren't called without both a track and an SSRC.
313TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
314 rtc::scoped_refptr<VideoRtpSender> sender =
315 new VideoRtpSender(&video_provider_);
316 EXPECT_TRUE(sender->SetTrack(video_track_));
317 EXPECT_TRUE(sender->SetTrack(nullptr));
318 sender->SetSsrc(kVideoSsrc);
319 sender->SetSsrc(0);
320 // Just let it get destroyed and make sure it doesn't call any methods on the
321 // provider interface.
322}
323
324// Test that an audio sender calls the expected methods on the provider once
325// it has a track and SSRC, when the SSRC is set first.
326TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
327 rtc::scoped_refptr<AudioRtpSender> sender =
328 new AudioRtpSender(&audio_provider_, nullptr);
329 rtc::scoped_refptr<AudioTrackInterface> track =
330 AudioTrack::Create(kAudioTrackId, nullptr);
331 sender->SetSsrc(kAudioSsrc);
332 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
333 sender->SetTrack(track);
334
335 // Calls expected from destructor.
336 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
337}
338
339// Test that an audio sender calls the expected methods on the provider once
340// it has a track and SSRC, when the SSRC is set last.
341TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
342 rtc::scoped_refptr<AudioRtpSender> sender =
343 new AudioRtpSender(&audio_provider_, nullptr);
344 rtc::scoped_refptr<AudioTrackInterface> track =
345 AudioTrack::Create(kAudioTrackId, nullptr);
346 sender->SetTrack(track);
347 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
348 sender->SetSsrc(kAudioSsrc);
349
350 // Calls expected from destructor.
351 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
352}
353
354// Test that a video sender calls the expected methods on the provider once
355// it has a track and SSRC, when the SSRC is set first.
356TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700357 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800358 rtc::scoped_refptr<VideoRtpSender> sender =
359 new VideoRtpSender(&video_provider_);
360 sender->SetSsrc(kVideoSsrc);
nisse2ded9b12016-04-08 02:23:55 -0700361 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800362 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
363 sender->SetTrack(video_track_);
364
365 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700366 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800367 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
368}
369
370// Test that a video sender calls the expected methods on the provider once
371// it has a track and SSRC, when the SSRC is set last.
372TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700373 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800374 rtc::scoped_refptr<VideoRtpSender> sender =
375 new VideoRtpSender(&video_provider_);
376 sender->SetTrack(video_track_);
nisse2ded9b12016-04-08 02:23:55 -0700377 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800378 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
379 sender->SetSsrc(kVideoSsrc);
380
381 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700382 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800383 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
384}
385
386// Test that the sender is disconnected from the provider when its SSRC is
387// set to 0.
388TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
389 rtc::scoped_refptr<AudioTrackInterface> track =
390 AudioTrack::Create(kAudioTrackId, nullptr);
391 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
392 rtc::scoped_refptr<AudioRtpSender> sender =
393 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
394 sender->SetSsrc(kAudioSsrc);
395
396 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
397 sender->SetSsrc(0);
398
399 // Make sure it's SetSsrc that called methods on the provider, and not the
400 // destructor.
401 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
402}
403
404// Test that the sender is disconnected from the provider when its SSRC is
405// set to 0.
406TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
nisseaf510af2016-03-21 08:20:42 -0700407 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700408 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800409 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
410 rtc::scoped_refptr<VideoRtpSender> sender =
411 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
412 sender->SetSsrc(kVideoSsrc);
413
nisse2ded9b12016-04-08 02:23:55 -0700414 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800415 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
416 sender->SetSsrc(0);
417
418 // Make sure it's SetSsrc that called methods on the provider, and not the
419 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700420 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800421 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
422}
423
424TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
425 rtc::scoped_refptr<AudioTrackInterface> track =
426 AudioTrack::Create(kAudioTrackId, nullptr);
427 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
428 rtc::scoped_refptr<AudioRtpSender> sender =
429 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
430 sender->SetSsrc(kAudioSsrc);
431
deadbeef5dd42fd2016-05-02 16:20:01 -0700432 // Expect that SetAudioSend will be called before the reference to the track
433 // is released.
434 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, nullptr))
435 .Times(1)
436 .WillOnce(InvokeWithoutArgs([&track] {
437 EXPECT_LT(2, track->AddRef());
438 track->Release();
439 }));
deadbeeffac06552015-11-25 11:26:01 -0800440 EXPECT_TRUE(sender->SetTrack(nullptr));
441
442 // Make sure it's SetTrack that called methods on the provider, and not the
443 // destructor.
444 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
445}
446
447TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
deadbeef5dd42fd2016-05-02 16:20:01 -0700448 rtc::scoped_refptr<VideoTrackSourceInterface> source(
449 FakeVideoTrackSource::Create());
450 rtc::scoped_refptr<VideoTrackInterface> track =
451 VideoTrack::Create(kVideoTrackId, source);
452 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, track.get()));
deadbeeffac06552015-11-25 11:26:01 -0800453 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
454 rtc::scoped_refptr<VideoRtpSender> sender =
deadbeef5dd42fd2016-05-02 16:20:01 -0700455 new VideoRtpSender(track, kStreamLabel1, &video_provider_);
deadbeeffac06552015-11-25 11:26:01 -0800456 sender->SetSsrc(kVideoSsrc);
457
deadbeef5dd42fd2016-05-02 16:20:01 -0700458 // Expect that SetSource will be called before the reference to the track
459 // is released.
460 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr))
461 .Times(1)
462 .WillOnce(InvokeWithoutArgs([&track] {
463 EXPECT_LT(2, track->AddRef());
464 track->Release();
465 return true;
466 }));
deadbeeffac06552015-11-25 11:26:01 -0800467 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
468 EXPECT_TRUE(sender->SetTrack(nullptr));
469
470 // Make sure it's SetTrack that called methods on the provider, and not the
471 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700472 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800473 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
474}
475
476TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700477 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800478 rtc::scoped_refptr<AudioTrackInterface> track =
479 AudioTrack::Create(kAudioTrackId, nullptr);
480 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
481 rtc::scoped_refptr<AudioRtpSender> sender =
482 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
483 sender->SetSsrc(kAudioSsrc);
484
485 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
486 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
487 sender->SetSsrc(kAudioSsrc2);
488
489 // Calls expected from destructor.
490 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
491}
492
493TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700494 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700495 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800496 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
497 rtc::scoped_refptr<VideoRtpSender> sender =
498 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
499 sender->SetSsrc(kVideoSsrc);
500
nisse2ded9b12016-04-08 02:23:55 -0700501 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800502 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
nisse2ded9b12016-04-08 02:23:55 -0700503 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800504 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
505 sender->SetSsrc(kVideoSsrc2);
506
507 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700508 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800509 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
510}
511
skvladdc1c62c2016-03-16 19:07:43 -0700512TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
513 CreateAudioRtpSender();
514
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700515 EXPECT_CALL(audio_provider_, GetAudioRtpSendParameters(kAudioSsrc))
skvladdc1c62c2016-03-16 19:07:43 -0700516 .WillOnce(Return(RtpParameters()));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700517 EXPECT_CALL(audio_provider_, SetAudioRtpSendParameters(kAudioSsrc, _))
skvladdc1c62c2016-03-16 19:07:43 -0700518 .WillOnce(Return(true));
519 RtpParameters params = audio_rtp_sender_->GetParameters();
520 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
521
522 DestroyAudioRtpSender();
523}
524
525TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
526 CreateVideoRtpSender();
527
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700528 EXPECT_CALL(video_provider_, GetVideoRtpSendParameters(kVideoSsrc))
skvladdc1c62c2016-03-16 19:07:43 -0700529 .WillOnce(Return(RtpParameters()));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700530 EXPECT_CALL(video_provider_, SetVideoRtpSendParameters(kVideoSsrc, _))
skvladdc1c62c2016-03-16 19:07:43 -0700531 .WillOnce(Return(true));
532 RtpParameters params = video_rtp_sender_->GetParameters();
533 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
534
535 DestroyVideoRtpSender();
536}
537
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700538TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
539 CreateAudioRtpReceiver();
540
541 EXPECT_CALL(audio_provider_, GetAudioRtpReceiveParameters(kAudioSsrc))
542 .WillOnce(Return(RtpParameters()));
543 EXPECT_CALL(audio_provider_, SetAudioRtpReceiveParameters(kAudioSsrc, _))
544 .WillOnce(Return(true));
545 RtpParameters params = audio_rtp_receiver_->GetParameters();
546 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
547
548 DestroyAudioRtpReceiver();
549}
550
551TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
552 CreateVideoRtpReceiver();
553
554 EXPECT_CALL(video_provider_, GetVideoRtpReceiveParameters(kVideoSsrc))
555 .WillOnce(Return(RtpParameters()));
556 EXPECT_CALL(video_provider_, SetVideoRtpReceiveParameters(kVideoSsrc, _))
557 .WillOnce(Return(true));
558 RtpParameters params = video_rtp_receiver_->GetParameters();
559 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
560
561 DestroyVideoRtpReceiver();
562}
563
deadbeef70ab1a12015-09-28 16:53:55 -0700564} // namespace webrtc