Index: media/video/capture/video_capture_device_unittest.cc |
=================================================================== |
--- media/video/capture/video_capture_device_unittest.cc (revision 0) |
+++ media/video/capture/video_capture_device_unittest.cc (revision 0) |
@@ -0,0 +1,261 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "base/threading/thread.h" |
+#include "media/video/capture/fake_video_capture_device.h" |
+#include "media/video/capture/video_capture_device.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using ::testing::_; |
+using ::testing::AnyNumber; |
+using ::testing::Return; |
+using ::testing::AtLeast; |
+ |
+namespace media { |
+const int kWaitTime = 3000; |
+ |
+class MockFrameObserver: public media::VideoCaptureDevice::EventHandler { |
+ public: |
+ MOCK_METHOD0(OnErr, void()); |
+ MOCK_METHOD3(OnFrameInfo, void(int width, int height, int frame_rate)); |
+ |
+ explicit MockFrameObserver(base::WaitableEvent* wait_event) |
+ : wait_event_(wait_event) {} |
+ |
+ virtual void OnError() OVERRIDE { |
+ OnErr(); |
+ } |
+ |
+ virtual void OnFrameInfo( |
+ const VideoCaptureDevice::Capability& info) OVERRIDE { |
+ OnFrameInfo(info.width, info.height, info.frame_rate); |
+ } |
+ |
+ virtual void OnIncomingCapturedFrame(const uint8* data, int length, |
+ base::Time timestamp) OVERRIDE { |
+ wait_event_->Signal(); |
+ } |
+ |
+ private: |
+ base::WaitableEvent* wait_event_; |
+}; |
+ |
+class VideoCaptureDeviceTest : public testing::Test { |
+ public: |
+ VideoCaptureDeviceTest(): wait_event_(false, false) { } |
+ |
+ protected: |
+ virtual void SetUp() { |
+ frame_observer_.reset(new MockFrameObserver(&wait_event_)); |
+ } |
+ |
+ virtual void TearDown() { |
+ } |
+ |
+ base::WaitableEvent wait_event_; |
+ scoped_ptr<MockFrameObserver> frame_observer_; |
+ VideoCaptureDevice::Names names_; |
+}; |
+ |
+TEST_F(VideoCaptureDeviceTest, OpenInvalidDevice) { |
+ VideoCaptureDevice::Name device_name; |
+ device_name.device_name = "jibberish"; |
+ device_name.unique_id = "jibberish"; |
+ VideoCaptureDevice* device = VideoCaptureDevice::Create(device_name); |
+ EXPECT_TRUE(device == NULL); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, CaptureVGA) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ // Make sure there are more than 0 cameras. |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ |
+ scoped_ptr<VideoCaptureDevice> device( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_FALSE(device.get() == NULL); |
+ |
+ // Get info about the new resolution. |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480, 30)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ |
+ device->Allocate(640, 480, 30, frame_observer_.get()); |
+ device->Start(); |
+ // Wait for 3s or for captured frame. |
+ EXPECT_TRUE(wait_event_.TimedWait( |
+ base::TimeDelta::FromMilliseconds(kWaitTime))); |
+ device->Stop(); |
+ device->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, Capture720p) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ // Make sure there are more than 0 cameras. |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ |
+ scoped_ptr<VideoCaptureDevice> device( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_FALSE(device.get() == NULL); |
+ |
+ // Get info about the new resolution. |
+ // We don't care about the resulting resolution or frame rate as it might |
+ // be different from one machine to the next. |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(_, _, _)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ |
+ device->Allocate(1280, 720, 30, frame_observer_.get()); |
+ device->Start(); |
+ // Get captured video frames. |
+ EXPECT_TRUE(wait_event_.TimedWait( |
+ base::TimeDelta::FromMilliseconds(kWaitTime))); |
+ device->Stop(); |
+ device->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, AllocateSameCameraTwice) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ scoped_ptr<VideoCaptureDevice> device1( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_TRUE(device1.get() != NULL); |
+ |
+ scoped_ptr<VideoCaptureDevice> device2( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_TRUE(device2.get() != NULL); |
+ |
+ // 1. Get info about the new resolution on the first allocated camera |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480, 30)); |
+ |
+ device1->Allocate(640, 480, 30, frame_observer_.get()); |
+ |
+ // 2. Error when trying to allocate the same camera again. |
+ EXPECT_CALL(*frame_observer_, OnErr()); |
+ device2->Allocate(640, 480, 30, frame_observer_.get()); |
+ |
+ device1->DeAllocate(); |
+ device2->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, AllocateBadSize) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ scoped_ptr<VideoCaptureDevice> device( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_TRUE(device.get() != NULL); |
+ |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ |
+ // get info about the new resolution |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480 , _)) |
+ .Times(AtLeast(1)); |
+ |
+ device->Allocate(637, 472, 35, frame_observer_.get()); |
+ device->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, ReAllocateCamera) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ scoped_ptr<VideoCaptureDevice> device( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_TRUE(device.get() != NULL); |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ // get info about the new resolution |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480, _)); |
+ |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(320, 240, _)); |
+ |
+ device->Allocate(640, 480, 30, frame_observer_.get()); |
+ device->Start(); |
+ // Nothing shall happen. |
+ device->Allocate(1280, 1024, 30, frame_observer_.get()); |
+ device->DeAllocate(); |
+ // Allocate new size 320, 240 |
+ device->Allocate(320, 240, 30, frame_observer_.get()); |
+ |
+ device->Start(); |
+ // Get captured video frames. |
+ EXPECT_TRUE(wait_event_.TimedWait( |
+ base::TimeDelta::FromMilliseconds(kWaitTime))); |
+ device->Stop(); |
+ device->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, DeAllocateCameraWhileRunning) { |
+ VideoCaptureDevice::GetDeviceNames(&names_); |
+ if (!names_.size()) { |
+ LOG(WARNING) << "No camera available. Exiting test."; |
+ return; |
+ } |
+ scoped_ptr<VideoCaptureDevice> device( |
+ VideoCaptureDevice::Create(names_.front())); |
+ ASSERT_TRUE(device.get() != NULL); |
+ |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ // Get info about the new resolution. |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480, 30)); |
+ |
+ device->Allocate(640, 480, 30, frame_observer_.get()); |
+ |
+ device->Start(); |
+ // Get captured video frames. |
+ EXPECT_TRUE(wait_event_.TimedWait( |
+ base::TimeDelta::FromMilliseconds(kWaitTime))); |
+ device->DeAllocate(); |
+} |
+ |
+TEST_F(VideoCaptureDeviceTest, TestFakeCapture) { |
+ VideoCaptureDevice::Names names; |
+ |
+ FakeVideoCaptureDevice::GetDeviceNames(&names); |
+ |
+ ASSERT_GT(static_cast<int>(names.size()), 0); |
+ |
+ scoped_ptr<VideoCaptureDevice> device( |
+ FakeVideoCaptureDevice::Create(names.front())); |
+ ASSERT_TRUE(device.get() != NULL); |
+ |
+ // Get info about the new resolution. |
+ EXPECT_CALL(*frame_observer_, OnFrameInfo(640, 480, 30)) |
+ .Times(1); |
+ |
+ EXPECT_CALL(*frame_observer_, OnErr()) |
+ .Times(0); |
+ |
+ device->Allocate(640, 480, 30, frame_observer_.get()); |
+ |
+ device->Start(); |
+ EXPECT_TRUE(wait_event_.TimedWait( |
+ base::TimeDelta::FromMilliseconds(kWaitTime))); |
+ device->Stop(); |
+ device->DeAllocate(); |
+} |
+ |
+}; // namespace media |