blob: 60960fb5f043addb2ef32df4388e412fb6580460 [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"
22#include "webrtc/api/videosource.h"
23#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,
53 cricket::AudioRenderer* renderer));
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
81class FakeVideoSource : public Notifier<VideoSourceInterface> {
82 public:
tommi6eca7e32015-12-15 04:27:11 -080083 static rtc::scoped_refptr<FakeVideoSource> Create(bool remote) {
84 return new rtc::RefCountedObject<FakeVideoSource>(remote);
deadbeef70ab1a12015-09-28 16:53:55 -070085 }
86 virtual cricket::VideoCapturer* GetVideoCapturer() { return &fake_capturer_; }
87 virtual void Stop() {}
88 virtual void Restart() {}
nissee73afba2016-01-28 04:47:08 -080089 virtual void AddSink(rtc::VideoSinkInterface<cricket::VideoFrame>* output) {}
90 virtual void RemoveSink(
91 rtc::VideoSinkInterface<cricket::VideoFrame>* output) {}
deadbeef70ab1a12015-09-28 16:53:55 -070092 virtual SourceState state() const { return state_; }
tommi6eca7e32015-12-15 04:27:11 -080093 virtual bool remote() const { return remote_; }
deadbeef70ab1a12015-09-28 16:53:55 -070094 virtual const cricket::VideoOptions* options() const { return &options_; }
95 virtual cricket::VideoRenderer* FrameInput() { return NULL; }
96
97 protected:
tommi6eca7e32015-12-15 04:27:11 -080098 explicit FakeVideoSource(bool remote) : state_(kLive), remote_(remote) {}
deadbeef70ab1a12015-09-28 16:53:55 -070099 ~FakeVideoSource() {}
100
101 private:
102 cricket::FakeVideoCapturer fake_capturer_;
103 SourceState state_;
tommi6eca7e32015-12-15 04:27:11 -0800104 bool remote_;
deadbeef70ab1a12015-09-28 16:53:55 -0700105 cricket::VideoOptions options_;
106};
107
108class RtpSenderReceiverTest : public testing::Test {
109 public:
110 virtual void SetUp() {
111 stream_ = MediaStream::Create(kStreamLabel1);
tommi6eca7e32015-12-15 04:27:11 -0800112 }
113
114 void AddVideoTrack(bool remote) {
115 rtc::scoped_refptr<VideoSourceInterface> source(
116 FakeVideoSource::Create(remote));
deadbeef70ab1a12015-09-28 16:53:55 -0700117 video_track_ = VideoTrack::Create(kVideoTrackId, source);
118 EXPECT_TRUE(stream_->AddTrack(video_track_));
119 }
120
121 void CreateAudioRtpSender() {
122 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
123 EXPECT_TRUE(stream_->AddTrack(audio_track_));
124 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800125 audio_rtp_sender_ =
126 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
127 &audio_provider_, nullptr);
128 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700129 }
130
131 void CreateVideoRtpSender() {
tommi6eca7e32015-12-15 04:27:11 -0800132 AddVideoTrack(false);
deadbeef70ab1a12015-09-28 16:53:55 -0700133 EXPECT_CALL(video_provider_,
134 SetCaptureDevice(
135 kVideoSsrc, video_track_->GetSource()->GetVideoCapturer()));
136 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
137 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeeffac06552015-11-25 11:26:01 -0800138 stream_->label(), &video_provider_);
139 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700140 }
141
142 void DestroyAudioRtpSender() {
143 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
144 .Times(1);
145 audio_rtp_sender_ = nullptr;
146 }
147
148 void DestroyVideoRtpSender() {
149 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL)).Times(1);
150 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
151 video_rtp_sender_ = nullptr;
152 }
153
154 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800155 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100156 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700157 EXPECT_TRUE(stream_->AddTrack(audio_track_));
solenbergd4cec0d2015-10-09 08:55:48 -0700158 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700159 audio_rtp_receiver_ = new AudioRtpReceiver(stream_->GetAudioTracks()[0],
160 kAudioSsrc, &audio_provider_);
161 }
162
163 void CreateVideoRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800164 AddVideoTrack(true);
deadbeef70ab1a12015-09-28 16:53:55 -0700165 EXPECT_CALL(video_provider_,
166 SetVideoPlayout(kVideoSsrc, true,
nisse8e8908a2016-02-05 01:52:15 -0800167 video_track_->GetSink()));
deadbeef70ab1a12015-09-28 16:53:55 -0700168 video_rtp_receiver_ = new VideoRtpReceiver(stream_->GetVideoTracks()[0],
169 kVideoSsrc, &video_provider_);
170 }
171
172 void DestroyAudioRtpReceiver() {
solenbergd4cec0d2015-10-09 08:55:48 -0700173 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700174 audio_rtp_receiver_ = nullptr;
175 }
176
177 void DestroyVideoRtpReceiver() {
178 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
179 video_rtp_receiver_ = nullptr;
180 }
181
182 protected:
183 MockAudioProvider audio_provider_;
184 MockVideoProvider video_provider_;
185 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
186 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
187 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
188 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
189 rtc::scoped_refptr<MediaStreamInterface> stream_;
190 rtc::scoped_refptr<VideoTrackInterface> video_track_;
191 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
192};
193
194// Test that |audio_provider_| is notified when an audio track is associated
195// and disassociated with an AudioRtpSender.
196TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
197 CreateAudioRtpSender();
198 DestroyAudioRtpSender();
199}
200
201// Test that |video_provider_| is notified when a video track is associated and
202// disassociated with a VideoRtpSender.
203TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
204 CreateVideoRtpSender();
205 DestroyVideoRtpSender();
206}
207
208// Test that |audio_provider_| is notified when a remote audio and track is
209// associated and disassociated with an AudioRtpReceiver.
210TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
211 CreateAudioRtpReceiver();
212 DestroyAudioRtpReceiver();
213}
214
215// Test that |video_provider_| is notified when a remote
216// video track is associated and disassociated with a VideoRtpReceiver.
217TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
218 CreateVideoRtpReceiver();
219 DestroyVideoRtpReceiver();
220}
221
222TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
223 CreateAudioRtpSender();
224
225 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
226 audio_track_->set_enabled(false);
227
228 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
229 audio_track_->set_enabled(true);
230
231 DestroyAudioRtpSender();
232}
233
234TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
235 CreateAudioRtpReceiver();
236
solenbergd4cec0d2015-10-09 08:55:48 -0700237 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700238 audio_track_->set_enabled(false);
239
solenbergd4cec0d2015-10-09 08:55:48 -0700240 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700241 audio_track_->set_enabled(true);
242
243 DestroyAudioRtpReceiver();
244}
245
246TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
247 CreateVideoRtpSender();
248
249 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
250 video_track_->set_enabled(false);
251
252 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
253 video_track_->set_enabled(true);
254
255 DestroyVideoRtpSender();
256}
257
258TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
259 CreateVideoRtpReceiver();
260
261 video_track_->set_enabled(false);
262
263 video_track_->set_enabled(true);
264
265 DestroyVideoRtpReceiver();
266}
267
268TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
269 CreateAudioRtpReceiver();
270
271 double volume = 0.5;
272 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
273 audio_track_->GetSource()->SetVolume(volume);
274
275 // Disable the audio track, this should prevent setting the volume.
solenbergd4cec0d2015-10-09 08:55:48 -0700276 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700277 audio_track_->set_enabled(false);
278 audio_track_->GetSource()->SetVolume(1.0);
279
solenbergd4cec0d2015-10-09 08:55:48 -0700280 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700281 audio_track_->set_enabled(true);
282
283 double new_volume = 0.8;
284 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
285 audio_track_->GetSource()->SetVolume(new_volume);
286
287 DestroyAudioRtpReceiver();
288}
289
deadbeeffac06552015-11-25 11:26:01 -0800290// Test that provider methods aren't called without both a track and an SSRC.
291TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
292 rtc::scoped_refptr<AudioRtpSender> sender =
293 new AudioRtpSender(&audio_provider_, nullptr);
294 rtc::scoped_refptr<AudioTrackInterface> track =
295 AudioTrack::Create(kAudioTrackId, nullptr);
296 EXPECT_TRUE(sender->SetTrack(track));
297 EXPECT_TRUE(sender->SetTrack(nullptr));
298 sender->SetSsrc(kAudioSsrc);
299 sender->SetSsrc(0);
300 // Just let it get destroyed and make sure it doesn't call any methods on the
301 // provider interface.
302}
303
304// Test that provider methods aren't called without both a track and an SSRC.
305TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
306 rtc::scoped_refptr<VideoRtpSender> sender =
307 new VideoRtpSender(&video_provider_);
308 EXPECT_TRUE(sender->SetTrack(video_track_));
309 EXPECT_TRUE(sender->SetTrack(nullptr));
310 sender->SetSsrc(kVideoSsrc);
311 sender->SetSsrc(0);
312 // Just let it get destroyed and make sure it doesn't call any methods on the
313 // provider interface.
314}
315
316// Test that an audio sender calls the expected methods on the provider once
317// it has a track and SSRC, when the SSRC is set first.
318TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
319 rtc::scoped_refptr<AudioRtpSender> sender =
320 new AudioRtpSender(&audio_provider_, nullptr);
321 rtc::scoped_refptr<AudioTrackInterface> track =
322 AudioTrack::Create(kAudioTrackId, nullptr);
323 sender->SetSsrc(kAudioSsrc);
324 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
325 sender->SetTrack(track);
326
327 // Calls expected from destructor.
328 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
329}
330
331// Test that an audio sender calls the expected methods on the provider once
332// it has a track and SSRC, when the SSRC is set last.
333TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
334 rtc::scoped_refptr<AudioRtpSender> sender =
335 new AudioRtpSender(&audio_provider_, nullptr);
336 rtc::scoped_refptr<AudioTrackInterface> track =
337 AudioTrack::Create(kAudioTrackId, nullptr);
338 sender->SetTrack(track);
339 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
340 sender->SetSsrc(kAudioSsrc);
341
342 // Calls expected from destructor.
343 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
344}
345
346// Test that a video sender calls the expected methods on the provider once
347// it has a track and SSRC, when the SSRC is set first.
348TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
tommi6eca7e32015-12-15 04:27:11 -0800349 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800350 rtc::scoped_refptr<VideoRtpSender> sender =
351 new VideoRtpSender(&video_provider_);
352 sender->SetSsrc(kVideoSsrc);
353 EXPECT_CALL(video_provider_,
354 SetCaptureDevice(kVideoSsrc,
355 video_track_->GetSource()->GetVideoCapturer()));
356 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
357 sender->SetTrack(video_track_);
358
359 // Calls expected from destructor.
360 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
361 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
362}
363
364// Test that a video sender calls the expected methods on the provider once
365// it has a track and SSRC, when the SSRC is set last.
366TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
tommi6eca7e32015-12-15 04:27:11 -0800367 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800368 rtc::scoped_refptr<VideoRtpSender> sender =
369 new VideoRtpSender(&video_provider_);
370 sender->SetTrack(video_track_);
371 EXPECT_CALL(video_provider_,
372 SetCaptureDevice(kVideoSsrc,
373 video_track_->GetSource()->GetVideoCapturer()));
374 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
375 sender->SetSsrc(kVideoSsrc);
376
377 // Calls expected from destructor.
378 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
379 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
380}
381
382// Test that the sender is disconnected from the provider when its SSRC is
383// set to 0.
384TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
385 rtc::scoped_refptr<AudioTrackInterface> track =
386 AudioTrack::Create(kAudioTrackId, nullptr);
387 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
388 rtc::scoped_refptr<AudioRtpSender> sender =
389 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
390 sender->SetSsrc(kAudioSsrc);
391
392 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
393 sender->SetSsrc(0);
394
395 // Make sure it's SetSsrc that called methods on the provider, and not the
396 // destructor.
397 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
398}
399
400// Test that the sender is disconnected from the provider when its SSRC is
401// set to 0.
402TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
tommi6eca7e32015-12-15 04:27:11 -0800403 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800404 EXPECT_CALL(video_provider_,
405 SetCaptureDevice(kVideoSsrc,
406 video_track_->GetSource()->GetVideoCapturer()));
407 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
408 rtc::scoped_refptr<VideoRtpSender> sender =
409 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
410 sender->SetSsrc(kVideoSsrc);
411
412 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
413 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
414 sender->SetSsrc(0);
415
416 // Make sure it's SetSsrc that called methods on the provider, and not the
417 // destructor.
418 EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0);
419 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
420}
421
422TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
423 rtc::scoped_refptr<AudioTrackInterface> track =
424 AudioTrack::Create(kAudioTrackId, nullptr);
425 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
426 rtc::scoped_refptr<AudioRtpSender> sender =
427 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
428 sender->SetSsrc(kAudioSsrc);
429
430 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
431 EXPECT_TRUE(sender->SetTrack(nullptr));
432
433 // Make sure it's SetTrack that called methods on the provider, and not the
434 // destructor.
435 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
436}
437
438TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
tommi6eca7e32015-12-15 04:27:11 -0800439 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800440 EXPECT_CALL(video_provider_,
441 SetCaptureDevice(kVideoSsrc,
442 video_track_->GetSource()->GetVideoCapturer()));
443 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
444 rtc::scoped_refptr<VideoRtpSender> sender =
445 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
446 sender->SetSsrc(kVideoSsrc);
447
448 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
449 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
450 EXPECT_TRUE(sender->SetTrack(nullptr));
451
452 // Make sure it's SetTrack that called methods on the provider, and not the
453 // destructor.
454 EXPECT_CALL(video_provider_, SetCaptureDevice(_, _)).Times(0);
455 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _)).Times(0);
456}
457
458TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800459 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800460 rtc::scoped_refptr<AudioTrackInterface> track =
461 AudioTrack::Create(kAudioTrackId, nullptr);
462 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
463 rtc::scoped_refptr<AudioRtpSender> sender =
464 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
465 sender->SetSsrc(kAudioSsrc);
466
467 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
468 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
469 sender->SetSsrc(kAudioSsrc2);
470
471 // Calls expected from destructor.
472 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
473}
474
475TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
tommi6eca7e32015-12-15 04:27:11 -0800476 AddVideoTrack(false);
deadbeeffac06552015-11-25 11:26:01 -0800477 EXPECT_CALL(video_provider_,
478 SetCaptureDevice(kVideoSsrc,
479 video_track_->GetSource()->GetVideoCapturer()));
480 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
481 rtc::scoped_refptr<VideoRtpSender> sender =
482 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
483 sender->SetSsrc(kVideoSsrc);
484
485 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, nullptr)).Times(1);
486 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _)).Times(1);
487 EXPECT_CALL(video_provider_,
488 SetCaptureDevice(kVideoSsrc2,
489 video_track_->GetSource()->GetVideoCapturer()));
490 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, true, _));
491 sender->SetSsrc(kVideoSsrc2);
492
493 // Calls expected from destructor.
494 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc2, nullptr)).Times(1);
495 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _)).Times(1);
496}
497
deadbeef70ab1a12015-09-28 16:53:55 -0700498} // namespace webrtc