From c2dc7cd31cea2a4732dfc811de85d169de712dec Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 4 May 2021 21:27:56 +0000 Subject: libutils: LightRefBase: incStrongRequireStrong Allow LightRefBase to be used with ANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION, mainly for libhwui. Bug: N/A Test: libutils_test Change-Id: I251c874a80f0a069572bc51da45f8f8e74ba6f5b --- libutils/StrongPointer_test.cpp | 56 ++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 15 deletions(-) (limited to 'libutils/StrongPointer_test.cpp') diff --git a/libutils/StrongPointer_test.cpp b/libutils/StrongPointer_test.cpp index 29f6bd4bb..f27c1f1cc 100644 --- a/libutils/StrongPointer_test.cpp +++ b/libutils/StrongPointer_test.cpp @@ -30,17 +30,34 @@ class SPFoo : virtual public RefBase { ~SPFoo() { *mDeleted = true; } -private: + + private: + bool* mDeleted; +}; + +class SPLightFoo : virtual public VirtualLightRefBase { + public: + explicit SPLightFoo(bool* deleted_check) : mDeleted(deleted_check) { *mDeleted = false; } + + ~SPLightFoo() { *mDeleted = true; } + + private: bool* mDeleted; }; -TEST(StrongPointer, move) { +template +class StrongPointer : public ::testing::Test {}; + +using RefBaseTypes = ::testing::Types; +TYPED_TEST_CASE(StrongPointer, RefBaseTypes); + +TYPED_TEST(StrongPointer, move) { bool isDeleted; - sp sp1 = sp::make(&isDeleted); - SPFoo* foo = sp1.get(); + sp sp1 = sp::make(&isDeleted); + TypeParam* foo = sp1.get(); ASSERT_EQ(1, foo->getStrongCount()); { - sp sp2 = std::move(sp1); + sp sp2 = std::move(sp1); ASSERT_EQ(1, foo->getStrongCount()) << "std::move failed, incremented refcnt"; ASSERT_EQ(nullptr, sp1.get()) << "std::move failed, sp1 is still valid"; // The strong count isn't increasing, let's double check the old object @@ -50,33 +67,42 @@ TEST(StrongPointer, move) { ASSERT_FALSE(isDeleted) << "deleted too early! still has a reference!"; { // Now let's double check it deletes on time - sp sp2 = std::move(sp1); + sp sp2 = std::move(sp1); } ASSERT_TRUE(isDeleted) << "foo was leaked!"; } -TEST(StrongPointer, NullptrComparison) { - sp foo; +TYPED_TEST(StrongPointer, NullptrComparison) { + sp foo; ASSERT_EQ(foo, nullptr); ASSERT_EQ(nullptr, foo); } -TEST(StrongPointer, PointerComparison) { +TYPED_TEST(StrongPointer, PointerComparison) { bool isDeleted; - sp foo = sp::make(&isDeleted); + sp foo = sp::make(&isDeleted); ASSERT_EQ(foo.get(), foo); ASSERT_EQ(foo, foo.get()); ASSERT_NE(nullptr, foo); ASSERT_NE(foo, nullptr); } -TEST(StrongPointer, AssertStrongRefExists) { - // uses some other refcounting method, or non at all +TYPED_TEST(StrongPointer, Deleted) { bool isDeleted; - SPFoo* foo = new SPFoo(&isDeleted); + sp foo = sp::make(&isDeleted); - // can only get a valid sp<> object when you construct it as an sp<> object - EXPECT_DEATH(sp::fromExisting(foo), ""); + auto foo2 = sp::fromExisting(foo.get()); + EXPECT_FALSE(isDeleted); + foo = nullptr; + EXPECT_FALSE(isDeleted); + foo2 = nullptr; + EXPECT_TRUE(isDeleted); +} + +TYPED_TEST(StrongPointer, AssertStrongRefExists) { + bool isDeleted; + TypeParam* foo = new TypeParam(&isDeleted); + EXPECT_DEATH(sp::fromExisting(foo), ""); delete foo; } -- cgit v1.2.3