blob: 61dbfe05166efed630b3005863e77d22ed4f87cb [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:361/*
2 * libjingle
3 * Copyright 2012, Google Inc.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include "talk/app/webrtc/mediastreamhandler.h"
29
30#include <string>
31
32#include "talk/app/webrtc/audiotrack.h"
henrike@webrtc.org28e20752013-07-10 00:45:3633#include "talk/app/webrtc/mediastream.h"
wu@webrtc.orgb9a088b2014-02-13 23:18:4934#include "talk/app/webrtc/remoteaudiosource.h"
henrike@webrtc.org28e20752013-07-10 00:45:3635#include "talk/app/webrtc/streamcollection.h"
wu@webrtc.org967bfff2013-09-19 05:49:5036#include "talk/app/webrtc/videosource.h"
henrike@webrtc.org28e20752013-07-10 00:45:3637#include "talk/app/webrtc/videotrack.h"
henrike@webrtc.org28e20752013-07-10 00:45:3638#include "talk/media/base/fakevideocapturer.h"
39#include "talk/media/base/mediachannel.h"
xians@webrtc.org4cb01282014-06-12 14:57:0540#include "testing/gmock/include/gmock/gmock.h"
41#include "testing/gtest/include/gtest/gtest.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:0842#include "webrtc/base/gunit.h"
henrike@webrtc.org28e20752013-07-10 00:45:3643
44using ::testing::_;
45using ::testing::Exactly;
46
47static const char kStreamLabel1[] = "local_stream_1";
48static const char kVideoTrackId[] = "video_1";
49static const char kAudioTrackId[] = "audio_1";
50static const uint32 kVideoSsrc = 98;
51static const uint32 kAudioSsrc = 99;
52
53namespace webrtc {
54
55// Helper class to test MediaStreamHandler.
56class MockAudioProvider : public AudioProviderInterface {
57 public:
58 virtual ~MockAudioProvider() {}
henrike@webrtc.org1e09a712013-07-26 19:17:5959 MOCK_METHOD3(SetAudioPlayout, void(uint32 ssrc, bool enable,
60 cricket::AudioRenderer* renderer));
61 MOCK_METHOD4(SetAudioSend, void(uint32 ssrc, bool enable,
62 const cricket::AudioOptions& options,
63 cricket::AudioRenderer* renderer));
wu@webrtc.orgb9a088b2014-02-13 23:18:4964 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32 ssrc, double volume));
henrike@webrtc.org28e20752013-07-10 00:45:3665};
66
67// Helper class to test MediaStreamHandler.
68class MockVideoProvider : public VideoProviderInterface {
69 public:
70 virtual ~MockVideoProvider() {}
71 MOCK_METHOD2(SetCaptureDevice, bool(uint32 ssrc,
72 cricket::VideoCapturer* camera));
73 MOCK_METHOD3(SetVideoPlayout, void(uint32 ssrc,
74 bool enable,
75 cricket::VideoRenderer* renderer));
76 MOCK_METHOD3(SetVideoSend, void(uint32 ssrc, bool enable,
77 const cricket::VideoOptions* options));
78};
79
80class FakeVideoSource : public Notifier<VideoSourceInterface> {
81 public:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:5282 static rtc::scoped_refptr<FakeVideoSource> Create() {
83 return new rtc::RefCountedObject<FakeVideoSource>();
henrike@webrtc.org28e20752013-07-10 00:45:3684 }
85 virtual cricket::VideoCapturer* GetVideoCapturer() {
86 return &fake_capturer_;
87 }
88 virtual void AddSink(cricket::VideoRenderer* output) {}
89 virtual void RemoveSink(cricket::VideoRenderer* output) {}
90 virtual SourceState state() const { return state_; }
91 virtual const cricket::VideoOptions* options() const { return &options_; }
wu@webrtc.org967bfff2013-09-19 05:49:5092 virtual cricket::VideoRenderer* FrameInput() { return NULL; }
henrike@webrtc.org28e20752013-07-10 00:45:3693
94 protected:
95 FakeVideoSource() : state_(kLive) {}
96 ~FakeVideoSource() {}
97
98 private:
99 cricket::FakeVideoCapturer fake_capturer_;
100 SourceState state_;
101 cricket::VideoOptions options_;
102};
103
104class MediaStreamHandlerTest : public testing::Test {
105 public:
106 MediaStreamHandlerTest()
107 : handlers_(&audio_provider_, &video_provider_) {
108 }
109
110 virtual void SetUp() {
111 stream_ = MediaStream::Create(kStreamLabel1);
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52112 rtc::scoped_refptr<VideoSourceInterface> source(
henrike@webrtc.org28e20752013-07-10 00:45:36113 FakeVideoSource::Create());
114 video_track_ = VideoTrack::Create(kVideoTrackId, source);
115 EXPECT_TRUE(stream_->AddTrack(video_track_));
henrike@webrtc.org28e20752013-07-10 00:45:36116 }
117
118 void AddLocalAudioTrack() {
wu@webrtc.orgb9a088b2014-02-13 23:18:49119 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
120 EXPECT_TRUE(stream_->AddTrack(audio_track_));
henrike@webrtc.org1e09a712013-07-26 19:17:59121 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36122 handlers_.AddLocalAudioTrack(stream_, stream_->GetAudioTracks()[0],
123 kAudioSsrc);
124 }
125
126 void AddLocalVideoTrack() {
127 EXPECT_CALL(video_provider_, SetCaptureDevice(
128 kVideoSsrc, video_track_->GetSource()->GetVideoCapturer()));
129 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
130 handlers_.AddLocalVideoTrack(stream_, stream_->GetVideoTracks()[0],
131 kVideoSsrc);
132 }
133
134 void RemoveLocalAudioTrack() {
henrike@webrtc.org1e09a712013-07-26 19:17:59135 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
henrike@webrtc.org28e20752013-07-10 00:45:36136 .Times(1);
137 handlers_.RemoveLocalTrack(stream_, audio_track_);
138 }
139
140 void RemoveLocalVideoTrack() {
141 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL))
142 .Times(1);
143 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _))
144 .Times(1);
145 handlers_.RemoveLocalTrack(stream_, video_track_);
146 }
147
148 void AddRemoteAudioTrack() {
wu@webrtc.orgb9a088b2014-02-13 23:18:49149 audio_track_ = AudioTrack::Create(kAudioTrackId,
150 RemoteAudioSource::Create().get());
151 EXPECT_TRUE(stream_->AddTrack(audio_track_));
henrike@webrtc.org1e09a712013-07-26 19:17:59152 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
henrike@webrtc.org28e20752013-07-10 00:45:36153 handlers_.AddRemoteAudioTrack(stream_, stream_->GetAudioTracks()[0],
154 kAudioSsrc);
155 }
156
157 void AddRemoteVideoTrack() {
wu@webrtc.org967bfff2013-09-19 05:49:50158 EXPECT_CALL(video_provider_, SetVideoPlayout(
159 kVideoSsrc, true, video_track_->GetSource()->FrameInput()));
henrike@webrtc.org28e20752013-07-10 00:45:36160 handlers_.AddRemoteVideoTrack(stream_, stream_->GetVideoTracks()[0],
161 kVideoSsrc);
162 }
163
164 void RemoveRemoteAudioTrack() {
henrike@webrtc.org1e09a712013-07-26 19:17:59165 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
henrike@webrtc.org28e20752013-07-10 00:45:36166 handlers_.RemoveRemoteTrack(stream_, stream_->GetAudioTracks()[0]);
167 }
168
169 void RemoveRemoteVideoTrack() {
170 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
171 handlers_.RemoveRemoteTrack(stream_, stream_->GetVideoTracks()[0]);
172 }
173
174 protected:
175 MockAudioProvider audio_provider_;
176 MockVideoProvider video_provider_;
177 MediaStreamHandlerContainer handlers_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52178 rtc::scoped_refptr<MediaStreamInterface> stream_;
179 rtc::scoped_refptr<VideoTrackInterface> video_track_;
180 rtc::scoped_refptr<AudioTrackInterface> audio_track_;
henrike@webrtc.org28e20752013-07-10 00:45:36181};
182
183// Test that |audio_provider_| is notified when an audio track is associated
184// and disassociated with a MediaStreamHandler.
185TEST_F(MediaStreamHandlerTest, AddAndRemoveLocalAudioTrack) {
186 AddLocalAudioTrack();
187 RemoveLocalAudioTrack();
188
189 handlers_.RemoveLocalStream(stream_);
190}
191
192// Test that |video_provider_| is notified when a video track is associated and
193// disassociated with a MediaStreamHandler.
194TEST_F(MediaStreamHandlerTest, AddAndRemoveLocalVideoTrack) {
195 AddLocalVideoTrack();
196 RemoveLocalVideoTrack();
197
198 handlers_.RemoveLocalStream(stream_);
199}
200
201// Test that |video_provider_| and |audio_provider_| is notified when an audio
202// and video track is disassociated with a MediaStreamHandler by calling
203// RemoveLocalStream.
204TEST_F(MediaStreamHandlerTest, RemoveLocalStream) {
205 AddLocalAudioTrack();
206 AddLocalVideoTrack();
207
208 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL))
209 .Times(1);
210 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _))
211 .Times(1);
henrike@webrtc.org1e09a712013-07-26 19:17:59212 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
henrike@webrtc.org28e20752013-07-10 00:45:36213 .Times(1);
214 handlers_.RemoveLocalStream(stream_);
215}
216
217
218// Test that |audio_provider_| is notified when a remote audio and track is
219// associated and disassociated with a MediaStreamHandler.
220TEST_F(MediaStreamHandlerTest, AddAndRemoveRemoteAudioTrack) {
221 AddRemoteAudioTrack();
222 RemoveRemoteAudioTrack();
223
224 handlers_.RemoveRemoteStream(stream_);
225}
226
227// Test that |video_provider_| is notified when a remote
228// video track is associated and disassociated with a MediaStreamHandler.
229TEST_F(MediaStreamHandlerTest, AddAndRemoveRemoteVideoTrack) {
230 AddRemoteVideoTrack();
231 RemoveRemoteVideoTrack();
232
233 handlers_.RemoveRemoteStream(stream_);
234}
235
236// Test that |audio_provider_| and |video_provider_| is notified when an audio
237// and video track is disassociated with a MediaStreamHandler by calling
238// RemoveRemoveStream.
239TEST_F(MediaStreamHandlerTest, RemoveRemoteStream) {
240 AddRemoteAudioTrack();
241 AddRemoteVideoTrack();
242
243 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL))
244 .Times(1);
henrike@webrtc.org1e09a712013-07-26 19:17:59245 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _))
henrike@webrtc.org28e20752013-07-10 00:45:36246 .Times(1);
247 handlers_.RemoveRemoteStream(stream_);
248}
249
250TEST_F(MediaStreamHandlerTest, LocalAudioTrackDisable) {
251 AddLocalAudioTrack();
252
henrike@webrtc.org1e09a712013-07-26 19:17:59253 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36254 audio_track_->set_enabled(false);
255
henrike@webrtc.org1e09a712013-07-26 19:17:59256 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36257 audio_track_->set_enabled(true);
258
259 RemoveLocalAudioTrack();
260 handlers_.TearDown();
261}
262
263TEST_F(MediaStreamHandlerTest, RemoteAudioTrackDisable) {
264 AddRemoteAudioTrack();
265
henrike@webrtc.org1e09a712013-07-26 19:17:59266 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
henrike@webrtc.org28e20752013-07-10 00:45:36267 audio_track_->set_enabled(false);
268
henrike@webrtc.org1e09a712013-07-26 19:17:59269 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
henrike@webrtc.org28e20752013-07-10 00:45:36270 audio_track_->set_enabled(true);
271
272 RemoveRemoteAudioTrack();
273 handlers_.TearDown();
274}
275
276TEST_F(MediaStreamHandlerTest, LocalVideoTrackDisable) {
277 AddLocalVideoTrack();
278
279 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
280 video_track_->set_enabled(false);
281
282 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
283 video_track_->set_enabled(true);
284
285 RemoveLocalVideoTrack();
286 handlers_.TearDown();
287}
288
289TEST_F(MediaStreamHandlerTest, RemoteVideoTrackDisable) {
290 AddRemoteVideoTrack();
291
henrike@webrtc.org28e20752013-07-10 00:45:36292 video_track_->set_enabled(false);
293
henrike@webrtc.org28e20752013-07-10 00:45:36294 video_track_->set_enabled(true);
295
296 RemoveRemoteVideoTrack();
297 handlers_.TearDown();
298}
299
wu@webrtc.orgb9a088b2014-02-13 23:18:49300TEST_F(MediaStreamHandlerTest, RemoteAudioTrackSetVolume) {
301 AddRemoteAudioTrack();
302
303 double volume = 0.5;
304 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
305 audio_track_->GetSource()->SetVolume(volume);
306
307 // Disable the audio track, this should prevent setting the volume.
308 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
309 audio_track_->set_enabled(false);
310 audio_track_->GetSource()->SetVolume(1.0);
311
312 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
313 audio_track_->set_enabled(true);
314
315 double new_volume = 0.8;
316 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
317 audio_track_->GetSource()->SetVolume(new_volume);
318
319 RemoveRemoteAudioTrack();
320 handlers_.TearDown();
321}
322
henrike@webrtc.org28e20752013-07-10 00:45:36323} // namespace webrtc