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