1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "remoting/host/shaped_screen_capturer.h" 6 7 #include "remoting/host/desktop_shape_tracker.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 10 #include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" 11 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h" 12 13 namespace remoting { 14 15 const int kScreenSize = 10; 16 17 class FakeScreenCapturer : public webrtc::ScreenCapturer { 18 public: 19 FakeScreenCapturer() {} 20 virtual ~FakeScreenCapturer() {} 21 22 virtual void Start(Callback* callback) OVERRIDE { 23 callback_ = callback; 24 } 25 26 virtual void Capture(const webrtc::DesktopRegion& region) OVERRIDE { 27 webrtc::DesktopFrame* frame = new webrtc::BasicDesktopFrame( 28 webrtc::DesktopSize(kScreenSize, kScreenSize)); 29 memset(frame->data(), 0, frame->stride() * kScreenSize); 30 callback_->OnCaptureCompleted(frame); 31 } 32 33 virtual void SetMouseShapeObserver( 34 MouseShapeObserver* mouse_shape_observer) OVERRIDE { 35 } 36 virtual bool GetScreenList(ScreenList* screens) OVERRIDE { 37 return false; 38 } 39 virtual bool SelectScreen(webrtc::ScreenId id) OVERRIDE { 40 return false; 41 } 42 43 private: 44 Callback* callback_; 45 }; 46 47 class FakeDesktopShapeTracker : public DesktopShapeTracker { 48 public: 49 FakeDesktopShapeTracker() {} 50 virtual ~FakeDesktopShapeTracker() {} 51 52 static webrtc::DesktopRegion CreateShape() { 53 webrtc::DesktopRegion result; 54 result.AddRect(webrtc::DesktopRect::MakeXYWH(0, 0, 5, 5)); 55 result.AddRect(webrtc::DesktopRect::MakeXYWH(5, 5, 5, 5)); 56 return result; 57 } 58 59 virtual void RefreshDesktopShape() OVERRIDE { 60 shape_ = CreateShape(); 61 } 62 63 virtual const webrtc::DesktopRegion& desktop_shape() OVERRIDE { 64 // desktop_shape() can't be called before RefreshDesktopShape(). 65 EXPECT_FALSE(shape_.is_empty()); 66 return shape_; 67 } 68 69 private: 70 webrtc::DesktopRegion shape_; 71 }; 72 73 class ShapedScreenCapturerTest : public testing::Test, 74 public webrtc::DesktopCapturer::Callback { 75 public: 76 // webrtc::DesktopCapturer::Callback interface 77 virtual webrtc::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE { 78 return NULL; 79 } 80 81 virtual void OnCaptureCompleted(webrtc::DesktopFrame* frame) OVERRIDE { 82 last_frame_.reset(frame); 83 } 84 85 scoped_ptr<webrtc::DesktopFrame> last_frame_; 86 }; 87 88 // Verify that captured frame have shape. 89 TEST_F(ShapedScreenCapturerTest, Basic) { 90 ShapedScreenCapturer capturer( 91 scoped_ptr<webrtc::ScreenCapturer>(new FakeScreenCapturer()), 92 scoped_ptr<DesktopShapeTracker>(new FakeDesktopShapeTracker())); 93 capturer.Start(this); 94 capturer.Capture(webrtc::DesktopRegion()); 95 ASSERT_TRUE(last_frame_.get()); 96 ASSERT_TRUE(last_frame_->shape()); 97 EXPECT_TRUE( 98 FakeDesktopShapeTracker::CreateShape().Equals(*last_frame_->shape())); 99 } 100 101 } // namespace remoting 102