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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 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_; |
| 100 |
| 101 base::WeakPtrFactory<FakeDrawable> weak_factory_; |
| 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 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(); |
| 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 |
OLD | NEW |