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

Side by Side Diff: cc/blimp/layer_tree_host_remote_unittest.cc

Issue 2362073002: cc/blimp: Add a LayerTreeHostRemote implementation. (Closed)
Patch Set: win Created 4 years, 2 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 "cc/blimp/layer_tree_host_remote.h"
6
7 #include "base/bind.h"
8 #include "base/run_loop.h"
9 #include "base/threading/thread_task_runner_handle.h"
10 #include "cc/animation/animation_host.h"
11 #include "cc/layers/layer.h"
12 #include "cc/output/begin_frame_args.h"
13 #include "cc/test/fake_remote_compositor_bridge.h"
14 #include "cc/test/stub_layer_tree_host_client.h"
15 #include "cc/trees/layer_tree_settings.h"
16 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 using ::testing::_;
20 using testing::InSequence;
21 using testing::Mock;
22 using testing::StrictMock;
23
24 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \
25 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \
26 EXPECT_CALL(client, BeginMainFrame(_)).Times(num); \
27 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \
28 EXPECT_CALL(client, WillCommit()).Times(num); \
29 EXPECT_CALL(client, DidCommit()).Times(num); \
30 EXPECT_CALL(client, DidBeginMainFrame()).Times(num);
31
32 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \
33 EXPECT_BEGIN_MAIN_FRAME(client, num) \
34 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \
35 EXPECT_CALL(client, DidCompleteSwapBuffers()).Times(num);
36
37 namespace cc {
38 namespace {
39
40 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge {
41 public:
42 UpdateTrackingRemoteCompositorBridge(
43 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner)
44 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {}
45
46 ~UpdateTrackingRemoteCompositorBridge() override = default;
47
48 void ProcessCompositorStateUpdate(
49 std::unique_ptr<CompositorProtoState> compositor_proto_state) override {
50 num_updates_received_++;
51 };
52
53 int num_updates_received() const { return num_updates_received_; }
54
55 private:
56 int num_updates_received_ = 0;
57 };
58
59 class MockLayerTreeHostClient : public StubLayerTreeHostClient {
60 public:
61 MockLayerTreeHostClient() = default;
62 ~MockLayerTreeHostClient() override = default;
63
64 void set_update_host_callback(base::Closure callback) {
65 update_host_callback_ = callback;
66 }
67
68 void UpdateLayerTreeHost() override {
69 update_host_callback_.Run();
70 DidUpdateLayerTreeHost();
71 }
72
73 // LayerTreeHostClient implementation.
74 MOCK_METHOD0(WillBeginMainFrame, void());
75 MOCK_METHOD1(BeginMainFrame, void(const BeginFrameArgs& args));
76 MOCK_METHOD0(DidBeginMainFrame, void());
77 MOCK_METHOD0(DidUpdateLayerTreeHost, void());
78 MOCK_METHOD0(WillCommit, void());
79 MOCK_METHOD0(DidCommit, void());
80 MOCK_METHOD0(DidCommitAndDrawFrame, void());
81 MOCK_METHOD0(DidCompleteSwapBuffers, void());
82
83 private:
84 base::Closure update_host_callback_;
85 };
86
87 class MockLayer : public Layer {
88 public:
89 explicit MockLayer(bool update) : update_(update) {}
90
91 bool Update() override {
92 did_update_ = true;
93 return update_;
94 }
95
96 bool did_update() const { return did_update_; }
97
98 private:
99 ~MockLayer() override {}
100
101 bool update_;
102 bool did_update_ = false;
103 };
104
105 class MockLayerTree : public LayerTree {
106 public:
107 MockLayerTree(std::unique_ptr<AnimationHost> animation_host,
108 LayerTreeHost* layer_tree_host)
109 : LayerTree(std::move(animation_host), layer_tree_host) {}
110 ~MockLayerTree() override {}
111
112 // We don't want tree sync requests to trigger commits.
113 void SetNeedsFullTreeSync() override {}
114 };
115
116 class LayerTreeHostRemoteForTesting : public LayerTreeHostRemote {
117 public:
118 explicit LayerTreeHostRemoteForTesting(InitParams* params)
119 : LayerTreeHostRemote(
120 params,
121 base::MakeUnique<MockLayerTree>(AnimationHost::CreateMainInstance(),
122 this)) {}
123 ~LayerTreeHostRemoteForTesting() override {}
124 };
125
126 class LayerTreeHostRemoteTest : public testing::Test {
127 public:
128 LayerTreeHostRemoteTest() {
129 mock_layer_tree_host_client_.set_update_host_callback(base::Bind(
130 &LayerTreeHostRemoteTest::UpdateLayerTreeHost, base::Unretained(this)));
131 }
132 ~LayerTreeHostRemoteTest() override {}
133
134 void SetUp() override {
135 LayerTreeHostRemote::InitParams params;
136 params.client = &mock_layer_tree_host_client_;
137 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner =
138 base::ThreadTaskRunnerHandle::Get();
139 params.main_task_runner = main_task_runner;
140 std::unique_ptr<UpdateTrackingRemoteCompositorBridge>
141 remote_compositor_bridge =
142 base::MakeUnique<UpdateTrackingRemoteCompositorBridge>(
143 main_task_runner);
144 remote_compositor_bridge_ = remote_compositor_bridge.get();
145 params.remote_compositor_bridge = std::move(remote_compositor_bridge);
146 LayerTreeSettings settings;
147 params.settings = &settings;
148
149 layer_tree_host_ = base::MakeUnique<LayerTreeHostRemoteForTesting>(&params);
150 root_layer_ = make_scoped_refptr(new MockLayer(false));
151 layer_tree_host_->GetLayerTree()->SetRootLayer(root_layer_);
152 }
153
154 void TearDown() override {
155 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_);
156 layer_tree_host_ = nullptr;
157 root_layer_ = nullptr;
158 remote_compositor_bridge_ = nullptr;
159 }
160
161 void UpdateLayerTreeHost() {
162 if (needs_animate_during_main_frame_) {
163 layer_tree_host_->SetNeedsAnimate();
164 needs_animate_during_main_frame_ = false;
165 }
166
167 if (needs_commit_during_main_frame_) {
168 layer_tree_host_->SetNeedsCommit();
169 needs_commit_during_main_frame_ = false;
170 }
171 }
172
173 void set_needs_animate_during_main_frame(bool needs) {
174 needs_animate_during_main_frame_ = needs;
175 }
176
177 void set_needs_commit_during_main_frame(bool needs) {
178 needs_commit_during_main_frame_ = needs;
179 }
180
181 protected:
182 std::unique_ptr<LayerTreeHostRemote> layer_tree_host_;
183 StrictMock<MockLayerTreeHostClient> mock_layer_tree_host_client_;
184 UpdateTrackingRemoteCompositorBridge* remote_compositor_bridge_ = nullptr;
185 scoped_refptr<MockLayer> root_layer_;
186
187 bool needs_animate_during_main_frame_ = false;
188 bool needs_commit_during_main_frame_ = false;
189
190 private:
191 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostRemoteTest);
192 };
193
194 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameAnimateOnly) {
195 // The main frame should run until the animate step only.
196 InSequence s;
197 int num_of_frames = 1;
198 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames);
199
200 int previous_source_frame = layer_tree_host_->SourceFrameNumber();
201 layer_tree_host_->SetNeedsAnimate();
202
203 base::RunLoop().RunUntilIdle();
204 EXPECT_FALSE(root_layer_->did_update());
205 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received());
206 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber());
207 }
208
209 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameUpdateLayers) {
210 // The main frame should run until the update layers step only.
211 InSequence s;
212 int num_of_frames = 1;
213 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames);
214
215 int previous_source_frame = layer_tree_host_->SourceFrameNumber();
216 layer_tree_host_->SetNeedsUpdateLayers();
217
218 base::RunLoop().RunUntilIdle();
219 EXPECT_TRUE(root_layer_->did_update());
220 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received());
221 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber());
222 }
223
224 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameCommit) {
225 // The main frame should run until the commit step.
226 InSequence s;
227 int num_of_frames = 1;
228 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_,
229 num_of_frames);
230
231 int previous_source_frame = layer_tree_host_->SourceFrameNumber();
232 layer_tree_host_->SetNeedsCommit();
233
234 base::RunLoop().RunUntilIdle();
235 EXPECT_TRUE(root_layer_->did_update());
236 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
237 EXPECT_EQ(++previous_source_frame, layer_tree_host_->SourceFrameNumber());
238 }
239
240 TEST_F(LayerTreeHostRemoteTest, BeginMainFrameMultipleRequests) {
241 // Multiple BeginMainFrame requests should result in a single main frame
242 // update.
243 InSequence s;
244 int num_of_frames = 1;
245 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_,
246 num_of_frames);
247
248 layer_tree_host_->SetNeedsAnimate();
249 layer_tree_host_->SetNeedsUpdateLayers();
250 layer_tree_host_->SetNeedsCommit();
251
252 base::RunLoop().RunUntilIdle();
253 EXPECT_TRUE(root_layer_->did_update());
254 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
255 }
256
257 TEST_F(LayerTreeHostRemoteTest, CommitRequestThenDeferCommits) {
258 // Make a commit request, followed by a request to defer commits.
259 layer_tree_host_->SetNeedsCommit();
260 layer_tree_host_->SetDeferCommits(true);
261
262 // We should not have seen any BeginMainFrames.
263 base::RunLoop().RunUntilIdle();
264 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_);
265 EXPECT_FALSE(root_layer_->did_update());
266 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received());
267
268 // Now enable commits and ensure we see a BeginMainFrame.
269 layer_tree_host_->SetDeferCommits(false);
270 InSequence s;
271 int num_of_frames = 1;
272 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_,
273 num_of_frames);
274 base::RunLoop().RunUntilIdle();
275 EXPECT_TRUE(root_layer_->did_update());
276 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
277 }
278
279 TEST_F(LayerTreeHostRemoteTest, DeferCommitsThenCommitRequest) {
280 // Defer commits followed by a commit request.
281 layer_tree_host_->SetDeferCommits(true);
282 layer_tree_host_->SetNeedsCommit();
283
284 // We should not have seen any BeginMainFrames.
285 base::RunLoop().RunUntilIdle();
286 Mock::VerifyAndClearExpectations(&mock_layer_tree_host_client_);
287 EXPECT_FALSE(root_layer_->did_update());
288 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received());
289
290 // Now enable commits and ensure we see a BeginMainFrame.
291 layer_tree_host_->SetDeferCommits(false);
292 InSequence s;
293 int num_of_frames = 1;
294 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_,
295 num_of_frames);
296 base::RunLoop().RunUntilIdle();
297 EXPECT_TRUE(root_layer_->did_update());
298 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
299 }
300
301 TEST_F(LayerTreeHostRemoteTest, RequestAnimateDuringMainFrame) {
302 // An animate request during BeginMainFrame should result in a second main
303 // frame being scheduled.
304 set_needs_animate_during_main_frame(true);
305 int num_of_frames = 2;
306 EXPECT_BEGIN_MAIN_FRAME(mock_layer_tree_host_client_, num_of_frames);
307
308 layer_tree_host_->SetNeedsAnimate();
309
310 base::RunLoop().RunUntilIdle();
311 EXPECT_FALSE(root_layer_->did_update());
312 EXPECT_EQ(0, remote_compositor_bridge_->num_updates_received());
313 }
314
315 TEST_F(LayerTreeHostRemoteTest, RequestCommitDuringMainFrame) {
316 // A commit request during a BeginMainFrame scheduled for an animate request
317 // should go till the commit stage.
318 set_needs_commit_during_main_frame(true);
319 int num_of_frames = 1;
320 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_,
321 num_of_frames);
322
323 layer_tree_host_->SetNeedsAnimate();
324
325 base::RunLoop().RunUntilIdle();
326 EXPECT_TRUE(root_layer_->did_update());
327 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
328 }
329
330 TEST_F(LayerTreeHostRemoteTest, RequestCommitDuringLayerUpdates) {
331 // A layer update during a main frame should result in a commit.
332 scoped_refptr<Layer> child_layer = make_scoped_refptr(new MockLayer(true));
333 root_layer_->AddChild(child_layer);
334 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, 1);
335
336 layer_tree_host_->SetNeedsUpdateLayers();
337
338 base::RunLoop().RunUntilIdle();
339 EXPECT_TRUE(root_layer_->did_update());
340 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
341 }
342
343 } // namespace
344 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698