xref: /aosp_15_r20/external/libchrome/base/debug/leak_tracker_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/debug/leak_tracker.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <memory>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker namespace base {
12*635a8641SAndroid Build Coastguard Worker namespace debug {
13*635a8641SAndroid Build Coastguard Worker 
14*635a8641SAndroid Build Coastguard Worker namespace {
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker class ClassA {
17*635a8641SAndroid Build Coastguard Worker  private:
18*635a8641SAndroid Build Coastguard Worker   LeakTracker<ClassA> leak_tracker_;
19*635a8641SAndroid Build Coastguard Worker };
20*635a8641SAndroid Build Coastguard Worker 
21*635a8641SAndroid Build Coastguard Worker class ClassB {
22*635a8641SAndroid Build Coastguard Worker  private:
23*635a8641SAndroid Build Coastguard Worker   LeakTracker<ClassB> leak_tracker_;
24*635a8641SAndroid Build Coastguard Worker };
25*635a8641SAndroid Build Coastguard Worker 
26*635a8641SAndroid Build Coastguard Worker #ifndef ENABLE_LEAK_TRACKER
27*635a8641SAndroid Build Coastguard Worker 
28*635a8641SAndroid Build Coastguard Worker // If leak tracking is disabled, we should do nothing.
TEST(LeakTrackerTest,NotEnabled)29*635a8641SAndroid Build Coastguard Worker TEST(LeakTrackerTest, NotEnabled) {
30*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
31*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   // Use unique_ptr so compiler doesn't complain about unused variables.
34*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a1(new ClassA);
35*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassB> b1(new ClassB);
36*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassB> b2(new ClassB);
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
39*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
40*635a8641SAndroid Build Coastguard Worker }
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker #else
43*635a8641SAndroid Build Coastguard Worker 
TEST(LeakTrackerTest,Basic)44*635a8641SAndroid Build Coastguard Worker TEST(LeakTrackerTest, Basic) {
45*635a8641SAndroid Build Coastguard Worker   {
46*635a8641SAndroid Build Coastguard Worker     ClassA a1;
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
49*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker     ClassB b1;
52*635a8641SAndroid Build Coastguard Worker     ClassB b2;
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
55*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
56*635a8641SAndroid Build Coastguard Worker 
57*635a8641SAndroid Build Coastguard Worker     std::unique_ptr<ClassA> a2(new ClassA);
58*635a8641SAndroid Build Coastguard Worker 
59*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
60*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
61*635a8641SAndroid Build Coastguard Worker 
62*635a8641SAndroid Build Coastguard Worker     a2.reset();
63*635a8641SAndroid Build Coastguard Worker 
64*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
65*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
66*635a8641SAndroid Build Coastguard Worker   }
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
69*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker // Try some orderings of create/remove to hit different cases in the linked-list
73*635a8641SAndroid Build Coastguard Worker // assembly.
TEST(LeakTrackerTest,LinkedList)74*635a8641SAndroid Build Coastguard Worker TEST(LeakTrackerTest, LinkedList) {
75*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
76*635a8641SAndroid Build Coastguard Worker 
77*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a1(new ClassA);
78*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a2(new ClassA);
79*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a3(new ClassA);
80*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a4(new ClassA);
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4, LeakTracker<ClassA>::NumLiveInstances());
83*635a8641SAndroid Build Coastguard Worker 
84*635a8641SAndroid Build Coastguard Worker   // Remove the head of the list (a1).
85*635a8641SAndroid Build Coastguard Worker   a1.reset();
86*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker   // Remove the tail of the list (a4).
89*635a8641SAndroid Build Coastguard Worker   a4.reset();
90*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
91*635a8641SAndroid Build Coastguard Worker 
92*635a8641SAndroid Build Coastguard Worker   // Append to the new tail of the list (a3).
93*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ClassA> a5(new ClassA);
94*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
95*635a8641SAndroid Build Coastguard Worker 
96*635a8641SAndroid Build Coastguard Worker   a2.reset();
97*635a8641SAndroid Build Coastguard Worker   a3.reset();
98*635a8641SAndroid Build Coastguard Worker 
99*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
100*635a8641SAndroid Build Coastguard Worker 
101*635a8641SAndroid Build Coastguard Worker   a5.reset();
102*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
103*635a8641SAndroid Build Coastguard Worker }
104*635a8641SAndroid Build Coastguard Worker 
TEST(LeakTrackerTest,NoOpCheckForLeaks)105*635a8641SAndroid Build Coastguard Worker TEST(LeakTrackerTest, NoOpCheckForLeaks) {
106*635a8641SAndroid Build Coastguard Worker   // There are no live instances of ClassA, so this should do nothing.
107*635a8641SAndroid Build Coastguard Worker   LeakTracker<ClassA>::CheckForLeaks();
108*635a8641SAndroid Build Coastguard Worker }
109*635a8641SAndroid Build Coastguard Worker 
110*635a8641SAndroid Build Coastguard Worker #endif  // ENABLE_LEAK_TRACKER
111*635a8641SAndroid Build Coastguard Worker 
112*635a8641SAndroid Build Coastguard Worker }  // namespace
113*635a8641SAndroid Build Coastguard Worker 
114*635a8641SAndroid Build Coastguard Worker }  // namespace debug
115*635a8641SAndroid Build Coastguard Worker }  // namespace base
116