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