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

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: Don't draw when canvas is not set 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
« no previous file with comments | « remoting/client/gl_renderer.cc ('k') | remoting/client/sys_opengl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_delegate.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
16
17 namespace remoting {
18
19 class FakeGlRendererDelegate : public GlRendererDelegate {
20 public:
21 FakeGlRendererDelegate() : weak_factory_(this) {}
22
23 bool CanRenderFrame() override {
24 can_render_frame_call_count_++;
25 return can_render_frame_;
26 }
27
28 void OnFrameRendered() override {
29 on_frame_rendered_call_count_++;
30 if (on_frame_rendered_callback_) {
31 on_frame_rendered_callback_.Run();
32 }
33 }
34
35 void OnSizeChanged(int width, int height) override {
36 canvas_width_ = width;
37 canvas_height_ = height;
38 on_size_changed_call_count_++;
39 }
40
41 void SetOnFrameRenderedCallback(const base::Closure& callback) {
42 on_frame_rendered_callback_ = callback;
43 }
44
45 int canvas_width() {
46 return canvas_width_;
47 }
48
49 int canvas_height() {
50 return canvas_height_;
51 }
52
53 base::WeakPtr<FakeGlRendererDelegate> GetWeakPtr() {
54 return weak_factory_.GetWeakPtr();
55 }
56
57 int can_render_frame_call_count() {
58 return can_render_frame_call_count_;
59 }
60
61 int on_frame_rendered_call_count() {
62 return on_frame_rendered_call_count_;
63 }
64
65 int on_size_changed_call_count() {
66 return on_size_changed_call_count_;
67 }
68
69 bool can_render_frame_ = false;
70
71 private:
72 int can_render_frame_call_count_ = 0;
73 int on_frame_rendered_call_count_ = 0;
74 int on_size_changed_call_count_ = 0;
75
76 int canvas_width_ = 0;
77 int canvas_height_ = 0;
78
79 base::Closure on_frame_rendered_callback_;
80
81 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_;
82 };
83
84 class GlRendererTest : public testing::Test {
85 public:
86 void SetUp() override;
87 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
88 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
89
90 protected:
91 void RequestRender();
92 void OnDesktopFrameProcessed();
93 void RunTasksInCurrentQueue();
94 void RunUntilRendered();
95 int on_desktop_frame_processed_call_count() {
96 return on_desktop_frame_processed_call_count_;
97 }
98
99 base::MessageLoop message_loop_;
100 std::unique_ptr<GlRenderer> renderer_;
101 FakeGlRendererDelegate delegate_;
102
103 private:
104 int on_desktop_frame_processed_call_count_ = 0;
105 };
106
107 void GlRendererTest::SetUp() {
108 renderer_.reset(new GlRenderer());
109 renderer_->SetDelegate(delegate_.GetWeakPtr());
110 }
111
112 void GlRendererTest::RequestRender() {
113 renderer_->RequestRender();
114 }
115
116 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
117 renderer_->OnFrameReceived(
118 base::WrapUnique(
119 new webrtc::BasicDesktopFrame(size)),
120 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
121 base::Unretained(this)));
122 }
123
124 void GlRendererTest::PostSetDesktopFrameTasks(
125 const webrtc::DesktopSize& size, int count) {
126 for (int i = 0; i < count; i++) {
127 message_loop_.task_runner()->PostTask(
128 FROM_HERE, base::Bind(&GlRendererTest::SetDesktopFrameWithSize,
129 base::Unretained(this), size));
130 }
131 }
132
133 void GlRendererTest::OnDesktopFrameProcessed() {
134 on_desktop_frame_processed_call_count_++;
135 }
136
137 void GlRendererTest::RunTasksInCurrentQueue() {
138 base::RunLoop run_loop;
139 message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
140 run_loop.Run();
141 }
142
143 void GlRendererTest::RunUntilRendered() {
144 base::RunLoop run_loop;
145 delegate_.SetOnFrameRenderedCallback(run_loop.QuitClosure());
146 run_loop.Run();
147 }
148
149
150 TEST_F(GlRendererTest, TestDelegateCanRenderFrame) {
151 delegate_.can_render_frame_ = true;
152 RequestRender();
153 RunTasksInCurrentQueue();
154 EXPECT_EQ(1, delegate_.can_render_frame_call_count());
155 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
156
157 delegate_.can_render_frame_ = false;
158 RequestRender();
159 RunTasksInCurrentQueue();
160 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
161 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
162 }
163
164 TEST_F(GlRendererTest, TestRequestRenderOnlyScheduleOnce) {
165 delegate_.can_render_frame_ = true;
166
167 RequestRender();
168 RequestRender();
169 RequestRender();
170 RunTasksInCurrentQueue();
171 EXPECT_EQ(1, delegate_.can_render_frame_call_count());
172 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
173
174 RequestRender();
175 RunTasksInCurrentQueue();
176 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
177 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
178 }
179
180 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
181 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
182 EXPECT_EQ(1, delegate_.on_size_changed_call_count());
183 EXPECT_EQ(16, delegate_.canvas_width());
184 EXPECT_EQ(16, delegate_.canvas_height());
185
186 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
187 EXPECT_EQ(1, delegate_.on_size_changed_call_count());
188 EXPECT_EQ(16, delegate_.canvas_width());
189 EXPECT_EQ(16, delegate_.canvas_height());
190
191 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
192 EXPECT_EQ(2, delegate_.on_size_changed_call_count());
193 EXPECT_EQ(32, delegate_.canvas_width());
194 EXPECT_EQ(32, delegate_.canvas_height());
195
196 renderer_->RequestCanvasSize();
197 EXPECT_EQ(3, delegate_.on_size_changed_call_count());
198 EXPECT_EQ(32, delegate_.canvas_width());
199 EXPECT_EQ(32, delegate_.canvas_height());
200 }
201
202 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
203 delegate_.can_render_frame_ = true;
204
205 // Implicitly calls RequestRender().
206
207 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
208 RunUntilRendered();
209 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
210 EXPECT_EQ(1, on_desktop_frame_processed_call_count());
211
212 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
213 RunUntilRendered();
214 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
215 EXPECT_EQ(21, on_desktop_frame_processed_call_count());
216 }
217
218 // TODO(yuweih): Add tests to validate the rendered output.
219
220 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/gl_renderer.cc ('k') | remoting/client/sys_opengl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698