16c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org/* 26c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 36c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * 46c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * Use of this source code is governed by a BSD-style license 56c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * that can be found in the LICENSE file in the root of the source 66c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * tree. An additional intellectual property rights grant can be found 76c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * in the file PATENTS. All contributing project authors may 86c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org * be found in the AUTHORS file in the root of the source tree. 96c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org */ 106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/screen_capturer.h" 126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "testing/gmock/include/gmock/gmock.h" 146c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "testing/gtest/include/gtest/gtest.h" 1591685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_capture_options.h" 166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_frame.h" 176c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_region.h" 186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org#include "webrtc/modules/desktop_capture/screen_capturer_mock_objects.h" 196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgusing ::testing::_; 216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgusing ::testing::AnyNumber; 226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgusing ::testing::Return; 236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgusing ::testing::SaveArg; 246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgconst int kTestSharedMemoryId = 123; 266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgnamespace webrtc { 286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgclass ScreenCapturerTest : public testing::Test { 306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org public: 316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org SharedMemory* CreateSharedMemory(size_t size); 326c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 3391685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org virtual void SetUp() OVERRIDE { 3491685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org capturer_.reset( 3591685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org ScreenCapturer::Create(DesktopCaptureOptions::CreateDefault())); 3691685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org } 3791685dc421db7dcdc24f6a154de9b92eababf6fdsergeyu@chromium.org 386c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org protected: 396c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org scoped_ptr<ScreenCapturer> capturer_; 406c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org MockMouseShapeObserver mouse_observer_; 416c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org MockScreenCapturerCallback callback_; 426c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}; 436c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 446c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgclass FakeSharedMemory : public SharedMemory { 456c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org public: 466c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org FakeSharedMemory(char* buffer, size_t size) 476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org : SharedMemory(buffer, size, 0, kTestSharedMemoryId), 486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org buffer_(buffer) { 496c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } 506c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org virtual ~FakeSharedMemory() { 516c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org delete[] buffer_; 526c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org } 536c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org private: 546c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org char* buffer_; 556c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org DISALLOW_COPY_AND_ASSIGN(FakeSharedMemory); 566c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org}; 576c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 586c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgSharedMemory* ScreenCapturerTest::CreateSharedMemory(size_t size) { 596c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org return new FakeSharedMemory(new char[size], size); 606c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 616c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 6228bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.orgTEST_F(ScreenCapturerTest, GetScreenListAndSelectScreen) { 6328bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org webrtc::ScreenCapturer::ScreenList screens; 6428bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org EXPECT_TRUE(capturer_->GetScreenList(&screens)); 6528bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org for(webrtc::ScreenCapturer::ScreenList::iterator it = screens.begin(); 6628bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org it != screens.end(); ++it) { 6728bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org EXPECT_TRUE(capturer_->SelectScreen(it->id)); 6828bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org } 6928bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org} 7028bd30a00c8d0a5692ef5c0b2281b9c33457d7fcjiayl@webrtc.org 716c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST_F(ScreenCapturerTest, StartCapturer) { 726c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->SetMouseShapeObserver(&mouse_observer_); 736c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->Start(&callback_); 746c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 756c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 766c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST_F(ScreenCapturerTest, Capture) { 776c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org // Assume that Start() treats the screen as invalid initially. 786c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org DesktopFrame* frame = NULL; 796c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(callback_, OnCaptureCompleted(_)) 806c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .WillOnce(SaveArg<0>(&frame)); 816c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(mouse_observer_, OnCursorShapeChangedPtr(_)) 826c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .Times(AnyNumber()); 836c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 846c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(callback_, CreateSharedMemory(_)) 856c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .Times(AnyNumber()) 866c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .WillRepeatedly(Return(static_cast<SharedMemory*>(NULL))); 876c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 886c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->Start(&callback_); 896c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->Capture(DesktopRegion()); 906c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 916c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org ASSERT_TRUE(frame); 926c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_GT(frame->size().width(), 0); 936c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_GT(frame->size().height(), 0); 946c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_GE(frame->stride(), 956c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org frame->size().width() * DesktopFrame::kBytesPerPixel); 966c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_TRUE(frame->shared_memory() == NULL); 976c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 986c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org // Verify that the region contains whole screen. 996c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_FALSE(frame->updated_region().is_empty()); 1006c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org DesktopRegion::Iterator it(frame->updated_region()); 1016c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org ASSERT_TRUE(!it.IsAtEnd()); 1026c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_TRUE(it.rect().equals(DesktopRect::MakeSize(frame->size()))); 1036c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org it.Advance(); 1046c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_TRUE(it.IsAtEnd()); 1056c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1066c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org delete frame; 1076c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 1086c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1096b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org#if defined(WEBRTC_WIN) 1106c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1116c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.orgTEST_F(ScreenCapturerTest, UseSharedBuffers) { 1126c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org DesktopFrame* frame = NULL; 1136c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(callback_, OnCaptureCompleted(_)) 1146c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .WillOnce(SaveArg<0>(&frame)); 1156c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(mouse_observer_, OnCursorShapeChangedPtr(_)) 1166c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .Times(AnyNumber()); 1176c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1186c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_CALL(callback_, CreateSharedMemory(_)) 1196c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .Times(AnyNumber()) 1206c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org .WillRepeatedly(Invoke(this, &ScreenCapturerTest::CreateSharedMemory)); 1216c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1226c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->Start(&callback_); 1236c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org capturer_->Capture(DesktopRegion()); 1246c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1256c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org ASSERT_TRUE(frame); 1266c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org ASSERT_TRUE(frame->shared_memory()); 1276c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org EXPECT_EQ(frame->shared_memory()->id(), kTestSharedMemoryId); 1286c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1296c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org delete frame; 1306c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} 1316c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1326b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.orgTEST_F(ScreenCapturerTest, UseMagnifier) { 1336b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org DesktopCaptureOptions options(DesktopCaptureOptions::CreateDefault()); 1346b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org options.set_allow_use_magnification_api(true); 1356b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org capturer_.reset(ScreenCapturer::Create(options)); 1366b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org 1376b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org DesktopFrame* frame = NULL; 1386b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org EXPECT_CALL(callback_, OnCaptureCompleted(_)).WillOnce(SaveArg<0>(&frame)); 1396b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org 1406b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org capturer_->Start(&callback_); 1416b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org capturer_->Capture(DesktopRegion()); 1426b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org ASSERT_TRUE(frame); 1436b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org delete frame; 1446b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org} 1456b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org 1466b6e3eacfd0ba5d01fb391e72ff2bbf630f231e2jiayl@webrtc.org#endif // defined(WEBRTC_WIN) 1476c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org 1486c82a7ea6ea92e8c68b37112186fd928b11ddc49sergeyu@chromium.org} // namespace webrtc 149