1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test of classes in the tracked_objects.h classes. 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/tracked_objects.h" 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <stddef.h> 10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h> 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/scoped_ptr.h" 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/process/process_handle.h" 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h" 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/tracking_info.h" 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h" 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kLineNumber = 1776; 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kFile[] = "FixedUnitTestFileName"; 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kWorkerThreadName[] = "WorkerThread-1"; 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kMainThreadName[] = "SomeMainThreadName"; 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kStillAlive[] = "Still_Alive"; 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace tracked_objects { 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TrackedObjectsTest : public testing::Test { 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat protected: 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TrackedObjectsTest() { 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // On entry, leak any database structures in case they are still in use by 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // prior threads. 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::ShutdownSingleThreadedCleanup(true); 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat test_time_ = 0; 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::SetAlternateTimeSource(&TrackedObjectsTest::GetTestTime); 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::now_function_is_time_ = true; 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~TrackedObjectsTest() override { 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // We should not need to leak any structures we create, since we are 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // single threaded, and carefully accounting for items. 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::ShutdownSingleThreadedCleanup(false); 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Reset the profiler state. 45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Reset() { 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::ShutdownSingleThreadedCleanup(false); 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat test_time_ = 0; 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Simulate a birth on the thread named |thread_name|, at the given 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // |location|. 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void TallyABirth(const Location& location, const std::string& thread_name) { 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If the |thread_name| is empty, we don't initialize system with a thread 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // name, so we're viewed as a worker thread. 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!thread_name.empty()) 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeThreadContext(kMainThreadName); 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Do not delete |birth|. We don't own it. 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Births* birth = ThreadData::TallyABirthIfActive(location); 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (ThreadData::status() == ThreadData::DEACTIVATED) 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(reinterpret_cast<Births*>(NULL), birth); 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat else 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Helper function to verify the most common test expectations. 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void ExpectSimpleProcessData(const ProcessDataSnapshot& process_data, 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& function_name, 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& birth_thread, 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const std::string& death_thread, 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int count, 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int run_ms, 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int queue_ms) { 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase.tasks.size()); 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[0].birth.location.file_name); 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(function_name, 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.function_name); 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.line_number); 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(birth_thread, process_data_phase.tasks[0].birth.thread_name); 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(count, process_data_phase.tasks[0].death_data.count); 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(count * run_ms, 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.run_duration_sum); 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, process_data_phase.tasks[0].death_data.run_duration_max); 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.run_duration_sample); 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(count * queue_ms, 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.queue_duration_sum); 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.queue_duration_max); 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.queue_duration_sample); 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(death_thread, process_data_phase.tasks[0].death_thread_name); 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Sets time that will be returned by ThreadData::Now(). 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static void SetTestTime(unsigned int test_time) { test_time_ = test_time; } 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Returns test time in milliseconds. 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static unsigned int GetTestTime() { return test_time_; } 114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Test time in milliseconds. 116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static unsigned int test_time_; 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratunsigned int TrackedObjectsTest::test_time_; 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TaskStopwatchNoStartStop) { 123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Check that creating and destroying a stopwatch without starting it doesn't 126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // crash. 127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, MinimalStartupShutdown) { 131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Minimal test doesn't even create any tasks. 132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData* data = ThreadData::Get(); 136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(data); 138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(data->next()); 139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data, ThreadData::Get()); 140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::BirthMap birth_map; 141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::DeathsSnapshot deaths; 142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->SnapshotMaps(0, &birth_map, &deaths); 143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, birth_map.size()); 144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, deaths.size()); 145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Clean up with no leaking. 147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Reset(); 148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Do it again, just to be sure we reset state completely. 150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data = ThreadData::Get(); 153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(data); 155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(data->next()); 156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data, ThreadData::Get()); 157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat birth_map.clear(); 158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat deaths.clear(); 159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->SnapshotMaps(0, &birth_map, &deaths); 160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, birth_map.size()); 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, deaths.size()); 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TinyStartupShutdown) { 165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Instigate tracking on a single tracked object, on our thread. 168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TinyStartupShutdown"; 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyABirthIfActive(location); 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData* data = ThreadData::first(); 173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(data); 174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_FALSE(data->next()); 175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data, ThreadData::Get()); 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::BirthMap birth_map; 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::DeathsSnapshot deaths; 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->SnapshotMaps(0, &birth_map, &deaths); 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0u, deaths.size()); // No deaths. 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Now instigate another birth, while we are timing the run of the first 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // execution. 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Create a child (using the same birth location). 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 188cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko const int32_t start_time = 1; 189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeTicks kBogusBirthTime = base::TimeTicks() + 190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TimeDelta::FromMilliseconds(start_time); 191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kBogusBirthTime); 192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(1); 193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Finally conclude the outer run. 196cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko const int32_t time_elapsed = 1000; 197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(start_time + time_elapsed); 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat birth_map.clear(); 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat deaths.clear(); 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->SnapshotMaps(0, &birth_map, &deaths); 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1u, deaths.size()); // 1 location. 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, deaths.begin()->second.death_data.count); // 1 death. 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The births were at the same location as the one known death. 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(birth_map.begin()->second, deaths.begin()->first); 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase.tasks.size()); 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[0].birth.location.file_name); 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.function_name); 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.line_number); 226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kWorkerThreadName, process_data_phase.tasks[0].birth.thread_name); 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[0].death_data.count); 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(time_elapsed, 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.run_duration_sum); 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(time_elapsed, 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.run_duration_max); 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(time_elapsed, 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].death_data.run_duration_sample); 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_sum); 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_max); 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[0].death_data.queue_duration_sample); 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kWorkerThreadName, process_data_phase.tasks[0].death_thread_name); 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, DeathDataTestRecordDeath) { 241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<DeathData> data(new DeathData()); 244cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko ASSERT_NE(data, nullptr); 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sum(), 0); 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_max(), 0); 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sample(), 0); 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sum(), 0); 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_max(), 0); 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sample(), 0); 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->count(), 0); 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(nullptr, data->last_phase_snapshot()); 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 254cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t run_ms = 42; 255cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t queue_ms = 8; 256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kUnrandomInt = 0; // Fake random int that ensure we sample data. 258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sum(), run_ms); 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_max(), run_ms); 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sample(), run_ms); 262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sum(), queue_ms); 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_max(), queue_ms); 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sample(), queue_ms); 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->count(), 1); 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(nullptr, data->last_phase_snapshot()); 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_max(), run_ms); 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sample(), run_ms); 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sum(), queue_ms + queue_ms); 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_max(), queue_ms); 274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sample(), queue_ms); 275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->count(), 2); 276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(nullptr, data->last_phase_snapshot()); 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, DeathDataTest2Phases) { 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat scoped_ptr<DeathData> data(new DeathData()); 283cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko ASSERT_NE(data, nullptr); 284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 285cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t run_ms = 42; 286cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t queue_ms = 8; 287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kUnrandomInt = 0; // Fake random int that ensure we sample data. 289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->OnProfilingPhaseCompleted(123); 293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); 294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_max(), 0); 295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sample(), run_ms); 296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sum(), queue_ms + queue_ms); 297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_max(), 0); 298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sample(), queue_ms); 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->count(), 2); 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_NE(nullptr, data->last_phase_snapshot()); 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(123, data->last_phase_snapshot()->profiling_phase); 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, data->last_phase_snapshot()->death_data.count); 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2 * run_ms, 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.run_duration_sum); 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, data->last_phase_snapshot()->death_data.run_duration_max); 306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.run_duration_sample); 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2 * queue_ms, 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_sum); 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_max); 312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_sample); 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(nullptr, data->last_phase_snapshot()->prev); 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 316cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t run_ms1 = 21; 317cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko int32_t queue_ms1 = 4; 318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->RecordDeath(queue_ms1, run_ms1, kUnrandomInt); 320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms + run_ms1); 321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_max(), run_ms1); 322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->run_duration_sample(), run_ms1); 323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sum(), queue_ms + queue_ms + queue_ms1); 324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_max(), queue_ms1); 325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->queue_duration_sample(), queue_ms1); 326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(data->count(), 3); 327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_NE(nullptr, data->last_phase_snapshot()); 328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(123, data->last_phase_snapshot()->profiling_phase); 329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, data->last_phase_snapshot()->death_data.count); 330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2 * run_ms, 331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.run_duration_sum); 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, data->last_phase_snapshot()->death_data.run_duration_max); 333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(run_ms, 334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.run_duration_sample); 335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2 * queue_ms, 336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_sum); 337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_max); 339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(queue_ms, 340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data->last_phase_snapshot()->death_data.queue_duration_sample); 341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(nullptr, data->last_phase_snapshot()->prev); 342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, Delta) { 345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DeathDataSnapshot snapshot; 348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.count = 10; 349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.run_duration_sum = 100; 350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.run_duration_max = 50; 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.run_duration_sample = 25; 352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.queue_duration_sum = 200; 353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.queue_duration_max = 101; 354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat snapshot.queue_duration_sample = 26; 355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DeathDataSnapshot older_snapshot; 357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.count = 2; 358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.run_duration_sum = 95; 359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.run_duration_max = 48; 360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.run_duration_sample = 22; 361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.queue_duration_sum = 190; 362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.queue_duration_max = 99; 363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat older_snapshot.queue_duration_sample = 21; 364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const DeathDataSnapshot& delta = snapshot.Delta(older_snapshot); 366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(8, delta.count); 367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(5, delta.run_duration_sum); 368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(50, delta.run_duration_max); 369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(25, delta.run_duration_sample); 370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(10, delta.queue_duration_sum); 371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(101, delta.queue_duration_max); 372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(26, delta.queue_duration_sample); 373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { 376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Start in the deactivated state. 377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED); 378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; 380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, std::string()); 382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(0u, process_data_phase.tasks.size()); 393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Start in the deactivated state. 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED); 400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(0u, process_data_phase.tasks.size()); 415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; 423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, std::string()); 425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kStillAlive, 1, 0, 0); 430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { 433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "BirthOnlyToSnapshotMainThread"; 436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, 442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1, 0, 0); 443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { 446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "LifeCycleToSnapshotMainThread"; 449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kMainThreadName, 1, 2, 4); 472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TwoPhases) { 475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TwoPhases"; 478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::OnProfilingPhaseCompleted(0); 498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted1 = TrackedTime::FromMilliseconds(9); 502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime1 = base::TimeTicks(); 503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task1(location, kDelayedStartTime1); 505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task1.time_posted = kTimePosted1; // Overwrite implied Now(). 506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun1 = 11; 508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun1 = 21; 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun1); 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch1; 511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch1.Start(); 512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun1); 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch1.Stop(); 514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task1, stopwatch1); 516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(1, &process_data); 519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(2u, process_data.phased_snapshots.size()); 521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it0 = process_data.phased_snapshots.find(0); 523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it0 != process_data.phased_snapshots.end()); 524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase0 = it0->second; 525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase0.tasks.size()); 527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase0.tasks[0].birth.location.file_name); 529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.function_name); 531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.line_number); 533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name); 535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count); 537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum); 538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_max); 539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sample); 540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sum); 541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max); 542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample); 543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name); 545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it1 = process_data.phased_snapshots.find(1); 547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it1 != process_data.phased_snapshots.end()); 548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; 549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase1.tasks.size()); 551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase1.tasks[0].birth.location.file_name); 553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.function_name); 555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.line_number); 557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name); 559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count); 561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_sum); 562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_max); 563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_sample); 564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_sum); 565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_max); 566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_sample); 567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name); 569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, ThreePhases) { 574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "ThreePhases"; 577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Phase 0 580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(10); 585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, base::TimeTicks()); 586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(17); 588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(23); 591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::OnProfilingPhaseCompleted(0); 597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Phase 1 599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(30); 603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, base::TimeTicks()); 604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(35); 606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(39); 609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::OnProfilingPhaseCompleted(1); 615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Phase 2 617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(40); 622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, base::TimeTicks()); 623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(43); 625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(45); 628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Snapshot and check results. 634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(2, &process_data); 636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(3u, process_data.phased_snapshots.size()); 638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it0 = process_data.phased_snapshots.find(0); 640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it0 != process_data.phased_snapshots.end()); 641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase0 = it0->second; 642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase0.tasks.size()); 644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase0.tasks[0].birth.location.file_name); 646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.function_name); 648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.line_number); 650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name); 652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count); 654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase0.tasks[0].death_data.run_duration_sum); 655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase0.tasks[0].death_data.run_duration_max); 656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase0.tasks[0].death_data.run_duration_sample); 657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(7, process_data_phase0.tasks[0].death_data.queue_duration_sum); 658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(7, process_data_phase0.tasks[0].death_data.queue_duration_max); 659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(7, process_data_phase0.tasks[0].death_data.queue_duration_sample); 660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name); 662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it1 = process_data.phased_snapshots.find(1); 664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it1 != process_data.phased_snapshots.end()); 665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; 666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase1.tasks.size()); 668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase1.tasks[0].birth.location.file_name); 670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.function_name); 672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.line_number); 674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name); 676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count); 678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.run_duration_sum); 679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.run_duration_max); 680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.run_duration_sample); 681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(5, process_data_phase1.tasks[0].death_data.queue_duration_sum); 682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(5, process_data_phase1.tasks[0].death_data.queue_duration_max); 683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(5, process_data_phase1.tasks[0].death_data.queue_duration_sample); 684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name); 686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it2 = process_data.phased_snapshots.find(2); 688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it2 != process_data.phased_snapshots.end()); 689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase2 = it2->second; 690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase2.tasks.size()); 692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase2.tasks[0].birth.location.file_name); 694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase2.tasks[0].birth.location.function_name); 696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase2.tasks[0].birth.location.line_number); 698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase2.tasks[0].birth.thread_name); 700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase2.tasks[0].death_data.count); 702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase2.tasks[0].death_data.run_duration_sum); 703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase2.tasks[0].death_data.run_duration_max); 704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase2.tasks[0].death_data.run_duration_sample); 705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(3, process_data_phase2.tasks[0].death_data.queue_duration_sum); 706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(3, process_data_phase2.tasks[0].death_data.queue_duration_max); 707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(3, process_data_phase2.tasks[0].death_data.queue_duration_sample); 708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase2.tasks[0].death_thread_name); 710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TwoPhasesSecondEmpty) { 715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TwoPhasesSecondEmpty"; 718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeThreadContext(kMainThreadName); 720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::OnProfilingPhaseCompleted(0); 738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(1, &process_data); 741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(2u, process_data.phased_snapshots.size()); 743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it0 = process_data.phased_snapshots.find(0); 745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it0 != process_data.phased_snapshots.end()); 746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase0 = it0->second; 747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase0.tasks.size()); 749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase0.tasks[0].birth.location.file_name); 751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.function_name); 753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase0.tasks[0].birth.location.line_number); 755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name); 757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count); 759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum); 760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_max); 761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sample); 762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sum); 763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max); 764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample); 765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name); 767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it1 = process_data.phased_snapshots.find(1); 769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it1 != process_data.phased_snapshots.end()); 770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; 771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(0u, process_data_phase1.tasks.size()); 773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TwoPhasesFirstEmpty) { 778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::OnProfilingPhaseCompleted(0); 781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TwoPhasesSecondEmpty"; 783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeThreadContext(kMainThreadName); 785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(1, &process_data); 804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it1 = process_data.phased_snapshots.find(1); 808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it1 != process_data.phased_snapshots.end()); 809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; 810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data_phase1.tasks.size()); 812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase1.tasks[0].birth.location.file_name); 814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.function_name); 816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase1.tasks[0].birth.location.line_number); 818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name); 820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count); 822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.run_duration_sum); 823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.run_duration_max); 824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.run_duration_sample); 825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.queue_duration_sum); 826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.queue_duration_max); 827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase1.tasks[0].death_data.queue_duration_sample); 828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name); 830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// We will deactivate tracking after the birth, and before the death, and 835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// demonstrate that the lifecycle is completely tallied. This ensures that 836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// our tallied births are matched by tallied deaths (except for when the 837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// task is still running, or is queued). 838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { 839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "LifeCycleMidDeactivatedToSnapshotMainThread"; 842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Turn off tracking now that we have births. 852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED); 853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kMainThreadName, 1, 2, 4); 868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// We will deactivate tracking before starting a life cycle, and neither 871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the birth nor the death will be recorded. 872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { 873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Start in the deactivated state. 874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED); 875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "LifeCyclePreDeactivatedToSnapshotMainThread"; 877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(0u, process_data_phase.tasks.size()); 906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TwoLives) { 911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TwoLives"; 914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 920b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 922b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 923b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task2(location, kDelayedStartTime); 935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch2; 938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch2.Start(); 939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch2.Stop(); 941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2); 943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kMainThreadName, 2, 2, 4); 948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, DifferentLives) { 951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Use a well named thread. 954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeThreadContext(kMainThreadName); 955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "DifferentLives"; 956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 963b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kStartOfRun = 5; 965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned int kEndOfRun = 7; 966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kStartOfRun); 967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch stopwatch; 968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Start(); 969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(kEndOfRun); 970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat stopwatch.Stop(); 971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kSecondFakeLineNumber = 999; 975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task2(second_location, kDelayedStartTime); 979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(2u, process_data_phase.tasks.size()); 990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[0].birth.location.file_name); 992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.function_name); 994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[0].birth.location.line_number); 996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[0].birth.thread_name); 997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[0].death_data.count); 998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[0].death_data.run_duration_sum); 999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[0].death_data.run_duration_max); 1000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[0].death_data.run_duration_sample); 1001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_sum); 1002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_max); 1003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[0].death_data.queue_duration_sample); 1004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[0].death_thread_name); 1005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[1].birth.location.file_name); 1006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 1007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[1].birth.location.function_name); 1008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kSecondFakeLineNumber, 1009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[1].birth.location.line_number); 1010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[1].birth.thread_name); 1011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[1].death_data.count); 1012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.run_duration_sum); 1013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.run_duration_max); 1014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.run_duration_sample); 1015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_sum); 1016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_max); 1017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(0, process_data_phase.tasks[1].death_data.queue_duration_sample); 1018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kStillAlive, process_data_phase.tasks[1].death_thread_name); 1019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 1020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TaskWithNestedExclusion) { 1023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 1024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TaskWithNestedExclusion"; 1026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 1027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 1028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 1030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 1031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 1032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 1033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 1034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(5); 1036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch task_stopwatch; 1037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Start(); 1038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(8); 1040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch exclusion_stopwatch; 1041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Start(); 1042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(12); 1043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Stop(); 1044b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(15); 1046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Stop(); 1047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 1049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 1051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 1052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 1053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kMainThreadName, 1, 6, 4); 1054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) { 1057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 1058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TaskWith2NestedExclusions"; 1060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 1061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 1062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 1064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 1065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 1066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 1067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 1068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(5); 1070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch task_stopwatch; 1071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Start(); 1072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(8); 1074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch exclusion_stopwatch; 1075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Start(); 1076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(12); 1077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Stop(); 1078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(15); 1080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch exclusion_stopwatch2; 1081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch2.Start(); 1082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(18); 1083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch2.Stop(); 1084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(25); 1086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Stop(); 1087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 1089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 1091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 1092b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 1093b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat kMainThreadName, 1, 13, 4); 1094b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1095b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1096b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) { 1097b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::InitializeAndSetTrackingStatus(ThreadData::PROFILING_ACTIVE); 1098b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1099b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char kFunction[] = "TaskWithNestedExclusionWithNestedTask"; 1100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location location(kFunction, kFile, kLineNumber, NULL); 1101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int kSecondFakeLineNumber = 999; 1103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TallyABirth(location, kMainThreadName); 1105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); 1107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 1108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // TrackingInfo will call TallyABirth() during construction. 1109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo pending_task(location, kDelayedStartTime); 1110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 1111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(5); 1113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch task_stopwatch; 1114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Start(); 1115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(8); 1117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch exclusion_stopwatch; 1118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Start(); 1119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { 1120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 1121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::TrackingInfo nested_task(second_location, kDelayedStartTime); 1122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Overwrite implied Now(). 1123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat nested_task.time_posted = TrackedTime::FromMilliseconds(8); 1124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(9); 1125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TaskStopwatch nested_task_stopwatch; 1126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat nested_task_stopwatch.Start(); 1127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(11); 1128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat nested_task_stopwatch.Stop(); 1129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking( 1130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat nested_task, nested_task_stopwatch); 1131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(12); 1133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat exclusion_stopwatch.Stop(); 1134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTestTime(15); 1136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat task_stopwatch.Stop(); 1137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 1139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ProcessDataSnapshot process_data; 1141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ThreadData::Snapshot(0, &process_data); 1142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(1u, process_data.phased_snapshots.size()); 1144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat auto it = process_data.phased_snapshots.find(0); 1145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_TRUE(it != process_data.phased_snapshots.end()); 1146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ProcessDataPhaseSnapshot& process_data_phase = it->second; 1147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The order in which the two task follow is platform-dependent. 1149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int t0 = 1150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat (process_data_phase.tasks[0].birth.location.line_number == kLineNumber) 1151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ? 0 1152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : 1; 1153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int t1 = 1 - t0; 1154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ASSERT_EQ(2u, process_data_phase.tasks.size()); 1156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[t0].birth.location.file_name); 1157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 1158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[t0].birth.location.function_name); 1159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kLineNumber, 1160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[t0].birth.location.line_number); 1161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t0].birth.thread_name); 1162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[t0].death_data.count); 1163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase.tasks[t0].death_data.run_duration_sum); 1164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase.tasks[t0].death_data.run_duration_max); 1165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(6, process_data_phase.tasks[t0].death_data.run_duration_sample); 1166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_sum); 1167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_max); 1168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(4, process_data_phase.tasks[t0].death_data.queue_duration_sample); 1169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t0].death_thread_name); 1170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFile, process_data_phase.tasks[t1].birth.location.file_name); 1171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kFunction, 1172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[t1].birth.location.function_name); 1173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kSecondFakeLineNumber, 1174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat process_data_phase.tasks[t1].birth.location.line_number); 1175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t1].birth.thread_name); 1176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.count); 1177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[t1].death_data.run_duration_sum); 1178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[t1].death_data.run_duration_max); 1179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(2, process_data_phase.tasks[t1].death_data.run_duration_sample); 1180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_sum); 1181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_max); 1182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(1, process_data_phase.tasks[t1].death_data.queue_duration_sample); 1183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(kMainThreadName, process_data_phase.tasks[t1].death_thread_name); 1184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 1185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 1186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace tracked_objects 1188