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