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