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