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

Unified Diff: cc/surfaces/surface_manager_ref_unittest.cc

Issue 2455663003: Add cc::Surface ref counting. (Closed)
Patch Set: Address CL comments. Created 4 years, 2 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 side-by-side diff with in-line comments
Download patch
« cc/surfaces/surface_manager.cc ('K') | « cc/surfaces/surface_manager.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« cc/surfaces/surface_manager.cc ('K') | « cc/surfaces/surface_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698