1 // Copyright 2014 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/ios/bridge/frame_consumer_bridge.h" 6 7 #include <queue> 8 #include <gtest/gtest.h> 9 10 #include "base/bind.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 13 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h" 14 15 namespace { 16 const webrtc::DesktopSize kFrameSize(100, 100); 17 const webrtc::DesktopVector kDpi(100, 100); 18 19 const webrtc::DesktopRect FrameRect() { 20 return webrtc::DesktopRect::MakeSize(kFrameSize); 21 } 22 23 webrtc::DesktopRegion FrameRegion() { 24 return webrtc::DesktopRegion(FrameRect()); 25 } 26 27 void FrameDelivery(const webrtc::DesktopSize& view_size, 28 webrtc::DesktopFrame* buffer, 29 const webrtc::DesktopRegion& region) { 30 ASSERT_TRUE(view_size.equals(kFrameSize)); 31 ASSERT_TRUE(region.Equals(FrameRegion())); 32 }; 33 34 } // namespace 35 36 namespace remoting { 37 38 class FrameProducerTester : public FrameProducer { 39 public: 40 virtual ~FrameProducerTester() {}; 41 42 virtual void DrawBuffer(webrtc::DesktopFrame* buffer) OVERRIDE { 43 frames.push(buffer); 44 }; 45 46 virtual void InvalidateRegion(const webrtc::DesktopRegion& region) OVERRIDE { 47 NOTIMPLEMENTED(); 48 }; 49 50 virtual void RequestReturnBuffers(const base::Closure& done) OVERRIDE { 51 // Don't have to actually return the buffers. This function is really 52 // saying don't use the references anymore, they are now invalid. 53 while (!frames.empty()) { 54 frames.pop(); 55 } 56 done.Run(); 57 }; 58 59 virtual void SetOutputSizeAndClip(const webrtc::DesktopSize& view_size, 60 const webrtc::DesktopRect& clip_area) 61 OVERRIDE { 62 viewSize = view_size; 63 clipArea = clip_area; 64 }; 65 66 std::queue<webrtc::DesktopFrame*> frames; 67 webrtc::DesktopSize viewSize; 68 webrtc::DesktopRect clipArea; 69 }; 70 71 class FrameConsumerBridgeTest : public ::testing::Test { 72 protected: 73 virtual void SetUp() OVERRIDE { 74 frameProducer_.reset(new FrameProducerTester()); 75 frameConsumer_.reset(new FrameConsumerBridge(base::Bind(&FrameDelivery))); 76 frameConsumer_->Initialize(frameProducer_.get()); 77 } 78 virtual void TearDown() OVERRIDE {} 79 80 scoped_ptr<FrameProducerTester> frameProducer_; 81 scoped_ptr<FrameConsumerBridge> frameConsumer_; 82 }; 83 84 TEST(FrameConsumerBridgeTest_NotInitialized, CreateAndRelease) { 85 scoped_ptr<FrameConsumerBridge> frameConsumer_( 86 new FrameConsumerBridge(base::Bind(&FrameDelivery))); 87 ASSERT_TRUE(frameConsumer_.get() != NULL); 88 frameConsumer_.reset(); 89 ASSERT_TRUE(frameConsumer_.get() == NULL); 90 } 91 92 TEST_F(FrameConsumerBridgeTest, ApplyBuffer) { 93 webrtc::DesktopFrame* frame = NULL; 94 ASSERT_EQ(0, frameProducer_->frames.size()); 95 frameConsumer_->SetSourceSize(kFrameSize, kDpi); 96 ASSERT_EQ(1, frameProducer_->frames.size()); 97 98 // Return the frame, and ensure we get it back 99 frame = frameProducer_->frames.front(); 100 frameProducer_->frames.pop(); 101 ASSERT_EQ(0, frameProducer_->frames.size()); 102 frameConsumer_->ApplyBuffer( 103 kFrameSize, FrameRect(), frame, FrameRegion(), FrameRegion()); 104 ASSERT_EQ(1, frameProducer_->frames.size()); 105 ASSERT_TRUE(frame == frameProducer_->frames.front()); 106 ASSERT_TRUE(frame->data() == frameProducer_->frames.front()->data()); 107 108 // Change the SourceSize, we should get a new frame, but when the old frame is 109 // submitted we will not get it back. 110 frameConsumer_->SetSourceSize(webrtc::DesktopSize(1, 1), kDpi); 111 ASSERT_EQ(2, frameProducer_->frames.size()); 112 frame = frameProducer_->frames.front(); 113 frameProducer_->frames.pop(); 114 ASSERT_EQ(1, frameProducer_->frames.size()); 115 frameConsumer_->ApplyBuffer( 116 kFrameSize, FrameRect(), frame, FrameRegion(), FrameRegion()); 117 ASSERT_EQ(1, frameProducer_->frames.size()); 118 } 119 120 TEST_F(FrameConsumerBridgeTest, SetSourceSize) { 121 frameConsumer_->SetSourceSize(webrtc::DesktopSize(0, 0), 122 webrtc::DesktopVector(0, 0)); 123 ASSERT_TRUE(frameProducer_->viewSize.equals(webrtc::DesktopSize(0, 0))); 124 ASSERT_TRUE(frameProducer_->clipArea.equals( 125 webrtc::DesktopRect::MakeLTRB(0, 0, 0, 0))); 126 ASSERT_EQ(1, frameProducer_->frames.size()); 127 ASSERT_TRUE( 128 frameProducer_->frames.front()->size().equals(webrtc::DesktopSize(0, 0))); 129 130 frameConsumer_->SetSourceSize(kFrameSize, kDpi); 131 ASSERT_TRUE(frameProducer_->viewSize.equals(kFrameSize)); 132 ASSERT_TRUE(frameProducer_->clipArea.equals(FrameRect())); 133 ASSERT_EQ(2, frameProducer_->frames.size()); 134 frameProducer_->frames.pop(); 135 ASSERT_TRUE(frameProducer_->frames.front()->size().equals(kFrameSize)); 136 } 137 138 } // namespace remoting