| Index: remoting/client/gl_renderer_unittest.cc
|
| diff --git a/remoting/client/gl_renderer_unittest.cc b/remoting/client/gl_renderer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..999d6e25a7ac51269150bf49a6f427b66df3ecd3
|
| --- /dev/null
|
| +++ b/remoting/client/gl_renderer_unittest.cc
|
| @@ -0,0 +1,224 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "remoting/client/gl_renderer.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/threading/thread_task_runner_handle.h"
|
| +#include "remoting/client/gl_renderer_core.h"
|
| +#include "remoting/client/gl_renderer_delegate.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
|
| +
|
| +namespace remoting {
|
| +
|
| +class FakeGlRendererCore : public GlRendererCore {
|
| + public:
|
| + FakeGlRendererCore() {}
|
| + ~FakeGlRendererCore() override {}
|
| + void CreateCanvas(int gl_version) override {}
|
| + void DestroyCanvas() override {}
|
| + bool DrawFrame() override {
|
| + return false;
|
| + }
|
| + void SetPixelTransformation(const std::array<float, 9>& matrix) override {}
|
| + void MoveCursor(int x, int y) override {}
|
| + void StartFeedbackAnimation(int x, int y, float diameter) override {}
|
| + void SetCursorVisibility(bool visible) override {}
|
| + void SetDesktopFrame(const webrtc::DesktopFrame& frame) override {}
|
| + void SetCursorShape(const protocol::CursorShapeInfo& shape) override {}
|
| + void SetViewSize(int width, int height) override {}
|
| + void SetCanvasSize(int width, int height) override {
|
| + canvas_width_ = width;
|
| + canvas_height_ = height;
|
| + }
|
| + int GetCanvasWidth() const override {
|
| + return canvas_width_;
|
| + }
|
| + int GetCanvasHeight() const override {
|
| + return canvas_height_;
|
| + }
|
| +
|
| + private:
|
| + int canvas_width_ = 0;
|
| + int canvas_height_ = 0;
|
| +};
|
| +
|
| +// static
|
| +std::unique_ptr<GlRendererCore> GlRendererCore::CreateCore() {
|
| + return base::WrapUnique(new FakeGlRendererCore());
|
| +}
|
| +
|
| +class FakeGlRendererDelegate : public GlRendererDelegate {
|
| + public:
|
| + FakeGlRendererDelegate() : weak_factory_(this) {}
|
| +
|
| + bool CanRenderFrame() override {
|
| + can_render_frame_call_count_++;
|
| + return can_render_frame_;
|
| + }
|
| +
|
| + void OnFrameRendered() override {
|
| + on_frame_rendered_call_count_++;
|
| + if (on_frame_rendered_callback_) {
|
| + on_frame_rendered_callback_.Run();
|
| + }
|
| + }
|
| +
|
| + void OnSizeChanged(int width, int height) override {
|
| + canvas_width_ = width;
|
| + canvas_height_ = height;
|
| + on_size_changed_call_count_++;
|
| + }
|
| +
|
| + void SetOnFrameRenderedCallback(const base::Closure& callback) {
|
| + on_frame_rendered_callback_ = callback;
|
| + }
|
| +
|
| + base::WeakPtr<FakeGlRendererDelegate> GetWeakPtr() {
|
| + return weak_factory_.GetWeakPtr();
|
| + }
|
| +
|
| + bool can_render_frame_ = false;
|
| + int can_render_frame_call_count_ = 0;
|
| + int on_frame_rendered_call_count_ = 0;
|
| + int on_size_changed_call_count_ = 0;
|
| +
|
| + int canvas_width_ = 0;
|
| + int canvas_height_ = 0;
|
| + private:
|
| + base::Closure on_frame_rendered_callback_;
|
| +
|
| + base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_;
|
| +};
|
| +
|
| +class GlRendererTest : public testing::Test {
|
| + public:
|
| + void SetUp() override;
|
| + void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
|
| + void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
|
| +
|
| + protected:
|
| + void OnDesktopFrameProcessed();
|
| + void RunTasksInCurrentQueue();
|
| + void RunUntilRendered();
|
| +
|
| + std::unique_ptr<GlRenderer> renderer_;
|
| + FakeGlRendererDelegate delegate_;
|
| + base::MessageLoop message_loop_;
|
| + int on_desktop_frame_processed_call_count_ = 0;
|
| +};
|
| +
|
| +void GlRendererTest::SetUp() {
|
| + renderer_.reset(new GlRenderer());
|
| + renderer_->SetDelegate(delegate_.GetWeakPtr());
|
| +}
|
| +
|
| +void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
|
| + renderer_->OnFrameReceived(
|
| + base::WrapUnique(
|
| + new webrtc::BasicDesktopFrame(size)),
|
| + base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
|
| + base::Unretained(this)));
|
| +}
|
| +
|
| +void GlRendererTest::PostSetDesktopFrameTasks(
|
| + const webrtc::DesktopSize& size, int count) {
|
| + for (int i = 0; i < count; i++) {
|
| + message_loop_.task_runner()->PostTask(
|
| + FROM_HERE, base::Bind(&GlRendererTest::SetDesktopFrameWithSize,
|
| + base::Unretained(this), size));
|
| + }
|
| +}
|
| +
|
| +void GlRendererTest::OnDesktopFrameProcessed() {
|
| + on_desktop_frame_processed_call_count_++;
|
| +}
|
| +
|
| +void GlRendererTest::RunTasksInCurrentQueue() {
|
| + base::RunLoop run_loop;
|
| + message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
|
| + run_loop.Run();
|
| +}
|
| +
|
| +void GlRendererTest::RunUntilRendered() {
|
| + base::RunLoop run_loop;
|
| + delegate_.SetOnFrameRenderedCallback(run_loop.QuitClosure());
|
| + run_loop.Run();
|
| +}
|
| +
|
| +
|
| +TEST_F(GlRendererTest, TestDelegateCanRenderFrame) {
|
| + delegate_.can_render_frame_ = true;
|
| + renderer_->RequestRender();
|
| + RunTasksInCurrentQueue();
|
| + EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
|
| + EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
|
| +
|
| + delegate_.can_render_frame_ = false;
|
| + renderer_->RequestRender();
|
| + RunTasksInCurrentQueue();
|
| + EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
|
| + EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
|
| +}
|
| +
|
| +TEST_F(GlRendererTest, TestRequestRenderOnlyScheduleOnce) {
|
| + delegate_.can_render_frame_ = true;
|
| +
|
| + renderer_->RequestRender();
|
| + renderer_->RequestRender();
|
| + renderer_->RequestRender();
|
| + RunTasksInCurrentQueue();
|
| + EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
|
| + EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
|
| +
|
| + renderer_->RequestRender();
|
| + RunTasksInCurrentQueue();
|
| + EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
|
| + EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
|
| +}
|
| +
|
| +TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
|
| + SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
|
| + EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
|
| + EXPECT_EQ(16, delegate_.canvas_width_);
|
| + EXPECT_EQ(16, delegate_.canvas_height_);
|
| +
|
| + SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
|
| + EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
|
| + EXPECT_EQ(16, delegate_.canvas_width_);
|
| + EXPECT_EQ(16, delegate_.canvas_height_);
|
| +
|
| + SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
|
| + EXPECT_EQ(2, delegate_.on_size_changed_call_count_);
|
| + EXPECT_EQ(32, delegate_.canvas_width_);
|
| + EXPECT_EQ(32, delegate_.canvas_height_);
|
| +
|
| + renderer_->RequestCanvasSize();
|
| + EXPECT_EQ(3, delegate_.on_size_changed_call_count_);
|
| + EXPECT_EQ(32, delegate_.canvas_width_);
|
| + EXPECT_EQ(32, delegate_.canvas_height_);
|
| +}
|
| +
|
| +TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
|
| + delegate_.can_render_frame_ = true;
|
| +
|
| + // Implicitly calls RequestRender().
|
| +
|
| + PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
|
| + RunUntilRendered();
|
| + EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
|
| + EXPECT_EQ(1, on_desktop_frame_processed_call_count_);
|
| +
|
| + PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
|
| + RunUntilRendered();
|
| + EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
|
| + EXPECT_EQ(21, on_desktop_frame_processed_call_count_);
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|