1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/desktop_capture/screen_capturer.h" 12 13 #include <ApplicationServices/ApplicationServices.h> 14 15 #include <ostream> 16 17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "webrtc/modules/desktop_capture/desktop_frame.h" 19 #include "webrtc/modules/desktop_capture/desktop_geometry.h" 20 #include "webrtc/modules/desktop_capture/desktop_region.h" 21 #include "webrtc/modules/desktop_capture/mac/desktop_configuration.h" 22 #include "webrtc/modules/desktop_capture/screen_capturer_mock_objects.h" 23 #include "webrtc/system_wrappers/interface/scoped_ptr.h" 24 25 using ::testing::_; 26 using ::testing::AnyNumber; 27 using ::testing::Return; 28 29 namespace webrtc { 30 31 class ScreenCapturerMacTest : public testing::Test { 32 public: 33 // Verifies that the whole screen is initially dirty. 34 void CaptureDoneCallback1(DesktopFrame* frame); 35 36 // Verifies that a rectangle explicitly marked as dirty is propagated 37 // correctly. 38 void CaptureDoneCallback2(DesktopFrame* frame); 39 40 protected: 41 virtual void SetUp() OVERRIDE { 42 capturer_.reset(ScreenCapturer::Create()); 43 } 44 45 scoped_ptr<ScreenCapturer> capturer_; 46 MockScreenCapturerCallback callback_; 47 }; 48 49 void ScreenCapturerMacTest::CaptureDoneCallback1( 50 DesktopFrame* frame) { 51 scoped_ptr<DesktopFrame> owned_frame(frame); 52 53 MacDesktopConfiguration config = MacDesktopConfiguration::GetCurrent( 54 MacDesktopConfiguration::BottomLeftOrigin); 55 56 // Verify that the region contains full frame. 57 DesktopRegion::Iterator it(frame->updated_region()); 58 EXPECT_TRUE(!it.IsAtEnd() && it.rect().equals(config.pixel_bounds)); 59 } 60 61 void ScreenCapturerMacTest::CaptureDoneCallback2( 62 DesktopFrame* frame) { 63 scoped_ptr<DesktopFrame> owned_frame(frame); 64 65 MacDesktopConfiguration config = MacDesktopConfiguration::GetCurrent( 66 MacDesktopConfiguration::BottomLeftOrigin); 67 int width = config.pixel_bounds.width(); 68 int height = config.pixel_bounds.height(); 69 70 EXPECT_EQ(width, frame->size().width()); 71 EXPECT_EQ(height, frame->size().height()); 72 EXPECT_TRUE(frame->data() != NULL); 73 // Depending on the capture method, the screen may be flipped or not, so 74 // the stride may be positive or negative. 75 EXPECT_EQ(static_cast<int>(sizeof(uint32_t) * width), 76 abs(frame->stride())); 77 } 78 79 TEST_F(ScreenCapturerMacTest, Capture) { 80 EXPECT_CALL(callback_, OnCaptureCompleted(_)) 81 .Times(2) 82 .WillOnce(Invoke(this, &ScreenCapturerMacTest::CaptureDoneCallback1)) 83 .WillOnce(Invoke(this, &ScreenCapturerMacTest::CaptureDoneCallback2)); 84 85 EXPECT_CALL(callback_, CreateSharedMemory(_)) 86 .Times(AnyNumber()) 87 .WillRepeatedly(Return(static_cast<SharedMemory*>(NULL))); 88 89 SCOPED_TRACE(""); 90 capturer_->Start(&callback_); 91 92 // Check that we get an initial full-screen updated. 93 capturer_->Capture(DesktopRegion()); 94 95 // Check that subsequent dirty rects are propagated correctly. 96 capturer_->Capture(DesktopRegion()); 97 } 98 99 } // namespace webrtc 100