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

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: Changing a bunch of nits. 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_;
73
74 DISALLOW_COPY_AND_ASSIGN(FakeGlRendererDelegate);
75 };
76
77 class FakeDrawable : public Drawable {
78 public:
79 FakeDrawable() : weak_factory_(this) {}
80
81 void SetId(int id) { id_ = id; }
82 int GetId() { return id_; }
83
84 base::WeakPtr<Drawable> GetWeakPtr() override {
85 return weak_factory_.GetWeakPtr();
86 }
87
88 void SetCanvas(Canvas* canvas) override { canvas_ = canvas; }
89
90 bool Draw() override {
91 drawn_++;
92 return false;
93 }
94
95 int DrawnCount() { return drawn_; }
96
97 private:
98 int drawn_ = 0;
99 int id_ = -1;
100 Canvas* canvas_ = nullptr;
101
102 base::WeakPtrFactory<FakeDrawable> weak_factory_;
103
104 DISALLOW_COPY_AND_ASSIGN(FakeDrawable);
72 }; 105 };
73 106
74 class GlRendererTest : public testing::Test { 107 class GlRendererTest : public testing::Test {
75 public: 108 public:
76 void SetUp() override; 109 void SetUp() override;
77 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size); 110 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
78 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count); 111 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
112 int GetDrawablesCount();
113 std::vector<base::WeakPtr<Drawable>> GetDrawables();
79 114
80 protected: 115 protected:
81 void RequestRender(); 116 void RequestRender();
82 void OnDesktopFrameProcessed(); 117 void OnDesktopFrameProcessed();
83 void RunTasksInCurrentQueue(); 118 void RunTasksInCurrentQueue();
84 void RunUntilRendered(); 119 void RunUntilRendered();
85 int on_desktop_frame_processed_call_count() { 120 int on_desktop_frame_processed_call_count() {
86 return on_desktop_frame_processed_call_count_; 121 return on_desktop_frame_processed_call_count_;
87 } 122 }
88 123
89 base::MessageLoop message_loop_; 124 base::MessageLoop message_loop_;
90 std::unique_ptr<GlRenderer> renderer_; 125 std::unique_ptr<GlRenderer> renderer_;
91 FakeGlRendererDelegate delegate_; 126 FakeGlRendererDelegate delegate_;
92 127
93 private: 128 private:
94 int on_desktop_frame_processed_call_count_ = 0; 129 int on_desktop_frame_processed_call_count_ = 0;
95 }; 130 };
96 131
97 void GlRendererTest::SetUp() { 132 void GlRendererTest::SetUp() {
98 renderer_.reset(new GlRenderer()); 133 renderer_.reset(new GlRenderer());
99 renderer_->SetDelegate(delegate_.GetWeakPtr()); 134 renderer_->SetDelegate(delegate_.GetWeakPtr());
100 } 135 }
101 136
102 void GlRendererTest::RequestRender() { 137 void GlRendererTest::RequestRender() {
103 renderer_->RequestRender(); 138 renderer_->RequestRender();
104 } 139 }
105 140
141 int GlRendererTest::GetDrawablesCount() {
142 return (int)renderer_->drawables_.size();
143 }
144
145 std::vector<base::WeakPtr<Drawable>> GlRendererTest::GetDrawables() {
146 return renderer_->drawables_;
147 }
148
106 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) { 149 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
107 renderer_->OnFrameReceived( 150 renderer_->OnFrameReceived(
108 base::MakeUnique<webrtc::BasicDesktopFrame>(size), 151 base::MakeUnique<webrtc::BasicDesktopFrame>(size),
109 base::Bind(&GlRendererTest::OnDesktopFrameProcessed, 152 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
110 base::Unretained(this))); 153 base::Unretained(this)));
111 } 154 }
112 155
113 void GlRendererTest::PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, 156 void GlRendererTest::PostSetDesktopFrameTasks(const webrtc::DesktopSize& size,
114 int count) { 157 int count) {
115 for (int i = 0; i < count; i++) { 158 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()); 203 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
161 204
162 RequestRender(); 205 RequestRender();
163 RunTasksInCurrentQueue(); 206 RunTasksInCurrentQueue();
164 EXPECT_EQ(2, delegate_.can_render_frame_call_count()); 207 EXPECT_EQ(2, delegate_.can_render_frame_call_count());
165 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); 208 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count());
166 } 209 }
167 210
168 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) { 211 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
169 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16)); 212 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
170 EXPECT_EQ(1, delegate_.on_size_changed_call_count()); 213 ASSERT_EQ(1, delegate_.on_size_changed_call_count());
171 EXPECT_EQ(16, delegate_.canvas_width()); 214 ASSERT_EQ(16, delegate_.canvas_width());
172 EXPECT_EQ(16, delegate_.canvas_height()); 215 ASSERT_EQ(16, delegate_.canvas_height());
173 216
174 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16)); 217 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
175 EXPECT_EQ(1, delegate_.on_size_changed_call_count()); 218 ASSERT_EQ(1, delegate_.on_size_changed_call_count());
176 EXPECT_EQ(16, delegate_.canvas_width()); 219 ASSERT_EQ(16, delegate_.canvas_width());
177 EXPECT_EQ(16, delegate_.canvas_height()); 220 ASSERT_EQ(16, delegate_.canvas_height());
178 221
179 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32)); 222 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
180 EXPECT_EQ(2, delegate_.on_size_changed_call_count()); 223 ASSERT_EQ(2, delegate_.on_size_changed_call_count());
181 EXPECT_EQ(32, delegate_.canvas_width()); 224 ASSERT_EQ(32, delegate_.canvas_width());
182 EXPECT_EQ(32, delegate_.canvas_height()); 225 ASSERT_EQ(32, delegate_.canvas_height());
183 226
184 renderer_->RequestCanvasSize(); 227 renderer_->RequestCanvasSize();
185 EXPECT_EQ(3, delegate_.on_size_changed_call_count()); 228 ASSERT_EQ(3, delegate_.on_size_changed_call_count());
186 EXPECT_EQ(32, delegate_.canvas_width()); 229 ASSERT_EQ(32, delegate_.canvas_width());
187 EXPECT_EQ(32, delegate_.canvas_height()); 230 ASSERT_EQ(32, delegate_.canvas_height());
188 } 231 }
189 232
190 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) { 233 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
191 delegate_.can_render_frame_ = true; 234 delegate_.can_render_frame_ = true;
192 235
193 // Implicitly calls RequestRender(). 236 // Implicitly calls RequestRender().
194 237
195 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1); 238 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
196 RunUntilRendered(); 239 RunUntilRendered();
197 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count()); 240 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count());
198 EXPECT_EQ(1, on_desktop_frame_processed_call_count()); 241 EXPECT_EQ(1, on_desktop_frame_processed_call_count());
199 242
200 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20); 243 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
201 RunUntilRendered(); 244 RunUntilRendered();
202 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); 245 ASSERT_EQ(2, delegate_.on_frame_rendered_call_count());
203 EXPECT_EQ(21, on_desktop_frame_processed_call_count()); 246 ASSERT_EQ(21, on_desktop_frame_processed_call_count());
204 } 247 }
205 248
206 // TODO(yuweih): Add tests to validate the rendered output. 249 // TODO(yuweih): Add tests to validate the rendered output.
207 250
251 TEST_F(GlRendererTest, TestAddDrawable) {
252 FakeDrawable* drawable0 = new FakeDrawable();
253 drawable0->SetId(0);
254 renderer_->AddDrawable(drawable0->GetWeakPtr());
255 ASSERT_EQ(1, GetDrawablesCount());
256 }
257
258 TEST_F(GlRendererTest, TestAddDrawableDefaultOrder) {
259 FakeDrawable* drawable0 = new FakeDrawable();
260 drawable0->SetId(0);
261 renderer_->AddDrawable(drawable0->GetWeakPtr());
262 ASSERT_EQ(1, GetDrawablesCount());
263
264 FakeDrawable* drawable1 = new FakeDrawable();
265 drawable1->SetId(1);
266 renderer_->AddDrawable(drawable1->GetWeakPtr());
267 ASSERT_EQ(2, GetDrawablesCount());
268
269 FakeDrawable* drawable2 = new FakeDrawable();
270 drawable2->SetId(2);
271 renderer_->AddDrawable(drawable2->GetWeakPtr());
272 ASSERT_EQ(3, GetDrawablesCount());
273
274 int i = 0;
275 for (auto& drawable : GetDrawables()) {
276 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
277 ASSERT_EQ(i, fg->GetId());
278 i++;
279 }
280 ASSERT_EQ(3, i);
281 }
282
283 TEST_F(GlRendererTest, TestAddDrawableOrder) {
284 FakeDrawable* drawable2 = new FakeDrawable();
285 drawable2->SetId(2);
286 drawable2->SetZIndex(2);
287 renderer_->AddDrawable(drawable2->GetWeakPtr());
288 ASSERT_EQ(1, GetDrawablesCount());
289
290 FakeDrawable* drawable0 = new FakeDrawable();
291 drawable0->SetId(0);
292 renderer_->AddDrawable(drawable0->GetWeakPtr());
293 ASSERT_EQ(2, GetDrawablesCount());
294
295 FakeDrawable* drawable1 = new FakeDrawable();
296 drawable1->SetId(1);
297 drawable1->SetZIndex(1);
298 renderer_->AddDrawable(drawable1->GetWeakPtr());
299 ASSERT_EQ(3, GetDrawablesCount());
300
301 int i = 0;
302 for (auto& drawable : GetDrawables()) {
303 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
304 ASSERT_EQ(i, fg->GetId());
305 i++;
306 }
307 ASSERT_EQ(3, i);
308 }
309
310 TEST_F(GlRendererTest, TestAddDrawableDrawn) {
311 std::unique_ptr<Canvas> fakeCanvas(new FakeCanvas());
312 renderer_->OnSurfaceCreated(std::move(fakeCanvas));
313 delegate_.can_render_frame_ = true;
314 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
315
316 FakeDrawable* drawable0 = new FakeDrawable();
317 drawable0->SetId(3);
318 renderer_->AddDrawable(drawable0->GetWeakPtr());
319 RequestRender();
320 RunTasksInCurrentQueue();
321
322 FakeDrawable* drawable1 = new FakeDrawable();
323 drawable1->SetId(2);
324 drawable1->SetZIndex(1);
325 renderer_->AddDrawable(drawable1->GetWeakPtr());
326
327 RequestRender();
328 RunTasksInCurrentQueue();
329
330 FakeDrawable* drawable2 = new FakeDrawable();
331 drawable2->SetId(1);
332 drawable2->SetZIndex(2);
333 renderer_->AddDrawable(drawable2->GetWeakPtr());
334 ASSERT_EQ(3, GetDrawablesCount());
335
336 RequestRender();
337 RunTasksInCurrentQueue();
338 for (auto& drawable : GetDrawables()) {
339 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get());
340 EXPECT_EQ(fg->GetId(), fg->DrawnCount());
341 }
342 }
343
344 TEST_F(GlRendererTest, TestCreateGlRendererWithDesktop) {
345 renderer_ = GlRenderer::CreateGlRendererWithDesktop();
346 renderer_->SetDelegate(delegate_.GetWeakPtr());
347 ASSERT_EQ(3, GetDrawablesCount());
348 }
349
350 // TODO(nicholss): Add a test where the drawable is destructed and the renderer
351 // gets a dead weakptr.
352
208 } // namespace remoting 353 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698