Index: cc/surfaces/surface_manager_ref_unittest.cc |
diff --git a/cc/surfaces/surface_manager_ref_unittest.cc b/cc/surfaces/surface_manager_ref_unittest.cc |
index 5f68c165f78294eafbd8aab5575e3a81ec3855e2..dabebaa3ecd7b2791019529a981af0cd43d72933 100644 |
--- a/cc/surfaces/surface_manager_ref_unittest.cc |
+++ b/cc/surfaces/surface_manager_ref_unittest.cc |
@@ -71,6 +71,11 @@ class SurfaceManagerRefTest : public testing::Test { |
manager_->RemoveSurfaceReferences({SurfaceReference(parent_id, child_id)}); |
} |
+ void AddSurfaceReference(const SurfaceId& parent_id, |
+ const SurfaceId& child_id) { |
+ manager_->AddSurfaceReferences({SurfaceReference(parent_id, child_id)}); |
+ } |
+ |
// Returns all the references where |surface_id| is the parent. |
const SurfaceManager::SurfaceIdSet& GetReferencesFrom( |
const SurfaceId& surface_id) { |
@@ -83,24 +88,12 @@ class SurfaceManagerRefTest : public testing::Test { |
return manager().child_to_parent_refs_[surface_id]; |
} |
- const SurfaceManager::SurfaceIdSet& GetReferencesFromRoot() { |
- return GetReferencesFrom(manager().GetRootSurfaceId()); |
- } |
- |
- // Returns all the temporary references for the given frame sink id. |
- std::vector<LocalSurfaceId> GetTempReferencesFor( |
- const FrameSinkId& frame_sink_id) { |
- return manager().temp_references_[frame_sink_id]; |
- } |
- |
// Temporary references are stored as a map in SurfaceManager. This method |
// converts the map to a vector. |
std::vector<SurfaceId> GetAllTempReferences() { |
std::vector<SurfaceId> temp_references; |
- for (auto& map_entry : manager().temp_references_) { |
- for (auto local_surface_id : map_entry.second) |
- temp_references.push_back(SurfaceId(map_entry.first, local_surface_id)); |
- } |
+ for (auto& map_entry : manager().temporary_references_) |
+ temp_references.push_back(map_entry.first); |
return temp_references; |
} |
@@ -128,7 +121,7 @@ class SurfaceManagerRefTest : public testing::Test { |
TEST_F(SurfaceManagerRefTest, AddReference) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
EXPECT_THAT(GetReferencesFor(id1), |
UnorderedElementsAre(manager().GetRootSurfaceId())); |
@@ -138,8 +131,8 @@ TEST_F(SurfaceManagerRefTest, AddReference) { |
TEST_F(SurfaceManagerRefTest, AddRemoveReference) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
EXPECT_THAT(GetReferencesFor(id1), |
UnorderedElementsAre(manager().GetRootSurfaceId())); |
@@ -159,9 +152,9 @@ TEST_F(SurfaceManagerRefTest, NewSurfaceFromFrameSink) { |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
SurfaceId id3 = CreateSurface(kFrameSink3, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
- manager().AddSurfaceReference(id2, id3); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(id2, id3); |
// |kFramesink2| received a CompositorFrame with a new size, so it destroys |
// |id2| and creates |id2_next|. No reference have been removed yet. |
@@ -170,8 +163,8 @@ TEST_F(SurfaceManagerRefTest, NewSurfaceFromFrameSink) { |
EXPECT_NE(nullptr, manager().GetSurfaceForId(id2_next)); |
// Add references to and from |id2_next|. |
- manager().AddSurfaceReference(id1, id2_next); |
- manager().AddSurfaceReference(id2_next, id3); |
+ AddSurfaceReference(id1, id2_next); |
+ AddSurfaceReference(id2_next, id3); |
EXPECT_THAT(GetReferencesFor(id2), UnorderedElementsAre(id1)); |
EXPECT_THAT(GetReferencesFor(id2_next), UnorderedElementsAre(id1)); |
EXPECT_THAT(GetReferencesFor(id3), UnorderedElementsAre(id2, id2_next)); |
@@ -192,12 +185,12 @@ TEST_F(SurfaceManagerRefTest, ReferenceCycleGetsDeleted) { |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
SurfaceId id3 = CreateSurface(kFrameSink3, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
- manager().AddSurfaceReference(id2, id3); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(id2, id3); |
// This reference forms a cycle between id2 and id3. |
- manager().AddSurfaceReference(id3, id2); |
+ AddSurfaceReference(id3, id2); |
DestroySurface(id3); |
DestroySurface(id2); |
@@ -212,12 +205,12 @@ TEST_F(SurfaceManagerRefTest, ReferenceCycleGetsDeleted) { |
EXPECT_EQ(nullptr, manager().GetSurfaceForId(id3)); |
} |
-TEST_F(SurfaceManagerRefTest, CheckGC) { |
+TEST_F(SurfaceManagerRefTest, SurfacesAreDeletedDuringGarbageCollection) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
EXPECT_NE(nullptr, manager().GetSurfaceForId(id1)); |
EXPECT_NE(nullptr, manager().GetSurfaceForId(id2)); |
@@ -238,14 +231,14 @@ TEST_F(SurfaceManagerRefTest, CheckGC) { |
EXPECT_EQ(nullptr, manager().GetSurfaceForId(id1)); |
} |
-TEST_F(SurfaceManagerRefTest, CheckGCRecusiveFull) { |
+TEST_F(SurfaceManagerRefTest, GarbageCollectionWorksRecusively) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
SurfaceId id3 = CreateSurface(kFrameSink3, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
- manager().AddSurfaceReference(id2, id3); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(id2, id3); |
DestroySurface(id3); |
DestroySurface(id2); |
@@ -266,43 +259,45 @@ TEST_F(SurfaceManagerRefTest, CheckGCRecusiveFull) { |
EXPECT_EQ(nullptr, manager().GetSurfaceForId(id3)); |
} |
-TEST_F(SurfaceManagerRefTest, TryDoubleAddReference) { |
+TEST_F(SurfaceManagerRefTest, TryAddReferenceSameReferenceTwice) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
- manager().AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ AddSurfaceReference(id1, id2); |
EXPECT_THAT(GetReferencesFor(id2), SizeIs(1)); |
EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1)); |
// The second request should be ignored without crashing. |
- manager().AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(id1, id2); |
EXPECT_THAT(GetReferencesFor(id2), SizeIs(1)); |
EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1)); |
} |
-TEST_F(SurfaceManagerRefTest, TryAddSelfReference) { |
- SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
+TEST_F(SurfaceManagerRefTest, AddingSelfReferenceFails) { |
+ SurfaceId id1 = CreateSurface(kFrameSink2, 1); |
// A temporary reference must exist to |id1|. |
- EXPECT_THAT(GetReferencesFor(id1), SizeIs(1)); |
+ EXPECT_THAT(GetAllTempReferences(), ElementsAre(id1)); |
+ EXPECT_THAT(GetReferencesFrom(id1), IsEmpty()); |
+ EXPECT_THAT(GetReferencesFor(id1), IsEmpty()); |
// Try to add a self reference. This should fail. |
- manager().AddSurfaceReference(id1, id1); |
+ AddSurfaceReference(id1, id1); |
- // Adding a self reference should be ignored without crashing. |
+ // Adding a self reference should be ignored without crashing. The temporary |
+ // reference to |id1| must still exist. |
+ EXPECT_THAT(GetAllTempReferences(), ElementsAre(id1)); |
EXPECT_THAT(GetReferencesFrom(id1), IsEmpty()); |
- |
- // The temporary reference to |id1| must still exist. |
- EXPECT_THAT(GetReferencesFor(id1), SizeIs(1)); |
+ EXPECT_THAT(GetReferencesFor(id1), IsEmpty()); |
} |
-TEST_F(SurfaceManagerRefTest, TryRemoveBadReference) { |
+TEST_F(SurfaceManagerRefTest, RemovingNonexistantReferenceFails) { |
SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
// Removing non-existent reference should be ignored. |
- manager().AddSurfaceReference(id1, id2); |
+ AddSurfaceReference(id1, id2); |
RemoveSurfaceReference(id2, id1); |
EXPECT_THAT(GetReferencesFrom(id1), SizeIs(1)); |
EXPECT_THAT(GetReferencesFor(id2), SizeIs(1)); |
@@ -314,17 +309,15 @@ TEST_F(SurfaceManagerRefTest, AddSurfaceThenReference) { |
// A temporary reference must be added to |surface_id|. |
EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id)); |
- EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); |
// Create |parent_id| and add a real reference from it to |surface_id|. |
const SurfaceId parent_id = CreateSurface(kFrameSink1, 1); |
- manager().AddSurfaceReference(parent_id, surface_id); |
+ AddSurfaceReference(parent_id, surface_id); |
// The temporary reference to |surface_id| should be gone. |
// The only temporary reference should be to |parent_id|. |
// There must be a real reference from |parent_id| to |child_id|. |
EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id)); |
- EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id)); |
EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id)); |
} |
@@ -334,15 +327,15 @@ TEST_F(SurfaceManagerRefTest, AddSurfaceThenRootReference) { |
// Temporary reference should be added to |surface_id|. |
EXPECT_THAT(GetAllTempReferences(), ElementsAre(surface_id)); |
- EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); |
// Add a real reference from root to |surface_id|. |
- manager().AddSurfaceReference(manager().GetRootSurfaceId(), surface_id); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), surface_id); |
- // The temporary reference should be gone. |
- // There should now be a real reference from root to |surface_id|. |
+ // The temporary reference should be gone and there should now be a surface |
+ // reference from root to |surface_id|. |
EXPECT_TRUE(GetAllTempReferences().empty()); |
- EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(surface_id)); |
+ EXPECT_THAT(GetReferencesFrom(manager().GetRootSurfaceId()), |
+ ElementsAre(surface_id)); |
} |
TEST_F(SurfaceManagerRefTest, AddTwoSurfacesThenOneReference) { |
@@ -353,12 +346,10 @@ TEST_F(SurfaceManagerRefTest, AddTwoSurfacesThenOneReference) { |
// Temporary reference should be added for both surfaces. |
EXPECT_THAT(GetAllTempReferences(), |
UnorderedElementsAre(surface_id1, surface_id2)); |
- EXPECT_THAT(GetReferencesFromRoot(), |
- UnorderedElementsAre(surface_id1, surface_id2)); |
// Create |parent_id| and add a real reference from it to |surface_id1|. |
const SurfaceId parent_id = CreateSurface(kFrameSink1, 1); |
- manager().AddSurfaceReference(parent_id, surface_id1); |
+ AddSurfaceReference(parent_id, surface_id1); |
// Real reference must be added to |surface_id1| and the temporary reference |
// to it must be gone. |
@@ -366,8 +357,6 @@ TEST_F(SurfaceManagerRefTest, AddTwoSurfacesThenOneReference) { |
// A temporary reference to |parent_id| must be created. |
EXPECT_THAT(GetAllTempReferences(), |
UnorderedElementsAre(parent_id, surface_id2)); |
- EXPECT_THAT(GetReferencesFromRoot(), |
- UnorderedElementsAre(parent_id, surface_id2)); |
EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1)); |
} |
@@ -380,26 +369,22 @@ TEST_F(SurfaceManagerRefTest, AddSurfacesSkipReference) { |
// Temporary references should be added for both surfaces and they should be |
// stored in the order of creation. |
- EXPECT_THAT(GetTempReferencesFor(surface_id1.frame_sink_id()), |
- ElementsAre(surface_id1.local_surface_id(), |
- surface_id2.local_surface_id())); |
- EXPECT_THAT(GetReferencesFromRoot(), |
+ EXPECT_THAT(GetAllTempReferences(), |
UnorderedElementsAre(surface_id1, surface_id2)); |
// Create |parent_id| and add a reference from it to |surface_id2| which was |
// created later. |
const SurfaceId parent_id = CreateSurface(kFrameSink1, 1); |
- manager().AddSurfaceReference(parent_id, surface_id2); |
+ AddSurfaceReference(parent_id, surface_id2); |
// The real reference should be added for |surface_id2| and the temporary |
// references to both |surface_id1| and |surface_id2| should be gone. |
// There should be a temporary reference to |parent_id|. |
EXPECT_THAT(GetAllTempReferences(), ElementsAre(parent_id)); |
- EXPECT_THAT(GetReferencesFromRoot(), ElementsAre(parent_id)); |
EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id2)); |
} |
-TEST_F(SurfaceManagerRefTest, RemoveFirstTempRefOnly) { |
+TEST_F(SurfaceManagerRefTest, RemoveFirstTempReferenceOnly) { |
// Add two surfaces that have the same FrameSinkId. This would happen when a |
// client submits two CFs before parent submits a new CF. |
const SurfaceId surface_id1 = CreateSurface(kFrameSink2, 1); |
@@ -407,25 +392,43 @@ TEST_F(SurfaceManagerRefTest, RemoveFirstTempRefOnly) { |
// Temporary references should be added for both surfaces and they should be |
// stored in the order of creation. |
- EXPECT_THAT(GetTempReferencesFor(surface_id1.frame_sink_id()), |
- ElementsAre(surface_id1.local_surface_id(), |
- surface_id2.local_surface_id())); |
- EXPECT_THAT(GetReferencesFromRoot(), |
+ EXPECT_THAT(GetAllTempReferences(), |
UnorderedElementsAre(surface_id1, surface_id2)); |
// Create |parent_id| and add a reference from it to |surface_id1| which was |
// created earlier. |
const SurfaceId parent_id = CreateSurface(kFrameSink1, 1); |
- manager().AddSurfaceReference(parent_id, surface_id1); |
+ AddSurfaceReference(parent_id, surface_id1); |
// The real reference should be added for |surface_id1| and its temporary |
// reference should be removed. The temporary reference for |surface_id2| |
// should remain. A temporary reference must be added for |parent_id|. |
EXPECT_THAT(GetAllTempReferences(), |
UnorderedElementsAre(parent_id, surface_id2)); |
- EXPECT_THAT(GetReferencesFromRoot(), |
- UnorderedElementsAre(parent_id, surface_id2)); |
EXPECT_THAT(GetReferencesFrom(parent_id), ElementsAre(surface_id1)); |
} |
+TEST_F(SurfaceManagerRefTest, SurfaceWithTemporaryReferenceIsNotDeleted) { |
+ const SurfaceId id1 = CreateSurface(kFrameSink1, 1); |
+ AddSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ |
+ // We create |id2| and never add a real reference to it. This leaves the |
+ // temporary reference. |
+ const SurfaceId id2 = CreateSurface(kFrameSink2, 1); |
+ ASSERT_THAT(GetAllTempReferences(), UnorderedElementsAre(id2)); |
+ EXPECT_NE(nullptr, manager().GetSurfaceForId(id2)); |
+ |
+ // Destroy both surfaces so they can be garbage collected. We remove the |
+ // surface reference to |id1| which will run GarbageCollectSurfaces(). |
+ DestroySurface(id1); |
+ DestroySurface(id2); |
+ RemoveSurfaceReference(manager().GetRootSurfaceId(), id1); |
+ |
+ // |id1| is destroyed and has no references, so it's deleted. |
+ EXPECT_EQ(nullptr, manager().GetSurfaceForId(id1)); |
+ |
+ // |id2| is destroyed but has a temporary reference, it's not deleted. |
+ EXPECT_NE(nullptr, manager().GetSurfaceForId(id2)); |
+} |
+ |
} // namespace cc |