Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(113)

Side by Side Diff: content/browser/renderer_host/media/video_capture_manager_unittest.cc

Issue 9320070: Re-added OnChannelClosing in MediaStreamDispatcherHost to close open media devices. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Indentation after rebase. Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Unit test for VideoCaptureManager 5 // Unit test for VideoCaptureManager.
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/process_util.h" 12 #include "base/process_util.h"
13 #include "content/browser/browser_thread_impl.h" 13 #include "content/browser/browser_thread_impl.h"
14 #include "content/browser/renderer_host/media/media_stream_provider.h" 14 #include "content/browser/renderer_host/media/media_stream_provider.h"
15 #include "content/browser/renderer_host/media/video_capture_manager.h" 15 #include "content/browser/renderer_host/media/video_capture_manager.h"
16 #include "content/common/media/media_stream_options.h" 16 #include "content/common/media/media_stream_options.h"
17 #include "media/video/capture/video_capture_device.h" 17 #include "media/video/capture/video_capture_device.h"
18 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 20
21 using ::testing::_; 21 using ::testing::_;
22 using ::testing::AnyNumber; 22 using ::testing::AnyNumber;
23 using ::testing::InSequence; 23 using ::testing::InSequence;
24 using ::testing::Return; 24 using ::testing::Return;
25 using content::BrowserThread; 25 using content::BrowserThread;
26 26
27 using content::BrowserThreadImpl; 27 using content::BrowserThreadImpl;
28 28
29 namespace media_stream { 29 namespace media_stream {
30 30
31 // Listener class used to track progress of VideoCaptureManager test 31 // Listener class used to track progress of VideoCaptureManager test.
32 class MockMediaStreamProviderListener : public MediaStreamProviderListener { 32 class MockMediaStreamProviderListener : public MediaStreamProviderListener {
33 public: 33 public:
34 MockMediaStreamProviderListener() 34 MockMediaStreamProviderListener()
35 : devices_() { 35 : devices_() {
36 } 36 }
37 ~MockMediaStreamProviderListener() {} 37 ~MockMediaStreamProviderListener() {}
38 38
39 MOCK_METHOD2(Opened, void(MediaStreamType, int)); 39 MOCK_METHOD2(Opened, void(MediaStreamType, int));
40 MOCK_METHOD2(Closed, void(MediaStreamType, int)); 40 MOCK_METHOD2(Closed, void(MediaStreamType, int));
41 MOCK_METHOD1(DevicesEnumerated, void(const StreamDeviceInfoArray&)); 41 MOCK_METHOD1(DevicesEnumerated, void(const StreamDeviceInfoArray&));
(...skipping 11 matching lines...) Expand all
53 DevicesEnumerated(devices); 53 DevicesEnumerated(devices);
54 } 54 }
55 55
56 media_stream::StreamDeviceInfoArray devices_; 56 media_stream::StreamDeviceInfoArray devices_;
57 }; // class MockMediaStreamProviderListener 57 }; // class MockMediaStreamProviderListener
58 58
59 } // namespace media_stream 59 } // namespace media_stream
60 60
61 namespace { 61 namespace {
62 62
63 // Needed as an input argument to Start() 63 // Needed as an input argument to Start().
64 class MockFrameObserver: public media::VideoCaptureDevice::EventHandler { 64 class MockFrameObserver: public media::VideoCaptureDevice::EventHandler {
65 public: 65 public:
66 virtual void OnError() {} 66 virtual void OnError() {}
67 void OnFrameInfo(const media::VideoCaptureDevice::Capability& info) {} 67 void OnFrameInfo(const media::VideoCaptureDevice::Capability& info) {}
68 virtual void OnIncomingCapturedFrame(const uint8* data, int length, 68 virtual void OnIncomingCapturedFrame(const uint8* data, int length,
69 base::Time timestamp) {} 69 base::Time timestamp) {}
70 }; 70 };
71 71
72 // Test class 72 // Test class
73 class VideoCaptureManagerTest : public testing::Test { 73 class VideoCaptureManagerTest : public testing::Test {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 InSequence s; 138 InSequence s;
139 EXPECT_CALL(*listener_, DevicesEnumerated(_)) 139 EXPECT_CALL(*listener_, DevicesEnumerated(_))
140 .Times(1); 140 .Times(1);
141 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _)) 141 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
142 .Times(1); 142 .Times(1);
143 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _)) 143 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _))
144 .Times(1); 144 .Times(1);
145 145
146 vcm_->EnumerateDevices(); 146 vcm_->EnumerateDevices();
147 147
148 // Wait to get device callback... 148 // Wait to get device callback.
149 SyncWithVideoCaptureManagerThread(); 149 SyncWithVideoCaptureManagerThread();
150 150
151 int video_session_id = vcm_->Open(listener_->devices_.front()); 151 int video_session_id = vcm_->Open(listener_->devices_.front());
152 152
153 media::VideoCaptureParams capture_params; 153 media::VideoCaptureParams capture_params;
154 capture_params.session_id = video_session_id; 154 capture_params.session_id = video_session_id;
155 capture_params.width = 320; 155 capture_params.width = 320;
156 capture_params.height = 240; 156 capture_params.height = 240;
157 capture_params.frame_per_second = 30; 157 capture_params.frame_per_second = 30;
158 vcm_->Start(capture_params, frame_observer_.get()); 158 vcm_->Start(capture_params, frame_observer_.get());
159 159
160 vcm_->Stop(video_session_id, base::Closure()); 160 vcm_->Stop(video_session_id, base::Closure());
161 vcm_->Close(video_session_id); 161 vcm_->Close(video_session_id);
162 162
163 // Wait to check callbacks before removing the listener 163 // Wait to check callbacks before removing the listener.
164 SyncWithVideoCaptureManagerThread(); 164 SyncWithVideoCaptureManagerThread();
165 vcm_->Unregister(); 165 vcm_->Unregister();
166 } 166 }
167 167
168 // Open the same device twice. 168 // Open the same device twice.
169 TEST_F(VideoCaptureManagerTest, OpenTwice) { 169 TEST_F(VideoCaptureManagerTest, OpenTwice) {
170 InSequence s; 170 InSequence s;
171 EXPECT_CALL(*listener_, DevicesEnumerated(_)) 171 EXPECT_CALL(*listener_, DevicesEnumerated(_))
172 .Times(1); 172 .Times(1);
173 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _)) 173 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
174 .Times(2); 174 .Times(2);
175 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _)) 175 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _))
176 .Times(2); 176 .Times(2);
177 177
178 vcm_->EnumerateDevices(); 178 vcm_->EnumerateDevices();
179 179
180 // Wait to get device callback... 180 // Wait to get device callback.
181 SyncWithVideoCaptureManagerThread(); 181 SyncWithVideoCaptureManagerThread();
182 182
183 int video_session_id_first = vcm_->Open(listener_->devices_.front()); 183 int video_session_id_first = vcm_->Open(listener_->devices_.front());
184 184
185 // This should trigger an error callback with error code 'kDeviceAlreadyInUse' 185 // This should trigger an error callback with error code
186 // 'kDeviceAlreadyInUse'.
186 int video_session_id_second = vcm_->Open(listener_->devices_.front()); 187 int video_session_id_second = vcm_->Open(listener_->devices_.front());
187 EXPECT_NE(video_session_id_first, video_session_id_second); 188 EXPECT_NE(video_session_id_first, video_session_id_second);
188 189
189 vcm_->Close(video_session_id_first); 190 vcm_->Close(video_session_id_first);
190 vcm_->Close(video_session_id_second); 191 vcm_->Close(video_session_id_second);
191 192
192 // Wait to check callbacks before removing the listener 193 // Wait to check callbacks before removing the listener.
193 SyncWithVideoCaptureManagerThread(); 194 SyncWithVideoCaptureManagerThread();
194 vcm_->Unregister(); 195 vcm_->Unregister();
195 } 196 }
196 197
197 // Open two different devices. 198 // Open two different devices.
198 TEST_F(VideoCaptureManagerTest, OpenTwo) { 199 TEST_F(VideoCaptureManagerTest, OpenTwo) {
199 InSequence s; 200 InSequence s;
200 EXPECT_CALL(*listener_, DevicesEnumerated(_)) 201 EXPECT_CALL(*listener_, DevicesEnumerated(_))
201 .Times(1); 202 .Times(1);
202 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _)) 203 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
203 .Times(2); 204 .Times(2);
204 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _)) 205 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _))
205 .Times(2); 206 .Times(2);
206 207
207 vcm_->EnumerateDevices(); 208 vcm_->EnumerateDevices();
208 209
209 // Wait to get device callback... 210 // Wait to get device callback.
210 SyncWithVideoCaptureManagerThread(); 211 SyncWithVideoCaptureManagerThread();
211 212
212 media_stream::StreamDeviceInfoArray::iterator it = 213 media_stream::StreamDeviceInfoArray::iterator it =
213 listener_->devices_.begin(); 214 listener_->devices_.begin();
214 215
215 int video_session_id_first = vcm_->Open(*it); 216 int video_session_id_first = vcm_->Open(*it);
216 ++it; 217 ++it;
217 int video_session_id_second = vcm_->Open(*it); 218 int video_session_id_second = vcm_->Open(*it);
218 219
219 vcm_->Close(video_session_id_first); 220 vcm_->Close(video_session_id_first);
220 vcm_->Close(video_session_id_second); 221 vcm_->Close(video_session_id_second);
221 222
222 // Wait to check callbacks before removing the listener 223 // Wait to check callbacks before removing the listener.
223 SyncWithVideoCaptureManagerThread(); 224 SyncWithVideoCaptureManagerThread();
224 vcm_->Unregister(); 225 vcm_->Unregister();
225 } 226 }
226 227
227 // Try open a non-existing device. 228 // Try open a non-existing device.
228 TEST_F(VideoCaptureManagerTest, OpenNotExisting) { 229 TEST_F(VideoCaptureManagerTest, OpenNotExisting) {
229 InSequence s; 230 InSequence s;
230 EXPECT_CALL(*listener_, DevicesEnumerated(_)) 231 EXPECT_CALL(*listener_, DevicesEnumerated(_))
231 .Times(1); 232 .Times(1);
232 EXPECT_CALL(*listener_, Error(media_stream::kVideoCapture, _, 233 EXPECT_CALL(*listener_, Error(media_stream::kVideoCapture, _,
233 media_stream::kDeviceNotAvailable)) 234 media_stream::kDeviceNotAvailable))
234 .Times(1); 235 .Times(1);
235 236
236 vcm_->EnumerateDevices(); 237 vcm_->EnumerateDevices();
237 238
238 // Wait to get device callback... 239 // Wait to get device callback.
239 SyncWithVideoCaptureManagerThread(); 240 SyncWithVideoCaptureManagerThread();
240 241
241 media_stream::MediaStreamType stream_type = media_stream::kVideoCapture; 242 media_stream::MediaStreamType stream_type = media_stream::kVideoCapture;
242 std::string device_name("device_doesnt_exist"); 243 std::string device_name("device_doesnt_exist");
243 std::string device_id("id_doesnt_exist"); 244 std::string device_id("id_doesnt_exist");
244 media_stream::StreamDeviceInfo dummy_device(stream_type, device_name, 245 media_stream::StreamDeviceInfo dummy_device(stream_type, device_name,
245 device_id, false); 246 device_id, false);
246 247
247 // This should fail with error code 'kDeviceNotAvailable' 248 // This should fail with error code 'kDeviceNotAvailable'.
248 vcm_->Open(dummy_device); 249 vcm_->Open(dummy_device);
249 250
250 // Wait to check callbacks before removing the listener 251 // Wait to check callbacks before removing the listener.
251 SyncWithVideoCaptureManagerThread(); 252 SyncWithVideoCaptureManagerThread();
252 vcm_->Unregister(); 253 vcm_->Unregister();
253 } 254 }
254 255
255 // Start a device using "magic" id, i.e. call Start without calling Open. 256 // Start a device using "magic" id, i.e. call Start without calling Open.
256 TEST_F(VideoCaptureManagerTest, StartUsingId) { 257 TEST_F(VideoCaptureManagerTest, StartUsingId) {
257 InSequence s; 258 InSequence s;
258 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _)) 259 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
259 .Times(1); 260 .Times(1);
260 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _)) 261 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _))
261 .Times(1); 262 .Times(1);
262 263
263 media::VideoCaptureParams capture_params; 264 media::VideoCaptureParams capture_params;
264 capture_params.session_id = 265 capture_params.session_id =
265 media_stream::VideoCaptureManager::kStartOpenSessionId; 266 media_stream::VideoCaptureManager::kStartOpenSessionId;
266 capture_params.width = 320; 267 capture_params.width = 320;
267 capture_params.height = 240; 268 capture_params.height = 240;
268 capture_params.frame_per_second = 30; 269 capture_params.frame_per_second = 30;
269 // Start shall trigger the Open callback 270
271 // Start shall trigger the Open callback.
270 vcm_->Start(capture_params, frame_observer_.get()); 272 vcm_->Start(capture_params, frame_observer_.get());
271 273
272 // Stop shall trigger the Close callback 274 // Stop shall trigger the Close callback
273 vcm_->Stop(media_stream::VideoCaptureManager::kStartOpenSessionId, 275 vcm_->Stop(media_stream::VideoCaptureManager::kStartOpenSessionId,
274 base::Closure()); 276 base::Closure());
275 277
278 // Wait to check callbacks before removing the listener.
279 SyncWithVideoCaptureManagerThread();
280 vcm_->Unregister();
281 }
282
283 // Open and start a device, close it before calling Stop.
284 TEST_F(VideoCaptureManagerTest, CloseWithoutStop) {
285 InSequence s;
286 EXPECT_CALL(*listener_, DevicesEnumerated(_))
287 .Times(1);
tommi (sloooow) - chröme 2012/02/23 10:03:22 indent is off here and below. should be EXPECT_CA
288 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
289 .Times(1);
290 EXPECT_CALL(*listener_, Closed(media_stream::kVideoCapture, _))
291 .Times(1);
292
293 vcm_->EnumerateDevices();
294
295 // Wait to get device callback.
296 SyncWithVideoCaptureManagerThread();
297
298 int video_session_id = vcm_->Open(listener_->devices_.front());
299
300 media::VideoCaptureParams capture_params;
301 capture_params.session_id = video_session_id;
302 capture_params.width = 320;
303 capture_params.height = 240;
304 capture_params.frame_per_second = 30;
305 vcm_->Start(capture_params, frame_observer_.get());
306
307 // Close will stop the running device, an assert will be triggered in
308 // VideoCaptureManager destructor otherwise.
309 vcm_->Close(video_session_id);
310 vcm_->Stop(video_session_id, base::Closure());
311
276 // Wait to check callbacks before removing the listener 312 // Wait to check callbacks before removing the listener
277 SyncWithVideoCaptureManagerThread(); 313 SyncWithVideoCaptureManagerThread();
278 vcm_->Unregister(); 314 vcm_->Unregister();
279 } 315 }
280 316
281 // TODO(mflodman) Remove test case below when shut-down bug is resolved, this is
282 // only to verify this temporary solution is ok in regards to the
283 // VideoCaptureManager.
284 // Open the devices and delete manager.
285 TEST_F(VideoCaptureManagerTest, DeleteManager) {
286 InSequence s;
287 EXPECT_CALL(*listener_, DevicesEnumerated(_))
288 .Times(1);
289 EXPECT_CALL(*listener_, Opened(media_stream::kVideoCapture, _))
290 .Times(2);
291
292 vcm_->EnumerateDevices();
293
294 // Wait to get device callback...
295 SyncWithVideoCaptureManagerThread();
296
297 media_stream::StreamDeviceInfoArray::iterator it =
298 listener_->devices_.begin();
299 vcm_->Open(*it);
300 ++it;
301 vcm_->Open(*it);
302
303 // Wait to check callbacks before removing the listener
304 SyncWithVideoCaptureManagerThread();
305
306 // Delete the manager.
307 vcm_.reset();
308 }
309
310 } // namespace 317 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698