blob: 0a7c408bf01499930ed269f0fe306495e93df904 [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() {
tommi6eca7e32015-12-15 04:27:11 -0800153 AddVideoTrack(true);
deadbeef70ab1a12015-09-28 16:53:55 -0700154 EXPECT_CALL(video_provider_,
155 SetVideoPlayout(kVideoSsrc, true,
nisse8e8908a2016-02-05 01:52:15 -0800156 video_track_->GetSink()));
deadbeef70ab1a12015-09-28 16:53:55 -0700157 video_rtp_receiver_ = new VideoRtpReceiver(stream_->GetVideoTracks()[0],
158 kVideoSsrc, &video_provider_);
159 }
160
161 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700162 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700163 audio_rtp_receiver_ = nullptr;
164 }
165
166 void DestroyVideoRtpReceiver() {
167 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
168 video_rtp_receiver_ = nullptr;
169 }
170
171 protected:
172 MockAudioProvider audio_provider_;
173 MockVideoProvider video_provider_;
174 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
175 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
176 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
177 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
178 rtc::scoped_refptr<MediaStreamInterface> stream_;
179 rtc::scoped_refptr<VideoTrackInterface> video_track_;
180 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
181};
182
183// Test that |audio_provider_| is notified when an audio track is associated
184// and disassociated with an AudioRtpSender.
185TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
186 CreateAudioRtpSender();
187 DestroyAudioRtpSender();
188}
189
190// Test that |video_provider_| is notified when a video track is associated and
191// disassociated with a VideoRtpSender.
192TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
193 CreateVideoRtpSender();
194 DestroyVideoRtpSender();
195}
196
197// Test that |audio_provider_| is notified when a remote audio and track is
198// associated and disassociated with an AudioRtpReceiver.
199TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
200 CreateAudioRtpReceiver();
201 DestroyAudioRtpReceiver();
202}
203
204// Test that |video_provider_| is notified when a remote
205// video track is associated and disassociated with a VideoRtpReceiver.
206TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
207 CreateVideoRtpReceiver();
208 DestroyVideoRtpReceiver();
209}
210
211TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
212 CreateAudioRtpSender();
213
214 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
215 audio_track_->set_enabled(false);
216
217 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
218 audio_track_->set_enabled(true);
219
220 DestroyAudioRtpSender();
221}
222
223TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
224 CreateAudioRtpReceiver();
225
solenbergd4cec0d2015-10-09 08:55:48 -0700226 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700227 audio_track_->set_enabled(false);
228
solenbergd4cec0d2015-10-09 08:55:48 -0700229 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700230 audio_track_->set_enabled(true);
231
232 DestroyAudioRtpReceiver();
233}
234
235TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
236 CreateVideoRtpSender();
237
238 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
239 video_track_->set_enabled(false);
240
241 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
242 video_track_->set_enabled(true);
243
244 DestroyVideoRtpSender();
245}
246
247TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
248 CreateVideoRtpReceiver();
249
250 video_track_->set_enabled(false);
251
252 video_track_->set_enabled(true);
253
254 DestroyVideoRtpReceiver();
255}
256
257TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
258 CreateAudioRtpReceiver();
259
260 double volume = 0.5;
261 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
262 audio_track_->GetSource()->SetVolume(volume);
263
264 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700265 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700266 audio_track_->set_enabled(false);
267 audio_track_->GetSource()->SetVolume(1.0);
268
solenbergd4cec0d2015-10-09 08:55:48 -0700269 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700270 audio_track_->set_enabled(true);
271
272 double new_volume = 0.8;
273 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
274 audio_track_->GetSource()->SetVolume(new_volume);
275
276 DestroyAudioRtpReceiver();
277}
278
deadbeeffac06552015-11-25 11:26:01 -0800279// Test that provider methods aren't called without both a track and an SSRC.
280TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
281 rtc::scoped_refptr<AudioRtpSender> sender =
282 new AudioRtpSender(&audio_provider_, nullptr);
283 rtc::scoped_refptr<AudioTrackInterface> track =
284 AudioTrack::Create(kAudioTrackId, nullptr);
285 EXPECT_TRUE(sender->SetTrack(track));
286 EXPECT_TRUE(sender->SetTrack(nullptr));
287 sender->SetSsrc(kAudioSsrc);
288 sender->SetSsrc(0);
289 // Just let it get destroyed and make sure it doesn't call any methods on the
290 // provider interface.
291}
292
293// Test that provider methods aren't called without both a track and an SSRC.
294TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
295 rtc::scoped_refptr<VideoRtpSender> sender =
296 new VideoRtpSender(&video_provider_);
297 EXPECT_TRUE(sender->SetTrack(video_track_));
298 EXPECT_TRUE(sender->SetTrack(nullptr));
299 sender->SetSsrc(kVideoSsrc);
300 sender->SetSsrc(0);
301 // Just let it get destroyed and make sure it doesn't call any methods on the
302 // provider interface.
303}
304
305// Test that an audio sender calls the expected methods on the provider once
306// it has a track and SSRC, when the SSRC is set first.
307TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
308 rtc::scoped_refptr<AudioRtpSender> sender =
309 new AudioRtpSender(&audio_provider_, nullptr);
310 rtc::scoped_refptr<AudioTrackInterface> track =
311 AudioTrack::Create(kAudioTrackId, nullptr);
312 sender->SetSsrc(kAudioSsrc);
313 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
314 sender->SetTrack(track);
315
316 // Calls expected from destructor.
317 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
318}
319
320// Test that an audio sender calls the expected methods on the provider once
321// it has a track and SSRC, when the SSRC is set last.
322TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
323 rtc::scoped_refptr<AudioRtpSender> sender =
324 new AudioRtpSender(&audio_provider_, nullptr);
325 rtc::scoped_refptr<AudioTrackInterface> track =
326 AudioTrack::Create(kAudioTrackId, nullptr);
327 sender->SetTrack(track);
328 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
329 sender->SetSsrc(kAudioSsrc);
330
331 // Calls expected from destructor.
332 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
333}
334
335// Test that a video sender calls the expected methods on the provider once
336// it has a track and SSRC, when the SSRC is set first.
337TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
tommi6eca7e32015-12-15 04:27:11 -0800338 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800339 rtc::scoped_refptr<VideoRtpSender> sender =
340 new VideoRtpSender(&video_provider_);
341 sender->SetSsrc(kVideoSsrc);
342 EXPECT_CALL(video_provider_,
343 SetCaptureDevice(kVideoSsrc,
344 video_track_->GetSource()->GetVideoCapturer()));
345 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
346 sender->SetTrack(video_track_);
347
348 // Calls expected from destructor.
349 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
350 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
351}
352
353// Test that a video sender calls the expected methods on the provider once
354// it has a track and SSRC, when the SSRC is set last.
355TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
tommi6eca7e32015-12-15 04:27:11 -0800356 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800357 rtc::scoped_refptr<VideoRtpSender> sender =
358 new VideoRtpSender(&video_provider_);
359 sender->SetTrack(video_track_);
360 EXPECT_CALL(video_provider_,
361 SetCaptureDevice(kVideoSsrc,
362 video_track_->GetSource()->GetVideoCapturer()));
363 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
364 sender->SetSsrc(kVideoSsrc);
365
366 // Calls expected from destructor.
367 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
368 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
369}
370
371// Test that the sender is disconnected from the provider when its SSRC is
372// set to 0.
373TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
374 rtc::scoped_refptr<AudioTrackInterface> track =
375 AudioTrack::Create(kAudioTrackId, nullptr);
376 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
377 rtc::scoped_refptr<AudioRtpSender> sender =
378 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
379 sender->SetSsrc(kAudioSsrc);
380
381 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
382 sender->SetSsrc(0);
383
384 // Make sure it's SetSsrc that called methods on the provider, and not the
385 // destructor.
386 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
387}
388
389// Test that the sender is disconnected from the provider when its SSRC is
390// set to 0.
391TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
tommi6eca7e32015-12-15 04:27:11 -0800392 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800393 EXPECT_CALL(video_provider_,
394 SetCaptureDevice(kVideoSsrc,
395 video_track_->GetSource()->GetVideoCapturer()));
396 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
401 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
402 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.
407 EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0);
408 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) {
tommi6eca7e32015-12-15 04:27:11 -0800428 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800429 EXPECT_CALL(video_provider_,
430 SetCaptureDevice(kVideoSsrc,
431 video_track_->GetSource()->GetVideoCapturer()));
432 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
433 rtc::scoped_refptr<VideoRtpSender> sender =
434 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
435 sender->SetSsrc(kVideoSsrc);
436
437 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
438 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
439 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(video_provider_, SetCaptureDevice(_, _)).Times(0);
444 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
445}
446
447TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800448 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800449 rtc::scoped_refptr<AudioTrackInterface> track =
450 AudioTrack::Create(kAudioTrackId, nullptr);
451 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
452 rtc::scoped_refptr<AudioRtpSender> sender =
453 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
454 sender->SetSsrc(kAudioSsrc);
455
456 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
457 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
458 sender->SetSsrc(kAudioSsrc2);
459
460 // Calls expected from destructor.
461 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
462}
463
464TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800465 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800466 EXPECT_CALL(video_provider_,
467 SetCaptureDevice(kVideoSsrc,
468 video_track_->GetSource()->GetVideoCapturer()));
469 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
474 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
475 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
476 EXPECT_CALL(video_provider_,
477 SetCaptureDevice(kVideoSsrc2,
478 video_track_->GetSource()->GetVideoCapturer()));
479 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
480 sender->SetSsrc(kVideoSsrc2);
481
482 // Calls expected from destructor.
483 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc2, nullptr)).Times(1);
484 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
485}
486
deadbeef70ab1a12015-09-28 16:53:55 -0700487} // namespace webrtc