blob: 4cd142567ada966f753e33f7e49ff940f8eb4440 [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;
skvladdc1c62c2016-03-16 19:07:43 -070031using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070032
33static const char kStreamLabel1[] = "local_stream_1";
34static const char kVideoTrackId[] = "video_1";
35static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020036static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080037static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020038static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080039static const uint32_t kAudioSsrc2 = 101;
deadbeef70ab1a12015-09-28 16:53:55 -070040
41namespace webrtc {
42
43// Helper class to test RtpSender/RtpReceiver.
44class MockAudioProvider : public AudioProviderInterface {
45 public:
Tommif888bb52015-12-12 01:37:01 +010046 ~MockAudioProvider() override {}
47
solenbergd4cec0d2015-10-09 08:55:48 -070048 MOCK_METHOD2(SetAudioPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020049 void(uint32_t ssrc,
solenbergd4cec0d2015-10-09 08:55:48 -070050 bool enable));
deadbeef70ab1a12015-09-28 16:53:55 -070051 MOCK_METHOD4(SetAudioSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020052 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070053 bool enable,
54 const cricket::AudioOptions& options,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080055 cricket::AudioSource* source));
Peter Boström0c4e06b2015-10-07 12:23:21 +020056 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
skvladdc1c62c2016-03-16 19:07:43 -070057 MOCK_CONST_METHOD1(GetAudioRtpParameters, RtpParameters(uint32_t ssrc));
58 MOCK_METHOD2(SetAudioRtpParameters,
59 bool(uint32_t ssrc, const RtpParameters&));
Tommif888bb52015-12-12 01:37:01 +010060
deadbeef2d110be2016-01-13 12:00:26 -080061 void SetRawAudioSink(uint32_t,
kwibergd1fe2812016-04-27 06:47:29 -070062 std::unique_ptr<AudioSinkInterface> sink) override {
deadbeef2d110be2016-01-13 12:00:26 -080063 sink_ = std::move(sink);
Tommif888bb52015-12-12 01:37:01 +010064 }
65
66 private:
kwibergd1fe2812016-04-27 06:47:29 -070067 std::unique_ptr<AudioSinkInterface> sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070068};
69
70// Helper class to test RtpSender/RtpReceiver.
71class MockVideoProvider : public VideoProviderInterface {
72 public:
73 virtual ~MockVideoProvider() {}
nisse2ded9b12016-04-08 02:23:55 -070074 MOCK_METHOD2(SetSource,
75 bool(uint32_t ssrc,
76 rtc::VideoSourceInterface<cricket::VideoFrame>* source));
deadbeef70ab1a12015-09-28 16:53:55 -070077 MOCK_METHOD3(SetVideoPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020078 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070079 bool enable,
nisse08582ff2016-02-04 01:24:52 -080080 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
deadbeef70ab1a12015-09-28 16:53:55 -070081 MOCK_METHOD3(SetVideoSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020082 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070083 bool enable,
84 const cricket::VideoOptions* options));
skvladdc1c62c2016-03-16 19:07:43 -070085
86 MOCK_CONST_METHOD1(GetVideoRtpParameters, RtpParameters(uint32_t ssrc));
87 MOCK_METHOD2(SetVideoRtpParameters,
88 bool(uint32_t ssrc, const RtpParameters&));
deadbeef70ab1a12015-09-28 16:53:55 -070089};
90
deadbeef70ab1a12015-09-28 16:53:55 -070091class RtpSenderReceiverTest : public testing::Test {
92 public:
93 virtual void SetUp() {
94 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -080095 }
96
nisseaf510af2016-03-21 08:20:42 -070097 void AddVideoTrack() {
perkja3ede6c2016-03-08 01:27:48 +010098 rtc::scoped_refptr<VideoTrackSourceInterface> source(
nisseaf510af2016-03-21 08:20:42 -070099 FakeVideoTrackSource::Create());
deadbeef70ab1a12015-09-28 16:53:55 -0700100 video_track_ = VideoTrack::Create(kVideoTrackId, source);
101 EXPECT_TRUE(stream_->AddTrack(video_track_));
102 }
103
104 void CreateAudioRtpSender() {
105 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
106 EXPECT_TRUE(stream_->AddTrack(audio_track_));
107 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800108 audio_rtp_sender_ =
109 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
110 &audio_provider_, nullptr);
111 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700112 }
113
114 void CreateVideoRtpSender() {
nisseaf510af2016-03-21 08:20:42 -0700115 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700116 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700117 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
118 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800119 stream_->label(), &video_provider_);
120 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700121 }
122
123 void DestroyAudioRtpSender() {
124 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
125 .Times(1);
126 audio_rtp_sender_ = nullptr;
127 }
128
129 void DestroyVideoRtpSender() {
nisse2ded9b12016-04-08 02:23:55 -0700130 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, NULL)).Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700131 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
132 video_rtp_sender_ = nullptr;
133 }
134
135 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800136 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100137 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700138 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700139 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
perkjd61bf802016-03-24 03:16:19 -0700140 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
deadbeef70ab1a12015-09-28 16:53:55 -0700141 kAudioSsrc, &audio_provider_);
perkjd61bf802016-03-24 03:16:19 -0700142 audio_track_ = audio_rtp_receiver_->audio_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700143 }
144
145 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100146 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
147 video_rtp_receiver_ =
148 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
149 kVideoSsrc, &video_provider_);
150 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700151 }
152
153 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700154 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700155 audio_rtp_receiver_ = nullptr;
156 }
157
158 void DestroyVideoRtpReceiver() {
159 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
160 video_rtp_receiver_ = nullptr;
161 }
162
163 protected:
164 MockAudioProvider audio_provider_;
165 MockVideoProvider video_provider_;
166 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
167 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
168 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
169 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
170 rtc::scoped_refptr<MediaStreamInterface> stream_;
171 rtc::scoped_refptr<VideoTrackInterface> video_track_;
172 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
173};
174
175// Test that |audio_provider_| is notified when an audio track is associated
176// and disassociated with an AudioRtpSender.
177TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
178 CreateAudioRtpSender();
179 DestroyAudioRtpSender();
180}
181
182// Test that |video_provider_| is notified when a video track is associated and
183// disassociated with a VideoRtpSender.
184TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
185 CreateVideoRtpSender();
186 DestroyVideoRtpSender();
187}
188
189// Test that |audio_provider_| is notified when a remote audio and track is
190// associated and disassociated with an AudioRtpReceiver.
191TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
192 CreateAudioRtpReceiver();
193 DestroyAudioRtpReceiver();
194}
195
196// Test that |video_provider_| is notified when a remote
197// video track is associated and disassociated with a VideoRtpReceiver.
198TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
199 CreateVideoRtpReceiver();
200 DestroyVideoRtpReceiver();
201}
202
203TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
204 CreateAudioRtpSender();
205
206 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
207 audio_track_->set_enabled(false);
208
209 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
210 audio_track_->set_enabled(true);
211
212 DestroyAudioRtpSender();
213}
214
215TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
216 CreateAudioRtpReceiver();
217
solenbergd4cec0d2015-10-09 08:55:48 -0700218 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700219 audio_track_->set_enabled(false);
220
solenbergd4cec0d2015-10-09 08:55:48 -0700221 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700222 audio_track_->set_enabled(true);
223
224 DestroyAudioRtpReceiver();
225}
226
227TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
228 CreateVideoRtpSender();
229
230 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
231 video_track_->set_enabled(false);
232
233 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
234 video_track_->set_enabled(true);
235
236 DestroyVideoRtpSender();
237}
238
perkjf0dcfe22016-03-10 18:32:00 +0100239TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
240 CreateVideoRtpReceiver();
241
242 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
243 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
244 video_track_->GetSource()->state());
245
246 DestroyVideoRtpReceiver();
247
248 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
249 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
250 video_track_->GetSource()->state());
251}
252
deadbeef70ab1a12015-09-28 16:53:55 -0700253TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
254 CreateVideoRtpReceiver();
255
256 video_track_->set_enabled(false);
257
258 video_track_->set_enabled(true);
259
260 DestroyVideoRtpReceiver();
261}
262
263TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
264 CreateAudioRtpReceiver();
265
266 double volume = 0.5;
267 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
268 audio_track_->GetSource()->SetVolume(volume);
269
270 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700271 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700272 audio_track_->set_enabled(false);
273 audio_track_->GetSource()->SetVolume(1.0);
274
solenbergd4cec0d2015-10-09 08:55:48 -0700275 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700276 audio_track_->set_enabled(true);
277
278 double new_volume = 0.8;
279 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
280 audio_track_->GetSource()->SetVolume(new_volume);
281
282 DestroyAudioRtpReceiver();
283}
284
deadbeeffac06552015-11-25 11:26:01 -0800285// Test that provider methods aren't called without both a track and an SSRC.
286TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
287 rtc::scoped_refptr<AudioRtpSender> sender =
288 new AudioRtpSender(&audio_provider_, nullptr);
289 rtc::scoped_refptr<AudioTrackInterface> track =
290 AudioTrack::Create(kAudioTrackId, nullptr);
291 EXPECT_TRUE(sender->SetTrack(track));
292 EXPECT_TRUE(sender->SetTrack(nullptr));
293 sender->SetSsrc(kAudioSsrc);
294 sender->SetSsrc(0);
295 // Just let it get destroyed and make sure it doesn't call any methods on the
296 // provider interface.
297}
298
299// Test that provider methods aren't called without both a track and an SSRC.
300TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
301 rtc::scoped_refptr<VideoRtpSender> sender =
302 new VideoRtpSender(&video_provider_);
303 EXPECT_TRUE(sender->SetTrack(video_track_));
304 EXPECT_TRUE(sender->SetTrack(nullptr));
305 sender->SetSsrc(kVideoSsrc);
306 sender->SetSsrc(0);
307 // Just let it get destroyed and make sure it doesn't call any methods on the
308 // provider interface.
309}
310
311// Test that an audio sender calls the expected methods on the provider once
312// it has a track and SSRC, when the SSRC is set first.
313TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
314 rtc::scoped_refptr<AudioRtpSender> sender =
315 new AudioRtpSender(&audio_provider_, nullptr);
316 rtc::scoped_refptr<AudioTrackInterface> track =
317 AudioTrack::Create(kAudioTrackId, nullptr);
318 sender->SetSsrc(kAudioSsrc);
319 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
320 sender->SetTrack(track);
321
322 // Calls expected from destructor.
323 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
324}
325
326// Test that an audio sender calls the expected methods on the provider once
327// it has a track and SSRC, when the SSRC is set last.
328TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
329 rtc::scoped_refptr<AudioRtpSender> sender =
330 new AudioRtpSender(&audio_provider_, nullptr);
331 rtc::scoped_refptr<AudioTrackInterface> track =
332 AudioTrack::Create(kAudioTrackId, nullptr);
333 sender->SetTrack(track);
334 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
335 sender->SetSsrc(kAudioSsrc);
336
337 // Calls expected from destructor.
338 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
339}
340
341// Test that a video sender calls the expected methods on the provider once
342// it has a track and SSRC, when the SSRC is set first.
343TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700344 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800345 rtc::scoped_refptr<VideoRtpSender> sender =
346 new VideoRtpSender(&video_provider_);
347 sender->SetSsrc(kVideoSsrc);
nisse2ded9b12016-04-08 02:23:55 -0700348 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800349 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
350 sender->SetTrack(video_track_);
351
352 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700353 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800354 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
355}
356
357// Test that a video sender calls the expected methods on the provider once
358// it has a track and SSRC, when the SSRC is set last.
359TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700360 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800361 rtc::scoped_refptr<VideoRtpSender> sender =
362 new VideoRtpSender(&video_provider_);
363 sender->SetTrack(video_track_);
nisse2ded9b12016-04-08 02:23:55 -0700364 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800365 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
366 sender->SetSsrc(kVideoSsrc);
367
368 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700369 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800370 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
371}
372
373// Test that the sender is disconnected from the provider when its SSRC is
374// set to 0.
375TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
376 rtc::scoped_refptr<AudioTrackInterface> track =
377 AudioTrack::Create(kAudioTrackId, nullptr);
378 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
379 rtc::scoped_refptr<AudioRtpSender> sender =
380 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
381 sender->SetSsrc(kAudioSsrc);
382
383 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
384 sender->SetSsrc(0);
385
386 // Make sure it's SetSsrc that called methods on the provider, and not the
387 // destructor.
388 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
389}
390
391// Test that the sender is disconnected from the provider when its SSRC is
392// set to 0.
393TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
nisseaf510af2016-03-21 08:20:42 -0700394 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700395 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800396 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
397 rtc::scoped_refptr<VideoRtpSender> sender =
398 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
399 sender->SetSsrc(kVideoSsrc);
400
nisse2ded9b12016-04-08 02:23:55 -0700401 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800402 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
403 sender->SetSsrc(0);
404
405 // Make sure it's SetSsrc that called methods on the provider, and not the
406 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700407 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800408 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
409}
410
411TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
412 rtc::scoped_refptr<AudioTrackInterface> track =
413 AudioTrack::Create(kAudioTrackId, nullptr);
414 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
415 rtc::scoped_refptr<AudioRtpSender> sender =
416 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
417 sender->SetSsrc(kAudioSsrc);
418
419 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
420 EXPECT_TRUE(sender->SetTrack(nullptr));
421
422 // Make sure it's SetTrack that called methods on the provider, and not the
423 // destructor.
424 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
425}
426
427TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
nisseaf510af2016-03-21 08:20:42 -0700428 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700429 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800430 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
431 rtc::scoped_refptr<VideoRtpSender> sender =
432 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
433 sender->SetSsrc(kVideoSsrc);
434
nisse2ded9b12016-04-08 02:23:55 -0700435 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800436 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
437 EXPECT_TRUE(sender->SetTrack(nullptr));
438
439 // Make sure it's SetTrack that called methods on the provider, and not the
440 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700441 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800442 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
443}
444
445TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700446 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800447 rtc::scoped_refptr<AudioTrackInterface> track =
448 AudioTrack::Create(kAudioTrackId, nullptr);
449 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
450 rtc::scoped_refptr<AudioRtpSender> sender =
451 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
452 sender->SetSsrc(kAudioSsrc);
453
454 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
455 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
456 sender->SetSsrc(kAudioSsrc2);
457
458 // Calls expected from destructor.
459 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
460}
461
462TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700463 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700464 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800465 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
466 rtc::scoped_refptr<VideoRtpSender> sender =
467 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
468 sender->SetSsrc(kVideoSsrc);
469
nisse2ded9b12016-04-08 02:23:55 -0700470 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800471 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
nisse2ded9b12016-04-08 02:23:55 -0700472 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800473 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
474 sender->SetSsrc(kVideoSsrc2);
475
476 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700477 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800478 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
479}
480
skvladdc1c62c2016-03-16 19:07:43 -0700481TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
482 CreateAudioRtpSender();
483
484 EXPECT_CALL(audio_provider_, GetAudioRtpParameters(kAudioSsrc))
485 .WillOnce(Return(RtpParameters()));
486 EXPECT_CALL(audio_provider_, SetAudioRtpParameters(kAudioSsrc, _))
487 .WillOnce(Return(true));
488 RtpParameters params = audio_rtp_sender_->GetParameters();
489 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
490
491 DestroyAudioRtpSender();
492}
493
494TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
495 CreateVideoRtpSender();
496
497 EXPECT_CALL(video_provider_, GetVideoRtpParameters(kVideoSsrc))
498 .WillOnce(Return(RtpParameters()));
499 EXPECT_CALL(video_provider_, SetVideoRtpParameters(kVideoSsrc, _))
500 .WillOnce(Return(true));
501 RtpParameters params = video_rtp_sender_->GetParameters();
502 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
503
504 DestroyVideoRtpSender();
505}
506
deadbeef70ab1a12015-09-28 16:53:55 -0700507} // namespace webrtc