Chromium Code Reviews| 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 |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ed87c6029114ef75e9053bd93bd8a9a8054b4867 |
| --- /dev/null |
| +++ b/cc/surfaces/surface_manager_ref_unittest.cc |
| @@ -0,0 +1,151 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <stddef.h> |
| + |
| +#include "base/memory/ptr_util.h" |
| +#include "cc/surfaces/surface_id.h" |
| +#include "cc/surfaces/surface_manager.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace cc { |
| +namespace { |
| + |
| +// Creates a new SurfaceId for the provided client and sink ids. |
| +constexpr SurfaceId MakeSurfaceId(uint32_t client_id, uint32_t sink_id) { |
| + return SurfaceId(FrameSinkId(client_id, sink_id), LocalFrameId(1u, 1u)); |
| +} |
| + |
| +// Creates a SurfaceId with the next LocalFrameId. |
| +SurfaceId NextSurfaceId(const SurfaceId& existing_id) { |
| + return SurfaceId( |
| + existing_id.frame_sink_id(), |
| + LocalFrameId(existing_id.local_frame_id().local_id() + 1u, 1u)); |
| +} |
| + |
| +constexpr SurfaceId kId1 = MakeSurfaceId(1, 0); |
| +constexpr SurfaceId kId2 = MakeSurfaceId(2, 0); |
| +constexpr SurfaceId kId3 = MakeSurfaceId(3, 0); |
| + |
| +class SurfaceManagerRefTest : public testing::Test { |
| + public: |
| + SurfaceManager& manager() { return *manager_; } |
| + |
| + void SetUp() override { |
| + testing::Test::SetUp(); |
| + manager_ = base::MakeUnique<SurfaceManager>(); |
| + } |
| + |
| + protected: |
| + std::unique_ptr<SurfaceManager> manager_; |
|
Fady Samuel
2016/10/27 04:14:49
No need to place it in a unique_ptr I think.
kylechar
2016/10/27 21:14:10
I'd have to add a reset method to SurfaceManager o
|
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(SurfaceManagerRefTest, AddRemoveRef) { |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0); |
|
Fady Samuel
2016/10/27 04:14:49
Hmm, what do we do about top-level surfaces? I gue
kylechar
2016/10/27 21:14:10
So my WIP patch beyond this one has a constant "Su
|
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| + |
| + manager().RemoveSurfaceIdReference(kId1, kId2); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, AddRemoveRefDouble) { |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId3), 0); |
| + |
| + // Should remove references from id1 -> id2 and then since kId2 has zero |
| + // references all references it holds should be removed. |
| + manager().RemoveSurfaceIdReference(kId1, kId2); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId3), 0); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, AddRemoveSameFrameSinkId) { |
| + SurfaceId next_id = NextSurfaceId(kId2); |
| + ASSERT_EQ(kId2.frame_sink_id(), next_id.frame_sink_id()); |
| + |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + manager().AddSurfaceIdReference(kId2, next_id); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferences(next_id), 1); |
| + |
| + manager().RemoveSurfaceIdReference(kId2, kId3); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(next_id), 1); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, RemoveAllRoot) { |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + manager().RemoveAllReferencesForFrameSink(kId1.frame_sink_id()); |
| + |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, RemoveAllLeafReference) { |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + manager().RemoveAllReferencesForFrameSink(kId3.frame_sink_id()); |
| + |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, RemoveAllRecursive) { |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + manager().RemoveAllReferencesForFrameSink(kId2.frame_sink_id()); |
| + |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId1), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| +} |
| + |
| +TEST_F(SurfaceManagerRefTest, RemoveAllRecusiveMultipleSurfaces) { |
|
Fady Samuel
2016/10/27 04:14:49
An interesting test or two or three to add would m
|
| + SurfaceId next_id = NextSurfaceId(kId2); |
| + ASSERT_EQ(kId2.frame_sink_id(), next_id.frame_sink_id()); |
| + |
| + manager().AddSurfaceIdReference(kId1, kId2); |
| + manager().AddSurfaceIdReference(kId1, next_id); |
| + manager().AddSurfaceIdReference(kId2, kId3); |
| + manager().AddSurfaceIdReference(next_id, kId3); |
| + |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferees(next_id), 1); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 2); |
| + |
| + manager().RemoveAllReferencesForFrameSink(next_id.frame_sink_id()); |
| + |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId2), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(next_id), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferences(kId3), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(next_id), 0); |
| + EXPECT_EQ(manager().CountSurfaceReferees(kId2), 0); |
| +} |
| + |
| +} // namespace cc |