OLD | NEW |
(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>(¶ms); |
| 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 |
OLD | NEW |