1// Copyright (c) 2006-2008 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// Test of classes in the tracked_objects.h classes.
6
7#include "base/tracked_objects.h"
8
9#include "base/message_loop.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace tracked_objects {
13
14class TrackedObjectsTest : public testing::Test {
15 public:
16  MessageLoop message_loop_;
17};
18
19TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
20  // Minimal test doesn't even create any tasks.
21  if (!ThreadData::StartTracking(true))
22    return;
23
24  EXPECT_FALSE(ThreadData::first());  // No activity even on this thread.
25  ThreadData* data = ThreadData::current();
26  EXPECT_TRUE(ThreadData::first());  // Now class was constructed.
27  EXPECT_TRUE(data);
28  EXPECT_TRUE(!data->next());
29  EXPECT_EQ(data, ThreadData::current());
30  ThreadData::BirthMap birth_map;
31  data->SnapshotBirthMap(&birth_map);
32  EXPECT_EQ(0u, birth_map.size());
33  ThreadData::DeathMap death_map;
34  data->SnapshotDeathMap(&death_map);
35  EXPECT_EQ(0u, death_map.size());
36  ThreadData::ShutdownSingleThreadedCleanup();
37
38  // Do it again, just to be sure we reset state completely.
39  ThreadData::StartTracking(true);
40  EXPECT_FALSE(ThreadData::first());  // No activity even on this thread.
41  data = ThreadData::current();
42  EXPECT_TRUE(ThreadData::first());  // Now class was constructed.
43  EXPECT_TRUE(data);
44  EXPECT_TRUE(!data->next());
45  EXPECT_EQ(data, ThreadData::current());
46  birth_map.clear();
47  data->SnapshotBirthMap(&birth_map);
48  EXPECT_EQ(0u, birth_map.size());
49  death_map.clear();
50  data->SnapshotDeathMap(&death_map);
51  EXPECT_EQ(0u, death_map.size());
52  ThreadData::ShutdownSingleThreadedCleanup();
53}
54
55class NoopTracked : public tracked_objects::Tracked {
56};
57
58TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
59  if (!ThreadData::StartTracking(true))
60    return;
61
62  // Instigate tracking on a single tracked object, or our thread.
63  NoopTracked tracked;
64
65  const ThreadData* data = ThreadData::first();
66  EXPECT_TRUE(data);
67  EXPECT_TRUE(!data->next());
68  EXPECT_EQ(data, ThreadData::current());
69  ThreadData::BirthMap birth_map;
70  data->SnapshotBirthMap(&birth_map);
71  EXPECT_EQ(1u, birth_map.size());                         // 1 birth location.
72  EXPECT_EQ(1, birth_map.begin()->second->birth_count());  // 1 birth.
73  ThreadData::DeathMap death_map;
74  data->SnapshotDeathMap(&death_map);
75  EXPECT_EQ(0u, death_map.size());                         // No deaths.
76
77
78  // Now instigate a birth, and a death.
79  delete new NoopTracked;
80
81  birth_map.clear();
82  data->SnapshotBirthMap(&birth_map);
83  EXPECT_EQ(1u, birth_map.size());                         // 1 birth location.
84  EXPECT_EQ(2, birth_map.begin()->second->birth_count());  // 2 births.
85  death_map.clear();
86  data->SnapshotDeathMap(&death_map);
87  EXPECT_EQ(1u, death_map.size());                         // 1 location.
88  EXPECT_EQ(1, death_map.begin()->second.count());         // 1 death.
89
90  // The births were at the same location as the one known death.
91  EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first);
92
93  ThreadData::ShutdownSingleThreadedCleanup();
94}
95
96}  // namespace tracked_objects
97