blob: a08e1b4c634a34083e01b451fd8080560504d30b [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;
deadbeef5dd42fd2016-05-02 16:20:01 -070031using ::testing::InvokeWithoutArgs;
skvladdc1c62c2016-03-16 19:07:43 -070032using ::testing::Return;
deadbeef70ab1a12015-09-28 16:53:55 -070033
34static const char kStreamLabel1[] = "local_stream_1";
35static const char kVideoTrackId[] = "video_1";
36static const char kAudioTrackId[] = "audio_1";
Peter Boström0c4e06b2015-10-07 12:23:21 +020037static const uint32_t kVideoSsrc = 98;
deadbeeffac06552015-11-25 11:26:01 -080038static const uint32_t kVideoSsrc2 = 100;
Peter Boström0c4e06b2015-10-07 12:23:21 +020039static const uint32_t kAudioSsrc = 99;
deadbeeffac06552015-11-25 11:26:01 -080040static const uint32_t kAudioSsrc2 = 101;
deadbeef70ab1a12015-09-28 16:53:55 -070041
42namespace webrtc {
43
deadbeef1a7162d2016-06-24 14:13:06 -070044// Helper class to test RtpSender/RtpReceiver.
45class MockAudioProvider : public AudioProviderInterface {
deadbeef70ab1a12015-09-28 16:53:55 -070046 public:
deadbeef1a7162d2016-06-24 14:13:06 -070047 // TODO(nisse): Valid overrides commented out, because the gmock
48 // methods don't use any override declarations, and we want to avoid
49 // warnings from -Winconsistent-missing-override. See
50 // http://crbug.com/428099.
51 ~MockAudioProvider() /* override */ {}
Taylor Brandstetterbc583192016-06-24 14:06:35 -070052
deadbeef1a7162d2016-06-24 14:13:06 -070053 MOCK_METHOD2(SetAudioPlayout,
54 void(uint32_t ssrc,
55 bool enable));
56 MOCK_METHOD4(SetAudioSend,
57 void(uint32_t ssrc,
58 bool enable,
59 const cricket::AudioOptions& options,
60 cricket::AudioSource* source));
61 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32_t ssrc, double volume));
62 MOCK_CONST_METHOD1(GetAudioRtpSendParameters, RtpParameters(uint32_t ssrc));
63 MOCK_METHOD2(SetAudioRtpSendParameters,
64 bool(uint32_t ssrc, const RtpParameters&));
65 MOCK_CONST_METHOD1(GetAudioRtpReceiveParameters,
66 RtpParameters(uint32_t ssrc));
67 MOCK_METHOD2(SetAudioRtpReceiveParameters,
68 bool(uint32_t ssrc, const RtpParameters&));
69
70 void SetRawAudioSink(
71 uint32_t, std::unique_ptr<AudioSinkInterface> sink) /* override */ {
72 sink_ = std::move(sink);
tommi6eca7e32015-12-15 04:27:11 -080073 }
74
deadbeef1a7162d2016-06-24 14:13:06 -070075 private:
76 std::unique_ptr<AudioSinkInterface> sink_;
77};
78
79// Helper class to test RtpSender/RtpReceiver.
80class MockVideoProvider : public VideoProviderInterface {
81 public:
82 virtual ~MockVideoProvider() {}
83 MOCK_METHOD3(SetVideoPlayout,
84 void(uint32_t ssrc,
85 bool enable,
86 rtc::VideoSinkInterface<cricket::VideoFrame>* sink));
87 MOCK_METHOD4(SetVideoSend,
88 void(uint32_t ssrc,
89 bool enable,
90 const cricket::VideoOptions* options,
91 rtc::VideoSourceInterface<cricket::VideoFrame>* source));
92
93 MOCK_CONST_METHOD1(GetVideoRtpSendParameters, RtpParameters(uint32_t ssrc));
94 MOCK_METHOD2(SetVideoRtpSendParameters,
95 bool(uint32_t ssrc, const RtpParameters&));
96 MOCK_CONST_METHOD1(GetVideoRtpReceiveParameters,
97 RtpParameters(uint32_t ssrc));
98 MOCK_METHOD2(SetVideoRtpReceiveParameters,
99 bool(uint32_t ssrc, const RtpParameters&));
100};
101
102class RtpSenderReceiverTest : public testing::Test {
103 public:
104 virtual void SetUp() {
105 stream_ = MediaStream::Create(kStreamLabel1);
106 }
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700107
nisseaf510af2016-03-21 08:20:42 -0700108 void AddVideoTrack() {
perkja3ede6c2016-03-08 01:27:48 +0100109 rtc::scoped_refptr<VideoTrackSourceInterface> source(
nisseaf510af2016-03-21 08:20:42 -0700110 FakeVideoTrackSource::Create());
deadbeef70ab1a12015-09-28 16:53:55 -0700111 video_track_ = VideoTrack::Create(kVideoTrackId, source);
112 EXPECT_TRUE(stream_->AddTrack(video_track_));
113 }
114
deadbeef1a7162d2016-06-24 14:13:06 -0700115 void CreateAudioRtpSender() {
116 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
deadbeef70ab1a12015-09-28 16:53:55 -0700117 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeef1a7162d2016-06-24 14:13:06 -0700118 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
deadbeeffac06552015-11-25 11:26:01 -0800119 audio_rtp_sender_ =
120 new AudioRtpSender(stream_->GetAudioTracks()[0], stream_->label(),
deadbeef1a7162d2016-06-24 14:13:06 -0700121 &audio_provider_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800122 audio_rtp_sender_->SetSsrc(kAudioSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700123 }
124
125 void CreateVideoRtpSender() {
nisseaf510af2016-03-21 08:20:42 -0700126 AddVideoTrack();
deadbeef1a7162d2016-06-24 14:13:06 -0700127 EXPECT_CALL(video_provider_,
128 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700129 video_rtp_sender_ = new VideoRtpSender(stream_->GetVideoTracks()[0],
deadbeef1a7162d2016-06-24 14:13:06 -0700130 stream_->label(), &video_provider_);
deadbeeffac06552015-11-25 11:26:01 -0800131 video_rtp_sender_->SetSsrc(kVideoSsrc);
deadbeef70ab1a12015-09-28 16:53:55 -0700132 }
133
134 void DestroyAudioRtpSender() {
deadbeef1a7162d2016-06-24 14:13:06 -0700135 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
136 .Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700137 audio_rtp_sender_ = nullptr;
138 }
139
140 void DestroyVideoRtpSender() {
deadbeef1a7162d2016-06-24 14:13:06 -0700141 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
142 .Times(1);
deadbeef70ab1a12015-09-28 16:53:55 -0700143 video_rtp_sender_ = nullptr;
144 }
145
146 void CreateAudioRtpReceiver() {
tommi6eca7e32015-12-15 04:27:11 -0800147 audio_track_ = AudioTrack::Create(
Tommif888bb52015-12-12 01:37:01 +0100148 kAudioTrackId, RemoteAudioSource::Create(kAudioSsrc, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700149 EXPECT_TRUE(stream_->AddTrack(audio_track_));
deadbeef1a7162d2016-06-24 14:13:06 -0700150 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
perkjd61bf802016-03-24 03:16:19 -0700151 audio_rtp_receiver_ = new AudioRtpReceiver(stream_, kAudioTrackId,
deadbeef1a7162d2016-06-24 14:13:06 -0700152 kAudioSsrc, &audio_provider_);
perkjd61bf802016-03-24 03:16:19 -0700153 audio_track_ = audio_rtp_receiver_->audio_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700154 }
155
156 void CreateVideoRtpReceiver() {
deadbeef1a7162d2016-06-24 14:13:06 -0700157 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, true, _));
perkjf0dcfe22016-03-10 18:32:00 +0100158 video_rtp_receiver_ =
159 new VideoRtpReceiver(stream_, kVideoTrackId, rtc::Thread::Current(),
deadbeef1a7162d2016-06-24 14:13:06 -0700160 kVideoSsrc, &video_provider_);
perkjf0dcfe22016-03-10 18:32:00 +0100161 video_track_ = video_rtp_receiver_->video_track();
deadbeef70ab1a12015-09-28 16:53:55 -0700162 }
163
164 void DestroyAudioRtpReceiver() {
deadbeef1a7162d2016-06-24 14:13:06 -0700165 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700166 audio_rtp_receiver_ = nullptr;
167 }
168
169 void DestroyVideoRtpReceiver() {
deadbeef1a7162d2016-06-24 14:13:06 -0700170 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
deadbeef70ab1a12015-09-28 16:53:55 -0700171 video_rtp_receiver_ = nullptr;
172 }
173
174 protected:
deadbeef1a7162d2016-06-24 14:13:06 -0700175 MockAudioProvider audio_provider_;
176 MockVideoProvider video_provider_;
deadbeef70ab1a12015-09-28 16:53:55 -0700177 rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
178 rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
179 rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
180 rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
181 rtc::scoped_refptr<MediaStreamInterface> stream_;
182 rtc::scoped_refptr<VideoTrackInterface> video_track_;
183 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
184};
185
deadbeef1a7162d2016-06-24 14:13:06 -0700186// Test that |audio_provider_| is notified when an audio track is associated
deadbeef70ab1a12015-09-28 16:53:55 -0700187// and disassociated with an AudioRtpSender.
188TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
189 CreateAudioRtpSender();
190 DestroyAudioRtpSender();
191}
192
deadbeef1a7162d2016-06-24 14:13:06 -0700193// Test that |video_provider_| is notified when a video track is associated and
deadbeef70ab1a12015-09-28 16:53:55 -0700194// disassociated with a VideoRtpSender.
195TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
196 CreateVideoRtpSender();
197 DestroyVideoRtpSender();
198}
199
deadbeef1a7162d2016-06-24 14:13:06 -0700200// Test that |audio_provider_| is notified when a remote audio and track is
deadbeef70ab1a12015-09-28 16:53:55 -0700201// associated and disassociated with an AudioRtpReceiver.
202TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
203 CreateAudioRtpReceiver();
204 DestroyAudioRtpReceiver();
205}
206
deadbeef1a7162d2016-06-24 14:13:06 -0700207// Test that |video_provider_| is notified when a remote
208// video track is associated and disassociated with a VideoRtpReceiver.
deadbeef70ab1a12015-09-28 16:53:55 -0700209TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
210 CreateVideoRtpReceiver();
211 DestroyVideoRtpReceiver();
212}
213
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700214TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
215 CreateAudioRtpSender();
216
deadbeef1a7162d2016-06-24 14:13:06 -0700217 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700218 audio_track_->set_enabled(false);
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700219
deadbeef1a7162d2016-06-24 14:13:06 -0700220 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700221 audio_track_->set_enabled(true);
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700222
223 DestroyAudioRtpSender();
224}
225
deadbeef70ab1a12015-09-28 16:53:55 -0700226TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
227 CreateAudioRtpReceiver();
228
deadbeef1a7162d2016-06-24 14:13:06 -0700229 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700230 audio_track_->set_enabled(false);
Taylor Brandstetterbc583192016-06-24 14:06:35 -0700231
deadbeef1a7162d2016-06-24 14:13:06 -0700232 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700233 audio_track_->set_enabled(true);
234
235 DestroyAudioRtpReceiver();
236}
237
238TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
239 CreateVideoRtpSender();
240
deadbeef1a7162d2016-06-24 14:13:06 -0700241 EXPECT_CALL(video_provider_,
242 SetVideoSend(kVideoSsrc, false, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700243 video_track_->set_enabled(false);
deadbeef1a7162d2016-06-24 14:13:06 -0700244
245 EXPECT_CALL(video_provider_,
246 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
deadbeef70ab1a12015-09-28 16:53:55 -0700247 video_track_->set_enabled(true);
248
249 DestroyVideoRtpSender();
250}
251
perkjf0dcfe22016-03-10 18:32:00 +0100252TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
253 CreateVideoRtpReceiver();
254
255 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
256 EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
257 video_track_->GetSource()->state());
258
259 DestroyVideoRtpReceiver();
260
261 EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
262 EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
263 video_track_->GetSource()->state());
264}
265
deadbeef70ab1a12015-09-28 16:53:55 -0700266TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
267 CreateVideoRtpReceiver();
268
269 video_track_->set_enabled(false);
deadbeef1a7162d2016-06-24 14:13:06 -0700270
deadbeef70ab1a12015-09-28 16:53:55 -0700271 video_track_->set_enabled(true);
272
273 DestroyVideoRtpReceiver();
274}
275
276TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
277 CreateAudioRtpReceiver();
278
deadbeef1a7162d2016-06-24 14:13:06 -0700279 double volume = 0.5;
280 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
281 audio_track_->GetSource()->SetVolume(volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700282
283 // Disable the audio track, this should prevent setting the volume.
deadbeef1a7162d2016-06-24 14:13:06 -0700284 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false));
deadbeef70ab1a12015-09-28 16:53:55 -0700285 audio_track_->set_enabled(false);
deadbeef1a7162d2016-06-24 14:13:06 -0700286 audio_track_->GetSource()->SetVolume(1.0);
deadbeef70ab1a12015-09-28 16:53:55 -0700287
deadbeef1a7162d2016-06-24 14:13:06 -0700288 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true));
deadbeef70ab1a12015-09-28 16:53:55 -0700289 audio_track_->set_enabled(true);
290
deadbeef1a7162d2016-06-24 14:13:06 -0700291 double new_volume = 0.8;
292 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
293 audio_track_->GetSource()->SetVolume(new_volume);
deadbeef70ab1a12015-09-28 16:53:55 -0700294
295 DestroyAudioRtpReceiver();
296}
297
deadbeef1a7162d2016-06-24 14:13:06 -0700298// Test that provider methods aren't called without both a track and an SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800299TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
deadbeef1a7162d2016-06-24 14:13:06 -0700300 rtc::scoped_refptr<AudioRtpSender> sender =
301 new AudioRtpSender(&audio_provider_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800302 rtc::scoped_refptr<AudioTrackInterface> track =
303 AudioTrack::Create(kAudioTrackId, nullptr);
deadbeef1a7162d2016-06-24 14:13:06 -0700304 EXPECT_TRUE(sender->SetTrack(track));
305 EXPECT_TRUE(sender->SetTrack(nullptr));
306 sender->SetSsrc(kAudioSsrc);
307 sender->SetSsrc(0);
308 // Just let it get destroyed and make sure it doesn't call any methods on the
309 // provider interface.
deadbeeffac06552015-11-25 11:26:01 -0800310}
311
deadbeef1a7162d2016-06-24 14:13:06 -0700312// Test that provider methods aren't called without both a track and an SSRC.
deadbeeffac06552015-11-25 11:26:01 -0800313TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
deadbeef1a7162d2016-06-24 14:13:06 -0700314 rtc::scoped_refptr<VideoRtpSender> sender =
315 new VideoRtpSender(&video_provider_);
316 EXPECT_TRUE(sender->SetTrack(video_track_));
317 EXPECT_TRUE(sender->SetTrack(nullptr));
318 sender->SetSsrc(kVideoSsrc);
319 sender->SetSsrc(0);
320 // Just let it get destroyed and make sure it doesn't call any methods on the
321 // provider interface.
deadbeeffac06552015-11-25 11:26:01 -0800322}
323
deadbeef1a7162d2016-06-24 14:13:06 -0700324// Test that an audio sender calls the expected methods on the provider once
325// it has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800326TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
deadbeef1a7162d2016-06-24 14:13:06 -0700327 rtc::scoped_refptr<AudioRtpSender> sender =
328 new AudioRtpSender(&audio_provider_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800329 rtc::scoped_refptr<AudioTrackInterface> track =
330 AudioTrack::Create(kAudioTrackId, nullptr);
deadbeef1a7162d2016-06-24 14:13:06 -0700331 sender->SetSsrc(kAudioSsrc);
332 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
333 sender->SetTrack(track);
deadbeeffac06552015-11-25 11:26:01 -0800334
deadbeef1a7162d2016-06-24 14:13:06 -0700335 // Calls expected from destructor.
336 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800337}
338
deadbeef1a7162d2016-06-24 14:13:06 -0700339// Test that an audio sender calls the expected methods on the provider once
340// it has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800341TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
deadbeef1a7162d2016-06-24 14:13:06 -0700342 rtc::scoped_refptr<AudioRtpSender> sender =
343 new AudioRtpSender(&audio_provider_, nullptr);
deadbeeffac06552015-11-25 11:26:01 -0800344 rtc::scoped_refptr<AudioTrackInterface> track =
345 AudioTrack::Create(kAudioTrackId, nullptr);
deadbeef1a7162d2016-06-24 14:13:06 -0700346 sender->SetTrack(track);
347 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
348 sender->SetSsrc(kAudioSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800349
deadbeef1a7162d2016-06-24 14:13:06 -0700350 // Calls expected from destructor.
351 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800352}
353
deadbeef1a7162d2016-06-24 14:13:06 -0700354// Test that a video sender calls the expected methods on the provider once
355// it has a track and SSRC, when the SSRC is set first.
deadbeeffac06552015-11-25 11:26:01 -0800356TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
nisseaf510af2016-03-21 08:20:42 -0700357 AddVideoTrack();
deadbeef1a7162d2016-06-24 14:13:06 -0700358 rtc::scoped_refptr<VideoRtpSender> sender =
359 new VideoRtpSender(&video_provider_);
360 sender->SetSsrc(kVideoSsrc);
361 EXPECT_CALL(video_provider_,
362 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
363 sender->SetTrack(video_track_);
deadbeeffac06552015-11-25 11:26:01 -0800364
deadbeef1a7162d2016-06-24 14:13:06 -0700365 // Calls expected from destructor.
366 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
367 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800368}
369
deadbeef1a7162d2016-06-24 14:13:06 -0700370// Test that a video sender calls the expected methods on the provider once
371// it has a track and SSRC, when the SSRC is set last.
deadbeeffac06552015-11-25 11:26:01 -0800372TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
nisseaf510af2016-03-21 08:20:42 -0700373 AddVideoTrack();
deadbeef1a7162d2016-06-24 14:13:06 -0700374 rtc::scoped_refptr<VideoRtpSender> sender =
375 new VideoRtpSender(&video_provider_);
376 sender->SetTrack(video_track_);
377 EXPECT_CALL(video_provider_,
378 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
379 sender->SetSsrc(kVideoSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800380
deadbeef1a7162d2016-06-24 14:13:06 -0700381 // Calls expected from destructor.
382 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
383 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800384}
385
deadbeef1a7162d2016-06-24 14:13:06 -0700386// Test that the sender is disconnected from the provider when its SSRC is
387// set to 0.
deadbeeffac06552015-11-25 11:26:01 -0800388TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
deadbeef1a7162d2016-06-24 14:13:06 -0700389 rtc::scoped_refptr<AudioTrackInterface> track =
390 AudioTrack::Create(kAudioTrackId, nullptr);
391 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
392 rtc::scoped_refptr<AudioRtpSender> sender =
393 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
394 sender->SetSsrc(kAudioSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800395
deadbeef1a7162d2016-06-24 14:13:06 -0700396 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
397 sender->SetSsrc(0);
398
399 // Make sure it's SetSsrc that called methods on the provider, and not the
400 // destructor.
401 EXPECT_CALL(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800402}
403
deadbeef1a7162d2016-06-24 14:13:06 -0700404// Test that the sender is disconnected from the provider when its SSRC is
405// set to 0.
deadbeeffac06552015-11-25 11:26:01 -0800406TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
deadbeef1a7162d2016-06-24 14:13:06 -0700407 AddVideoTrack();
408 EXPECT_CALL(video_provider_,
409 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
410 rtc::scoped_refptr<VideoRtpSender> sender =
411 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
412 sender->SetSsrc(kVideoSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800413
deadbeef1a7162d2016-06-24 14:13:06 -0700414 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
415 .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_, SetVideoSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800421}
422
423TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
deadbeef1a7162d2016-06-24 14:13:06 -0700424 rtc::scoped_refptr<AudioTrackInterface> track =
425 AudioTrack::Create(kAudioTrackId, nullptr);
426 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
427 rtc::scoped_refptr<AudioRtpSender> sender =
428 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
429 sender->SetSsrc(kAudioSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800430
deadbeef1a7162d2016-06-24 14:13:06 -0700431 // Expect that SetAudioSend will be called before the reference to the track
432 // is released.
433 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, nullptr))
434 .Times(1)
435 .WillOnce(InvokeWithoutArgs([&track] {
436 EXPECT_LT(2, track->AddRef());
437 track->Release();
438 }));
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(audio_provider_, SetAudioSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800444}
445
446TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
deadbeef1a7162d2016-06-24 14:13:06 -0700447 rtc::scoped_refptr<VideoTrackSourceInterface> source(
448 FakeVideoTrackSource::Create());
449 rtc::scoped_refptr<VideoTrackInterface> track =
450 VideoTrack::Create(kVideoTrackId, source);
451 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _, track.get()));
452 rtc::scoped_refptr<VideoRtpSender> sender =
453 new VideoRtpSender(track, kStreamLabel1, &video_provider_);
454 sender->SetSsrc(kVideoSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800455
deadbeef1a7162d2016-06-24 14:13:06 -0700456 // Expect that SetVideoSend will be called before the reference to the track
457 // is released.
458 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
459 .Times(1)
460 .WillOnce(InvokeWithoutArgs([&track] {
461 EXPECT_LT(2, track->AddRef());
462 track->Release();
463 }));
464 EXPECT_TRUE(sender->SetTrack(nullptr));
465
466 // Make sure it's SetTrack that called methods on the provider, and not the
467 // destructor.
468 EXPECT_CALL(video_provider_, SetVideoSend(_, _, _, _)).Times(0);
deadbeeffac06552015-11-25 11:26:01 -0800469}
470
471TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
deadbeef1a7162d2016-06-24 14:13:06 -0700472 AddVideoTrack();
473 rtc::scoped_refptr<AudioTrackInterface> track =
474 AudioTrack::Create(kAudioTrackId, nullptr);
475 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
476 rtc::scoped_refptr<AudioRtpSender> sender =
477 new AudioRtpSender(track, kStreamLabel1, &audio_provider_, nullptr);
478 sender->SetSsrc(kAudioSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800479
deadbeef1a7162d2016-06-24 14:13:06 -0700480 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _)).Times(1);
481 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, true, _, _)).Times(1);
482 sender->SetSsrc(kAudioSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800483
deadbeef1a7162d2016-06-24 14:13:06 -0700484 // Calls expected from destructor.
485 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc2, false, _, _)).Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800486}
487
488TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
deadbeef1a7162d2016-06-24 14:13:06 -0700489 AddVideoTrack();
490 EXPECT_CALL(video_provider_,
491 SetVideoSend(kVideoSsrc, true, _, video_track_.get()));
492 rtc::scoped_refptr<VideoRtpSender> sender =
493 new VideoRtpSender(video_track_, kStreamLabel1, &video_provider_);
494 sender->SetSsrc(kVideoSsrc);
deadbeeffac06552015-11-25 11:26:01 -0800495
deadbeef1a7162d2016-06-24 14:13:06 -0700496 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _, nullptr))
497 .Times(1);
498 EXPECT_CALL(video_provider_,
499 SetVideoSend(kVideoSsrc2, true, _, video_track_.get()))
500 .Times(1);
501 sender->SetSsrc(kVideoSsrc2);
deadbeeffac06552015-11-25 11:26:01 -0800502
deadbeef1a7162d2016-06-24 14:13:06 -0700503 // Calls expected from destructor.
504 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc2, false, _, nullptr))
505 .Times(1);
deadbeeffac06552015-11-25 11:26:01 -0800506}
507
skvladdc1c62c2016-03-16 19:07:43 -0700508TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
509 CreateAudioRtpSender();
510
deadbeef1a7162d2016-06-24 14:13:06 -0700511 EXPECT_CALL(audio_provider_, GetAudioRtpSendParameters(kAudioSsrc))
512 .WillOnce(Return(RtpParameters()));
513 EXPECT_CALL(audio_provider_, SetAudioRtpSendParameters(kAudioSsrc, _))
514 .WillOnce(Return(true));
skvladdc1c62c2016-03-16 19:07:43 -0700515 RtpParameters params = audio_rtp_sender_->GetParameters();
516 EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
517
518 DestroyAudioRtpSender();
519}
520
521TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
522 CreateVideoRtpSender();
523
deadbeef1a7162d2016-06-24 14:13:06 -0700524 EXPECT_CALL(video_provider_, GetVideoRtpSendParameters(kVideoSsrc))
525 .WillOnce(Return(RtpParameters()));
526 EXPECT_CALL(video_provider_, SetVideoRtpSendParameters(kVideoSsrc, _))
527 .WillOnce(Return(true));
skvladdc1c62c2016-03-16 19:07:43 -0700528 RtpParameters params = video_rtp_sender_->GetParameters();
529 EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
530
531 DestroyVideoRtpSender();
532}
533
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700534TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
535 CreateAudioRtpReceiver();
536
deadbeef1a7162d2016-06-24 14:13:06 -0700537 EXPECT_CALL(audio_provider_, GetAudioRtpReceiveParameters(kAudioSsrc))
538 .WillOnce(Return(RtpParameters()));
539 EXPECT_CALL(audio_provider_, SetAudioRtpReceiveParameters(kAudioSsrc, _))
540 .WillOnce(Return(true));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700541 RtpParameters params = audio_rtp_receiver_->GetParameters();
542 EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
543
544 DestroyAudioRtpReceiver();
545}
546
547TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
548 CreateVideoRtpReceiver();
549
deadbeef1a7162d2016-06-24 14:13:06 -0700550 EXPECT_CALL(video_provider_, GetVideoRtpReceiveParameters(kVideoSsrc))
551 .WillOnce(Return(RtpParameters()));
552 EXPECT_CALL(video_provider_, SetVideoRtpReceiveParameters(kVideoSsrc, _))
553 .WillOnce(Return(true));
Taylor Brandstetterdb0cd9e2016-05-16 11:40:30 -0700554 RtpParameters params = video_rtp_receiver_->GetParameters();
555 EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
556
557 DestroyVideoRtpReceiver();
558}
559
deadbeef70ab1a12015-09-28 16:53:55 -0700560} // namespace webrtc