1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/debug/leak_tracker.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace base {
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace debug {
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace {
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ClassA {
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LeakTracker<ClassA> leak_tracker_;
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass ClassB {
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LeakTracker<ClassB> leak_tracker_;
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef ENABLE_LEAK_TRACKER
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// If leak tracking is disabled, we should do nothing.
27513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST(LeakTrackerTest, NotEnabled) {
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Use scoped_ptr so compiler doesn't complain about unused variables.
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a1(new ClassA);
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassB> b1(new ClassB);
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassB> b2(new ClassB);
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#else
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
42513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST(LeakTrackerTest, Basic) {
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  {
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ClassA a1;
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ClassB b1;
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ClassB b2;
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_ptr<ClassA> a2(new ClassA);
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    a2.reset();
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Try some orderings of create/remove to hit different cases in the linked-list
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// assembly.
72513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST(LeakTrackerTest, LinkedList) {
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a1(new ClassA);
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a2(new ClassA);
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a3(new ClassA);
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a4(new ClassA);
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(4, LeakTracker<ClassA>::NumLiveInstances());
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove the head of the list (a1).
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  a1.reset();
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Remove the tail of the list (a4).
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  a4.reset();
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Append to the new tail of the list (a3).
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_ptr<ClassA> a5(new ClassA);
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  a2.reset();
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  a3.reset();
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  a5.reset();
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
103513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST(LeakTrackerTest, NoOpCheckForLeaks) {
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // There are no live instances of ClassA, so this should do nothing.
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LeakTracker<ClassA>::CheckForLeaks();
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif  // ENABLE_LEAK_TRACKER
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace debug
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace base
114