| // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Test of classes in the tracked_objects.h classes. |
| |
| #include "base/tracked_objects.h" |
| |
| #include "base/message_loop.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace tracked_objects { |
| |
| class TrackedObjectsTest : public testing::Test { |
| public: |
| MessageLoop message_loop_; |
| }; |
| |
| TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { |
| // Minimal test doesn't even create any tasks. |
| if (!ThreadData::StartTracking(true)) |
| return; |
| |
| EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. |
| ThreadData* data = ThreadData::current(); |
| EXPECT_TRUE(ThreadData::first()); // Now class was constructed. |
| EXPECT_TRUE(data); |
| EXPECT_TRUE(!data->next()); |
| EXPECT_EQ(data, ThreadData::current()); |
| ThreadData::BirthMap birth_map; |
| data->SnapshotBirthMap(&birth_map); |
| EXPECT_EQ(0u, birth_map.size()); |
| ThreadData::DeathMap death_map; |
| data->SnapshotDeathMap(&death_map); |
| EXPECT_EQ(0u, death_map.size()); |
| ThreadData::ShutdownSingleThreadedCleanup(); |
| |
| // Do it again, just to be sure we reset state completely. |
| ThreadData::StartTracking(true); |
| EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. |
| data = ThreadData::current(); |
| EXPECT_TRUE(ThreadData::first()); // Now class was constructed. |
| EXPECT_TRUE(data); |
| EXPECT_TRUE(!data->next()); |
| EXPECT_EQ(data, ThreadData::current()); |
| birth_map.clear(); |
| data->SnapshotBirthMap(&birth_map); |
| EXPECT_EQ(0u, birth_map.size()); |
| death_map.clear(); |
| data->SnapshotDeathMap(&death_map); |
| EXPECT_EQ(0u, death_map.size()); |
| ThreadData::ShutdownSingleThreadedCleanup(); |
| } |
| |
| class NoopTracked : public tracked_objects::Tracked { |
| }; |
| |
| TEST_F(TrackedObjectsTest, TinyStartupShutdown) { |
| if (!ThreadData::StartTracking(true)) |
| return; |
| |
| // Instigate tracking on a single tracked object, or our thread. |
| NoopTracked tracked; |
| |
| const ThreadData* data = ThreadData::first(); |
| EXPECT_TRUE(data); |
| EXPECT_TRUE(!data->next()); |
| EXPECT_EQ(data, ThreadData::current()); |
| ThreadData::BirthMap birth_map; |
| data->SnapshotBirthMap(&birth_map); |
| EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
| EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. |
| ThreadData::DeathMap death_map; |
| data->SnapshotDeathMap(&death_map); |
| EXPECT_EQ(0u, death_map.size()); // No deaths. |
| |
| |
| // Now instigate a birth, and a death. |
| delete new NoopTracked; |
| |
| birth_map.clear(); |
| data->SnapshotBirthMap(&birth_map); |
| EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
| EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. |
| death_map.clear(); |
| data->SnapshotDeathMap(&death_map); |
| EXPECT_EQ(1u, death_map.size()); // 1 location. |
| EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. |
| |
| // The births were at the same location as the one known death. |
| EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); |
| |
| ThreadData::ShutdownSingleThreadedCleanup(); |
| } |
| |
| } // namespace tracked_objects |