OLD | NEW |
---|---|
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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
60 | 61 |
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_; |
71 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_; | |
70 | 72 |
71 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_; | 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(base::WeakPtr<Canvas> canvas) override {} | |
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 | |
100 base::WeakPtrFactory<FakeDrawable> weak_factory_; | |
101 | |
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(); | |
Sergey Ulanov
2017/01/11 22:47:31
style guide doesn't allow c-style casts, static_ca
nicholss
2017/01/11 23:43:25
Done.
| |
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 Loading... | |
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()); |
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(); | |
Sergey Ulanov
2017/01/11 22:47:31
I think you need to use unique_ptr<> here to ensur
nicholss
2017/01/11 23:43:25
Done.
| |
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 FakeDrawable* drawable0 = new FakeDrawable(); | |
314 drawable0->SetId(3); | |
315 renderer_->AddDrawable(drawable0->GetWeakPtr()); | |
316 RequestRender(); | |
317 RunTasksInCurrentQueue(); | |
318 FakeDrawable* drawable1 = new FakeDrawable(); | |
319 drawable1->SetId(2); | |
320 drawable1->SetZIndex(1); | |
321 renderer_->AddDrawable(drawable1->GetWeakPtr()); | |
322 | |
323 RequestRender(); | |
324 RunTasksInCurrentQueue(); | |
325 | |
326 FakeDrawable* drawable2 = new FakeDrawable(); | |
327 drawable2->SetId(1); | |
328 drawable2->SetZIndex(2); | |
329 renderer_->AddDrawable(drawable2->GetWeakPtr()); | |
330 ASSERT_EQ(3, GetDrawablesCount()); | |
331 | |
332 RequestRender(); | |
333 RunTasksInCurrentQueue(); | |
334 for (auto& drawable : GetDrawables()) { | |
335 FakeDrawable* fg = static_cast<FakeDrawable*>(drawable.get()); | |
336 EXPECT_EQ(fg->GetId(), fg->DrawnCount()); | |
337 } | |
338 } | |
339 | |
340 TEST_F(GlRendererTest, TestCreateGlRendererWithDesktop) { | |
341 renderer_ = GlRenderer::CreateGlRendererWithDesktop(); | |
342 renderer_->SetDelegate(delegate_.GetWeakPtr()); | |
343 ASSERT_EQ(3, GetDrawablesCount()); | |
344 } | |
345 | |
346 // TODO(nicholss): Add a test where the drawable is destructed and the renderer | |
347 // gets a dead weakptr. | |
348 | |
208 } // namespace remoting | 349 } // namespace remoting |
OLD | NEW |