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 |
| 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 Loading... |
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 |
OLD | NEW |