Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |