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