xref: /aosp_15_r20/external/pigweed/pw_intrusive_ptr/recyclable_test.cc (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker 
15*61c4878aSAndroid Build Coastguard Worker #include "pw_intrusive_ptr/recyclable.h"
16*61c4878aSAndroid Build Coastguard Worker 
17*61c4878aSAndroid Build Coastguard Worker #include <stdint.h>
18*61c4878aSAndroid Build Coastguard Worker 
19*61c4878aSAndroid Build Coastguard Worker #include <utility>
20*61c4878aSAndroid Build Coastguard Worker 
21*61c4878aSAndroid Build Coastguard Worker #include "pw_intrusive_ptr/intrusive_ptr.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
23*61c4878aSAndroid Build Coastguard Worker 
24*61c4878aSAndroid Build Coastguard Worker namespace pw {
25*61c4878aSAndroid Build Coastguard Worker namespace {
26*61c4878aSAndroid Build Coastguard Worker 
27*61c4878aSAndroid Build Coastguard Worker class TestItem : public RefCounted<TestItem>, public Recyclable<TestItem> {
28*61c4878aSAndroid Build Coastguard Worker  public:
29*61c4878aSAndroid Build Coastguard Worker   TestItem() = default;
30*61c4878aSAndroid Build Coastguard Worker 
~TestItem()31*61c4878aSAndroid Build Coastguard Worker   virtual ~TestItem() {}
32*61c4878aSAndroid Build Coastguard Worker 
33*61c4878aSAndroid Build Coastguard Worker   inline static int32_t recycle_counter = 0;
34*61c4878aSAndroid Build Coastguard Worker 
35*61c4878aSAndroid Build Coastguard Worker  private:
36*61c4878aSAndroid Build Coastguard Worker   friend class Recyclable<TestItem>;
pw_recycle()37*61c4878aSAndroid Build Coastguard Worker   void pw_recycle() {
38*61c4878aSAndroid Build Coastguard Worker     recycle_counter++;
39*61c4878aSAndroid Build Coastguard Worker     delete this;
40*61c4878aSAndroid Build Coastguard Worker   }
41*61c4878aSAndroid Build Coastguard Worker };
42*61c4878aSAndroid Build Coastguard Worker 
43*61c4878aSAndroid Build Coastguard Worker // Class that thas the pw_recyclable method, but does not derive from
44*61c4878aSAndroid Build Coastguard Worker // Recyclable.
45*61c4878aSAndroid Build Coastguard Worker class TestItemNonRecyclable : public RefCounted<TestItemNonRecyclable> {
46*61c4878aSAndroid Build Coastguard Worker  public:
47*61c4878aSAndroid Build Coastguard Worker   TestItemNonRecyclable() = default;
48*61c4878aSAndroid Build Coastguard Worker 
~TestItemNonRecyclable()49*61c4878aSAndroid Build Coastguard Worker   virtual ~TestItemNonRecyclable() {}
50*61c4878aSAndroid Build Coastguard Worker 
51*61c4878aSAndroid Build Coastguard Worker   inline static int32_t recycle_counter = 0;
52*61c4878aSAndroid Build Coastguard Worker 
pw_recycle()53*61c4878aSAndroid Build Coastguard Worker   void pw_recycle() { recycle_counter++; }
54*61c4878aSAndroid Build Coastguard Worker };
55*61c4878aSAndroid Build Coastguard Worker 
56*61c4878aSAndroid Build Coastguard Worker class RecyclableTest : public ::testing::Test {
57*61c4878aSAndroid Build Coastguard Worker  protected:
SetUp()58*61c4878aSAndroid Build Coastguard Worker   void SetUp() override {
59*61c4878aSAndroid Build Coastguard Worker     TestItem::recycle_counter = 0;
60*61c4878aSAndroid Build Coastguard Worker     TestItemNonRecyclable::recycle_counter = 0;
61*61c4878aSAndroid Build Coastguard Worker   }
62*61c4878aSAndroid Build Coastguard Worker };
63*61c4878aSAndroid Build Coastguard Worker 
TEST_F(RecyclableTest,DeletingLastPtrRecyclesTheObject)64*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, DeletingLastPtrRecyclesTheObject) {
65*61c4878aSAndroid Build Coastguard Worker   {
66*61c4878aSAndroid Build Coastguard Worker     IntrusivePtr<TestItem> ptr(new TestItem());
67*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TestItem::recycle_counter, 0);
68*61c4878aSAndroid Build Coastguard Worker   }
69*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TestItem::recycle_counter, 1);
70*61c4878aSAndroid Build Coastguard Worker }
71*61c4878aSAndroid Build Coastguard Worker 
TEST_F(RecyclableTest,ConstRecycle)72*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, ConstRecycle) {
73*61c4878aSAndroid Build Coastguard Worker   {
74*61c4878aSAndroid Build Coastguard Worker     IntrusivePtr<const TestItem> ptr(new TestItem());
75*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TestItem::recycle_counter, 0);
76*61c4878aSAndroid Build Coastguard Worker   }
77*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TestItem::recycle_counter, 1);
78*61c4878aSAndroid Build Coastguard Worker }
79*61c4878aSAndroid Build Coastguard Worker 
TEST_F(RecyclableTest,NonRecyclableWithPwRecycleMethod)80*61c4878aSAndroid Build Coastguard Worker TEST_F(RecyclableTest, NonRecyclableWithPwRecycleMethod) {
81*61c4878aSAndroid Build Coastguard Worker   {
82*61c4878aSAndroid Build Coastguard Worker     IntrusivePtr<TestItemNonRecyclable> ptr(new TestItemNonRecyclable());
83*61c4878aSAndroid Build Coastguard Worker     EXPECT_EQ(TestItemNonRecyclable::recycle_counter, 0);
84*61c4878aSAndroid Build Coastguard Worker   }
85*61c4878aSAndroid Build Coastguard Worker   EXPECT_EQ(TestItemNonRecyclable::recycle_counter, 0);
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker 
88*61c4878aSAndroid Build Coastguard Worker }  // namespace
89*61c4878aSAndroid Build Coastguard Worker }  // namespace pw
90