Chromium Code Reviews| Index: content/browser/renderer_host/media/screen_capturer_unittest.cc |
| diff --git a/content/browser/renderer_host/media/screen_capturer_unittest.cc b/content/browser/renderer_host/media/screen_capturer_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e3037d1b4f18b18103f05013d931d1bc02ce9cbd |
| --- /dev/null |
| +++ b/content/browser/renderer_host/media/screen_capturer_unittest.cc |
| @@ -0,0 +1,159 @@ |
| +// 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 "content/browser/renderer_host/media/screen_capturer.h" |
| + |
| +#include "base/basictypes.h" |
| +#include "base/synchronization/waitable_event.h" |
| +#include "base/test/test_timeouts.h" |
| +#include "base/time.h" |
| +#include "remoting/capturer/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 content { |
| + |
| +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 media::VideoCaptureDevice::EventHandler { |
| + public: |
| + MOCK_METHOD0(OnError, void()); |
| + MOCK_METHOD1(OnFrameInfo, void(const media::VideoCaptureCapability& info)); |
| + MOCK_METHOD3(OnIncomingCapturedFrame, void(const uint8* data, int length, |
| + base::Time timestamp)); |
| +}; |
| + |
| +} // namespace |
| + |
| +// A class to perform video frame capturing for Linux. |
|
Wez
2013/01/10 00:58:14
For Linux....?
Sergey Ulanov
2013/01/11 23:46:20
Copy-paste failure. Removed this comment.
|
| +class FakeVideoFrameCapturer : public remoting::VideoFrameCapturer { |
| + public: |
| + FakeVideoFrameCapturer() |
| + : delegate_(NULL), |
| + frame_index_(0) { |
| + buffer_.reset(new uint8[kBufferSize]); |
| + frames_[0] = new remoting::CaptureData( |
| + buffer_.get(), kTestFrameWidth1 * remoting::CaptureData::kBytesPerPixel, |
| + SkISize::Make(kTestFrameWidth1, kTestFrameHeight1)); |
| + frames_[1] = new remoting::CaptureData( |
| + buffer_.get(), kTestFrameWidth2 * remoting::CaptureData::kBytesPerPixel, |
| + SkISize::Make(kTestFrameWidth2, kTestFrameHeight2)); |
| + } |
| + virtual ~FakeVideoFrameCapturer() {} |
| + |
| + // VideoFrameCapturer interface. |
| + virtual void Start(Delegate* delegate) OVERRIDE { |
| + delegate_ = delegate; |
| + } |
| + virtual void Stop() OVERRIDE { |
| + DCHECK(delegate_); |
| + delegate_ = NULL; |
| + } |
| + virtual void InvalidateRegion(const SkRegion& invalid_region) OVERRIDE { |
| + NOTIMPLEMENTED(); |
| + } |
| + virtual void CaptureFrame() OVERRIDE { |
| + scoped_refptr<remoting::CaptureData> frame = |
| + frames_[frame_index_ % arraysize(frames_)]; |
| + frame_index_++; |
| + size_most_recent_ = frame->size(); |
| + delegate_->OnCaptureCompleted(frame); |
| + } |
| + |
| + virtual const SkISize& size_most_recent() const OVERRIDE { |
|
Wez
2013/01/10 00:58:14
This has gone, I think?
Sergey Ulanov
2013/01/11 23:46:20
Removed now.
|
| + return size_most_recent_; |
| + } |
| + |
| + private: |
| + Delegate* delegate_; |
| + SkISize size_most_recent_; |
| + scoped_array<uint8> buffer_; |
| + scoped_refptr<remoting::CaptureData> frames_[2]; |
| + int frame_index_; |
| +}; |
| + |
| +TEST(ScreenCaptureTest, Capture) { |
| + ScreenCapturer capturer; |
| + media::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))); |
| + |
| + capturer.Allocate(640, 480, kFrameRate, &frame_observer); |
| + capturer.Start(); |
| + EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout())); |
| + capturer.Stop(); |
| + capturer.DeAllocate(); |
| + |
| + EXPECT_GT(caps.width, 0); |
|
Wez
2013/01/10 00:58:14
Shouldn't these exactly match the frame1 values?
Sergey Ulanov
2013/01/11 23:46:20
No. This test uses real capturer instead of FakeVi
|
| + EXPECT_GT(caps.height, 0); |
| + EXPECT_EQ(kFrameRate, caps.frame_rate); |
| + EXPECT_EQ(media::VideoCaptureCapability::kARGB, caps.color); |
| + EXPECT_EQ(false, caps.interlaced); |
| + |
| + EXPECT_EQ(caps.width * caps.height * 4, frame_size); |
| +} |
| + |
| +TEST(ScreenCaptureTest, ScreenResolutionChange) { |
| + FakeVideoFrameCapturer* mock_capturer = new FakeVideoFrameCapturer(); |
| + |
| + ScreenCapturer capturer; |
| + capturer.set_test_frame_capturer( |
| + scoped_ptr<remoting::VideoFrameCapturer>(mock_capturer)); |
| + |
| + media::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))); |
| + |
| + capturer.Allocate(640, 480, kFrameRate, &frame_observer); |
| + capturer.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())); |
| + capturer.Stop(); |
| + capturer.DeAllocate(); |
| + |
| + EXPECT_EQ(kTestFrameWidth1, caps.width); |
| + EXPECT_EQ(kTestFrameHeight1, caps.height); |
| + EXPECT_EQ(kFrameRate, caps.frame_rate); |
| + EXPECT_EQ(media::VideoCaptureCapability::kARGB, caps.color); |
| + EXPECT_EQ(false, caps.interlaced); |
| + |
| + EXPECT_EQ(caps.width * caps.height * 4, frame_size); |
| +} |
| + |
| +} // namespace content |