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

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

Issue 2614443003: Moving the GL implementation details into a sub folder for client display. (Closed)
Patch Set: Adding deps restriction on r/c/display; Moving sys_opengl.h Created 3 years, 11 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_delegate.h ('k') | remoting/client/gl_texture_ids.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::MakeUnique<webrtc::BasicDesktopFrame>(size),
119 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
120 base::Unretained(this)));
121 }
122
123 void GlRendererTest::PostSetDesktopFrameTasks(
124 const webrtc::DesktopSize& size, int count) {
125 for (int i = 0; i < count; i++) {
126 message_loop_.task_runner()->PostTask(
127 FROM_HERE, base::Bind(&GlRendererTest::SetDesktopFrameWithSize,
128 base::Unretained(this), size));
129 }
130 }
131
132 void GlRendererTest::OnDesktopFrameProcessed() {
133 on_desktop_frame_processed_call_count_++;
134 }
135
136 void GlRendererTest::RunTasksInCurrentQueue() {
137 base::RunLoop run_loop;
138 message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
139 run_loop.Run();
140 }
141
142 void GlRendererTest::RunUntilRendered() {
143 base::RunLoop run_loop;
144 delegate_.SetOnFrameRenderedCallback(run_loop.QuitClosure());
145 run_loop.Run();
146 }
147
148
149 TEST_F(GlRendererTest, TestDelegateCanRenderFrame) {
150 delegate_.can_render_frame_ = true;
151 RequestRender();
152 RunTasksInCurrentQueue();
153 EXPECT_EQ(1, delegate_.can_render_frame_call_count());
154 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
155
156 delegate_.can_render_frame_ = false;
157 RequestRender();
158 RunTasksInCurrentQueue();
159 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
160 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
161 }
162
163 TEST_F(GlRendererTest, TestRequestRenderOnlyScheduleOnce) {
164 delegate_.can_render_frame_ = true;
165
166 RequestRender();
167 RequestRender();
168 RequestRender();
169 RunTasksInCurrentQueue();
170 EXPECT_EQ(1, delegate_.can_render_frame_call_count());
171 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
172
173 RequestRender();
174 RunTasksInCurrentQueue();
175 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
176 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
177 }
178
179 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
180 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
181 EXPECT_EQ(1, delegate_.on_size_changed_call_count());
182 EXPECT_EQ(16, delegate_.canvas_width());
183 EXPECT_EQ(16, delegate_.canvas_height());
184
185 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
186 EXPECT_EQ(1, delegate_.on_size_changed_call_count());
187 EXPECT_EQ(16, delegate_.canvas_width());
188 EXPECT_EQ(16, delegate_.canvas_height());
189
190 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
191 EXPECT_EQ(2, delegate_.on_size_changed_call_count());
192 EXPECT_EQ(32, delegate_.canvas_width());
193 EXPECT_EQ(32, delegate_.canvas_height());
194
195 renderer_->RequestCanvasSize();
196 EXPECT_EQ(3, delegate_.on_size_changed_call_count());
197 EXPECT_EQ(32, delegate_.canvas_width());
198 EXPECT_EQ(32, delegate_.canvas_height());
199 }
200
201 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
202 delegate_.can_render_frame_ = true;
203
204 // Implicitly calls RequestRender().
205
206 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
207 RunUntilRendered();
208 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
209 EXPECT_EQ(1, on_desktop_frame_processed_call_count());
210
211 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
212 RunUntilRendered();
213 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
214 EXPECT_EQ(21, on_desktop_frame_processed_call_count());
215 }
216
217 // TODO(yuweih): Add tests to validate the rendered output.
218
219 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/gl_renderer_delegate.h ('k') | remoting/client/gl_texture_ids.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698