blob: 0ec3cfe47098bb643e7ad8a83377ca3b96b30a98 [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:
nisseef8b61e2016-04-29 06:09:15 -070046 // TODO(nisse): Valid overrides commented out, because the gmock
47 // methods don't use any override declarations, and we want to avoid
48 // warnings from -Winconsistent-missing-override. See
49 // http://crbug.com/428099.
50 ~MockAudioProvider() /* override */ {}
Tommif888bb52015-12-12 01:37:01 +010051
solenbergd4cec0d2015-10-09 08:55:48 -070052 MOCK_METHOD2(SetAudioPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020053 void(uint32_t ssrc,
solenbergd4cec0d2015-10-09 08:55:48 -070054 bool enable));
deadbeef70ab1a12015-09-28 16:53:55 -070055 MOCK_METHOD4(SetAudioSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020056 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070057 bool enable,
58 const cricket::AudioOptions& options,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080059 cricket::AudioSource* source));
Peter Boström0c4e06b2015-10-07 12:23:21 +020060 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
skvladdc1c62c2016-03-16 19:07:43 -070061 MOCK_CONST_METHOD1(GetAudioRtpParameters, RtpParameters(uint32_t ssrc));
62 MOCK_METHOD2(SetAudioRtpParameters,
63 bool(uint32_t ssrc, const RtpParameters&));
Tommif888bb52015-12-12 01:37:01 +010064
nisseef8b61e2016-04-29 06:09:15 -070065 void SetRawAudioSink(
66 uint32_t, std::unique_ptr<AudioSinkInterface> sink) /* override */ {
deadbeef2d110be2016-01-13 12:00:26 -080067 sink_ = std::move(sink);
Tommif888bb52015-12-12 01:37:01 +010068 }
69
70 private:
kwibergd1fe2812016-04-27 06:47:29 -070071 std::unique_ptr<AudioSinkInterface> sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070072};
73
74// Helper class to test RtpSender/RtpReceiver.
75class MockVideoProvider : public VideoProviderInterface {
76 public:
77 virtual ~MockVideoProvider() {}
nisse2ded9b12016-04-08 02:23:55 -070078 MOCK_METHOD2(SetSource,
79 bool(uint32_t ssrc,
80 rtc::VideoSourceInterface<cricket::VideoFrame>* source));
deadbeef70ab1a12015-09-28 16:53:55 -070081 MOCK_METHOD3(SetVideoPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020082 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070083 bool enable,
nisse08582ff2016-02-04 01:24:52 -080084 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
deadbeef70ab1a12015-09-28 16:53:55 -070085 MOCK_METHOD3(SetVideoSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020086 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070087 bool enable,
88 const cricket::VideoOptions* options));
skvladdc1c62c2016-03-16 19:07:43 -070089
90 MOCK_CONST_METHOD1(GetVideoRtpParameters, RtpParameters(uint32_t ssrc));
91 MOCK_METHOD2(SetVideoRtpParameters,
92 bool(uint32_t ssrc, const RtpParameters&));
deadbeef70ab1a12015-09-28 16:53:55 -070093};
94
deadbeef70ab1a12015-09-28 16:53:55 -070095class RtpSenderReceiverTest : public testing::Test {
96 public:
97 virtual void SetUp() {
98 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -080099 }
100
nisseaf510af2016-03-21 08:20:42 -0700101 void AddVideoTrack() {
perkja3ede6c2016-03-08 01:27:48 +0100102 rtc::scoped_refptr<VideoTrackSourceInterface> source(
nisseaf510af2016-03-21 08:20:42 -0700103 FakeVideoTrackSource::Create());
deadbeef70ab1a12015-09-28 16:53:55 -0700104 video_track_ = VideoTrack::Create(kVideoTrackId, source);
105 EXPECT_TRUE(stream_->AddTrack(video_track_));
106 }
107
108 void CreateAudioRtpSender() {
109 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
110 EXPECT_TRUE(stream_->AddTrack(audio_track_));
111 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800112 audio_rtp_sender_ =
113 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
114 &audio_provider_, nullptr);
115 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700116 }
117
118 void CreateVideoRtpSender() {
nisseaf510af2016-03-21 08:20:42 -0700119 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700120 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700121 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
122 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800123 stream_->label(), &video_provider_);
124 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700125 }
126
127 void DestroyAudioRtpSender() {
128 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
129 .Times(1);
130 audio_rtp_sender_ = nullptr;
131 }
132
133 void DestroyVideoRtpSender() {
nisse2ded9b12016-04-08 02:23:55 -0700134 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, NULL)).Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700135 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
136 video_rtp_sender_ = nullptr;
137 }
138
139 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800140 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100141 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700142 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700143 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
perkjd61bf802016-03-24 03:16:19 -0700144 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
deadbeef70ab1a12015-09-28 16:53:55 -0700145 kAudioSsrc, &audio_provider_);
perkjd61bf802016-03-24 03:16:19 -0700146 audio_track_ = audio_rtp_receiver_->audio_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700147 }
148
149 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100150 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
151 video_rtp_receiver_ =
152 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
153 kVideoSsrc, &video_provider_);
154 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700155 }
156
157 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700158 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700159 audio_rtp_receiver_ = nullptr;
160 }
161
162 void DestroyVideoRtpReceiver() {
163 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
164 video_rtp_receiver_ = nullptr;
165 }
166
167 protected:
168 MockAudioProvider audio_provider_;
169 MockVideoProvider video_provider_;
170 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
171 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
172 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
173 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
174 rtc::scoped_refptr<MediaStreamInterface> stream_;
175 rtc::scoped_refptr<VideoTrackInterface> video_track_;
176 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
177};
178
179// Test that |audio_provider_| is notified when an audio track is associated
180// and disassociated with an AudioRtpSender.
181TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
182 CreateAudioRtpSender();
183 DestroyAudioRtpSender();
184}
185
186// Test that |video_provider_| is notified when a video track is associated and
187// disassociated with a VideoRtpSender.
188TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
189 CreateVideoRtpSender();
190 DestroyVideoRtpSender();
191}
192
193// Test that |audio_provider_| is notified when a remote audio and track is
194// associated and disassociated with an AudioRtpReceiver.
195TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
196 CreateAudioRtpReceiver();
197 DestroyAudioRtpReceiver();
198}
199
200// Test that |video_provider_| is notified when a remote
201// video track is associated and disassociated with a VideoRtpReceiver.
202TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
203 CreateVideoRtpReceiver();
204 DestroyVideoRtpReceiver();
205}
206
207TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
208 CreateAudioRtpSender();
209
210 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
211 audio_track_->set_enabled(false);
212
213 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
214 audio_track_->set_enabled(true);
215
216 DestroyAudioRtpSender();
217}
218
219TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
220 CreateAudioRtpReceiver();
221
solenbergd4cec0d2015-10-09 08:55:48 -0700222 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700223 audio_track_->set_enabled(false);
224
solenbergd4cec0d2015-10-09 08:55:48 -0700225 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700226 audio_track_->set_enabled(true);
227
228 DestroyAudioRtpReceiver();
229}
230
231TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
232 CreateVideoRtpSender();
233
234 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
235 video_track_->set_enabled(false);
236
237 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
238 video_track_->set_enabled(true);
239
240 DestroyVideoRtpSender();
241}
242
perkjf0dcfe22016-03-10 18:32:00 +0100243TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
244 CreateVideoRtpReceiver();
245
246 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
247 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
248 video_track_->GetSource()->state());
249
250 DestroyVideoRtpReceiver();
251
252 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
253 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
254 video_track_->GetSource()->state());
255}
256
deadbeef70ab1a12015-09-28 16:53:55 -0700257TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
258 CreateVideoRtpReceiver();
259
260 video_track_->set_enabled(false);
261
262 video_track_->set_enabled(true);
263
264 DestroyVideoRtpReceiver();
265}
266
267TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
268 CreateAudioRtpReceiver();
269
270 double volume = 0.5;
271 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
272 audio_track_->GetSource()->SetVolume(volume);
273
274 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700275 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700276 audio_track_->set_enabled(false);
277 audio_track_->GetSource()->SetVolume(1.0);
278
solenbergd4cec0d2015-10-09 08:55:48 -0700279 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700280 audio_track_->set_enabled(true);
281
282 double new_volume = 0.8;
283 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
284 audio_track_->GetSource()->SetVolume(new_volume);
285
286 DestroyAudioRtpReceiver();
287}
288
deadbeeffac06552015-11-25 11:26:01 -0800289// Test that provider methods aren't called without both a track and an SSRC.
290TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
291 rtc::scoped_refptr<AudioRtpSender> sender =
292 new AudioRtpSender(&audio_provider_, nullptr);
293 rtc::scoped_refptr<AudioTrackInterface> track =
294 AudioTrack::Create(kAudioTrackId, nullptr);
295 EXPECT_TRUE(sender->SetTrack(track));
296 EXPECT_TRUE(sender->SetTrack(nullptr));
297 sender->SetSsrc(kAudioSsrc);
298 sender->SetSsrc(0);
299 // Just let it get destroyed and make sure it doesn't call any methods on the
300 // provider interface.
301}
302
303// Test that provider methods aren't called without both a track and an SSRC.
304TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
305 rtc::scoped_refptr<VideoRtpSender> sender =
306 new VideoRtpSender(&video_provider_);
307 EXPECT_TRUE(sender->SetTrack(video_track_));
308 EXPECT_TRUE(sender->SetTrack(nullptr));
309 sender->SetSsrc(kVideoSsrc);
310 sender->SetSsrc(0);
311 // Just let it get destroyed and make sure it doesn't call any methods on the
312 // provider interface.
313}
314
315// Test that an audio sender calls the expected methods on the provider once
316// it has a track and SSRC, when the SSRC is set first.
317TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
318 rtc::scoped_refptr<AudioRtpSender> sender =
319 new AudioRtpSender(&audio_provider_, nullptr);
320 rtc::scoped_refptr<AudioTrackInterface> track =
321 AudioTrack::Create(kAudioTrackId, nullptr);
322 sender->SetSsrc(kAudioSsrc);
323 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
324 sender->SetTrack(track);
325
326 // Calls expected from destructor.
327 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
328}
329
330// Test that an audio sender calls the expected methods on the provider once
331// it has a track and SSRC, when the SSRC is set last.
332TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
333 rtc::scoped_refptr<AudioRtpSender> sender =
334 new AudioRtpSender(&audio_provider_, nullptr);
335 rtc::scoped_refptr<AudioTrackInterface> track =
336 AudioTrack::Create(kAudioTrackId, nullptr);
337 sender->SetTrack(track);
338 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
339 sender->SetSsrc(kAudioSsrc);
340
341 // Calls expected from destructor.
342 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
343}
344
345// Test that a video sender calls the expected methods on the provider once
346// it has a track and SSRC, when the SSRC is set first.
347TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700348 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800349 rtc::scoped_refptr<VideoRtpSender> sender =
350 new VideoRtpSender(&video_provider_);
351 sender->SetSsrc(kVideoSsrc);
nisse2ded9b12016-04-08 02:23:55 -0700352 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800353 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
354 sender->SetTrack(video_track_);
355
356 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700357 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800358 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
359}
360
361// Test that a video sender calls the expected methods on the provider once
362// it has a track and SSRC, when the SSRC is set last.
363TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700364 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800365 rtc::scoped_refptr<VideoRtpSender> sender =
366 new VideoRtpSender(&video_provider_);
367 sender->SetTrack(video_track_);
nisse2ded9b12016-04-08 02:23:55 -0700368 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800369 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
370 sender->SetSsrc(kVideoSsrc);
371
372 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700373 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800374 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
375}
376
377// Test that the sender is disconnected from the provider when its SSRC is
378// set to 0.
379TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
380 rtc::scoped_refptr<AudioTrackInterface> track =
381 AudioTrack::Create(kAudioTrackId, nullptr);
382 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
383 rtc::scoped_refptr<AudioRtpSender> sender =
384 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
385 sender->SetSsrc(kAudioSsrc);
386
387 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
388 sender->SetSsrc(0);
389
390 // Make sure it's SetSsrc that called methods on the provider, and not the
391 // destructor.
392 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
393}
394
395// Test that the sender is disconnected from the provider when its SSRC is
396// set to 0.
397TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
nisseaf510af2016-03-21 08:20:42 -0700398 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700399 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800400 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
401 rtc::scoped_refptr<VideoRtpSender> sender =
402 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
403 sender->SetSsrc(kVideoSsrc);
404
nisse2ded9b12016-04-08 02:23:55 -0700405 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800406 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
407 sender->SetSsrc(0);
408
409 // Make sure it's SetSsrc that called methods on the provider, and not the
410 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700411 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800412 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
413}
414
415TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
416 rtc::scoped_refptr<AudioTrackInterface> track =
417 AudioTrack::Create(kAudioTrackId, nullptr);
418 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
419 rtc::scoped_refptr<AudioRtpSender> sender =
420 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
421 sender->SetSsrc(kAudioSsrc);
422
423 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
424 EXPECT_TRUE(sender->SetTrack(nullptr));
425
426 // Make sure it's SetTrack that called methods on the provider, and not the
427 // destructor.
428 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
429}
430
431TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
nisseaf510af2016-03-21 08:20:42 -0700432 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700433 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800434 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
435 rtc::scoped_refptr<VideoRtpSender> sender =
436 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
437 sender->SetSsrc(kVideoSsrc);
438
nisse2ded9b12016-04-08 02:23:55 -0700439 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800440 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
441 EXPECT_TRUE(sender->SetTrack(nullptr));
442
443 // Make sure it's SetTrack that called methods on the provider, and not the
444 // destructor.
nisse2ded9b12016-04-08 02:23:55 -0700445 EXPECT_CALL(video_provider_, SetSource(_, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800446 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
447}
448
449TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700450 AddVideoTrack();
deadbeeffac06552015-11-25 11:26:01 -0800451 rtc::scoped_refptr<AudioTrackInterface> track =
452 AudioTrack::Create(kAudioTrackId, nullptr);
453 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
454 rtc::scoped_refptr<AudioRtpSender> sender =
455 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
456 sender->SetSsrc(kAudioSsrc);
457
458 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
459 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
460 sender->SetSsrc(kAudioSsrc2);
461
462 // Calls expected from destructor.
463 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
464}
465
466TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
nisseaf510af2016-03-21 08:20:42 -0700467 AddVideoTrack();
nisse2ded9b12016-04-08 02:23:55 -0700468 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800469 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
470 rtc::scoped_refptr<VideoRtpSender> sender =
471 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
472 sender->SetSsrc(kVideoSsrc);
473
nisse2ded9b12016-04-08 02:23:55 -0700474 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800475 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
nisse2ded9b12016-04-08 02:23:55 -0700476 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, video_track_.get()));
deadbeeffac06552015-11-25 11:26:01 -0800477 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
478 sender->SetSsrc(kVideoSsrc2);
479
480 // Calls expected from destructor.
nisse2ded9b12016-04-08 02:23:55 -0700481 EXPECT_CALL(video_provider_, SetSource(kVideoSsrc2, nullptr)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800482 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
483}
484
skvladdc1c62c2016-03-16 19:07:43 -0700485TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
486 CreateAudioRtpSender();
487
488 EXPECT_CALL(audio_provider_, GetAudioRtpParameters(kAudioSsrc))
489 .WillOnce(Return(RtpParameters()));
490 EXPECT_CALL(audio_provider_, SetAudioRtpParameters(kAudioSsrc, _))
491 .WillOnce(Return(true));
492 RtpParameters params = audio_rtp_sender_->GetParameters();
493 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
494
495 DestroyAudioRtpSender();
496}
497
498TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
499 CreateVideoRtpSender();
500
501 EXPECT_CALL(video_provider_, GetVideoRtpParameters(kVideoSsrc))
502 .WillOnce(Return(RtpParameters()));
503 EXPECT_CALL(video_provider_, SetVideoRtpParameters(kVideoSsrc, _))
504 .WillOnce(Return(true));
505 RtpParameters params = video_rtp_sender_->GetParameters();
506 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
507
508 DestroyVideoRtpSender();
509}
510
deadbeef70ab1a12015-09-28 16:53:55 -0700511} // namespace webrtc