Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: remoting/client/gl_renderer_unittest.cc

Issue 2196493002: [Chromoting] Unit Tests for GlRenderer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge ToT Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "remoting/client/gl_renderer.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "remoting/client/gl_renderer_delegate.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
16
17 namespace remoting {
18
19 class FakeGlRendererDelegate : public GlRendererDelegate {
20 public:
21 FakeGlRendererDelegate() : weak_factory_(this) {}
22
23 bool CanRenderFrame() override {
24 can_render_frame_call_count_++;
25 return can_render_frame_;
26 }
27
28 void OnFrameRendered() override {
29 on_frame_rendered_call_count_++;
30 if (on_frame_rendered_callback_) {
31 on_frame_rendered_callback_.Run();
32 }
33 }
34
35 void OnSizeChanged(int width, int height) override {
36 canvas_width_ = width;
37 canvas_height_ = height;
38 on_size_changed_call_count_++;
39 }
40
41 void SetOnFrameRenderedCallback(const base::Closure& callback) {
42 on_frame_rendered_callback_ = callback;
43 }
44
45 base::WeakPtr<FakeGlRendererDelegate> GetWeakPtr() {
46 return weak_factory_.GetWeakPtr();
47 }
48
49 bool can_render_frame_ = false;
50 int can_render_frame_call_count_ = 0;
51 int on_frame_rendered_call_count_ = 0;
52 int on_size_changed_call_count_ = 0;
53
54 int canvas_width_ = 0;
55 int canvas_height_ = 0;
Sergey Ulanov 2016/08/10 15:35:06 make these private and add methods to access them
Yuwei 2016/08/10 21:31:01 Done.
56 private:
Sergey Ulanov 2016/08/10 15:35:06 empty line before private:
Yuwei 2016/08/10 21:31:01 Done.
57 base::Closure on_frame_rendered_callback_;
58
59 base::WeakPtrFactory<FakeGlRendererDelegate> weak_factory_;
60 };
61
62 class GlRendererTest : public testing::Test {
63 public:
64 void SetUp() override;
65 void SetDesktopFrameWithSize(const webrtc::DesktopSize& size);
66 void PostSetDesktopFrameTasks(const webrtc::DesktopSize& size, int count);
67
68 protected:
69 void RequestRender();
70 void OnDesktopFrameProcessed();
71 void RunTasksInCurrentQueue();
72 void RunUntilRendered();
73
74 std::unique_ptr<GlRenderer> renderer_;
75 FakeGlRendererDelegate delegate_;
76 base::MessageLoop message_loop_;
Sergey Ulanov 2016/08/10 15:35:06 move this above renderer_ so it's destroyed last.
Yuwei 2016/08/10 21:31:01 Done.
77 int on_desktop_frame_processed_call_count_ = 0;
78 };
79
80 void GlRendererTest::SetUp() {
81 renderer_.reset(new GlRenderer());
82 renderer_->SetDelegate(delegate_.GetWeakPtr());
83 }
84
85 void GlRendererTest::RequestRender() {
86 renderer_->RequestRender();
87 }
88
89 void GlRendererTest::SetDesktopFrameWithSize(const webrtc::DesktopSize& size) {
90 renderer_->OnFrameReceived(
91 base::WrapUnique(
92 new webrtc::BasicDesktopFrame(size)),
93 base::Bind(&GlRendererTest::OnDesktopFrameProcessed,
94 base::Unretained(this)));
95 }
96
97 void GlRendererTest::PostSetDesktopFrameTasks(
98 const webrtc::DesktopSize& size, int count) {
99 for (int i = 0; i < count; i++) {
100 message_loop_.task_runner()->PostTask(
101 FROM_HERE, base::Bind(&GlRendererTest::SetDesktopFrameWithSize,
102 base::Unretained(this), size));
103 }
104 }
105
106 void GlRendererTest::OnDesktopFrameProcessed() {
107 on_desktop_frame_processed_call_count_++;
108 }
109
110 void GlRendererTest::RunTasksInCurrentQueue() {
111 base::RunLoop run_loop;
112 message_loop_.task_runner()->PostTask(FROM_HERE, run_loop.QuitClosure());
113 run_loop.Run();
114 }
115
116 void GlRendererTest::RunUntilRendered() {
117 base::RunLoop run_loop;
118 delegate_.SetOnFrameRenderedCallback(run_loop.QuitClosure());
119 run_loop.Run();
120 }
121
122
123 TEST_F(GlRendererTest, TestDelegateCanRenderFrame) {
124 delegate_.can_render_frame_ = true;
125 RequestRender();
126 RunTasksInCurrentQueue();
127 EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
128 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
129
130 delegate_.can_render_frame_ = false;
131 RequestRender();
132 RunTasksInCurrentQueue();
133 EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
134 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
135 }
136
137 TEST_F(GlRendererTest, TestRequestRenderOnlyScheduleOnce) {
138 delegate_.can_render_frame_ = true;
139
140 RequestRender();
141 RequestRender();
142 RequestRender();
143 RunTasksInCurrentQueue();
144 EXPECT_EQ(1, delegate_.can_render_frame_call_count_);
145 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
146
147 RequestRender();
148 RunTasksInCurrentQueue();
149 EXPECT_EQ(2, delegate_.can_render_frame_call_count_);
150 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
151 }
152
153 TEST_F(GlRendererTest, TestDelegateOnSizeChanged) {
154 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
155 EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
156 EXPECT_EQ(16, delegate_.canvas_width_);
157 EXPECT_EQ(16, delegate_.canvas_height_);
158
159 SetDesktopFrameWithSize(webrtc::DesktopSize(16, 16));
160 EXPECT_EQ(1, delegate_.on_size_changed_call_count_);
161 EXPECT_EQ(16, delegate_.canvas_width_);
162 EXPECT_EQ(16, delegate_.canvas_height_);
163
164 SetDesktopFrameWithSize(webrtc::DesktopSize(32, 32));
165 EXPECT_EQ(2, delegate_.on_size_changed_call_count_);
166 EXPECT_EQ(32, delegate_.canvas_width_);
167 EXPECT_EQ(32, delegate_.canvas_height_);
168
169 renderer_->RequestCanvasSize();
170 EXPECT_EQ(3, delegate_.on_size_changed_call_count_);
171 EXPECT_EQ(32, delegate_.canvas_width_);
172 EXPECT_EQ(32, delegate_.canvas_height_);
173 }
174
175 TEST_F(GlRendererTest, TestOnFrameReceivedDoneCallbacks) {
176 delegate_.can_render_frame_ = true;
177
178 // Implicitly calls RequestRender().
179
180 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 1);
181 RunUntilRendered();
182 EXPECT_EQ(1, delegate_.on_frame_rendered_call_count_);
183 EXPECT_EQ(1, on_desktop_frame_processed_call_count_);
184
185 PostSetDesktopFrameTasks(webrtc::DesktopSize(16, 16), 20);
186 RunUntilRendered();
187 EXPECT_EQ(2, delegate_.on_frame_rendered_call_count_);
188 EXPECT_EQ(21, on_desktop_frame_processed_call_count_);
189 }
190
191 // TODO(yuweih): Add tests for the rendering process.
Sergey Ulanov 2016/08/10 15:35:06 Not clear what you mean by "rendering process". Di
Yuwei 2016/08/10 21:31:00 Yes. Changed the comment.
192
193 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698