| 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..7e05c2a312562641d85e9dfab19e82f68f0eedc4
|
| --- /dev/null
|
| +++ b/cc/surfaces/surface_manager_ref_unittest.cc
|
| @@ -0,0 +1,174 @@
|
| +// 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_;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(SurfaceManagerRefTest, AddRemoveRef) {
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +
|
| + manager().RemoveSurfaceIdReference(kId1, kId2);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, AddRemoveRefDouble) {
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().AddSurfaceIdReference(kId2, kId3);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId3), 0u);
|
| +
|
| + // 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().GetSurfaceReferenceCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId3), 0u);
|
| +}
|
| +
|
| +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().GetSurfaceReferenceCount(kId3), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(next_id), 1u);
|
| +
|
| + manager().RemoveSurfaceIdReference(kId2, kId3);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(next_id), 1u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, RemoveAllRoot) {
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().AddSurfaceIdReference(kId2, kId3);
|
| + manager().RemoveAllReferencesForFrameSink(kId1.frame_sink_id());
|
| +
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, RemoveAllLeafReference) {
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().AddSurfaceIdReference(kId2, kId3);
|
| + manager().RemoveAllReferencesForFrameSink(kId3.frame_sink_id());
|
| +
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, RemoveAllRecursive) {
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().AddSurfaceIdReference(kId2, kId3);
|
| + manager().RemoveAllReferencesForFrameSink(kId2.frame_sink_id());
|
| +
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, RemoveAllRecusiveMultipleSurfaces) {
|
| + 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().GetSurfaceRefereeCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(next_id), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 2u);
|
| +
|
| + manager().RemoveAllReferencesForFrameSink(next_id.frame_sink_id());
|
| +
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(next_id), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId3), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(next_id), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId2), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, TryDoubleAddRef) {
|
| + // The second request should be ignored without crashing.
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 1u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, TryAddSelfReference) {
|
| + // The second request should be ignored without crashing.
|
| + manager().AddSurfaceIdReference(kId1, kId1);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId1), 0u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 0u);
|
| +}
|
| +
|
| +TEST_F(SurfaceManagerRefTest, RemoveBadReference) {
|
| + // The second request should be ignored without crashing.
|
| + manager().AddSurfaceIdReference(kId1, kId2);
|
| + manager().RemoveSurfaceIdReference(kId2, kId2);
|
| + EXPECT_EQ(manager().GetSurfaceReferenceCount(kId2), 1u);
|
| + EXPECT_EQ(manager().GetSurfaceRefereeCount(kId1), 1u);
|
| +}
|
| +
|
| +} // namespace cc
|
|
|