blob: 6eedb7e89e7ec0cc40f20d12be09fd55e53d6c06 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
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:36 +000033#include "talk/app/webrtc/mediastream.h"
wu@webrtc.orgb9a088b2014-02-13 23:18:49 +000034#include "talk/app/webrtc/remoteaudiosource.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000035#include "talk/app/webrtc/streamcollection.h"
wu@webrtc.org967bfff2013-09-19 05:49:50 +000036#include "talk/app/webrtc/videosource.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000037#include "talk/app/webrtc/videotrack.h"
38#include "talk/base/gunit.h"
39#include "talk/media/base/fakevideocapturer.h"
40#include "talk/media/base/mediachannel.h"
41#include "testing/base/public/gmock.h"
42
43using ::testing::_;
44using ::testing::Exactly;
45
46static const char kStreamLabel1[] = "local_stream_1";
47static const char kVideoTrackId[] = "video_1";
48static const char kAudioTrackId[] = "audio_1";
49static const uint32 kVideoSsrc = 98;
50static const uint32 kAudioSsrc = 99;
51
52namespace webrtc {
53
54// Helper class to test MediaStreamHandler.
55class MockAudioProvider : public AudioProviderInterface {
56 public:
57 virtual ~MockAudioProvider() {}
henrike@webrtc.org1e09a712013-07-26 19:17:59 +000058 MOCK_METHOD3(SetAudioPlayout, void(uint32 ssrc, bool enable,
59 cricket::AudioRenderer* renderer));
60 MOCK_METHOD4(SetAudioSend, void(uint32 ssrc, bool enable,
61 const cricket::AudioOptions& options,
62 cricket::AudioRenderer* renderer));
wu@webrtc.orgb9a088b2014-02-13 23:18:49 +000063 MOCK_METHOD2(SetAudioPlayoutVolume, void(uint32 ssrc, double volume));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064};
65
66// Helper class to test MediaStreamHandler.
67class MockVideoProvider : public VideoProviderInterface {
68 public:
69 virtual ~MockVideoProvider() {}
70 MOCK_METHOD2(SetCaptureDevice, bool(uint32 ssrc,
71 cricket::VideoCapturer* camera));
72 MOCK_METHOD3(SetVideoPlayout, void(uint32 ssrc,
73 bool enable,
74 cricket::VideoRenderer* renderer));
75 MOCK_METHOD3(SetVideoSend, void(uint32 ssrc, bool enable,
76 const cricket::VideoOptions* options));
77};
78
79class FakeVideoSource : public Notifier<VideoSourceInterface> {
80 public:
81 static talk_base::scoped_refptr<FakeVideoSource> Create() {
82 return new talk_base::RefCountedObject<FakeVideoSource>();
83 }
84 virtual cricket::VideoCapturer* GetVideoCapturer() {
85 return &fake_capturer_;
86 }
87 virtual void AddSink(cricket::VideoRenderer* output) {}
88 virtual void RemoveSink(cricket::VideoRenderer* output) {}
89 virtual SourceState state() const { return state_; }
90 virtual const cricket::VideoOptions* options() const { return &options_; }
wu@webrtc.org967bfff2013-09-19 05:49:50 +000091 virtual cricket::VideoRenderer* FrameInput() { return NULL; }
henrike@webrtc.org28e20752013-07-10 00:45:36 +000092
93 protected:
94 FakeVideoSource() : state_(kLive) {}
95 ~FakeVideoSource() {}
96
97 private:
98 cricket::FakeVideoCapturer fake_capturer_;
99 SourceState state_;
100 cricket::VideoOptions options_;
101};
102
103class MediaStreamHandlerTest : public testing::Test {
104 public:
105 MediaStreamHandlerTest()
106 : handlers_(&audio_provider_, &video_provider_) {
107 }
108
109 virtual void SetUp() {
110 stream_ = MediaStream::Create(kStreamLabel1);
111 talk_base::scoped_refptr<VideoSourceInterface> source(
112 FakeVideoSource::Create());
113 video_track_ = VideoTrack::Create(kVideoTrackId, source);
114 EXPECT_TRUE(stream_->AddTrack(video_track_));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 }
116
117 void AddLocalAudioTrack() {
wu@webrtc.orgb9a088b2014-02-13 23:18:49 +0000118 audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
119 EXPECT_TRUE(stream_->AddTrack(audio_track_));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000120 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121 handlers_.AddLocalAudioTrack(stream_, stream_->GetAudioTracks()[0],
122 kAudioSsrc);
123 }
124
125 void AddLocalVideoTrack() {
126 EXPECT_CALL(video_provider_, SetCaptureDevice(
127 kVideoSsrc, video_track_->GetSource()->GetVideoCapturer()));
128 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
129 handlers_.AddLocalVideoTrack(stream_, stream_->GetVideoTracks()[0],
130 kVideoSsrc);
131 }
132
133 void RemoveLocalAudioTrack() {
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000134 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000135 .Times(1);
136 handlers_.RemoveLocalTrack(stream_, audio_track_);
137 }
138
139 void RemoveLocalVideoTrack() {
140 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL))
141 .Times(1);
142 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _))
143 .Times(1);
144 handlers_.RemoveLocalTrack(stream_, video_track_);
145 }
146
147 void AddRemoteAudioTrack() {
wu@webrtc.orgb9a088b2014-02-13 23:18:49 +0000148 audio_track_ = AudioTrack::Create(kAudioTrackId,
149 RemoteAudioSource::Create().get());
150 EXPECT_TRUE(stream_->AddTrack(audio_track_));
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000151 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000152 handlers_.AddRemoteAudioTrack(stream_, stream_->GetAudioTracks()[0],
153 kAudioSsrc);
154 }
155
156 void AddRemoteVideoTrack() {
wu@webrtc.org967bfff2013-09-19 05:49:50 +0000157 EXPECT_CALL(video_provider_, SetVideoPlayout(
158 kVideoSsrc, true, video_track_->GetSource()->FrameInput()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000159 handlers_.AddRemoteVideoTrack(stream_, stream_->GetVideoTracks()[0],
160 kVideoSsrc);
161 }
162
163 void RemoveRemoteAudioTrack() {
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000164 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000165 handlers_.RemoveRemoteTrack(stream_, stream_->GetAudioTracks()[0]);
166 }
167
168 void RemoveRemoteVideoTrack() {
169 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL));
170 handlers_.RemoveRemoteTrack(stream_, stream_->GetVideoTracks()[0]);
171 }
172
173 protected:
174 MockAudioProvider audio_provider_;
175 MockVideoProvider video_provider_;
176 MediaStreamHandlerContainer handlers_;
177 talk_base::scoped_refptr<MediaStreamInterface> stream_;
178 talk_base::scoped_refptr<VideoTrackInterface> video_track_;
179 talk_base::scoped_refptr<AudioTrackInterface> audio_track_;
180};
181
182// Test that |audio_provider_| is notified when an audio track is associated
183// and disassociated with a MediaStreamHandler.
184TEST_F(MediaStreamHandlerTest, AddAndRemoveLocalAudioTrack) {
185 AddLocalAudioTrack();
186 RemoveLocalAudioTrack();
187
188 handlers_.RemoveLocalStream(stream_);
189}
190
191// Test that |video_provider_| is notified when a video track is associated and
192// disassociated with a MediaStreamHandler.
193TEST_F(MediaStreamHandlerTest, AddAndRemoveLocalVideoTrack) {
194 AddLocalVideoTrack();
195 RemoveLocalVideoTrack();
196
197 handlers_.RemoveLocalStream(stream_);
198}
199
200// Test that |video_provider_| and |audio_provider_| is notified when an audio
201// and video track is disassociated with a MediaStreamHandler by calling
202// RemoveLocalStream.
203TEST_F(MediaStreamHandlerTest, RemoveLocalStream) {
204 AddLocalAudioTrack();
205 AddLocalVideoTrack();
206
207 EXPECT_CALL(video_provider_, SetCaptureDevice(kVideoSsrc, NULL))
208 .Times(1);
209 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _))
210 .Times(1);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000211 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _))
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000212 .Times(1);
213 handlers_.RemoveLocalStream(stream_);
214}
215
216
217// Test that |audio_provider_| is notified when a remote audio and track is
218// associated and disassociated with a MediaStreamHandler.
219TEST_F(MediaStreamHandlerTest, AddAndRemoveRemoteAudioTrack) {
220 AddRemoteAudioTrack();
221 RemoveRemoteAudioTrack();
222
223 handlers_.RemoveRemoteStream(stream_);
224}
225
226// Test that |video_provider_| is notified when a remote
227// video track is associated and disassociated with a MediaStreamHandler.
228TEST_F(MediaStreamHandlerTest, AddAndRemoveRemoteVideoTrack) {
229 AddRemoteVideoTrack();
230 RemoveRemoteVideoTrack();
231
232 handlers_.RemoveRemoteStream(stream_);
233}
234
235// Test that |audio_provider_| and |video_provider_| is notified when an audio
236// and video track is disassociated with a MediaStreamHandler by calling
237// RemoveRemoveStream.
238TEST_F(MediaStreamHandlerTest, RemoveRemoteStream) {
239 AddRemoteAudioTrack();
240 AddRemoteVideoTrack();
241
242 EXPECT_CALL(video_provider_, SetVideoPlayout(kVideoSsrc, false, NULL))
243 .Times(1);
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000244 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _))
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000245 .Times(1);
246 handlers_.RemoveRemoteStream(stream_);
247}
248
249TEST_F(MediaStreamHandlerTest, LocalAudioTrackDisable) {
250 AddLocalAudioTrack();
251
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000252 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, false, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000253 audio_track_->set_enabled(false);
254
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000255 EXPECT_CALL(audio_provider_, SetAudioSend(kAudioSsrc, true, _, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000256 audio_track_->set_enabled(true);
257
258 RemoveLocalAudioTrack();
259 handlers_.TearDown();
260}
261
262TEST_F(MediaStreamHandlerTest, RemoteAudioTrackDisable) {
263 AddRemoteAudioTrack();
264
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000265 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000266 audio_track_->set_enabled(false);
267
henrike@webrtc.org1e09a712013-07-26 19:17:59 +0000268 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000269 audio_track_->set_enabled(true);
270
271 RemoveRemoteAudioTrack();
272 handlers_.TearDown();
273}
274
275TEST_F(MediaStreamHandlerTest, LocalVideoTrackDisable) {
276 AddLocalVideoTrack();
277
278 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, false, _));
279 video_track_->set_enabled(false);
280
281 EXPECT_CALL(video_provider_, SetVideoSend(kVideoSsrc, true, _));
282 video_track_->set_enabled(true);
283
284 RemoveLocalVideoTrack();
285 handlers_.TearDown();
286}
287
288TEST_F(MediaStreamHandlerTest, RemoteVideoTrackDisable) {
289 AddRemoteVideoTrack();
290
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000291 video_track_->set_enabled(false);
292
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000293 video_track_->set_enabled(true);
294
295 RemoveRemoteVideoTrack();
296 handlers_.TearDown();
297}
298
wu@webrtc.orgb9a088b2014-02-13 23:18:49 +0000299TEST_F(MediaStreamHandlerTest, RemoteAudioTrackSetVolume) {
300 AddRemoteAudioTrack();
301
302 double volume = 0.5;
303 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, volume));
304 audio_track_->GetSource()->SetVolume(volume);
305
306 // Disable the audio track, this should prevent setting the volume.
307 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, false, _));
308 audio_track_->set_enabled(false);
309 audio_track_->GetSource()->SetVolume(1.0);
310
311 EXPECT_CALL(audio_provider_, SetAudioPlayout(kAudioSsrc, true, _));
312 audio_track_->set_enabled(true);
313
314 double new_volume = 0.8;
315 EXPECT_CALL(audio_provider_, SetAudioPlayoutVolume(kAudioSsrc, new_volume));
316 audio_track_->GetSource()->SetVolume(new_volume);
317
318 RemoveRemoteAudioTrack();
319 handlers_.TearDown();
320}
321
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000322} // namespace webrtc