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