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 |