Index: media/video/capture/screen/screen_capture_device_unittest.cc |
diff --git a/media/video/capture/screen/screen_capture_device_unittest.cc b/media/video/capture/screen/screen_capture_device_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..31001a0a33c2e71b3b21b003fbf7622c2fa136a8 |
--- /dev/null |
+++ b/media/video/capture/screen/screen_capture_device_unittest.cc |
@@ -0,0 +1,168 @@ |
+// Copyright (c) 2012 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 "media/video/capture/screen/screen_capture_device.h" |
+ |
+#include "base/basictypes.h" |
+#include "base/sequenced_task_runner.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "base/test/test_timeouts.h" |
+#include "base/threading/sequenced_worker_pool.h" |
+#include "base/time.h" |
+#include "media/video/capture/screen/screen_capture_data.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using ::testing::_; |
+using ::testing::DoAll; |
+using ::testing::InvokeWithoutArgs; |
+using ::testing::SaveArg; |
+ |
+namespace media { |
+ |
+namespace { |
+ |
+const int kTestFrameWidth1 = 100; |
+const int kTestFrameHeight1 = 100; |
+const int kTestFrameWidth2 = 200; |
+const int kTestFrameHeight2 = 150; |
+const int kBufferSize = kTestFrameWidth2 * kTestFrameHeight2 * 4; |
+ |
+const int kFrameRate = 30; |
+ |
+class MockFrameObserver : public VideoCaptureDevice::EventHandler { |
+ public: |
+ MOCK_METHOD0(OnError, void()); |
+ MOCK_METHOD1(OnFrameInfo, void(const VideoCaptureCapability& info)); |
+ MOCK_METHOD3(OnIncomingCapturedFrame, void(const uint8* data, int length, |
+ base::Time timestamp)); |
+}; |
+ |
+// TODO(sergeyu): Move this to a separate file where it can be reused. |
+class FakeScreenCapturer : public ScreenCapturer { |
+ public: |
+ FakeScreenCapturer() |
+ : delegate_(NULL), |
+ frame_index_(0) { |
+ buffer_.reset(new uint8[kBufferSize]); |
+ frames_[0] = new ScreenCaptureData( |
+ buffer_.get(), kTestFrameWidth1 * ScreenCaptureData::kBytesPerPixel, |
+ SkISize::Make(kTestFrameWidth1, kTestFrameHeight1)); |
+ frames_[1] = new ScreenCaptureData( |
+ buffer_.get(), kTestFrameWidth2 * ScreenCaptureData::kBytesPerPixel, |
+ SkISize::Make(kTestFrameWidth2, kTestFrameHeight2)); |
+ } |
+ virtual ~FakeScreenCapturer() {} |
+ |
+ // VideoFrameCapturer interface. |
+ virtual void Start(Delegate* delegate) OVERRIDE { |
+ delegate_ = delegate; |
+ } |
+ virtual void Stop() OVERRIDE { |
+ delegate_ = NULL; |
+ } |
+ virtual void InvalidateRegion(const SkRegion& invalid_region) OVERRIDE { |
+ NOTIMPLEMENTED(); |
+ } |
+ virtual void CaptureFrame() OVERRIDE { |
+ scoped_refptr<ScreenCaptureData> frame = |
+ frames_[frame_index_ % arraysize(frames_)]; |
+ frame_index_++; |
+ delegate_->OnCaptureCompleted(frame); |
+ } |
+ |
+ private: |
+ Delegate* delegate_; |
+ scoped_array<uint8> buffer_; |
+ scoped_refptr<ScreenCaptureData> frames_[2]; |
+ int frame_index_; |
+}; |
+ |
+class ScreenCaptureDeviceTest : public testing::Test { |
+ public: |
+ virtual void SetUp() OVERRIDE { |
+ worker_pool_ = new base::SequencedWorkerPool(3, "TestCaptureThread"); |
+ } |
+ |
+ protected: |
+ scoped_refptr<base::SequencedWorkerPool> worker_pool_; |
+}; |
+ |
+} // namespace |
+ |
+TEST_F(ScreenCaptureDeviceTest, Capture) { |
+ ScreenCaptureDevice capture_device( |
+ worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken())); |
+ VideoCaptureCapability caps; |
+ base::WaitableEvent done_event(false, false); |
+ int frame_size; |
+ |
+ MockFrameObserver frame_observer; |
+ EXPECT_CALL(frame_observer, OnFrameInfo(_)) |
+ .WillOnce(SaveArg<0>(&caps)); |
+ EXPECT_CALL(frame_observer, OnError()) |
+ .Times(0); |
+ EXPECT_CALL(frame_observer, OnIncomingCapturedFrame(_, _, _)) |
+ .WillRepeatedly(DoAll( |
+ SaveArg<1>(&frame_size), |
+ InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
+ |
+ capture_device.Allocate(640, 480, kFrameRate, &frame_observer); |
+ capture_device.Start(); |
+ EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
+ capture_device.Stop(); |
+ capture_device.DeAllocate(); |
+ |
+ EXPECT_GT(caps.width, 0); |
+ EXPECT_GT(caps.height, 0); |
+ EXPECT_EQ(kFrameRate, caps.frame_rate); |
+ EXPECT_EQ(VideoCaptureCapability::kARGB, caps.color); |
+ EXPECT_EQ(false, caps.interlaced); |
+ |
+ EXPECT_EQ(caps.width * caps.height * 4, frame_size); |
+} |
+ |
+// Test that screen capturer can handle resolution change. |
Wez
2013/02/01 00:44:34
nit: ".. without crashing."
Otherwise it's not cl
Sergey Ulanov
2013/02/01 02:02:26
Will address this in a separate cl
|
+TEST_F(ScreenCaptureDeviceTest, ScreenResolutionChange) { |
+ FakeScreenCapturer* mock_capturer = new FakeScreenCapturer(); |
+ |
+ ScreenCaptureDevice capture_device( |
+ worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken())); |
+ capture_device.SetScreenCapturerForTest( |
+ scoped_ptr<ScreenCapturer>(mock_capturer)); |
+ |
+ VideoCaptureCapability caps; |
+ base::WaitableEvent done_event(false, false); |
+ int frame_size; |
+ |
+ MockFrameObserver frame_observer; |
+ EXPECT_CALL(frame_observer, OnFrameInfo(_)) |
+ .WillOnce(SaveArg<0>(&caps)); |
+ EXPECT_CALL(frame_observer, OnError()) |
+ .Times(0); |
+ EXPECT_CALL(frame_observer, OnIncomingCapturedFrame(_, _, _)) |
+ .WillRepeatedly(DoAll( |
+ SaveArg<1>(&frame_size), |
+ InvokeWithoutArgs(&done_event, &base::WaitableEvent::Signal))); |
+ |
+ capture_device.Allocate(640, 480, kFrameRate, &frame_observer); |
+ capture_device.Start(); |
+ // Capture first frame. |
+ EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
+ done_event.Reset(); |
+ // Capture second frame. |
+ EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
+ capture_device.Stop(); |
+ capture_device.DeAllocate(); |
+ |
+ EXPECT_EQ(kTestFrameWidth1, caps.width); |
+ EXPECT_EQ(kTestFrameHeight1, caps.height); |
+ EXPECT_EQ(kFrameRate, caps.frame_rate); |
+ EXPECT_EQ(VideoCaptureCapability::kARGB, caps.color); |
+ EXPECT_EQ(false, caps.interlaced); |
+ |
+ EXPECT_EQ(caps.width * caps.height * 4, frame_size); |
+} |
+ |
+} // namespace media |