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