tracked_objects_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test of classes in the tracked_objects.h classes. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kLineNumber = 1776; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFile[] = "FixedUnitTestFileName"; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWorkerThreadName[] = "WorkerThread-1"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMainThreadName[] = "SomeMainThreadName"; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStillAlive[] = "Still_Alive"; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TrackedObjectsTest : public testing::Test { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrackedObjectsTest() { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On entry, leak any database structures in case they are still in use by 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prior threads. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(true); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TrackedObjectsTest() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not need to leak any structures we create, since we are 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // single threaded, and carefully accounting for items. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(false); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the profiler state. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(false); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a birth on the thread named |thread_name|, at the given 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |location|. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TallyABirth(const Location& location, const std::string& thread_name) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the |thread_name| is empty, we don't initialize system with a thread 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name, so we're viewed as a worker thread. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_name.empty()) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::InitializeThreadContext(kMainThreadName); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not delete |birth|. We don't own it. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* birth = ThreadData::TallyABirthIfActive(location); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::status() == ThreadData::DEACTIVATED) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(reinterpret_cast<Births*>(NULL), birth); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to verify the most common test expectations. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectSimpleProcessData(const ProcessDataSnapshot& process_data, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& function_name, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& birth_thread, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& death_thread, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int run_ms, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int queue_ms) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.tasks.size()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(function_name, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].birth.location.function_name); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(birth_thread, process_data.tasks[0].birth.thread_name); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count, process_data.tasks[0].death_data.count); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count * run_ms, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].death_data.run_duration_sum); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, process_data.tasks[0].death_data.run_duration_max); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, process_data.tasks[0].death_data.run_duration_sample); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count * queue_ms, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].death_data.queue_duration_sum); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_max); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_sample); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(death_thread, process_data.tasks[0].death_thread_name); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimal test doesn't even create any tasks. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData* data = ThreadData::Get(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::BirthMap birth_map; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DeathMap death_map; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ParentChildSet parent_child_set; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, birth_map.size()); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up with no leaking. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do it again, just to be sure we reset state completely. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ThreadData::Get(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) birth_map.clear(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) death_map.clear(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.clear(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, birth_map.size()); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, TinyStartupShutdown) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instigate tracking on a single tracked object, on our thread. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "TinyStartupShutdown"; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* first_birth = ThreadData::TallyABirthIfActive(location); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData* data = ThreadData::first(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::BirthMap birth_map; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DeathMap death_map; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ParentChildSet parent_child_set; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); // No deaths. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); // No children. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now instigate another birth, while we are timing the run of the first 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // execution. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::NowForStartOfRun(first_birth); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a child (using the same birth location). 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks kBogusBirthTime; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kBogusBirthTime); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrackedTime start_time(pending_task.time_posted); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally conclude the outer run. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrackedTime end_time = ThreadData::NowForEndOfRun(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, start_time, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_time); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) birth_map.clear(); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) death_map.clear(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.clear(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, death_map.size()); // 1 location. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::TrackingParentChildStatus()) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, parent_child_set.size()); // 1 child. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(parent_child_set.begin()->first, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.begin()->second); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); // no stats. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The births were at the same location as the one known death. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int32 time_elapsed = (end_time - start_time).InMilliseconds(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.tasks.size()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[0].death_data.count); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sum); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_max); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sample); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].death_thread_name); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::TrackingParentChildStatus()) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.descendants.size()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.descendants[0].parent.location.file_name); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.location.function_name); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.location.line_number); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.thread_name); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.descendants[0].child.location.file_name); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].child.location.function_name); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].child.location.line_number); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.descendants[0].child.thread_name); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeathDataTest) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeathData> data(new DeathData()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), 0); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), 0); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), 0); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), 0); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 0); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 run_ms = 42; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 queue_ms = 8; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kUnrandomInt = 0; // Fake random int that ensure we sample data. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), run_ms); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), run_ms); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), queue_ms); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), queue_ms); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 1); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), run_ms); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), queue_ms + queue_ms); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), queue_ms); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 2); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeathDataSnapshot snapshot(*data); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, snapshot.count); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2 * run_ms, snapshot.run_duration_sum); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, snapshot.run_duration_max); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, snapshot.run_duration_sample); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2 * queue_ms, snapshot.queue_duration_sum); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, snapshot.queue_duration_max); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, snapshot.queue_duration_sample); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, std::string()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, std::string()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStillAlive, 1, 0, 0); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "BirthOnlyToSnapshotMainThread"; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 0); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleToSnapshotMainThread"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 1, 2, 4); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We will deactivate tracking after the birth, and before the death, and 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// demonstrate that the lifecycle is completely tallied. This ensures that 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our tallied births are matched by tallied deaths (except for when the 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// task is still running, or is queued). 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleMidDeactivatedToSnapshotMainThread"; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn off tracking now that we have births. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DEACTIVATED)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 1, 2, 4); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We will deactivate tracking before starting a life cycle, and neither 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the birth nor the death will be recorded. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCyclePreDeactivatedToSnapshotMainThread"; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleToSnapshotWorkerThread) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleToSnapshotWorkerThread"; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not delete |birth|. We don't own it. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* birth = ThreadData::TallyABirthIfActive(location); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kTimePosted = TrackedTime() + Duration::FromMilliseconds(1); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnWorkerThreadIfTracking(birth, kTimePosted, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, but tell it to not reset the maxes after scanning. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWorkerThreadName, 1, 2, 4); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, but tell it to reset the maxes after scanning. 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll still get the same values, but the data will be reset (which we'll 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see in a moment). 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data_pre_reset; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(true, &process_data_pre_reset); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWorkerThreadName, 1, 2, 4); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, and now we'll see the result of the last 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // translation, as the max will have been pushed back to zero. 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data_post_reset; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(true, &process_data_post_reset); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data_post_reset.tasks.size()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data_post_reset.tasks[0].birth.location.file_name); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.location.function_name); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.location.line_number); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.thread_name); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data_post_reset.tasks[0].death_data.count); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sum); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.run_duration_max); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sample); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data_post_reset.tasks[0].death_data.queue_duration_sum); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.queue_duration_max); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].death_data.queue_duration_sample); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].death_thread_name); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data_post_reset.descendants.size()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data_post_reset.process_id); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, TwoLives) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "TwoLives"; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task2(location, kDelayedStartTime); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 2, 2, 4); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DifferentLives) { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a well named thread. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::InitializeThreadContext(kMainThreadName); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DifferentLives"; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kStartOfRun = TrackedTime() + 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Duration::FromMilliseconds(5); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStartOfRun, kEndOfRun); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSecondFakeLineNumber = 999; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task2(second_location, kDelayedStartTime); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, process_data.tasks.size()); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[0].death_data.count); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sum); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_max); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sample); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[0].death_thread_name); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[1].birth.location.file_name); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[1].birth.location.function_name); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSecondFakeLineNumber, 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[1].birth.location.line_number); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[1].birth.thread_name); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[1].death_data.count); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sum); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_max); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sample); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sum); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_max); 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sample); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kStillAlive, process_data.tasks[1].death_thread_name); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tracked_objects 582