blob: 22fa14f6618b374ef342aaef135bc98abf07d3b3 [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
11#include <string>
Tommif888bb52015-12-12 01:37:01 +010012#include <utility>
deadbeef70ab1a12015-09-28 16:53:55 -070013
deadbeef70ab1a12015-09-28 16:53:55 -070014#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010016#include "webrtc/api/audiotrack.h"
17#include "webrtc/api/mediastream.h"
18#include "webrtc/api/remoteaudiosource.h"
19#include "webrtc/api/rtpreceiver.h"
20#include "webrtc/api/rtpsender.h"
21#include "webrtc/api/streamcollection.h"
perkj0d3eef22016-03-09 02:39:17 +010022#include "webrtc/api/videotracksource.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010023#include "webrtc/api/videotrack.h"
deadbeef70ab1a12015-09-28 16:53:55 -070024#include "webrtc/base/gunit.h"
kjellandera96e2d72016-02-04 23:52:28 -080025#include "webrtc/media/base/fakevideocapturer.h"
26#include "webrtc/media/base/mediachannel.h"
deadbeef70ab1a12015-09-28 16:53:55 -070027
28using ::testing::_;
29using ::testing::Exactly;
30
31static const char kStreamLabel1[] = "local_stream_1";
32static const char kVideoTrackId[] = "video_1";
33static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020034static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080035static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020036static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080037static const uint32_t kAudioSsrc2 = 101;
deadbeef70ab1a12015-09-28 16:53:55 -070038
39namespace webrtc {
40
41// Helper class to test RtpSender/RtpReceiver.
42class MockAudioProvider : public AudioProviderInterface {
43 public:
Tommif888bb52015-12-12 01:37:01 +010044 ~MockAudioProvider() override {}
45
solenbergd4cec0d2015-10-09 08:55:48 -070046 MOCK_METHOD2(SetAudioPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020047 void(uint32_t ssrc,
solenbergd4cec0d2015-10-09 08:55:48 -070048 bool enable));
deadbeef70ab1a12015-09-28 16:53:55 -070049 MOCK_METHOD4(SetAudioSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020050 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070051 bool enable,
52 const cricket::AudioOptions& options,
Taylor Brandstetter1a018dc2016-03-08 12:37:39 -080053 cricket::AudioSource* source));
Peter Boström0c4e06b2015-10-07 12:23:21 +020054 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
Tommif888bb52015-12-12 01:37:01 +010055
deadbeef2d110be2016-01-13 12:00:26 -080056 void SetRawAudioSink(uint32_t,
57 rtc::scoped_ptr<AudioSinkInterface> sink) override {
58 sink_ = std::move(sink);
Tommif888bb52015-12-12 01:37:01 +010059 }
60
61 private:
deadbeef2d110be2016-01-13 12:00:26 -080062 rtc::scoped_ptr<AudioSinkInterface> sink_;
deadbeef70ab1a12015-09-28 16:53:55 -070063};
64
65// Helper class to test RtpSender/RtpReceiver.
66class MockVideoProvider : public VideoProviderInterface {
67 public:
68 virtual ~MockVideoProvider() {}
69 MOCK_METHOD2(SetCaptureDevice,
Peter Boström0c4e06b2015-10-07 12:23:21 +020070 bool(uint32_t ssrc, cricket::VideoCapturer* camera));
deadbeef70ab1a12015-09-28 16:53:55 -070071 MOCK_METHOD3(SetVideoPlayout,
Peter Boström0c4e06b2015-10-07 12:23:21 +020072 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070073 bool enable,
nisse08582ff2016-02-04 01:24:52 -080074 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
deadbeef70ab1a12015-09-28 16:53:55 -070075 MOCK_METHOD3(SetVideoSend,
Peter Boström0c4e06b2015-10-07 12:23:21 +020076 void(uint32_t ssrc,
deadbeef70ab1a12015-09-28 16:53:55 -070077 bool enable,
78 const cricket::VideoOptions* options));
79};
80
perkj0d3eef22016-03-09 02:39:17 +010081class FakeVideoTrackSource : public VideoTrackSource {
deadbeef70ab1a12015-09-28 16:53:55 -070082 public:
perkj0d3eef22016-03-09 02:39:17 +010083 static rtc::scoped_refptr<FakeVideoTrackSource> Create(bool remote) {
84 return new rtc::RefCountedObject<FakeVideoTrackSource>(remote);
deadbeef70ab1a12015-09-28 16:53:55 -070085 }
perkjf2880a02016-03-03 01:51:52 -080086 cricket::VideoCapturer* GetVideoCapturer() { return &fake_capturer_; }
deadbeef70ab1a12015-09-28 16:53:55 -070087
88 protected:
perkj0d3eef22016-03-09 02:39:17 +010089 explicit FakeVideoTrackSource(bool remote)
90 : VideoTrackSource(&fake_capturer_, rtc::Thread::Current(), remote) {}
91 ~FakeVideoTrackSource() {}
deadbeef70ab1a12015-09-28 16:53:55 -070092
93 private:
94 cricket::FakeVideoCapturer fake_capturer_;
deadbeef70ab1a12015-09-28 16:53:55 -070095};
96
97class RtpSenderReceiverTest : public testing::Test {
98 public:
99 virtual void SetUp() {
100 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -0800101 }
102
103 void AddVideoTrack(bool remote) {
perkja3ede6c2016-03-08 01:27:48 +0100104 rtc::scoped_refptr<VideoTrackSourceInterface> source(
perkj0d3eef22016-03-09 02:39:17 +0100105 FakeVideoTrackSource::Create(remote));
deadbeef70ab1a12015-09-28 16:53:55 -0700106 video_track_ = VideoTrack::Create(kVideoTrackId, source);
107 EXPECT_TRUE(stream_->AddTrack(video_track_));
108 }
109
110 void CreateAudioRtpSender() {
111 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
112 EXPECT_TRUE(stream_->AddTrack(audio_track_));
113 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800114 audio_rtp_sender_ =
115 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
116 &audio_provider_, nullptr);
117 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700118 }
119
120 void CreateVideoRtpSender() {
tommi6eca7e32015-12-15 04:27:11 -0800121 AddVideoTrack(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700122 EXPECT_CALL(video_provider_,
123 SetCaptureDevice(
124 kVideoSsrc, video_track_->GetSource()->GetVideoCapturer()));
125 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
126 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800127 stream_->label(), &video_provider_);
128 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700129 }
130
131 void DestroyAudioRtpSender() {
132 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
133 .Times(1);
134 audio_rtp_sender_ = nullptr;
135 }
136
137 void DestroyVideoRtpSender() {
138 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL)).Times(1);
139 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
140 video_rtp_sender_ = nullptr;
141 }
142
143 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800144 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100145 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700146 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700147 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700148 audio_rtp_receiver_ = new AudioRtpReceiver(stream_->GetAudioTracks()[0],
149 kAudioSsrc, &audio_provider_);
150 }
151
152 void CreateVideoRtpReceiver() {
perkjf0dcfe22016-03-10 18:32:00 +0100153 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
154 video_rtp_receiver_ =
155 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
156 kVideoSsrc, &video_provider_);
157 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700158 }
159
160 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700161 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700162 audio_rtp_receiver_ = nullptr;
163 }
164
165 void DestroyVideoRtpReceiver() {
166 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
167 video_rtp_receiver_ = nullptr;
168 }
169
170 protected:
171 MockAudioProvider audio_provider_;
172 MockVideoProvider video_provider_;
173 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
174 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
175 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
176 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
177 rtc::scoped_refptr<MediaStreamInterface> stream_;
178 rtc::scoped_refptr<VideoTrackInterface> video_track_;
179 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
180};
181
182// Test that |audio_provider_| is notified when an audio track is associated
183// and disassociated with an AudioRtpSender.
184TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
185 CreateAudioRtpSender();
186 DestroyAudioRtpSender();
187}
188
189// Test that |video_provider_| is notified when a video track is associated and
190// disassociated with a VideoRtpSender.
191TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
192 CreateVideoRtpSender();
193 DestroyVideoRtpSender();
194}
195
196// Test that |audio_provider_| is notified when a remote audio and track is
197// associated and disassociated with an AudioRtpReceiver.
198TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
199 CreateAudioRtpReceiver();
200 DestroyAudioRtpReceiver();
201}
202
203// Test that |video_provider_| is notified when a remote
204// video track is associated and disassociated with a VideoRtpReceiver.
205TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
206 CreateVideoRtpReceiver();
207 DestroyVideoRtpReceiver();
208}
209
210TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
211 CreateAudioRtpSender();
212
213 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
214 audio_track_->set_enabled(false);
215
216 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
217 audio_track_->set_enabled(true);
218
219 DestroyAudioRtpSender();
220}
221
222TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
223 CreateAudioRtpReceiver();
224
solenbergd4cec0d2015-10-09 08:55:48 -0700225 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700226 audio_track_->set_enabled(false);
227
solenbergd4cec0d2015-10-09 08:55:48 -0700228 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700229 audio_track_->set_enabled(true);
230
231 DestroyAudioRtpReceiver();
232}
233
234TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
235 CreateVideoRtpSender();
236
237 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
238 video_track_->set_enabled(false);
239
240 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
241 video_track_->set_enabled(true);
242
243 DestroyVideoRtpSender();
244}
245
perkjf0dcfe22016-03-10 18:32:00 +0100246TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
247 CreateVideoRtpReceiver();
248
249 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
250 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
251 video_track_->GetSource()->state());
252
253 DestroyVideoRtpReceiver();
254
255 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
256 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
257 video_track_->GetSource()->state());
258}
259
deadbeef70ab1a12015-09-28 16:53:55 -0700260TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
261 CreateVideoRtpReceiver();
262
263 video_track_->set_enabled(false);
264
265 video_track_->set_enabled(true);
266
267 DestroyVideoRtpReceiver();
268}
269
270TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
271 CreateAudioRtpReceiver();
272
273 double volume = 0.5;
274 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
275 audio_track_->GetSource()->SetVolume(volume);
276
277 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700278 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700279 audio_track_->set_enabled(false);
280 audio_track_->GetSource()->SetVolume(1.0);
281
solenbergd4cec0d2015-10-09 08:55:48 -0700282 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700283 audio_track_->set_enabled(true);
284
285 double new_volume = 0.8;
286 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
287 audio_track_->GetSource()->SetVolume(new_volume);
288
289 DestroyAudioRtpReceiver();
290}
291
deadbeeffac06552015-11-25 11:26:01 -0800292// Test that provider methods aren't called without both a track and an SSRC.
293TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
294 rtc::scoped_refptr<AudioRtpSender> sender =
295 new AudioRtpSender(&audio_provider_, nullptr);
296 rtc::scoped_refptr<AudioTrackInterface> track =
297 AudioTrack::Create(kAudioTrackId, nullptr);
298 EXPECT_TRUE(sender->SetTrack(track));
299 EXPECT_TRUE(sender->SetTrack(nullptr));
300 sender->SetSsrc(kAudioSsrc);
301 sender->SetSsrc(0);
302 // Just let it get destroyed and make sure it doesn't call any methods on the
303 // provider interface.
304}
305
306// Test that provider methods aren't called without both a track and an SSRC.
307TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
308 rtc::scoped_refptr<VideoRtpSender> sender =
309 new VideoRtpSender(&video_provider_);
310 EXPECT_TRUE(sender->SetTrack(video_track_));
311 EXPECT_TRUE(sender->SetTrack(nullptr));
312 sender->SetSsrc(kVideoSsrc);
313 sender->SetSsrc(0);
314 // Just let it get destroyed and make sure it doesn't call any methods on the
315 // provider interface.
316}
317
318// Test that an audio sender calls the expected methods on the provider once
319// it has a track and SSRC, when the SSRC is set first.
320TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
321 rtc::scoped_refptr<AudioRtpSender> sender =
322 new AudioRtpSender(&audio_provider_, nullptr);
323 rtc::scoped_refptr<AudioTrackInterface> track =
324 AudioTrack::Create(kAudioTrackId, nullptr);
325 sender->SetSsrc(kAudioSsrc);
326 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
327 sender->SetTrack(track);
328
329 // Calls expected from destructor.
330 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
331}
332
333// Test that an audio sender calls the expected methods on the provider once
334// it has a track and SSRC, when the SSRC is set last.
335TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
336 rtc::scoped_refptr<AudioRtpSender> sender =
337 new AudioRtpSender(&audio_provider_, nullptr);
338 rtc::scoped_refptr<AudioTrackInterface> track =
339 AudioTrack::Create(kAudioTrackId, nullptr);
340 sender->SetTrack(track);
341 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
342 sender->SetSsrc(kAudioSsrc);
343
344 // Calls expected from destructor.
345 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
346}
347
348// Test that a video sender calls the expected methods on the provider once
349// it has a track and SSRC, when the SSRC is set first.
350TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
tommi6eca7e32015-12-15 04:27:11 -0800351 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800352 rtc::scoped_refptr<VideoRtpSender> sender =
353 new VideoRtpSender(&video_provider_);
354 sender->SetSsrc(kVideoSsrc);
355 EXPECT_CALL(video_provider_,
356 SetCaptureDevice(kVideoSsrc,
357 video_track_->GetSource()->GetVideoCapturer()));
358 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
359 sender->SetTrack(video_track_);
360
361 // Calls expected from destructor.
362 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
363 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
364}
365
366// Test that a video sender calls the expected methods on the provider once
367// it has a track and SSRC, when the SSRC is set last.
368TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
tommi6eca7e32015-12-15 04:27:11 -0800369 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800370 rtc::scoped_refptr<VideoRtpSender> sender =
371 new VideoRtpSender(&video_provider_);
372 sender->SetTrack(video_track_);
373 EXPECT_CALL(video_provider_,
374 SetCaptureDevice(kVideoSsrc,
375 video_track_->GetSource()->GetVideoCapturer()));
376 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
377 sender->SetSsrc(kVideoSsrc);
378
379 // Calls expected from destructor.
380 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
381 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
382}
383
384// Test that the sender is disconnected from the provider when its SSRC is
385// set to 0.
386TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
387 rtc::scoped_refptr<AudioTrackInterface> track =
388 AudioTrack::Create(kAudioTrackId, nullptr);
389 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
390 rtc::scoped_refptr<AudioRtpSender> sender =
391 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
392 sender->SetSsrc(kAudioSsrc);
393
394 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
395 sender->SetSsrc(0);
396
397 // Make sure it's SetSsrc that called methods on the provider, and not the
398 // destructor.
399 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
400}
401
402// Test that the sender is disconnected from the provider when its SSRC is
403// set to 0.
404TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
tommi6eca7e32015-12-15 04:27:11 -0800405 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800406 EXPECT_CALL(video_provider_,
407 SetCaptureDevice(kVideoSsrc,
408 video_track_->GetSource()->GetVideoCapturer()));
409 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
414 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
415 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.
420 EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0);
421 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
432 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
433 EXPECT_TRUE(sender->SetTrack(nullptr));
434
435 // Make sure it's SetTrack that called methods on the provider, and not the
436 // destructor.
437 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
438}
439
440TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
tommi6eca7e32015-12-15 04:27:11 -0800441 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800442 EXPECT_CALL(video_provider_,
443 SetCaptureDevice(kVideoSsrc,
444 video_track_->GetSource()->GetVideoCapturer()));
445 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
446 rtc::scoped_refptr<VideoRtpSender> sender =
447 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
448 sender->SetSsrc(kVideoSsrc);
449
450 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
451 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
452 EXPECT_TRUE(sender->SetTrack(nullptr));
453
454 // Make sure it's SetTrack that called methods on the provider, and not the
455 // destructor.
456 EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0);
457 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
458}
459
460TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800461 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800462 rtc::scoped_refptr<AudioTrackInterface> track =
463 AudioTrack::Create(kAudioTrackId, nullptr);
464 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
465 rtc::scoped_refptr<AudioRtpSender> sender =
466 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
467 sender->SetSsrc(kAudioSsrc);
468
469 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
470 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
471 sender->SetSsrc(kAudioSsrc2);
472
473 // Calls expected from destructor.
474 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
475}
476
477TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800478 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800479 EXPECT_CALL(video_provider_,
480 SetCaptureDevice(kVideoSsrc,
481 video_track_->GetSource()->GetVideoCapturer()));
482 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
483 rtc::scoped_refptr<VideoRtpSender> sender =
484 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
485 sender->SetSsrc(kVideoSsrc);
486
487 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
488 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
489 EXPECT_CALL(video_provider_,
490 SetCaptureDevice(kVideoSsrc2,
491 video_track_->GetSource()->GetVideoCapturer()));
492 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
493 sender->SetSsrc(kVideoSsrc2);
494
495 // Calls expected from destructor.
496 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc2, nullptr)).Times(1);
497 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
498}
499
deadbeef70ab1a12015-09-28 16:53:55 -0700500} // namespace webrtc