Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: remoting/client/gl_renderer_unittest.cc

Issue 2196493002: [Chromoting] Unit Tests for GlRenderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add unittest Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/client/gl_renderer.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "remoting/client/gl_renderer_core.h"
14 #include "remoting/client/gl_renderer_delegate.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
17
18 namespace remoting {
19
20 class FakeGlRendererCore : public GlRendererCore {
21 public:
22 FakeGlRendererCore() {}
23 ~FakeGlRendererCore() override {}
24 void CreateCanvas(int gl_version) override {}
25 void DestroyCanvas() override {}
26 bool DrawFrame() override {
27 return false;
28 }
29 void SetPixelTransformation(const std::array<float, 9>& matrix) override {}
30 void MoveCursor(int x, int y) override {}
31 void StartFeedbackAnimation(int x, int y, float diameter) override {}
32 void SetCursorVisibility(bool visible) override {}
33 void SetDesktopFrame(const webrtc::DesktopFrame& frame) override {}
34 void SetCursorShape(const protocol::CursorShapeInfo& shape) override {}
35 void SetViewSize(int width, int height) override {}
36 void SetCanvasSize(int width, int height) override {
37 canvas_width_ = width;
38 canvas_height_ = height;
39 }
40 int GetCanvasWidth() const override {
41 return canvas_width_;
42 }
43 int GetCanvasHeight() const override {
44 return canvas_height_;
45 }
46
47 private:
48 int canvas_width_ = 0;
49 int canvas_height_ = 0;
50 };
51
52 // static
53 std::unique_ptr<GlRendererCore> GlRendererCore::CreateCore() {
54 return base::WrapUnique(new FakeGlRendererCore());
55 }
56
57 class FakeGlRendererDelegate : public GlRendererDelegate {
58 public:
59 FakeGlRendererDelegate() : weak_factory_(this) {}
60
61 bool CanRenderFrame() override {
62 can_render_frame_call_count_++;
63 return can_render_frame_;
64 }
65
66 void OnFrameRendered() override {
67 on_frame_rendered_call_count_++;
68 if (on_frame_rendered_callback_) {
69 on_frame_rendered_callback_.Run();
70 }
71 }
72
73 void OnSizeChanged(int width, int height) override {
74 canvas_width_ = width;
75 canvas_height_ = height;
76 on_size_changed_call_count_++;
77 }
78
79 void SetOnFrameRenderedCallback(const base::Closure& callback) {
80 on_frame_rendered_callback_ = callback;
81 }
82
83 base::WeakPtr<FakeGlRendererDelegate> GetWeakPtr() {
84 return weak_factory_.GetWeakPtr();
85 }
86
87 bool can_render_frame_ = false;
88 int can_render_frame_call_count_ = 0;
89 int on_frame_rendered_call_count_ = 0;
90 int on_size_changed_call_count_ = 0;
91
92 int canvas_width_ = 0;
93 int canvas_height_ = 0;
94 private:
95 base::Closure on_frame_rendered_callback_;
96
97 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_;
98 };
99
100 class GlRendererTest : public testing::Test {
101 public:
102 void SetUp() override;
103 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
104 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
105
106 protected:
107 void OnDesktopFrameProcessed();
108 void RunTasksInCurrentQueue();
109 void RunUntilRendered();
110
111 std::unique_ptr<GlRenderer> renderer_;
112 FakeGlRendererDelegate delegate_;
113 base::MessageLoop message_loop_;
114 int on_desktop_frame_processed_call_count_ = 0;
115 };
116
117 void GlRendererTest::SetUp() {
118 renderer_.reset(new GlRenderer());
119 renderer_->SetDelegate(delegate_.GetWeakPtr());
120 }
121
122 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
123 renderer_->OnFrameReceived(
124 base::WrapUnique(
125 new webrtc::BasicDesktopFrame(size)),
126 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
127 base::Unretained(this)));
128 }
129
130 void GlRendererTest::PostSetDesktopFrameTasks(
131 const webrtc::DesktopSize& size, int count) {
132 for (int i = 0; i < count; i++) {
133 message_loop_.task_runner()->PostTask(
134 FROM_HERE, base::Bind(&GlRendererTest::SetDesktopFrameWithSize,
135 base::Unretained(this), size));
136 }
137 }
138
139 void GlRendererTest::OnDesktopFrameProcessed() {
140 on_desktop_frame_processed_call_count_++;
141 }
142
143 void GlRendererTest::RunTasksInCurrentQueue() {
144 base::RunLoop run_loop;
145 message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
146 run_loop.Run();
147 }
148
149 void GlRendererTest::RunUntilRendered() {
150 base::RunLoop run_loop;
151 delegate_.SetOnFrameRenderedCallback(run_loop.QuitClosure());
152 run_loop.Run();
153 }
154
155
156 TEST_F(GlRendererTest, TestDelegateCanRenderFrame) {
157 delegate_.can_render_frame_ = true;
158 renderer_->RequestRender();
159 RunTasksInCurrentQueue();
160 EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
161 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
162
163 delegate_.can_render_frame_ = false;
164 renderer_->RequestRender();
165 RunTasksInCurrentQueue();
166 EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
167 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
168 }
169
170 TEST_F(GlRendererTest, TestRequestRenderOnlyScheduleOnce) {
171 delegate_.can_render_frame_ = true;
172
173 renderer_->RequestRender();
174 renderer_->RequestRender();
175 renderer_->RequestRender();
176 RunTasksInCurrentQueue();
177 EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
178 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
179
180 renderer_->RequestRender();
181 RunTasksInCurrentQueue();
182 EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
183 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
184 }
185
186 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
187 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
188 EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
189 EXPECT_EQ(16, delegate_.canvas_width_);
190 EXPECT_EQ(16, delegate_.canvas_height_);
191
192 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
193 EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
194 EXPECT_EQ(16, delegate_.canvas_width_);
195 EXPECT_EQ(16, delegate_.canvas_height_);
196
197 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
198 EXPECT_EQ(2, delegate_.on_size_changed_call_count_);
199 EXPECT_EQ(32, delegate_.canvas_width_);
200 EXPECT_EQ(32, delegate_.canvas_height_);
201
202 renderer_->RequestCanvasSize();
203 EXPECT_EQ(3, delegate_.on_size_changed_call_count_);
204 EXPECT_EQ(32, delegate_.canvas_width_);
205 EXPECT_EQ(32, delegate_.canvas_height_);
206 }
207
208 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
209 delegate_.can_render_frame_ = true;
210
211 // Implicitly calls RequestRender().
212
213 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
214 RunUntilRendered();
215 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
216 EXPECT_EQ(1, on_desktop_frame_processed_call_count_);
217
218 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
219 RunUntilRendered();
220 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
221 EXPECT_EQ(21, on_desktop_frame_processed_call_count_);
222 }
223
224 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698