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

Side by Side Diff: cc/surfaces/surface_manager_ref_unittest.cc

Issue 2642123004: Fix surface reference assumptions in SurfaceManager. (Closed)
Patch Set: Rebase + fix test. Created 3 years, 11 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 | « cc/surfaces/surface_manager.cc ('k') | 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 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <unordered_map> 7 #include <unordered_map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "cc/surfaces/surface.h" 11 #include "cc/surfaces/surface.h"
12 #include "cc/surfaces/surface_factory.h" 12 #include "cc/surfaces/surface_factory.h"
13 #include "cc/surfaces/surface_factory_client.h" 13 #include "cc/surfaces/surface_factory_client.h"
14 #include "cc/surfaces/surface_id.h" 14 #include "cc/surfaces/surface_id.h"
15 #include "cc/surfaces/surface_manager.h" 15 #include "cc/surfaces/surface_manager.h"
16 #include "cc/surfaces/surface_sequence_generator.h"
17 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
19 18
20 using testing::ElementsAre; 19 using testing::ElementsAre;
20 using testing::IsEmpty;
21 using testing::SizeIs;
21 using testing::UnorderedElementsAre; 22 using testing::UnorderedElementsAre;
22 23
23 namespace cc { 24 namespace cc {
24 25
25 namespace { 26 namespace {
26 27
27 constexpr FrameSinkId kFrameSink1(1, 0); 28 constexpr FrameSinkId kFrameSink1(1, 0);
28 constexpr FrameSinkId kFrameSink2(2, 0); 29 constexpr FrameSinkId kFrameSink2(2, 0);
29 constexpr FrameSinkId kFrameSink3(3, 0); 30 constexpr FrameSinkId kFrameSink3(3, 0);
30 const LocalFrameId kLocalFrame1(1, base::UnguessableToken::Create());
31 const LocalFrameId kLocalFrame2(2, base::UnguessableToken::Create());
32 31
33 class StubSurfaceFactoryClient : public SurfaceFactoryClient { 32 class StubSurfaceFactoryClient : public SurfaceFactoryClient {
34 public: 33 public:
35 void ReturnResources(const ReturnedResourceArray& resources) override {} 34 void ReturnResources(const ReturnedResourceArray& resources) override {}
36 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {} 35 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {}
37 }; 36 };
38 37
39 } // namespace 38 } // namespace
40 39
41 // Tests for reference tracking in SurfaceManager. 40 // Tests for reference tracking in SurfaceManager.
42 class SurfaceManagerRefTest : public testing::Test { 41 class SurfaceManagerRefTest : public testing::Test {
43 public: 42 public:
44 SurfaceManager& manager() { return *manager_; } 43 SurfaceManager& manager() { return *manager_; }
45 44
46 // Creates a new Surface with the provided SurfaceId. Will first create the 45 // Creates a new Surface with the provided |frame_sink_id| and |local_id|.
47 // SurfaceFactory for |frame_sink_id| if necessary. 46 // Will first create a SurfaceFactory for |frame_sink_id| if necessary.
48 SurfaceId CreateSurface(const FrameSinkId& frame_sink_id, 47 SurfaceId CreateSurface(const FrameSinkId& frame_sink_id, uint32_t local_id) {
49 const LocalFrameId& local_frame_id) { 48 LocalFrameId local_frame_id(local_id,
49 base::UnguessableToken::Deserialize(0, 1u));
50 GetFactory(frame_sink_id) 50 GetFactory(frame_sink_id)
51 .SubmitCompositorFrame(local_frame_id, CompositorFrame(), 51 .SubmitCompositorFrame(local_frame_id, CompositorFrame(),
52 SurfaceFactory::DrawCallback()); 52 SurfaceFactory::DrawCallback());
53 return SurfaceId(frame_sink_id, local_frame_id); 53 return SurfaceId(frame_sink_id, local_frame_id);
54 } 54 }
55 55
56 SurfaceId CreateSurface(uint32_t client_id,
57 uint32_t sink_id,
58 uint32_t local_id) {
59 return CreateSurface(
60 FrameSinkId(client_id, sink_id),
61 LocalFrameId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
62 }
63
64 // Destroy Surface with |surface_id|. 56 // Destroy Surface with |surface_id|.
65 void DestroySurface(const SurfaceId& surface_id) { 57 void DestroySurface(const SurfaceId& surface_id) {
66 GetFactory(surface_id.frame_sink_id()).EvictSurface(); 58 GetFactory(surface_id.frame_sink_id()).EvictSurface();
67 } 59 }
68 60
69 protected: 61 protected:
70 SurfaceFactory& GetFactory(const FrameSinkId& frame_sink_id) { 62 SurfaceFactory& GetFactory(const FrameSinkId& frame_sink_id) {
71 auto& factory_ptr = factories_[frame_sink_id]; 63 auto& factory_ptr = factories_[frame_sink_id];
72 if (!factory_ptr) 64 if (!factory_ptr)
73 factory_ptr = base::MakeUnique<SurfaceFactory>(frame_sink_id, 65 factory_ptr = base::MakeUnique<SurfaceFactory>(frame_sink_id,
74 manager_.get(), &client_); 66 manager_.get(), &client_);
75 return *factory_ptr; 67 return *factory_ptr;
76 } 68 }
77 69
78 // testing::Test: 70 // testing::Test:
79 void SetUp() override { 71 void SetUp() override {
80 // Start each test with a fresh SurfaceManager instance. 72 // Start each test with a fresh SurfaceManager instance.
81 manager_ = base::MakeUnique<SurfaceManager>( 73 manager_ = base::MakeUnique<SurfaceManager>(
82 SurfaceManager::LifetimeType::REFERENCES); 74 SurfaceManager::LifetimeType::REFERENCES);
83 } 75 }
84 void TearDown() override { 76 void TearDown() override {
85 for (auto& factory : factories_) 77 for (auto& factory : factories_)
86 factory.second->EvictSurface(); 78 factory.second->EvictSurface();
87 factories_.clear(); 79 factories_.clear();
88 manager_.reset(); 80 manager_.reset();
89 } 81 }
90 82
91 // Returns all the references from the given surface id. 83 // Returns all the references where |surface_id| is the parent.
92 SurfaceManager::SurfaceIdSet GetReferencesFrom(const SurfaceId& surface_id) { 84 const SurfaceManager::SurfaceIdSet& GetReferencesFrom(
85 const SurfaceId& surface_id) {
93 return manager().parent_to_child_refs_[surface_id]; 86 return manager().parent_to_child_refs_[surface_id];
94 } 87 }
95 88
96 SurfaceManager::SurfaceIdSet GetReferencesFromRoot() { 89 // Returns all the references where |surface_id| is the child.
90 const SurfaceManager::SurfaceIdSet& GetReferencesFor(
91 const SurfaceId& surface_id) {
92 return manager().child_to_parent_refs_[surface_id];
93 }
94
95 const SurfaceManager::SurfaceIdSet& GetReferencesFromRoot() {
97 return GetReferencesFrom(manager().GetRootSurfaceId()); 96 return GetReferencesFrom(manager().GetRootSurfaceId());
98 } 97 }
99 98
100 // Returns all the temporary references for the given frame sink id. 99 // Returns all the temporary references for the given frame sink id.
101 std::vector<LocalFrameId> GetTempReferencesFor( 100 std::vector<LocalFrameId> GetTempReferencesFor(
102 const FrameSinkId& frame_sink_id) { 101 const FrameSinkId& frame_sink_id) {
103 return manager().temp_references_[frame_sink_id]; 102 return manager().temp_references_[frame_sink_id];
104 } 103 }
105 104
106 // Temporary references are stored as a map in SurfaceManager. This method 105 // Temporary references are stored as a map in SurfaceManager. This method
107 // converts the map to a vector. 106 // converts the map to a vector.
108 std::vector<SurfaceId> GetAllTempReferences() { 107 std::vector<SurfaceId> GetAllTempReferences() {
109 std::vector<SurfaceId> temp_references; 108 std::vector<SurfaceId> temp_references;
110 for (auto& map_entry : manager().temp_references_) { 109 for (auto& map_entry : manager().temp_references_) {
111 for (auto local_frame_id : map_entry.second) 110 for (auto local_frame_id : map_entry.second)
112 temp_references.push_back(SurfaceId(map_entry.first, local_frame_id)); 111 temp_references.push_back(SurfaceId(map_entry.first, local_frame_id));
113 } 112 }
114 return temp_references; 113 return temp_references;
115 } 114 }
116 115
117 std::unordered_map<FrameSinkId, 116 std::unordered_map<FrameSinkId,
118 std::unique_ptr<SurfaceFactory>, 117 std::unique_ptr<SurfaceFactory>,
119 FrameSinkIdHash> 118 FrameSinkIdHash>
120 factories_; 119 factories_;
121 std::unique_ptr<SurfaceManager> manager_; 120 std::unique_ptr<SurfaceManager> manager_;
122 StubSurfaceFactoryClient client_; 121 StubSurfaceFactoryClient client_;
123 }; 122 };
124 123
125 TEST_F(SurfaceManagerRefTest, AddReference) { 124 TEST_F(SurfaceManagerRefTest, AddReference) {
126 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 125 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
127 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 126 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
128 127
129 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u); 128 EXPECT_THAT(GetReferencesFor(id1),
130 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 0u); 129 UnorderedElementsAre(manager().GetRootSurfaceId()));
130 EXPECT_THAT(GetReferencesFrom(id1), IsEmpty());
131 } 131 }
132 132
133 TEST_F(SurfaceManagerRefTest, AddRemoveReference) { 133 TEST_F(SurfaceManagerRefTest, AddRemoveReference) {
134 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 134 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
135 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 135 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
136 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 136 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
137 manager().AddSurfaceReference(id1, id2); 137 manager().AddSurfaceReference(id1, id2);
138 138
139 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u); 139 EXPECT_THAT(GetReferencesFor(id1),
140 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u); 140 UnorderedElementsAre(manager().GetRootSurfaceId()));
141 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 1u); 141 EXPECT_THAT(GetReferencesFor(id2), UnorderedElementsAre(id1));
142 EXPECT_EQ(manager().GetReferencedSurfaceCount(id2), 0u); 142 EXPECT_THAT(GetReferencesFrom(id1), UnorderedElementsAre(id2));
143 EXPECT_THAT(GetReferencesFrom(id2), IsEmpty());
143 144
144 manager().RemoveSurfaceReference(id1, id2); 145 manager().RemoveSurfaceReference(id1, id2);
145 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u); 146 EXPECT_THAT(GetReferencesFor(id1), SizeIs(1));
146 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 0u); 147 EXPECT_THAT(GetReferencesFor(id2), IsEmpty());
147 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 0u); 148 EXPECT_THAT(GetReferencesFrom(id1), IsEmpty());
148 EXPECT_EQ(manager().GetReferencedSurfaceCount(id2), 0u); 149 EXPECT_THAT(GetReferencesFrom(id2), IsEmpty());
149 } 150 }
150 151
151 TEST_F(SurfaceManagerRefTest, AddRemoveReferenceRecursive) { 152 TEST_F(SurfaceManagerRefTest, NewSurfaceFromFrameSink) {
152 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 153 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
153 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 154 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
154 SurfaceId id3 = CreateSurface(kFrameSink3, kLocalFrame1); 155 SurfaceId id3 = CreateSurface(kFrameSink3, 1);
155 156
156 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 157 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
157 manager().AddSurfaceReference(id1, id2); 158 manager().AddSurfaceReference(id1, id2);
158 manager().AddSurfaceReference(id2, id3);
159 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u);
160 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u);
161 EXPECT_EQ(manager().GetSurfaceReferenceCount(id3), 1u);
162 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 1u);
163 EXPECT_EQ(manager().GetReferencedSurfaceCount(id2), 1u);
164 EXPECT_EQ(manager().GetReferencedSurfaceCount(id3), 0u);
165
166 // Should remove reference from id1 -> id2 and then since id2 has zero
167 // references all references it holds should be removed.
168 manager().RemoveSurfaceReference(id1, id2);
169 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u);
170 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 0u);
171 EXPECT_EQ(manager().GetSurfaceReferenceCount(id3), 0u);
172 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 0u);
173 EXPECT_EQ(manager().GetReferencedSurfaceCount(id2), 0u);
174 EXPECT_EQ(manager().GetReferencedSurfaceCount(id3), 0u);
175 }
176
177 TEST_F(SurfaceManagerRefTest, NewSurfaceFromFrameSink) {
178 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1);
179 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1);
180 SurfaceId id3 = CreateSurface(kFrameSink3, kLocalFrame1);
181
182 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
183 manager().AddSurfaceReference(id1, id2);
184 manager().AddSurfaceReference(id2, id3); 159 manager().AddSurfaceReference(id2, id3);
185 160
186 // |kFramesink2| received a CompositorFrame with a new size, so it destroys 161 // |kFramesink2| received a CompositorFrame with a new size, so it destroys
187 // |id2| and creates |id2_next|. No reference have been removed yet. 162 // |id2| and creates |id2_next|. No reference have been removed yet.
188 DestroySurface(id2); 163 SurfaceId id2_next = CreateSurface(kFrameSink2, 2);
189 SurfaceId id2_next = CreateSurface(kFrameSink2, kLocalFrame2); 164 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2));
190 EXPECT_NE(manager().GetSurfaceForId(id2), nullptr); 165 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2_next));
191 EXPECT_NE(manager().GetSurfaceForId(id2_next), nullptr);
192 166
193 // Add references to and from |id2_next|. 167 // Add references to and from |id2_next|.
194 manager().AddSurfaceReference(id1, id2_next); 168 manager().AddSurfaceReference(id1, id2_next);
195 manager().AddSurfaceReference(id2_next, id3); 169 manager().AddSurfaceReference(id2_next, id3);
196 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u); 170 EXPECT_THAT(GetReferencesFor(id2), UnorderedElementsAre(id1));
197 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2_next), 1u); 171 EXPECT_THAT(GetReferencesFor(id2_next), UnorderedElementsAre(id1));
198 EXPECT_EQ(manager().GetSurfaceReferenceCount(id3), 2u); 172 EXPECT_THAT(GetReferencesFor(id3), UnorderedElementsAre(id2, id2_next));
199 173
200 manager().RemoveSurfaceReference(id1, id2); 174 manager().RemoveSurfaceReference(id1, id2);
201 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 0u); 175 EXPECT_THAT(GetReferencesFor(id2), IsEmpty());
202 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2_next), 1u); 176 EXPECT_THAT(GetReferencesFor(id2_next), UnorderedElementsAre(id1));
203 EXPECT_EQ(manager().GetSurfaceReferenceCount(id3), 1u); 177 EXPECT_THAT(GetReferencesFor(id3), UnorderedElementsAre(id2_next));
204 178
205 // |id2| should be deleted during GC but other surfaces shouldn't. 179 // |id2| should be deleted during GC but other surfaces shouldn't.
206 EXPECT_EQ(manager().GetSurfaceForId(id2), nullptr); 180 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id2));
207 EXPECT_NE(manager().GetSurfaceForId(id2_next), nullptr); 181 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2_next));
208 EXPECT_NE(manager().GetSurfaceForId(id3), nullptr); 182 EXPECT_NE(nullptr, manager().GetSurfaceForId(id3));
183 }
184
185 TEST_F(SurfaceManagerRefTest, ReferenceCycleGetsDeleted) {
186 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
187 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
188 SurfaceId id3 = CreateSurface(kFrameSink3, 1);
189
190 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
191 manager().AddSurfaceReference(id1, id2);
192 manager().AddSurfaceReference(id2, id3);
193
194 // This reference forms a cycle between id2 and id3.
195 manager().AddSurfaceReference(id3, id2);
196
197 DestroySurface(id3);
198 DestroySurface(id2);
199 DestroySurface(id1);
200
201 manager().RemoveSurfaceReference(manager().GetRootSurfaceId(), id1);
202
203 // Removing the reference from the root to id1 should allow all three surfaces
204 // to be deleted during GC even with a cycle between 2 and 3.
205 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id1));
206 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id2));
207 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id3));
209 } 208 }
210 209
211 TEST_F(SurfaceManagerRefTest, CheckGC) { 210 TEST_F(SurfaceManagerRefTest, CheckGC) {
212 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 211 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
213 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 212 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
214 213
215 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 214 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
216 manager().AddSurfaceReference(id1, id2); 215 manager().AddSurfaceReference(id1, id2);
217 216
218 EXPECT_NE(manager().GetSurfaceForId(id1), nullptr); 217 EXPECT_NE(nullptr, manager().GetSurfaceForId(id1));
219 EXPECT_NE(manager().GetSurfaceForId(id2), nullptr); 218 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2));
220 219
221 // Destroying the surfaces shouldn't delete them yet, since there is still an 220 // Destroying the surfaces shouldn't delete them yet, since there is still an
222 // active reference on all surfaces. 221 // active reference on all surfaces.
223 DestroySurface(id1); 222 DestroySurface(id1);
224 DestroySurface(id2); 223 DestroySurface(id2);
225 EXPECT_NE(manager().GetSurfaceForId(id1), nullptr); 224 EXPECT_NE(nullptr, manager().GetSurfaceForId(id1));
226 EXPECT_NE(manager().GetSurfaceForId(id2), nullptr); 225 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2));
227 226
228 // Should delete |id2| when the only reference to it is removed. 227 // Should delete |id2| when the only reference to it is removed.
229 manager().RemoveSurfaceReference(id1, id2); 228 manager().RemoveSurfaceReference(id1, id2);
230 EXPECT_EQ(manager().GetSurfaceForId(id2), nullptr); 229 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id2));
231 230
232 // Should delete |id1| when the only reference to it is removed. 231 // Should delete |id1| when the only reference to it is removed.
233 manager().RemoveSurfaceReference(manager().GetRootSurfaceId(), id1); 232 manager().RemoveSurfaceReference(manager().GetRootSurfaceId(), id1);
234 EXPECT_EQ(manager().GetSurfaceForId(id1), nullptr); 233 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id1));
235 } 234 }
236 235
237 TEST_F(SurfaceManagerRefTest, CheckGCRecusiveFull) { 236 TEST_F(SurfaceManagerRefTest, CheckGCRecusiveFull) {
238 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 237 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
239 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 238 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
240 SurfaceId id3 = CreateSurface(kFrameSink3, kLocalFrame1); 239 SurfaceId id3 = CreateSurface(kFrameSink3, 1);
241 240
242 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 241 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
243 manager().AddSurfaceReference(id1, id2); 242 manager().AddSurfaceReference(id1, id2);
244 manager().AddSurfaceReference(id2, id3); 243 manager().AddSurfaceReference(id2, id3);
245 244
246 DestroySurface(id3); 245 DestroySurface(id3);
247 DestroySurface(id2); 246 DestroySurface(id2);
248 DestroySurface(id1); 247 DestroySurface(id1);
249 248
250 // Destroying the surfaces shouldn't delete them yet, since there is still an 249 // Destroying the surfaces shouldn't delete them yet, since there is still an
251 // active reference on all surfaces. 250 // active reference on all surfaces.
252 EXPECT_NE(manager().GetSurfaceForId(id3), nullptr); 251 EXPECT_NE(nullptr, manager().GetSurfaceForId(id3));
253 EXPECT_NE(manager().GetSurfaceForId(id2), nullptr); 252 EXPECT_NE(nullptr, manager().GetSurfaceForId(id2));
254 EXPECT_NE(manager().GetSurfaceForId(id1), nullptr); 253 EXPECT_NE(nullptr, manager().GetSurfaceForId(id1));
255 254
256 manager().RemoveSurfaceReference(manager().GetRootSurfaceId(), id1); 255 manager().RemoveSurfaceReference(manager().GetRootSurfaceId(), id1);
257 256
258 // Removing the reference from the root to id1 should allow all three surfaces 257 // Removing the reference from the root to id1 should allow all three surfaces
259 // to be deleted during GC. 258 // to be deleted during GC.
260 EXPECT_EQ(manager().GetSurfaceForId(id1), nullptr); 259 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id1));
261 EXPECT_EQ(manager().GetSurfaceForId(id2), nullptr); 260 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id2));
262 EXPECT_EQ(manager().GetSurfaceForId(id3), nullptr); 261 EXPECT_EQ(nullptr, manager().GetSurfaceForId(id3));
263 } 262 }
264 263
265 TEST_F(SurfaceManagerRefTest, TryAddReferenceToBadSurface) { 264 TEST_F(SurfaceManagerRefTest, TryAddReferenceToBadSurface) {
266 // Not creating an accompanying Surface and SurfaceFactory. 265 // Not creating an accompanying Surface and SurfaceFactory.
267 SurfaceId id(FrameSinkId(100u, 200u), 266 SurfaceId id(FrameSinkId(100u, 200u),
268 LocalFrameId(1u, base::UnguessableToken::Create())); 267 LocalFrameId(1u, base::UnguessableToken::Create()));
269 268
270 // Adding reference from root to the Surface should do nothing because 269 // Adding reference from root to the Surface should do nothing because
271 // SurfaceManager doesn't know Surface for |id| exists. 270 // SurfaceManager doesn't know Surface for |id| exists.
272 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id); 271 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id);
273 EXPECT_EQ(manager().GetSurfaceReferenceCount(id), 0u); 272 EXPECT_THAT(GetReferencesFor(id), IsEmpty());
274 } 273 }
275 274
276 TEST_F(SurfaceManagerRefTest, TryDoubleAddReference) { 275 TEST_F(SurfaceManagerRefTest, TryDoubleAddReference) {
277 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 276 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
278 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 277 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
279 278
280 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); 279 manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1);
281 manager().AddSurfaceReference(id1, id2); 280 manager().AddSurfaceReference(id1, id2);
282 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u); 281 EXPECT_THAT(GetReferencesFor(id2), SizeIs(1));
283 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 1u); 282 EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1));
284 283
285 // The second request should be ignored without crashing. 284 // The second request should be ignored without crashing.
286 manager().AddSurfaceReference(id1, id2); 285 manager().AddSurfaceReference(id1, id2);
287 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u); 286 EXPECT_THAT(GetReferencesFor(id2), SizeIs(1));
288 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 1u); 287 EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1));
289 } 288 }
290 289
291 TEST_F(SurfaceManagerRefTest, TryAddSelfReference) { 290 TEST_F(SurfaceManagerRefTest, TryAddSelfReference) {
292 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 291 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
293 292
294 // A temporary reference must exist to |id1|. 293 // A temporary reference must exist to |id1|.
295 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u); 294 EXPECT_THAT(GetReferencesFor(id1), SizeIs(1));
296 295
297 // Try to add a self reference. This should fail. 296 // Try to add a self reference. This should fail.
298 manager().AddSurfaceReference(id1, id1); 297 manager().AddSurfaceReference(id1, id1);
299 298
300 // Adding a self reference should be ignored without crashing. 299 // Adding a self reference should be ignored without crashing.
301 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 0u); 300 EXPECT_THAT(GetReferencesFrom(id1), IsEmpty());
302 301
303 // The temporary reference to |id1| must still exist. 302 // The temporary reference to |id1| must still exist.
304 EXPECT_EQ(manager().GetSurfaceReferenceCount(id1), 1u); 303 EXPECT_THAT(GetReferencesFor(id1), SizeIs(1));
305 } 304 }
306 305
307 TEST_F(SurfaceManagerRefTest, TryRemoveBadReference) { 306 TEST_F(SurfaceManagerRefTest, TryRemoveBadReference) {
308 SurfaceId id1 = CreateSurface(kFrameSink1, kLocalFrame1); 307 SurfaceId id1 = CreateSurface(kFrameSink1, 1);
309 SurfaceId id2 = CreateSurface(kFrameSink2, kLocalFrame1); 308 SurfaceId id2 = CreateSurface(kFrameSink2, 1);
310 309
311 // Removing non-existent reference should be ignored. 310 // Removing non-existent reference should be ignored.
312 manager().AddSurfaceReference(id1, id2); 311 manager().AddSurfaceReference(id1, id2);
313 manager().RemoveSurfaceReference(id2, id1); 312 manager().RemoveSurfaceReference(id2, id1);
314 EXPECT_EQ(manager().GetReferencedSurfaceCount(id1), 1u); 313 EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1));
315 EXPECT_EQ(manager().GetSurfaceReferenceCount(id2), 1u); 314 EXPECT_THAT(GetReferencesFor(id2), SizeIs(1));
316 } 315 }
317 316
318 TEST_F(SurfaceManagerRefTest, AddSurfaceThenReference) { 317 TEST_F(SurfaceManagerRefTest, AddSurfaceThenReference) {
319 // Create a new surface. 318 // Create a new surface.
320 const SurfaceId surface_id = CreateSurface(2, 1, 1); 319 const SurfaceId surface_id = CreateSurface(kFrameSink2, 1);
321 320
322 // A temporary reference must be added to |surface_id|. 321 // A temporary reference must be added to |surface_id|.
323 EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id)); 322 EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id));
324 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); 323 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id));
325 324
326 // Create |parent_id| and add a real reference from it to |surface_id|. 325 // Create |parent_id| and add a real reference from it to |surface_id|.
327 const SurfaceId parent_id = CreateSurface(1, 1, 1); 326 const SurfaceId parent_id = CreateSurface(kFrameSink1, 1);
328 manager().AddSurfaceReference(parent_id, surface_id); 327 manager().AddSurfaceReference(parent_id, surface_id);
329 328
330 // The temporary reference to |surface_id| should be gone. 329 // The temporary reference to |surface_id| should be gone.
331 // The only temporary reference should be to |parent_id|. 330 // The only temporary reference should be to |parent_id|.
332 // There must be a real reference from |parent_id| to |child_id|. 331 // There must be a real reference from |parent_id| to |child_id|.
333 EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id)); 332 EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id));
334 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id)); 333 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id));
335 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id)); 334 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id));
336 } 335 }
337 336
338 TEST_F(SurfaceManagerRefTest, AddSurfaceThenRootReference) { 337 TEST_F(SurfaceManagerRefTest, AddSurfaceThenRootReference) {
339 // Create a new surface. 338 // Create a new surface.
340 const SurfaceId surface_id = CreateSurface(1, 1, 1); 339 const SurfaceId surface_id = CreateSurface(kFrameSink1, 1);
341 340
342 // Temporary reference should be added to |surface_id|. 341 // Temporary reference should be added to |surface_id|.
343 EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id)); 342 EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id));
344 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); 343 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id));
345 344
346 // Add a real reference from root to |surface_id|. 345 // Add a real reference from root to |surface_id|.
347 manager().AddSurfaceReference(manager().GetRootSurfaceId(), surface_id); 346 manager().AddSurfaceReference(manager().GetRootSurfaceId(), surface_id);
348 347
349 // The temporary reference should be gone. 348 // The temporary reference should be gone.
350 // There should now be a real reference from root to |surface_id|. 349 // There should now be a real reference from root to |surface_id|.
351 EXPECT_TRUE(GetAllTempReferences().empty()); 350 EXPECT_TRUE(GetAllTempReferences().empty());
352 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); 351 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id));
353 } 352 }
354 353
355 TEST_F(SurfaceManagerRefTest, AddTwoSurfacesThenOneReference) { 354 TEST_F(SurfaceManagerRefTest, AddTwoSurfacesThenOneReference) {
356 // Create two surfaces with different FrameSinkIds. 355 // Create two surfaces with different FrameSinkIds.
357 const SurfaceId surface_id1 = CreateSurface(2, 1, 1); 356 const SurfaceId surface_id1 = CreateSurface(kFrameSink2, 1);
358 const SurfaceId surface_id2 = CreateSurface(3, 1, 1); 357 const SurfaceId surface_id2 = CreateSurface(kFrameSink3, 1);
359 358
360 // Temporary reference should be added for both surfaces. 359 // Temporary reference should be added for both surfaces.
361 EXPECT_THAT(GetAllTempReferences(), 360 EXPECT_THAT(GetAllTempReferences(),
362 UnorderedElementsAre(surface_id1, surface_id2)); 361 UnorderedElementsAre(surface_id1, surface_id2));
363 EXPECT_THAT(GetReferencesFromRoot(), 362 EXPECT_THAT(GetReferencesFromRoot(),
364 UnorderedElementsAre(surface_id1, surface_id2)); 363 UnorderedElementsAre(surface_id1, surface_id2));
365 364
366 // Create |parent_id| and add a real reference from it to |surface_id1|. 365 // Create |parent_id| and add a real reference from it to |surface_id1|.
367 const SurfaceId parent_id = CreateSurface(1, 1, 1); 366 const SurfaceId parent_id = CreateSurface(kFrameSink1, 1);
368 manager().AddSurfaceReference(parent_id, surface_id1); 367 manager().AddSurfaceReference(parent_id, surface_id1);
369 368
370 // Real reference must be added to |surface_id1| and the temporary reference 369 // Real reference must be added to |surface_id1| and the temporary reference
371 // to it must be gone. 370 // to it must be gone.
372 // There should still be a temporary reference left to |surface_id2|. 371 // There should still be a temporary reference left to |surface_id2|.
373 // A temporary reference to |parent_id| must be created. 372 // A temporary reference to |parent_id| must be created.
374 EXPECT_THAT(GetAllTempReferences(), 373 EXPECT_THAT(GetAllTempReferences(),
375 UnorderedElementsAre(parent_id, surface_id2)); 374 UnorderedElementsAre(parent_id, surface_id2));
376 EXPECT_THAT(GetReferencesFromRoot(), 375 EXPECT_THAT(GetReferencesFromRoot(),
377 UnorderedElementsAre(parent_id, surface_id2)); 376 UnorderedElementsAre(parent_id, surface_id2));
378 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1)); 377 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1));
379 } 378 }
380 379
381 TEST_F(SurfaceManagerRefTest, AddSurfacesSkipReference) { 380 TEST_F(SurfaceManagerRefTest, AddSurfacesSkipReference) {
382 // Add two surfaces that have the same FrameSinkId. This would happen when a 381 // Add two surfaces that have the same FrameSinkId. This would happen when a
383 // client submits two CompositorFrames before parent submits a new 382 // client submits two CompositorFrames before parent submits a new
384 // CompositorFrame. 383 // CompositorFrame.
385 const SurfaceId surface_id1 = CreateSurface(2, 1, 2); 384 const SurfaceId surface_id1 = CreateSurface(kFrameSink2, 2);
386 const SurfaceId surface_id2 = CreateSurface(2, 1, 1); 385 const SurfaceId surface_id2 = CreateSurface(kFrameSink2, 1);
387 386
388 // Temporary references should be added for both surfaces and they should be 387 // Temporary references should be added for both surfaces and they should be
389 // stored in the order of creation. 388 // stored in the order of creation.
390 EXPECT_THAT( 389 EXPECT_THAT(
391 GetTempReferencesFor(surface_id1.frame_sink_id()), 390 GetTempReferencesFor(surface_id1.frame_sink_id()),
392 ElementsAre(surface_id1.local_frame_id(), surface_id2.local_frame_id())); 391 ElementsAre(surface_id1.local_frame_id(), surface_id2.local_frame_id()));
393 EXPECT_THAT(GetReferencesFromRoot(), 392 EXPECT_THAT(GetReferencesFromRoot(),
394 UnorderedElementsAre(surface_id1, surface_id2)); 393 UnorderedElementsAre(surface_id1, surface_id2));
395 394
396 // Create |parent_id| and add a reference from it to |surface_id2| which was 395 // Create |parent_id| and add a reference from it to |surface_id2| which was
397 // created later. 396 // created later.
398 const SurfaceId parent_id = CreateSurface(1, 1, 1); 397 const SurfaceId parent_id = CreateSurface(kFrameSink1, 1);
399 manager().AddSurfaceReference(parent_id, surface_id2); 398 manager().AddSurfaceReference(parent_id, surface_id2);
400 399
401 // The real reference should be added for |surface_id2| and the temporary 400 // The real reference should be added for |surface_id2| and the temporary
402 // references to both |surface_id1| and |surface_id2| should be gone. 401 // references to both |surface_id1| and |surface_id2| should be gone.
403 // There should be a temporary reference to |parent_id|. 402 // There should be a temporary reference to |parent_id|.
404 EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id)); 403 EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id));
405 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id)); 404 EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id));
406 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id2)); 405 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id2));
407 } 406 }
408 407
409 TEST_F(SurfaceManagerRefTest, RemoveFirstTempRefOnly) { 408 TEST_F(SurfaceManagerRefTest, RemoveFirstTempRefOnly) {
410 // Add two surfaces that have the same FrameSinkId. This would happen when a 409 // Add two surfaces that have the same FrameSinkId. This would happen when a
411 // client submits two CFs before parent submits a new CF. 410 // client submits two CFs before parent submits a new CF.
412 const SurfaceId surface_id1 = CreateSurface(2, 1, 1); 411 const SurfaceId surface_id1 = CreateSurface(kFrameSink2, 1);
413 const SurfaceId surface_id2 = CreateSurface(2, 1, 2); 412 const SurfaceId surface_id2 = CreateSurface(kFrameSink2, 2);
414 413
415 // Temporary references should be added for both surfaces and they should be 414 // Temporary references should be added for both surfaces and they should be
416 // stored in the order of creation. 415 // stored in the order of creation.
417 EXPECT_THAT( 416 EXPECT_THAT(
418 GetTempReferencesFor(surface_id1.frame_sink_id()), 417 GetTempReferencesFor(surface_id1.frame_sink_id()),
419 ElementsAre(surface_id1.local_frame_id(), surface_id2.local_frame_id())); 418 ElementsAre(surface_id1.local_frame_id(), surface_id2.local_frame_id()));
420 EXPECT_THAT(GetReferencesFromRoot(), 419 EXPECT_THAT(GetReferencesFromRoot(),
421 UnorderedElementsAre(surface_id1, surface_id2)); 420 UnorderedElementsAre(surface_id1, surface_id2));
422 421
423 // Create |parent_id| and add a reference from it to |surface_id1| which was 422 // Create |parent_id| and add a reference from it to |surface_id1| which was
424 // created earlier. 423 // created earlier.
425 const SurfaceId parent_id = CreateSurface(1, 1, 1); 424 const SurfaceId parent_id = CreateSurface(kFrameSink1, 1);
426 manager().AddSurfaceReference(parent_id, surface_id1); 425 manager().AddSurfaceReference(parent_id, surface_id1);
427 426
428 // The real reference should be added for |surface_id1| and its temporary 427 // The real reference should be added for |surface_id1| and its temporary
429 // reference should be removed. The temporary reference for |surface_id2| 428 // reference should be removed. The temporary reference for |surface_id2|
430 // should remain. A temporary reference must be added for |parent_id|. 429 // should remain. A temporary reference must be added for |parent_id|.
431 EXPECT_THAT(GetAllTempReferences(), 430 EXPECT_THAT(GetAllTempReferences(),
432 UnorderedElementsAre(parent_id, surface_id2)); 431 UnorderedElementsAre(parent_id, surface_id2));
433 EXPECT_THAT(GetReferencesFromRoot(), 432 EXPECT_THAT(GetReferencesFromRoot(),
434 UnorderedElementsAre(parent_id, surface_id2)); 433 UnorderedElementsAre(parent_id, surface_id2));
435 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1)); 434 EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1));
436 } 435 }
437 436
438 } // namespace cc 437 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/surface_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698