blob: a08e1b4c634a34083e01b451fd8080560504d30b [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() {}
deadbeef70ab1a12015-09-28 16:53:55 -070083 MOCK_METHOD3(SetVideoPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020084 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070085 bool enable,
nisse08582ff2016-02-04 01:24:52 -080086 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
deadbeef5a4a75a2016-06-02 16:23:38 -070087 MOCK_METHOD4(SetVideoSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020088 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070089 bool enable,
deadbeef5a4a75a2016-06-02 16:23:38 -070090 const cricket::VideoOptions* options,
91 rtc::VideoSourceInterface<cricket::VideoFrame>* source));
skvladdc1c62c2016-03-16 19:07:43 -070092
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -070093 MOCK_CONST_METHOD1(GetVideoRtpSendParameters, RtpParameters(uint32_t ssrc));
94 MOCK_METHOD2(SetVideoRtpSendParameters,
95 bool(uint32_t ssrc, const RtpParameters&));
96 MOCK_CONST_METHOD1(GetVideoRtpReceiveParameters,
97 RtpParameters(uint32_t ssrc));
98 MOCK_METHOD2(SetVideoRtpReceiveParameters,
skvladdc1c62c2016-03-16 19:07:43 -070099 bool(uint32_t ssrc, const RtpParameters&));
deadbeef70ab1a12015-09-28 16:53:55 -0700100};
101
deadbeef70ab1a12015-09-28 16:53:55 -0700102class RtpSenderReceiverTest : public testing::Test {
103 public:
104 virtual void SetUp() {
105 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -0800106 }
107
nisseaf510af2016-03-21 08:20:42 -0700108 void AddVideoTrack() {
perkja3ede6c2016-03-08 01:27:48 +0100109 rtc::scoped_refptr<VideoTrackSourceInterface> source(
nisseaf510af2016-03-21 08:20:42 -0700110 FakeVideoTrackSource::Create());
deadbeef70ab1a12015-09-28 16:53:55 -0700111 video_track_ = VideoTrack::Create(kVideoTrackId, source);
112 EXPECT_TRUE(stream_->AddTrack(video_track_));
113 }
114
115 void CreateAudioRtpSender() {
116 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
117 EXPECT_TRUE(stream_->AddTrack(audio_track_));
118 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800119 audio_rtp_sender_ =
120 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
121 &audio_provider_, nullptr);
122 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700123 }
124
125 void CreateVideoRtpSender() {
nisseaf510af2016-03-21 08:20:42 -0700126 AddVideoTrack();
deadbeef5a4a75a2016-06-02 16:23:38 -0700127 EXPECT_CALL(video_provider_,
128 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700129 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800130 stream_->label(), &video_provider_);
131 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700132 }
133
134 void DestroyAudioRtpSender() {
135 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
136 .Times(1);
137 audio_rtp_sender_ = nullptr;
138 }
139
140 void DestroyVideoRtpSender() {
deadbeef5a4a75a2016-06-02 16:23:38 -0700141 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
142 .Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700143 video_rtp_sender_ = nullptr;
144 }
145
146 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800147 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100148 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700149 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700150 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
perkjd61bf802016-03-24 03:16:19 -0700151 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
deadbeef70ab1a12015-09-28 16:53:55 -0700152 kAudioSsrc, &audio_provider_);
perkjd61bf802016-03-24 03:16:19 -0700153 audio_track_ = audio_rtp_receiver_->audio_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700154 }
155
156 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100157 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
158 video_rtp_receiver_ =
159 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
160 kVideoSsrc, &video_provider_);
161 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
164 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700165 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700166 audio_rtp_receiver_ = nullptr;
167 }
168
169 void DestroyVideoRtpReceiver() {
170 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
171 video_rtp_receiver_ = nullptr;
172 }
173
174 protected:
175 MockAudioProvider audio_provider_;
176 MockVideoProvider video_provider_;
177 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
178 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
179 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
180 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
181 rtc::scoped_refptr<MediaStreamInterface> stream_;
182 rtc::scoped_refptr<VideoTrackInterface> video_track_;
183 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
184};
185
186// Test that |audio_provider_| is notified when an audio track is associated
187// and disassociated with an AudioRtpSender.
188TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
189 CreateAudioRtpSender();
190 DestroyAudioRtpSender();
191}
192
193// Test that |video_provider_| is notified when a video track is associated and
194// disassociated with a VideoRtpSender.
195TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
196 CreateVideoRtpSender();
197 DestroyVideoRtpSender();
198}
199
200// Test that |audio_provider_| is notified when a remote audio and track is
201// associated and disassociated with an AudioRtpReceiver.
202TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
203 CreateAudioRtpReceiver();
204 DestroyAudioRtpReceiver();
205}
206
207// Test that |video_provider_| is notified when a remote
208// video track is associated and disassociated with a VideoRtpReceiver.
209TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
210 CreateVideoRtpReceiver();
211 DestroyVideoRtpReceiver();
212}
213
214TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
215 CreateAudioRtpSender();
216
217 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
218 audio_track_->set_enabled(false);
219
220 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
221 audio_track_->set_enabled(true);
222
223 DestroyAudioRtpSender();
224}
225
226TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
227 CreateAudioRtpReceiver();
228
solenbergd4cec0d2015-10-09 08:55:48 -0700229 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700230 audio_track_->set_enabled(false);
231
solenbergd4cec0d2015-10-09 08:55:48 -0700232 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700233 audio_track_->set_enabled(true);
234
235 DestroyAudioRtpReceiver();
236}
237
238TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
239 CreateVideoRtpSender();
240
deadbeef5a4a75a2016-06-02 16:23:38 -0700241 EXPECT_CALL(video_provider_,
242 SetVideoSend(kVideoSsrc, false, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700243 video_track_->set_enabled(false);
244
deadbeef5a4a75a2016-06-02 16:23:38 -0700245 EXPECT_CALL(video_provider_,
246 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700247 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);
deadbeef5a4a75a2016-06-02 16:23:38 -0700361 EXPECT_CALL(video_provider_,
362 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800363 sender->SetTrack(video_track_);
364
365 // Calls expected from destructor.
deadbeef5a4a75a2016-06-02 16:23:38 -0700366 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
367 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800368}
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_);
deadbeef5a4a75a2016-06-02 16:23:38 -0700377 EXPECT_CALL(video_provider_,
378 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800379 sender->SetSsrc(kVideoSsrc);
380
381 // Calls expected from destructor.
deadbeef5a4a75a2016-06-02 16:23:38 -0700382 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
383 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800384}
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();
deadbeef5a4a75a2016-06-02 16:23:38 -0700408 EXPECT_CALL(video_provider_,
409 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800410 rtc::scoped_refptr<VideoRtpSender> sender =
411 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
412 sender->SetSsrc(kVideoSsrc);
413
deadbeef5a4a75a2016-06-02 16:23:38 -0700414 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
415 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800416 sender->SetSsrc(0);
417
418 // Make sure it's SetSsrc that called methods on the provider, and not the
419 // destructor.
deadbeef5a4a75a2016-06-02 16:23:38 -0700420 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800421}
422
423TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
424 rtc::scoped_refptr<AudioTrackInterface> track =
425 AudioTrack::Create(kAudioTrackId, nullptr);
426 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
427 rtc::scoped_refptr<AudioRtpSender> sender =
428 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
429 sender->SetSsrc(kAudioSsrc);
430
deadbeef5dd42fd2016-05-02 16:20:01 -0700431 // Expect that SetAudioSend will be called before the reference to the track
432 // is released.
433 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, nullptr))
434 .Times(1)
435 .WillOnce(InvokeWithoutArgs([&track] {
436 EXPECT_LT(2, track->AddRef());
437 track->Release();
438 }));
deadbeeffac06552015-11-25 11:26:01 -0800439 EXPECT_TRUE(sender->SetTrack(nullptr));
440
441 // Make sure it's SetTrack that called methods on the provider, and not the
442 // destructor.
443 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
444}
445
446TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
deadbeef5dd42fd2016-05-02 16:20:01 -0700447 rtc::scoped_refptr<VideoTrackSourceInterface> source(
448 FakeVideoTrackSource::Create());
449 rtc::scoped_refptr<VideoTrackInterface> track =
450 VideoTrack::Create(kVideoTrackId, source);
deadbeef5a4a75a2016-06-02 16:23:38 -0700451 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _, track.get()));
deadbeeffac06552015-11-25 11:26:01 -0800452 rtc::scoped_refptr<VideoRtpSender> sender =
deadbeef5dd42fd2016-05-02 16:20:01 -0700453 new VideoRtpSender(track, kStreamLabel1, &video_provider_);
deadbeeffac06552015-11-25 11:26:01 -0800454 sender->SetSsrc(kVideoSsrc);
455
deadbeef5a4a75a2016-06-02 16:23:38 -0700456 // Expect that SetVideoSend will be called before the reference to the track
deadbeef5dd42fd2016-05-02 16:20:01 -0700457 // is released.
deadbeef5a4a75a2016-06-02 16:23:38 -0700458 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
deadbeef5dd42fd2016-05-02 16:20:01 -0700459 .Times(1)
460 .WillOnce(InvokeWithoutArgs([&track] {
461 EXPECT_LT(2, track->AddRef());
462 track->Release();
deadbeef5dd42fd2016-05-02 16:20:01 -0700463 }));
deadbeeffac06552015-11-25 11:26:01 -0800464 EXPECT_TRUE(sender->SetTrack(nullptr));
465
466 // Make sure it's SetTrack that called methods on the provider, and not the
467 // destructor.
deadbeef5a4a75a2016-06-02 16:23:38 -0700468 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800469}
470
471TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700472 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800473 rtc::scoped_refptr<AudioTrackInterface> track =
474 AudioTrack::Create(kAudioTrackId, nullptr);
475 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
476 rtc::scoped_refptr<AudioRtpSender> sender =
477 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
478 sender->SetSsrc(kAudioSsrc);
479
480 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
481 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
482 sender->SetSsrc(kAudioSsrc2);
483
484 // Calls expected from destructor.
485 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
486}
487
488TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700489 AddVideoTrack();
deadbeef5a4a75a2016-06-02 16:23:38 -0700490 EXPECT_CALL(video_provider_,
491 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800492 rtc::scoped_refptr<VideoRtpSender> sender =
493 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
494 sender->SetSsrc(kVideoSsrc);
495
deadbeef5a4a75a2016-06-02 16:23:38 -0700496 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
497 .Times(1);
498 EXPECT_CALL(video_provider_,
499 SetVideoSend(kVideoSsrc2, true, _, video_track_.get()))
500 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800501 sender->SetSsrc(kVideoSsrc2);
502
503 // Calls expected from destructor.
deadbeef5a4a75a2016-06-02 16:23:38 -0700504 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _, nullptr))
505 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800506}
507
skvladdc1c62c2016-03-16 19:07:43 -0700508TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
509 CreateAudioRtpSender();
510
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700511 EXPECT_CALL(audio_provider_, GetAudioRtpSendParameters(kAudioSsrc))
skvladdc1c62c2016-03-16 19:07:43 -0700512 .WillOnce(Return(RtpParameters()));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700513 EXPECT_CALL(audio_provider_, SetAudioRtpSendParameters(kAudioSsrc, _))
skvladdc1c62c2016-03-16 19:07:43 -0700514 .WillOnce(Return(true));
515 RtpParameters params = audio_rtp_sender_->GetParameters();
516 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
517
518 DestroyAudioRtpSender();
519}
520
521TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
522 CreateVideoRtpSender();
523
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700524 EXPECT_CALL(video_provider_, GetVideoRtpSendParameters(kVideoSsrc))
skvladdc1c62c2016-03-16 19:07:43 -0700525 .WillOnce(Return(RtpParameters()));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700526 EXPECT_CALL(video_provider_, SetVideoRtpSendParameters(kVideoSsrc, _))
skvladdc1c62c2016-03-16 19:07:43 -0700527 .WillOnce(Return(true));
528 RtpParameters params = video_rtp_sender_->GetParameters();
529 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
530
531 DestroyVideoRtpSender();
532}
533
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700534TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
535 CreateAudioRtpReceiver();
536
537 EXPECT_CALL(audio_provider_, GetAudioRtpReceiveParameters(kAudioSsrc))
538 .WillOnce(Return(RtpParameters()));
539 EXPECT_CALL(audio_provider_, SetAudioRtpReceiveParameters(kAudioSsrc, _))
540 .WillOnce(Return(true));
541 RtpParameters params = audio_rtp_receiver_->GetParameters();
542 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
543
544 DestroyAudioRtpReceiver();
545}
546
547TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
548 CreateVideoRtpReceiver();
549
550 EXPECT_CALL(video_provider_, GetVideoRtpReceiveParameters(kVideoSsrc))
551 .WillOnce(Return(RtpParameters()));
552 EXPECT_CALL(video_provider_, SetVideoRtpReceiveParameters(kVideoSsrc, _))
553 .WillOnce(Return(true));
554 RtpParameters params = video_rtp_receiver_->GetParameters();
555 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
556
557 DestroyVideoRtpReceiver();
558}
559
deadbeef70ab1a12015-09-28 16:53:55 -0700560} // namespace webrtc