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

Side by Side Diff: cc/layers/surface_layer_unittest.cc

Issue 2830983004: Replace TestSurfaceReferenceFactory in surface_layer_unittests.cc with a mock implementation (Closed)
Patch Set: Remove VerifyAndClearExpectations Created 3 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stdint.h> 5 #include <stdint.h>
6 6
7 #include <set> 7 #include <set>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 14 matching lines...) Expand all
25 #include "cc/test/fake_output_surface.h" 25 #include "cc/test/fake_output_surface.h"
26 #include "cc/test/layer_tree_test.h" 26 #include "cc/test/layer_tree_test.h"
27 #include "cc/test/test_task_graph_runner.h" 27 #include "cc/test/test_task_graph_runner.h"
28 #include "cc/trees/layer_tree_host.h" 28 #include "cc/trees/layer_tree_host.h"
29 #include "testing/gmock/include/gmock/gmock.h" 29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
31 31
32 namespace cc { 32 namespace cc {
33 namespace { 33 namespace {
34 34
35 using testing::_;
36 using testing::Eq;
37
35 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); 38 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
36 39
37 class SurfaceLayerTest : public testing::Test { 40 class SurfaceLayerTest : public testing::Test {
38 public: 41 public:
39 SurfaceLayerTest() 42 SurfaceLayerTest()
40 : host_impl_(&task_runner_provider_, &task_graph_runner_) {} 43 : host_impl_(&task_runner_provider_, &task_graph_runner_) {}
41 44
42 protected: 45 protected:
43 void SetUp() override { 46 void SetUp() override {
44 animation_host_ = AnimationHost::CreateForTesting(ThreadInstance::MAIN); 47 animation_host_ = AnimationHost::CreateForTesting(ThreadInstance::MAIN);
(...skipping 11 matching lines...) Expand all
56 } 59 }
57 60
58 FakeLayerTreeHostClient fake_client_; 61 FakeLayerTreeHostClient fake_client_;
59 FakeImplTaskRunnerProvider task_runner_provider_; 62 FakeImplTaskRunnerProvider task_runner_provider_;
60 TestTaskGraphRunner task_graph_runner_; 63 TestTaskGraphRunner task_graph_runner_;
61 std::unique_ptr<AnimationHost> animation_host_; 64 std::unique_ptr<AnimationHost> animation_host_;
62 std::unique_ptr<FakeLayerTreeHost> layer_tree_host_; 65 std::unique_ptr<FakeLayerTreeHost> layer_tree_host_;
63 FakeLayerTreeHostImpl host_impl_; 66 FakeLayerTreeHostImpl host_impl_;
64 }; 67 };
65 68
66 class TestSurfaceReferenceFactory : public SequenceSurfaceReferenceFactory { 69 class MockSurfaceReferenceFactory : public SequenceSurfaceReferenceFactory {
67 protected: 70 public:
68 void SatisfySequence(const SurfaceSequence& seq) const override { 71 MockSurfaceReferenceFactory() {}
69 *out_seq_ = seq;
70 }
71 72
72 void RequireSequence(const SurfaceId& id, 73 // SequenceSurfaceReferenceFactory implementation.
73 const SurfaceSequence& seq) const override { 74 MOCK_CONST_METHOD1(SatisfySequence, void(const SurfaceSequence&));
74 *out_id_ = id; 75 MOCK_CONST_METHOD2(RequireSequence,
75 out_set_->insert(seq); 76 void(const SurfaceId&, const SurfaceSequence&));
76 }
77
78 public:
79 TestSurfaceReferenceFactory(SurfaceSequence* out_seq,
80 SurfaceId* out_id,
81 std::set<SurfaceSequence>* out_set)
82 : out_seq_(out_seq), out_id_(out_id), out_set_(out_set) {}
83 77
84 protected: 78 protected:
85 ~TestSurfaceReferenceFactory() override = default; 79 ~MockSurfaceReferenceFactory() override = default;
86 80
87 private: 81 private:
88 SurfaceSequence* out_seq_; 82 DISALLOW_COPY_AND_ASSIGN(MockSurfaceReferenceFactory);
89 SurfaceId* out_id_;
90 std::set<SurfaceSequence>* out_set_;
91
92 DISALLOW_COPY_AND_ASSIGN(TestSurfaceReferenceFactory);
93 }; 83 };
94 84
95 // Check that one surface can be referenced by multiple LayerTreeHosts, and 85 // Check that one surface can be referenced by multiple LayerTreeHosts, and
96 // each will create its own SurfaceSequence that's satisfied on destruction. 86 // each will create its own SurfaceSequence that's satisfied on destruction.
97 TEST_F(SurfaceLayerTest, MultipleFramesOneSurface) { 87 TEST_F(SurfaceLayerTest, MultipleFramesOneSurface) {
98 const base::UnguessableToken kArbitraryToken = 88 const base::UnguessableToken kArbitraryToken =
99 base::UnguessableToken::Create(); 89 base::UnguessableToken::Create();
100 SurfaceSequence blank_change; // Receives sequence if commit doesn't happen. 90 const SurfaceInfo info(
101
102 SurfaceId required_id;
103 std::set<SurfaceSequence> required_seq;
104 scoped_refptr<SurfaceReferenceFactory> ref_factory =
105 new TestSurfaceReferenceFactory(&blank_change, &required_id,
106 &required_seq);
107 auto layer = SurfaceLayer::Create(ref_factory);
108 SurfaceInfo info(
109 SurfaceId(kArbitraryFrameSinkId, LocalSurfaceId(1, kArbitraryToken)), 1.f, 91 SurfaceId(kArbitraryFrameSinkId, LocalSurfaceId(1, kArbitraryToken)), 1.f,
110 gfx::Size(1, 1)); 92 gfx::Size(1, 1));
93 const SurfaceSequence expected_seq1(FrameSinkId(1, 1), 1u);
94 const SurfaceSequence expected_seq2(FrameSinkId(2, 2), 1u);
95 const SurfaceId expected_id(kArbitraryFrameSinkId,
96 LocalSurfaceId(1, kArbitraryToken));
97
98 scoped_refptr<MockSurfaceReferenceFactory> ref_factory =
99 new testing::StrictMock<MockSurfaceReferenceFactory>();
100
101 // We are going to set up the SurfaceLayers and LayerTreeHosts. Each layer
102 // will require a sequence and no sequence should be satisfied for now.
103 EXPECT_CALL(*ref_factory, RequireSequence(Eq(expected_id), Eq(expected_seq1)))
104 .Times(1);
105 EXPECT_CALL(*ref_factory, RequireSequence(Eq(expected_id), Eq(expected_seq2)))
106 .Times(1);
107 EXPECT_CALL(*ref_factory, SatisfySequence(_)).Times(0);
108
109 auto layer = SurfaceLayer::Create(ref_factory);
111 layer->SetPrimarySurfaceInfo(info); 110 layer->SetPrimarySurfaceInfo(info);
112 layer_tree_host_->GetSurfaceSequenceGenerator()->set_frame_sink_id( 111 layer_tree_host_->GetSurfaceSequenceGenerator()->set_frame_sink_id(
113 FrameSinkId(1, 1)); 112 FrameSinkId(1, 1));
114 layer_tree_host_->SetRootLayer(layer); 113 layer_tree_host_->SetRootLayer(layer);
115 114
116 auto animation_host2 = AnimationHost::CreateForTesting(ThreadInstance::MAIN); 115 auto animation_host2 = AnimationHost::CreateForTesting(ThreadInstance::MAIN);
117 std::unique_ptr<FakeLayerTreeHost> layer_tree_host2 = 116 std::unique_ptr<FakeLayerTreeHost> layer_tree_host2 =
118 FakeLayerTreeHost::Create(&fake_client_, &task_graph_runner_, 117 FakeLayerTreeHost::Create(&fake_client_, &task_graph_runner_,
119 animation_host2.get()); 118 animation_host2.get());
120 auto layer2 = SurfaceLayer::Create(std::move(ref_factory)); 119 auto layer2 = SurfaceLayer::Create(ref_factory);
121 layer2->SetPrimarySurfaceInfo(info); 120 layer2->SetPrimarySurfaceInfo(info);
122 layer_tree_host2->GetSurfaceSequenceGenerator()->set_frame_sink_id( 121 layer_tree_host2->GetSurfaceSequenceGenerator()->set_frame_sink_id(
123 FrameSinkId(2, 2)); 122 FrameSinkId(2, 2));
124 layer_tree_host2->SetRootLayer(layer2); 123 layer_tree_host2->SetRootLayer(layer2);
125 124
126 // Layers haven't been removed, so no sequence should be satisfied. 125 testing::Mock::VerifyAndClearExpectations(ref_factory.get());
127 EXPECT_FALSE(blank_change.is_valid());
128 126
129 SurfaceSequence expected1(FrameSinkId(1, 1), 1u); 127 // Destroy the second LayerTreeHost. The sequence generated by its
130 SurfaceSequence expected2(FrameSinkId(2, 2), 1u); 128 // SurfaceLayer must be satisfied and no new sequences must be required.
131 129 EXPECT_CALL(*ref_factory, SatisfySequence(Eq(expected_seq2))).Times(1);
132 layer_tree_host2->SetRootLayer(nullptr); 130 layer_tree_host2->SetRootLayer(nullptr);
133 layer_tree_host2.reset(); 131 layer_tree_host2.reset();
134 animation_host2 = nullptr; 132 animation_host2 = nullptr;
133 base::RunLoop().RunUntilIdle();
134 testing::Mock::VerifyAndClearExpectations(ref_factory.get());
135 135
136 // Layer was removed so sequence from second LayerTreeHost should be 136 // Destroy the first LayerTreeHost. The sequence generated by its
137 // satisfied. 137 // SurfaceLayer must be satisfied and no new sequences must be required.
138 base::RunLoop().RunUntilIdle(); 138 EXPECT_CALL(*ref_factory, SatisfySequence(expected_seq1)).Times(1);
139 EXPECT_TRUE(blank_change == expected2); 139 EXPECT_CALL(*ref_factory, RequireSequence(_, _)).Times(0);
140
141 // Set of sequences that need to be satisfied should include sequences from
142 // both trees.
143 EXPECT_TRUE(required_id == SurfaceId(kArbitraryFrameSinkId,
144 LocalSurfaceId(1, kArbitraryToken)));
145 EXPECT_EQ(2u, required_seq.size());
146 EXPECT_TRUE(required_seq.count(expected1));
147 EXPECT_TRUE(required_seq.count(expected2));
148
149 layer_tree_host_->SetRootLayer(nullptr); 140 layer_tree_host_->SetRootLayer(nullptr);
150 layer_tree_host_.reset(); 141 layer_tree_host_.reset();
151
152 // Layer was removed so sequence from first LayerTreeHost should be
153 // satisfied.
154 base::RunLoop().RunUntilIdle(); 142 base::RunLoop().RunUntilIdle();
155 EXPECT_TRUE(blank_change == expected1); 143 testing::Mock::VerifyAndClearExpectations(ref_factory.get());
156
157 // No more SurfaceSequences should have been generated that need to have be
158 // satisfied.
159 EXPECT_EQ(2u, required_seq.size());
160 } 144 }
161 145
162 // This test verifies that the primary and fallback SurfaceInfo are pushed 146 // This test verifies that the primary and fallback SurfaceInfo are pushed
163 // across from SurfaceLayer to SurfaceLayerImpl. 147 // across from SurfaceLayer to SurfaceLayerImpl.
164 TEST_F(SurfaceLayerTest, SurfaceInfoPushProperties) { 148 TEST_F(SurfaceLayerTest, SurfaceInfoPushProperties) {
165 SurfaceSequence blank_change; 149 // We use a nice mock here because we are not really interested in calls to
166 SurfaceId required_id; 150 // MockSurfaceReferenceFactory and we don't want warnings printed.
167 std::set<SurfaceSequence> required_sequences;
168 scoped_refptr<SurfaceReferenceFactory> ref_factory = 151 scoped_refptr<SurfaceReferenceFactory> ref_factory =
169 new TestSurfaceReferenceFactory(&blank_change, &required_id, 152 new testing::NiceMock<MockSurfaceReferenceFactory>();
170 &required_sequences);
171 153
172 scoped_refptr<SurfaceLayer> layer = SurfaceLayer::Create(ref_factory); 154 scoped_refptr<SurfaceLayer> layer = SurfaceLayer::Create(ref_factory);
173 layer_tree_host_->SetRootLayer(layer); 155 layer_tree_host_->SetRootLayer(layer);
174 SurfaceInfo primary_info( 156 SurfaceInfo primary_info(
175 SurfaceId(kArbitraryFrameSinkId, 157 SurfaceId(kArbitraryFrameSinkId,
176 LocalSurfaceId(1, base::UnguessableToken::Create())), 158 LocalSurfaceId(1, base::UnguessableToken::Create())),
177 1.f, gfx::Size(1, 1)); 159 1.f, gfx::Size(1, 1));
178 layer->SetPrimarySurfaceInfo(primary_info); 160 layer->SetPrimarySurfaceInfo(primary_info);
179 161
180 std::unique_ptr<SurfaceLayerImpl> layer_impl = 162 std::unique_ptr<SurfaceLayerImpl> layer_impl =
(...skipping 20 matching lines...) Expand all
201 183
202 // Check that SurfaceSequence is sent through swap promise. 184 // Check that SurfaceSequence is sent through swap promise.
203 class SurfaceLayerSwapPromise : public LayerTreeTest { 185 class SurfaceLayerSwapPromise : public LayerTreeTest {
204 public: 186 public:
205 SurfaceLayerSwapPromise() 187 SurfaceLayerSwapPromise()
206 : commit_count_(0), sequence_was_satisfied_(false) {} 188 : commit_count_(0), sequence_was_satisfied_(false) {}
207 189
208 void BeginTest() override { 190 void BeginTest() override {
209 layer_tree_host()->GetSurfaceSequenceGenerator()->set_frame_sink_id( 191 layer_tree_host()->GetSurfaceSequenceGenerator()->set_frame_sink_id(
210 FrameSinkId(1, 1)); 192 FrameSinkId(1, 1));
211 layer_ = SurfaceLayer::Create(new TestSurfaceReferenceFactory( 193 ref_factory_ = new testing::StrictMock<MockSurfaceReferenceFactory>();
212 &satisfied_sequence_, &required_id_, &required_set_)); 194
195 // Create a SurfaceLayer but don't add it to the tree yet. No sequence
196 // should be required / satisfied.
197 EXPECT_CALL(*ref_factory_, SatisfySequence(_)).Times(0);
198 EXPECT_CALL(*ref_factory_, RequireSequence(_, _)).Times(0);
199 layer_ = SurfaceLayer::Create(ref_factory_);
213 SurfaceInfo info( 200 SurfaceInfo info(
214 SurfaceId(kArbitraryFrameSinkId, LocalSurfaceId(1, kArbitraryToken)), 201 SurfaceId(kArbitraryFrameSinkId, LocalSurfaceId(1, kArbitraryToken)),
215 1.f, gfx::Size(1, 1)); 202 1.f, gfx::Size(1, 1));
216 layer_->SetPrimarySurfaceInfo(info); 203 layer_->SetPrimarySurfaceInfo(info);
204 testing::Mock::VerifyAndClearExpectations(ref_factory_.get());
217 205
218 // Layer hasn't been added to tree so no SurfaceSequence generated yet. 206 // Add the layer to the tree. A sequence must be required.
219 EXPECT_EQ(0u, required_set_.size()); 207 SurfaceSequence expected_seq(kArbitraryFrameSinkId, 1u);
208 SurfaceId expected_id(kArbitraryFrameSinkId,
209 LocalSurfaceId(1, kArbitraryToken));
210 EXPECT_CALL(*ref_factory_, SatisfySequence(_)).Times(0);
211 EXPECT_CALL(*ref_factory_,
212 RequireSequence(Eq(expected_id), Eq(expected_seq)))
213 .Times(1);
214 layer_tree_host()->SetRootLayer(layer_);
215 testing::Mock::VerifyAndClearExpectations(ref_factory_.get());
220 216
221 layer_tree_host()->SetRootLayer(layer_); 217 // By the end of the test, the required sequence must be satisfied and no
222 218 // more sequence must be required.
223 // Should have SurfaceSequence from first tree. 219 EXPECT_CALL(*ref_factory_, SatisfySequence(Eq(expected_seq))).Times(1);
224 SurfaceSequence expected(kArbitraryFrameSinkId, 1u); 220 EXPECT_CALL(*ref_factory_, RequireSequence(_, _)).Times(0);
225 EXPECT_TRUE(required_id_ == SurfaceId(kArbitraryFrameSinkId,
226 LocalSurfaceId(1, kArbitraryToken)));
227 EXPECT_EQ(1u, required_set_.size());
228 EXPECT_TRUE(required_set_.count(expected));
229 221
230 gfx::Size bounds(100, 100); 222 gfx::Size bounds(100, 100);
231 layer_tree_host()->SetViewportSize(bounds); 223 layer_tree_host()->SetViewportSize(bounds);
232 224
233 blank_layer_ = SolidColorLayer::Create(); 225 blank_layer_ = SolidColorLayer::Create();
234 blank_layer_->SetIsDrawable(true); 226 blank_layer_->SetIsDrawable(true);
235 blank_layer_->SetBounds(gfx::Size(10, 10)); 227 blank_layer_->SetBounds(gfx::Size(10, 10));
236 228
237 PostSetNeedsCommitToMainThread(); 229 PostSetNeedsCommitToMainThread();
238 } 230 }
239 231
240 virtual void ChangeTree() = 0; 232 virtual void ChangeTree() = 0;
241 233
242 void DidCommitAndDrawFrame() override { 234 void DidCommitAndDrawFrame() override {
243 base::ThreadTaskRunnerHandle::Get()->PostTask( 235 base::ThreadTaskRunnerHandle::Get()->PostTask(
244 FROM_HERE, base::BindOnce(&SurfaceLayerSwapPromise::ChangeTree, 236 FROM_HERE, base::BindOnce(&SurfaceLayerSwapPromise::ChangeTree,
245 base::Unretained(this))); 237 base::Unretained(this)));
246 } 238 }
247 239
240 void AfterTest() override {}
241
248 protected: 242 protected:
249 int commit_count_; 243 int commit_count_;
250 bool sequence_was_satisfied_; 244 bool sequence_was_satisfied_;
251 scoped_refptr<SurfaceLayer> layer_; 245 scoped_refptr<SurfaceLayer> layer_;
252 scoped_refptr<Layer> blank_layer_; 246 scoped_refptr<Layer> blank_layer_;
253 SurfaceSequence satisfied_sequence_; 247 scoped_refptr<MockSurfaceReferenceFactory> ref_factory_;
254 248
255 SurfaceId required_id_;
256 std::set<SurfaceSequence> required_set_;
257 const base::UnguessableToken kArbitraryToken = 249 const base::UnguessableToken kArbitraryToken =
258 base::UnguessableToken::Create(); 250 base::UnguessableToken::Create();
259 }; 251 };
260 252
261 // Check that SurfaceSequence is sent through swap promise. 253 // Check that SurfaceSequence is sent through swap promise.
262 class SurfaceLayerSwapPromiseWithDraw : public SurfaceLayerSwapPromise { 254 class SurfaceLayerSwapPromiseWithDraw : public SurfaceLayerSwapPromise {
263 public: 255 public:
264 void ChangeTree() override { 256 void ChangeTree() override {
265 ++commit_count_; 257 ++commit_count_;
266 switch (commit_count_) { 258 switch (commit_count_) {
267 case 1: 259 case 1:
268 // Remove SurfaceLayer from tree to cause SwapPromise to be created. 260 // Remove SurfaceLayer from tree to cause SwapPromise to be created.
269 layer_tree_host()->SetRootLayer(blank_layer_); 261 layer_tree_host()->SetRootLayer(blank_layer_);
270 break; 262 break;
271 case 2: 263 case 2:
272 EndTest(); 264 EndTest();
273 break; 265 break;
274 default: 266 default:
275 NOTREACHED(); 267 NOTREACHED();
276 break; 268 break;
277 } 269 }
278 } 270 }
279
280 void AfterTest() override {
281 EXPECT_TRUE(required_id_ == SurfaceId(kArbitraryFrameSinkId,
282 LocalSurfaceId(1, kArbitraryToken)));
283 EXPECT_EQ(1u, required_set_.size());
284 EXPECT_TRUE(satisfied_sequence_ ==
285 SurfaceSequence(kArbitraryFrameSinkId, 1u));
286 }
287 }; 271 };
288 272
289 SINGLE_AND_MULTI_THREAD_TEST_F(SurfaceLayerSwapPromiseWithDraw); 273 SINGLE_AND_MULTI_THREAD_TEST_F(SurfaceLayerSwapPromiseWithDraw);
290 274
291 // Check that SurfaceSequence is sent through swap promise and resolved when 275 // Check that SurfaceSequence is sent through swap promise and resolved when
292 // swap fails. 276 // swap fails.
293 class SurfaceLayerSwapPromiseWithoutDraw : public SurfaceLayerSwapPromise { 277 class SurfaceLayerSwapPromiseWithoutDraw : public SurfaceLayerSwapPromise {
294 public: 278 public:
295 SurfaceLayerSwapPromiseWithoutDraw() : SurfaceLayerSwapPromise() {} 279 SurfaceLayerSwapPromiseWithoutDraw() : SurfaceLayerSwapPromise() {}
296 280
(...skipping 11 matching lines...) Expand all
308 layer_tree_host()->SetRootLayer(blank_layer_); 292 layer_tree_host()->SetRootLayer(blank_layer_);
309 break; 293 break;
310 case 2: 294 case 2:
311 layer_tree_host()->SetNeedsCommit(); 295 layer_tree_host()->SetNeedsCommit();
312 break; 296 break;
313 default: 297 default:
314 EndTest(); 298 EndTest();
315 break; 299 break;
316 } 300 }
317 } 301 }
318
319 void AfterTest() override {
320 EXPECT_TRUE(required_id_ == SurfaceId(kArbitraryFrameSinkId,
321 LocalSurfaceId(1, kArbitraryToken)));
322 EXPECT_EQ(1u, required_set_.size());
323 EXPECT_TRUE(satisfied_sequence_ ==
324 SurfaceSequence(kArbitraryFrameSinkId, 1u));
325 }
326 }; 302 };
327 303
328 MULTI_THREAD_TEST_F(SurfaceLayerSwapPromiseWithoutDraw); 304 MULTI_THREAD_TEST_F(SurfaceLayerSwapPromiseWithoutDraw);
329 305
330 } // namespace 306 } // namespace
331 } // namespace cc 307 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698