Chromium Code Reviews| 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/gl_renderer.h" | 5 #include "remoting/client/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" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 int on_size_changed_call_count_ = 0; | 74 int on_size_changed_call_count_ = 0; |
| 75 | 75 |
| 76 int canvas_width_ = 0; | 76 int canvas_width_ = 0; |
| 77 int canvas_height_ = 0; | 77 int canvas_height_ = 0; |
| 78 | 78 |
| 79 base::Closure on_frame_rendered_callback_; | 79 base::Closure on_frame_rendered_callback_; |
| 80 | 80 |
| 81 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_; | 81 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_; |
| 82 }; | 82 }; |
| 83 | 83 |
| 84 class FakeGlDrawable : public GlDrawable { | |
| 85 public: | |
| 86 FakeGlDrawable() : drawn_(0), id_(-1), weak_factory_(this) {} | |
|
joedow
2016/12/22 00:29:03
nit: init the primitives inline and clean up the i
nicholss
2017/01/09 18:50:24
Done.
| |
| 87 | |
| 88 void SetId(int id) { id_ = id; } | |
| 89 int GetId() { return id_; } | |
| 90 | |
| 91 base::WeakPtr<GlDrawable> GetWeakPtr() override { | |
| 92 return weak_factory_.GetWeakPtr(); | |
| 93 } | |
| 94 | |
| 95 void SetCanvas(GlCanvas* canvas) override { canvas_ = canvas; } | |
| 96 | |
| 97 bool Draw() override { | |
| 98 drawn_++; | |
| 99 return false; | |
| 100 } | |
| 101 | |
| 102 int DrawnCount() { return drawn_; } | |
| 103 | |
| 104 private: | |
| 105 int drawn_; | |
| 106 int id_; | |
| 107 GlCanvas* canvas_; | |
| 108 | |
| 109 base::WeakPtrFactory<FakeGlDrawable> weak_factory_; | |
|
joedow
2016/12/22 00:29:03
DISALLOW_COPY_AND_ASSIGN macro?
nicholss
2017/01/09 18:50:24
Done.
| |
| 110 }; | |
| 111 | |
| 84 class GlRendererTest : public testing::Test { | 112 class GlRendererTest : public testing::Test { |
| 85 public: | 113 public: |
| 86 void SetUp() override; | 114 void SetUp() override; |
| 87 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size); | 115 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size); |
| 88 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count); | 116 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count); |
| 117 int GetDrawablesCount(); | |
| 118 std::vector<base::WeakPtr<GlDrawable>> GetDrawables(); | |
|
joedow
2016/12/22 00:29:03
Can this return a const ref so it doesn't need to
nicholss
2017/01/09 18:50:24
I don't think it matters for the test. It is 5 ele
| |
| 89 | 119 |
| 90 protected: | 120 protected: |
| 91 void RequestRender(); | 121 void RequestRender(); |
| 92 void OnDesktopFrameProcessed(); | 122 void OnDesktopFrameProcessed(); |
| 93 void RunTasksInCurrentQueue(); | 123 void RunTasksInCurrentQueue(); |
| 94 void RunUntilRendered(); | 124 void RunUntilRendered(); |
| 95 int on_desktop_frame_processed_call_count() { | 125 int on_desktop_frame_processed_call_count() { |
| 96 return on_desktop_frame_processed_call_count_; | 126 return on_desktop_frame_processed_call_count_; |
| 97 } | 127 } |
| 98 | 128 |
| 99 base::MessageLoop message_loop_; | 129 base::MessageLoop message_loop_; |
| 100 std::unique_ptr<GlRenderer> renderer_; | 130 std::unique_ptr<GlRenderer> renderer_; |
| 101 FakeGlRendererDelegate delegate_; | 131 FakeGlRendererDelegate delegate_; |
| 102 | 132 |
| 103 private: | 133 private: |
| 104 int on_desktop_frame_processed_call_count_ = 0; | 134 int on_desktop_frame_processed_call_count_ = 0; |
| 105 }; | 135 }; |
| 106 | 136 |
| 107 void GlRendererTest::SetUp() { | 137 void GlRendererTest::SetUp() { |
| 108 renderer_.reset(new GlRenderer()); | 138 renderer_.reset(new GlRenderer()); |
| 109 renderer_->SetDelegate(delegate_.GetWeakPtr()); | 139 renderer_->SetDelegate(delegate_.GetWeakPtr()); |
| 110 } | 140 } |
| 111 | 141 |
| 112 void GlRendererTest::RequestRender() { | 142 void GlRendererTest::RequestRender() { |
| 113 renderer_->RequestRender(); | 143 renderer_->RequestRender(); |
| 114 } | 144 } |
| 115 | 145 |
| 146 int GlRendererTest::GetDrawablesCount() { | |
| 147 return (int)renderer_->drawables_.size(); | |
| 148 } | |
| 149 | |
| 150 std::vector<base::WeakPtr<GlDrawable>> GlRendererTest::GetDrawables() { | |
| 151 return renderer_->drawables_; | |
| 152 } | |
| 153 | |
| 116 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) { | 154 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) { |
| 117 renderer_->OnFrameReceived( | 155 renderer_->OnFrameReceived( |
| 118 base::MakeUnique<webrtc::BasicDesktopFrame>(size), | 156 base::MakeUnique<webrtc::BasicDesktopFrame>(size), |
| 119 base::Bind(&GlRendererTest::OnDesktopFrameProcessed, | 157 base::Bind(&GlRendererTest::OnDesktopFrameProcessed, |
| 120 base::Unretained(this))); | 158 base::Unretained(this))); |
| 121 } | 159 } |
| 122 | 160 |
| 123 void GlRendererTest::PostSetDesktopFrameTasks( | 161 void GlRendererTest::PostSetDesktopFrameTasks( |
| 124 const webrtc::DesktopSize& size, int count) { | 162 const webrtc::DesktopSize& size, int count) { |
| 125 for (int i = 0; i < count; i++) { | 163 for (int i = 0; i < count; i++) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 209 EXPECT_EQ(1, on_desktop_frame_processed_call_count()); | 247 EXPECT_EQ(1, on_desktop_frame_processed_call_count()); |
| 210 | 248 |
| 211 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20); | 249 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20); |
| 212 RunUntilRendered(); | 250 RunUntilRendered(); |
| 213 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); | 251 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count()); |
| 214 EXPECT_EQ(21, on_desktop_frame_processed_call_count()); | 252 EXPECT_EQ(21, on_desktop_frame_processed_call_count()); |
| 215 } | 253 } |
| 216 | 254 |
| 217 // TODO(yuweih): Add tests to validate the rendered output. | 255 // TODO(yuweih): Add tests to validate the rendered output. |
| 218 | 256 |
| 257 TEST_F(GlRendererTest, TestAddDrawable) { | |
| 258 FakeGlDrawable* drawable0 = new FakeGlDrawable(); | |
| 259 drawable0->SetId(0); | |
| 260 renderer_->AddDrawable(drawable0->GetWeakPtr()); | |
| 261 EXPECT_EQ(1, GetDrawablesCount()); | |
| 262 } | |
| 263 | |
| 264 TEST_F(GlRendererTest, TestAddDrawableDefaultOrder) { | |
| 265 FakeGlDrawable* drawable0 = new FakeGlDrawable(); | |
| 266 drawable0->SetId(0); | |
| 267 renderer_->AddDrawable(drawable0->GetWeakPtr()); | |
| 268 EXPECT_EQ(1, GetDrawablesCount()); | |
|
joedow
2016/12/22 00:29:03
Why use EXPECT instead of ASSERT? Do you want the
nicholss
2017/01/09 18:50:24
I do not know how to unit test in chromium... Don'
Yuwei
2017/01/09 20:28:52
I think ASSERT will fail the test case and make th
| |
| 269 | |
| 270 FakeGlDrawable* drawable1 = new FakeGlDrawable(); | |
| 271 drawable1->SetId(1); | |
| 272 renderer_->AddDrawable(drawable1->GetWeakPtr()); | |
| 273 EXPECT_EQ(2, GetDrawablesCount()); | |
| 274 | |
| 275 FakeGlDrawable* drawable2 = new FakeGlDrawable(); | |
| 276 drawable2->SetId(2); | |
| 277 renderer_->AddDrawable(drawable2->GetWeakPtr()); | |
| 278 EXPECT_EQ(3, GetDrawablesCount()); | |
| 279 | |
| 280 std::vector<base::WeakPtr<GlDrawable>> drawables = GetDrawables(); | |
| 281 int i = 0; | |
| 282 for (auto& drawable : drawables) { | |
|
joedow
2016/12/22 00:29:03
replace 'drawable' with GetDrawables() instead?
nicholss
2017/01/09 18:50:24
Done.
| |
| 283 FakeGlDrawable* fg = (FakeGlDrawable*)drawable.get(); | |
|
joedow
2016/12/22 00:29:03
can you use a c++ style cast instead a c style? r
nicholss
2017/01/09 18:50:24
Done.
| |
| 284 EXPECT_EQ(i, fg->GetId()); | |
| 285 i++; | |
| 286 } | |
| 287 EXPECT_EQ(3, i); | |
| 288 } | |
| 289 | |
| 290 TEST_F(GlRendererTest, TestAddDrawableOrder) { | |
| 291 FakeGlDrawable* drawable2 = new FakeGlDrawable(); | |
| 292 drawable2->SetId(2); | |
| 293 drawable2->SetZIndex(2); | |
| 294 renderer_->AddDrawable(drawable2->GetWeakPtr()); | |
| 295 EXPECT_EQ(1, GetDrawablesCount()); | |
| 296 | |
| 297 FakeGlDrawable* drawable0 = new FakeGlDrawable(); | |
| 298 drawable0->SetId(0); | |
| 299 renderer_->AddDrawable(drawable0->GetWeakPtr()); | |
| 300 EXPECT_EQ(2, GetDrawablesCount()); | |
| 301 | |
| 302 FakeGlDrawable* drawable1 = new FakeGlDrawable(); | |
| 303 drawable1->SetId(1); | |
| 304 drawable1->SetZIndex(1); | |
| 305 renderer_->AddDrawable(drawable1->GetWeakPtr()); | |
| 306 EXPECT_EQ(3, GetDrawablesCount()); | |
| 307 | |
| 308 std::vector<base::WeakPtr<GlDrawable>> drawables = GetDrawables(); | |
| 309 int i = 0; | |
| 310 for (auto& drawable : drawables) { | |
| 311 FakeGlDrawable* fg = (FakeGlDrawable*)drawable.get(); | |
| 312 EXPECT_EQ(i, fg->GetId()); | |
| 313 i++; | |
| 314 } | |
| 315 EXPECT_EQ(3, i); | |
| 316 } | |
| 317 | |
| 318 TEST_F(GlRendererTest, TestAddDrawableDrawn) { | |
| 319 renderer_->OnSurfaceCreated(-1); | |
| 320 | |
| 321 delegate_.can_render_frame_ = true; | |
| 322 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1); | |
| 323 | |
| 324 FakeGlDrawable* drawable0 = new FakeGlDrawable(); | |
| 325 drawable0->SetId(3); | |
| 326 renderer_->AddDrawable(drawable0->GetWeakPtr()); | |
| 327 | |
| 328 RequestRender(); | |
| 329 RunTasksInCurrentQueue(); | |
| 330 | |
| 331 FakeGlDrawable* drawable1 = new FakeGlDrawable(); | |
| 332 drawable1->SetId(2); | |
| 333 drawable1->SetZIndex(1); | |
| 334 renderer_->AddDrawable(drawable1->GetWeakPtr()); | |
| 335 | |
| 336 RequestRender(); | |
| 337 RunTasksInCurrentQueue(); | |
| 338 | |
| 339 FakeGlDrawable* drawable2 = new FakeGlDrawable(); | |
| 340 drawable2->SetId(1); | |
| 341 drawable2->SetZIndex(2); | |
| 342 renderer_->AddDrawable(drawable2->GetWeakPtr()); | |
| 343 EXPECT_EQ(3, GetDrawablesCount()); | |
| 344 | |
| 345 RequestRender(); | |
| 346 RunTasksInCurrentQueue(); | |
| 347 std::vector<base::WeakPtr<GlDrawable>> drawables = GetDrawables(); | |
| 348 for (auto& drawable : drawables) { | |
| 349 FakeGlDrawable* fg = (FakeGlDrawable*)drawable.get(); | |
| 350 EXPECT_EQ(fg->GetId(), fg->DrawnCount()); | |
| 351 } | |
| 352 } | |
| 353 | |
| 354 TEST_F(GlRendererTest, TestCreateGlRendererWithDesktop) { | |
| 355 renderer_.reset(GlRenderer::CreateGlRendererWithDesktop()); | |
| 356 renderer_->SetDelegate(delegate_.GetWeakPtr()); | |
| 357 EXPECT_EQ(3, GetDrawablesCount()); | |
| 358 } | |
| 359 | |
| 360 // TODO(nicholss): Add a test where the drawable is destructed and the renderer | |
| 361 // gets a dead weakptr. | |
| 362 | |
| 219 } // namespace remoting | 363 } // namespace remoting |
| OLD | NEW |