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

Unified Diff: cc/surfaces/surface_manager_ref_unittest.cc

Issue 2455663003: Add cc::Surface ref counting. (Closed)
Patch Set: 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..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
« 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