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

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

Issue 2591363002: Adding drawable to CRD andorid and iOS gl rendering pipeline. (Closed)
Patch Set: Trying to fix android. 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/client/display/gl_renderer.h" 5 #include "remoting/client/display/gl_renderer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/message_loop/message_loop.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "remoting/client/display/fake_canvas.h"
13 #include "remoting/client/display/gl_renderer_delegate.h" 14 #include "remoting/client/display/gl_renderer_delegate.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 16 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
16 17
17 namespace remoting { 18 namespace remoting {
18 19
19 class FakeGlRendererDelegate : public GlRendererDelegate { 20 class FakeGlRendererDelegate : public GlRendererDelegate {
20 public: 21 public:
21 FakeGlRendererDelegate() : weak_factory_(this) {} 22 FakeGlRendererDelegate() : weak_factory_(this) {}
22 23
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 private: 62 private:
62 int can_render_frame_call_count_ = 0; 63 int can_render_frame_call_count_ = 0;
63 int on_frame_rendered_call_count_ = 0; 64 int on_frame_rendered_call_count_ = 0;
64 int on_size_changed_call_count_ = 0; 65 int on_size_changed_call_count_ = 0;
65 66
66 int canvas_width_ = 0; 67 int canvas_width_ = 0;
67 int canvas_height_ = 0; 68 int canvas_height_ = 0;
68 69
69 base::Closure on_frame_rendered_callback_; 70 base::Closure on_frame_rendered_callback_;
70 71
71 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_; 72 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_;
joedow 2017/01/10 00:19:44 nit: add newline
nicholss 2017/01/10 21:43:10 Done.
73 DISALLOW_COPY_AND_ASSIGN(FakeGlRendererDelegate);
74 };
75
76 class FakeDrawable : public Drawable {
77 public:
78 FakeDrawable() : weak_factory_(this) {}
79
80 void SetId(int id) { id_ = id; }
81 int GetId() { return id_; }
82
83 base::WeakPtr<Drawable> GetWeakPtr() override {
84 return weak_factory_.GetWeakPtr();
85 }
86
87 void SetCanvas(Canvas* canvas) override { canvas_ = canvas; }
88
89 bool Draw() override {
90 drawn_++;
91 return false;
92 }
93
94 int DrawnCount() { return drawn_; }
95
96 private:
97 int drawn_ = 0;
98 int id_ = -1;
99 Canvas* canvas_;
joedow 2017/01/10 00:19:44 Canvas* canvas_ = nullptr;
nicholss 2017/01/10 21:43:10 Done.
100
101 base::WeakPtrFactory<FakeDrawable> weak_factory_;
joedow 2017/01/10 00:19:44 nit: add newline
nicholss 2017/01/10 21:43:10 Done.
102 DISALLOW_COPY_AND_ASSIGN(FakeDrawable);
72 }; 103 };
73 104
74 class GlRendererTest : public testing::Test { 105 class GlRendererTest : public testing::Test {
75 public: 106 public:
76 void SetUp() override; 107 void SetUp() override;
77 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size); 108 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
78 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count); 109 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
110 int GetDrawablesCount();
111 std::vector<base::WeakPtr<Drawable>> GetDrawables();
79 112
80 protected: 113 protected:
81 void RequestRender(); 114 void RequestRender();
82 void OnDesktopFrameProcessed(); 115 void OnDesktopFrameProcessed();
83 void RunTasksInCurrentQueue(); 116 void RunTasksInCurrentQueue();
84 void RunUntilRendered(); 117 void RunUntilRendered();
85 int on_desktop_frame_processed_call_count() { 118 int on_desktop_frame_processed_call_count() {
86 return on_desktop_frame_processed_call_count_; 119 return on_desktop_frame_processed_call_count_;
87 } 120 }
88 121
89 base::MessageLoop message_loop_; 122 base::MessageLoop message_loop_;
90 std::unique_ptr<GlRenderer> renderer_; 123 std::unique_ptr<GlRenderer> renderer_;
91 FakeGlRendererDelegate delegate_; 124 FakeGlRendererDelegate delegate_;
92 125
93 private: 126 private:
94 int on_desktop_frame_processed_call_count_ = 0; 127 int on_desktop_frame_processed_call_count_ = 0;
95 }; 128 };
96 129
97 void GlRendererTest::SetUp() { 130 void GlRendererTest::SetUp() {
98 renderer_.reset(new GlRenderer()); 131 renderer_.reset(new GlRenderer());
99 renderer_->SetDelegate(delegate_.GetWeakPtr()); 132 renderer_->SetDelegate(delegate_.GetWeakPtr());
100 } 133 }
101 134
102 void GlRendererTest::RequestRender() { 135 void GlRendererTest::RequestRender() {
103 renderer_->RequestRender(); 136 renderer_->RequestRender();
104 } 137 }
105 138
139 int GlRendererTest::GetDrawablesCount() {
140 return (int)renderer_->drawables_.size();
141 }
142
143 std::vector<base::WeakPtr<Drawable>> GlRendererTest::GetDrawables() {
144 return renderer_->drawables_;
145 }
146
106 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) { 147 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
107 renderer_->OnFrameReceived( 148 renderer_->OnFrameReceived(
108 base::MakeUnique<webrtc::BasicDesktopFrame>(size), 149 base::MakeUnique<webrtc::BasicDesktopFrame>(size),
109 base::Bind(&GlRendererTest::OnDesktopFrameProcessed, 150 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
110 base::Unretained(this))); 151 base::Unretained(this)));
111 } 152 }
112 153
113 void GlRendererTest::PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, 154 void GlRendererTest::PostSetDesktopFrameTasks(const webrtc::DesktopSize& size,
114 int count) { 155 int count) {
115 for (int i = 0; i < count; i++) { 156 for (int i = 0; i < count; i++) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count()); 201 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
161 202
162 RequestRender(); 203 RequestRender();
163 RunTasksInCurrentQueue(); 204 RunTasksInCurrentQueue();
164 EXPECT_EQ(2, delegate_.can_render_frame_call_count()); 205 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
165 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); 206 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
166 } 207 }
167 208
168 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) { 209 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
169 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16)); 210 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
170 EXPECT_EQ(1, delegate_.on_size_changed_call_count()); 211 ASSERT_EQ(1, delegate_.on_size_changed_call_count());
joedow 2017/01/10 00:19:44 Thank you for fixing these!
171 EXPECT_EQ(16, delegate_.canvas_width()); 212 ASSERT_EQ(16, delegate_.canvas_width());
172 EXPECT_EQ(16, delegate_.canvas_height()); 213 ASSERT_EQ(16, delegate_.canvas_height());
173 214
174 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16)); 215 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
175 EXPECT_EQ(1, delegate_.on_size_changed_call_count()); 216 ASSERT_EQ(1, delegate_.on_size_changed_call_count());
176 EXPECT_EQ(16, delegate_.canvas_width()); 217 ASSERT_EQ(16, delegate_.canvas_width());
177 EXPECT_EQ(16, delegate_.canvas_height()); 218 ASSERT_EQ(16, delegate_.canvas_height());
178 219
179 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32)); 220 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
180 EXPECT_EQ(2, delegate_.on_size_changed_call_count()); 221 ASSERT_EQ(2, delegate_.on_size_changed_call_count());
181 EXPECT_EQ(32, delegate_.canvas_width()); 222 ASSERT_EQ(32, delegate_.canvas_width());
182 EXPECT_EQ(32, delegate_.canvas_height()); 223 ASSERT_EQ(32, delegate_.canvas_height());
183 224
184 renderer_->RequestCanvasSize(); 225 renderer_->RequestCanvasSize();
185 EXPECT_EQ(3, delegate_.on_size_changed_call_count()); 226 ASSERT_EQ(3, delegate_.on_size_changed_call_count());
186 EXPECT_EQ(32, delegate_.canvas_width()); 227 ASSERT_EQ(32, delegate_.canvas_width());
187 EXPECT_EQ(32, delegate_.canvas_height()); 228 ASSERT_EQ(32, delegate_.canvas_height());
188 } 229 }
189 230
190 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) { 231 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
191 delegate_.can_render_frame_ = true; 232 delegate_.can_render_frame_ = true;
192 233
193 // Implicitly calls RequestRender(). 234 // Implicitly calls RequestRender().
194 235
195 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1); 236 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
196 RunUntilRendered(); 237 RunUntilRendered();
197 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count()); 238 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
198 EXPECT_EQ(1, on_desktop_frame_processed_call_count()); 239 EXPECT_EQ(1, on_desktop_frame_processed_call_count());
199 240
200 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20); 241 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
201 RunUntilRendered(); 242 RunUntilRendered();
202 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); 243 ASSERT_EQ(2, delegate_.on_frame_rendered_call_count());
203 EXPECT_EQ(21, on_desktop_frame_processed_call_count()); 244 ASSERT_EQ(21, on_desktop_frame_processed_call_count());
204 } 245 }
205 246
206 // TODO(yuweih): Add tests to validate the rendered output. 247 // TODO(yuweih): Add tests to validate the rendered output.
207 248
249 TEST_F(GlRendererTest, TestAddDrawable) {
250 FakeDrawable* drawable0 = new FakeDrawable();
251 drawable0->SetId(0);
252 renderer_->AddDrawable(drawable0->GetWeakPtr());
253 ASSERT_EQ(1, GetDrawablesCount());
254 }
255
256 TEST_F(GlRendererTest, TestAddDrawableDefaultOrder) {
257 FakeDrawable* drawable0 = new FakeDrawable();
258 drawable0->SetId(0);
259 renderer_->AddDrawable(drawable0->GetWeakPtr());
260 ASSERT_EQ(1, GetDrawablesCount());
261
262 FakeDrawable* drawable1 = new FakeDrawable();
263 drawable1->SetId(1);
264 renderer_->AddDrawable(drawable1->GetWeakPtr());
265 ASSERT_EQ(2, GetDrawablesCount());
266
267 FakeDrawable* drawable2 = new FakeDrawable();
268 drawable2->SetId(2);
269 renderer_->AddDrawable(drawable2->GetWeakPtr());
270 ASSERT_EQ(3, GetDrawablesCount());
271
272 int i = 0;
273 for (auto& drawable : GetDrawables()) {
274 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
275 ASSERT_EQ(i, fg->GetId());
276 i++;
277 }
278 ASSERT_EQ(3, i);
279 }
280
281 TEST_F(GlRendererTest, TestAddDrawableOrder) {
282 FakeDrawable* drawable2 = new FakeDrawable();
283 drawable2->SetId(2);
284 drawable2->SetZIndex(2);
285 renderer_->AddDrawable(drawable2->GetWeakPtr());
286 ASSERT_EQ(1, GetDrawablesCount());
287
288 FakeDrawable* drawable0 = new FakeDrawable();
289 drawable0->SetId(0);
290 renderer_->AddDrawable(drawable0->GetWeakPtr());
291 ASSERT_EQ(2, GetDrawablesCount());
292
293 FakeDrawable* drawable1 = new FakeDrawable();
294 drawable1->SetId(1);
295 drawable1->SetZIndex(1);
296 renderer_->AddDrawable(drawable1->GetWeakPtr());
297 ASSERT_EQ(3, GetDrawablesCount());
298
299 int i = 0;
300 for (auto& drawable : GetDrawables()) {
301 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
302 ASSERT_EQ(i, fg->GetId());
303 i++;
304 }
305 ASSERT_EQ(3, i);
306 }
307
308 TEST_F(GlRendererTest, TestAddDrawableDrawn) {
309 std::unique_ptr<Canvas> fakeCanvas(new FakeCanvas());
310 renderer_->OnSurfaceCreated(std::move(fakeCanvas));
311 delegate_.can_render_frame_ = true;
312 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
313
314 FakeDrawable* drawable0 = new FakeDrawable();
315 drawable0->SetId(3);
316 renderer_->AddDrawable(drawable0->GetWeakPtr());
317 RequestRender();
318 RunTasksInCurrentQueue();
319
320 FakeDrawable* drawable1 = new FakeDrawable();
321 drawable1->SetId(2);
322 drawable1->SetZIndex(1);
323 renderer_->AddDrawable(drawable1->GetWeakPtr());
324
325 RequestRender();
326 RunTasksInCurrentQueue();
327
328 FakeDrawable* drawable2 = new FakeDrawable();
329 drawable2->SetId(1);
330 drawable2->SetZIndex(2);
331 renderer_->AddDrawable(drawable2->GetWeakPtr());
332 ASSERT_EQ(3, GetDrawablesCount());
333
334 RequestRender();
335 RunTasksInCurrentQueue();
336 for (auto& drawable : GetDrawables()) {
337 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
338 EXPECT_EQ(fg->GetId(), fg->DrawnCount());
339 }
340 }
341
342 TEST_F(GlRendererTest, TestCreateGlRendererWithDesktop) {
343 renderer_ = GlRenderer::CreateGlRendererWithDesktop();
344 renderer_->SetDelegate(delegate_.GetWeakPtr());
345 ASSERT_EQ(3, GetDrawablesCount());
346 }
347
348 // TODO(nicholss): Add a test where the drawable is destructed and the renderer
349 // gets a dead weakptr.
350
208 } // namespace remoting 351 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698