Index: base/tracked_objects_unittest.cc |
diff --git a/base/tracked_objects_unittest.cc b/base/tracked_objects_unittest.cc |
index 9352ebcc0d49344460884a93667c2e6d8731dd3d..a73b4d52dd3689b958f891921946365b6f823afb 100644 |
--- a/base/tracked_objects_unittest.cc |
+++ b/base/tracked_objects_unittest.cc |
@@ -147,7 +147,7 @@ TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { |
ThreadData::BirthMap birth_map; |
ThreadData::DeathMap death_map; |
ThreadData::ParentChildSet parent_child_set; |
- data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
+ data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); |
EXPECT_EQ(0u, birth_map.size()); |
EXPECT_EQ(0u, death_map.size()); |
EXPECT_EQ(0u, parent_child_set.size()); |
@@ -167,7 +167,7 @@ TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { |
birth_map.clear(); |
death_map.clear(); |
parent_child_set.clear(); |
- data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
+ data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); |
EXPECT_EQ(0u, birth_map.size()); |
EXPECT_EQ(0u, death_map.size()); |
EXPECT_EQ(0u, parent_child_set.size()); |
@@ -191,7 +191,7 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { |
ThreadData::BirthMap birth_map; |
ThreadData::DeathMap death_map; |
ThreadData::ParentChildSet parent_child_set; |
- data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
+ data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); |
EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. |
EXPECT_EQ(0u, death_map.size()); // No deaths. |
@@ -220,7 +220,7 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { |
birth_map.clear(); |
death_map.clear(); |
parent_child_set.clear(); |
- data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
+ data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); |
EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. |
EXPECT_EQ(1u, death_map.size()); // 1 location. |
@@ -237,7 +237,7 @@ TEST_F(TrackedObjectsTest, TinyStartupShutdown) { |
EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |
@@ -338,7 +338,7 @@ TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { |
TallyABirth(location, std::string()); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |
@@ -361,7 +361,7 @@ TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { |
TallyABirth(location, kMainThreadName); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |
@@ -384,7 +384,7 @@ TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { |
TallyABirth(location, std::string()); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, |
kStillAlive, 1, 0, 0); |
} |
@@ -400,7 +400,7 @@ TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { |
TallyABirth(location, kMainThreadName); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, |
1, 0, 0); |
} |
@@ -432,11 +432,187 @@ TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
kMainThreadName, 1, 2, 4); |
} |
+TEST_F(TrackedObjectsTest, TwoPhases) { |
+ if (!ThreadData::InitializeAndSetTrackingStatus( |
+ ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
+ return; |
+ } |
+ |
+ const char kFunction[] = "TwoPhases"; |
+ Location location(kFunction, kFile, kLineNumber, NULL); |
+ TallyABirth(location, kMainThreadName); |
+ |
+ const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); |
+ const base::TimeTicks kDelayedStartTime = base::TimeTicks(); |
+ // TrackingInfo will call TallyABirth() during construction. |
+ base::TrackingInfo pending_task(location, kDelayedStartTime); |
+ pending_task.time_posted = kTimePosted; // Overwrite implied Now(). |
+ |
+ const unsigned int kStartOfRun = 5; |
+ const unsigned int kEndOfRun = 7; |
+ SetTestTime(kStartOfRun); |
+ TaskStopwatch stopwatch; |
+ stopwatch.Start(); |
+ SetTestTime(kEndOfRun); |
+ stopwatch.Stop(); |
+ |
+ ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
+ |
+ ThreadData::OnProfilingPhaseCompletion(0); |
+ |
+ TallyABirth(location, kMainThreadName); |
+ |
+ const TrackedTime kTimePosted1 = TrackedTime::FromMilliseconds(9); |
+ const base::TimeTicks kDelayedStartTime1 = base::TimeTicks(); |
+ // TrackingInfo will call TallyABirth() during construction. |
+ base::TrackingInfo pending_task1(location, kDelayedStartTime1); |
+ pending_task1.time_posted = kTimePosted1; // Overwrite implied Now(). |
+ |
+ const unsigned int kStartOfRun1 = 11; |
+ const unsigned int kEndOfRun1 = 21; |
+ SetTestTime(kStartOfRun1); |
+ TaskStopwatch stopwatch1; |
+ stopwatch1.Start(); |
+ SetTestTime(kEndOfRun1); |
+ stopwatch1.Stop(); |
+ |
+ ThreadData::TallyRunOnNamedThreadIfTracking(pending_task1, stopwatch1); |
+ |
+ ProcessDataSnapshot process_data; |
+ ThreadData::Snapshot(1, &process_data); |
+ |
+ ASSERT_EQ(2u, process_data.phased_process_data_snapshots.size()); |
+ |
+ auto it0 = process_data.phased_process_data_snapshots.find(0); |
+ ASSERT_TRUE(it0 != process_data.phased_process_data_snapshots.end()); |
+ const ProcessDataPhaseSnapshot& process_data_phase0 = it0->second; |
+ |
+ ASSERT_EQ(1u, process_data_phase0.tasks.size()); |
+ |
+ EXPECT_EQ(kFile, process_data_phase0.tasks[0].birth.location.file_name); |
+ EXPECT_EQ(kFunction, |
+ process_data_phase0.tasks[0].birth.location.function_name); |
+ EXPECT_EQ(kLineNumber, |
+ process_data_phase0.tasks[0].birth.location.line_number); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name); |
+ |
+ EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_max); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sample); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sum); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name); |
+ |
+ EXPECT_EQ(0u, process_data_phase0.descendants.size()); |
+ |
+ auto it1 = process_data.phased_process_data_snapshots.find(1); |
+ ASSERT_TRUE(it1 != process_data.phased_process_data_snapshots.end()); |
+ const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; |
+ |
+ ASSERT_EQ(1u, process_data_phase1.tasks.size()); |
+ |
+ EXPECT_EQ(kFile, process_data_phase1.tasks[0].birth.location.file_name); |
+ EXPECT_EQ(kFunction, |
+ process_data_phase1.tasks[0].birth.location.function_name); |
+ EXPECT_EQ(kLineNumber, |
+ process_data_phase1.tasks[0].birth.location.line_number); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].birth.thread_name); |
+ |
+ EXPECT_EQ(1, process_data_phase1.tasks[0].death_data.count); |
+ EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_sum); |
+ EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_max); |
+ EXPECT_EQ(10, process_data_phase1.tasks[0].death_data.run_duration_sample); |
+ EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_sum); |
+ EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_max); |
+ EXPECT_EQ(2, process_data_phase1.tasks[0].death_data.queue_duration_sample); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase1.tasks[0].death_thread_name); |
+ |
+ EXPECT_EQ(0u, process_data_phase1.descendants.size()); |
+ |
+ EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
+} |
+ |
+TEST_F(TrackedObjectsTest, TwoPhasesSecondEmpty) { |
+ if (!ThreadData::InitializeAndSetTrackingStatus( |
+ ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
+ return; |
+ } |
+ |
+ const char kFunction[] = "TwoPhasesSecondEmpty"; |
+ Location location(kFunction, kFile, kLineNumber, NULL); |
+ ThreadData::InitializeThreadContext(kMainThreadName); |
+ |
+ const TrackedTime kTimePosted = TrackedTime::FromMilliseconds(1); |
+ const base::TimeTicks kDelayedStartTime = base::TimeTicks(); |
+ // TrackingInfo will call TallyABirth() during construction. |
+ base::TrackingInfo pending_task(location, kDelayedStartTime); |
+ pending_task.time_posted = kTimePosted; // Overwrite implied Now(). |
+ |
+ const unsigned int kStartOfRun = 5; |
+ const unsigned int kEndOfRun = 7; |
+ SetTestTime(kStartOfRun); |
+ TaskStopwatch stopwatch; |
+ stopwatch.Start(); |
+ SetTestTime(kEndOfRun); |
+ stopwatch.Stop(); |
+ |
+ ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
+ |
+ ThreadData::OnProfilingPhaseCompletion(0); |
+ |
+ ProcessDataSnapshot process_data; |
+ ThreadData::Snapshot(1, &process_data); |
+ |
+ ASSERT_EQ(2u, process_data.phased_process_data_snapshots.size()); |
+ |
+ auto it0 = process_data.phased_process_data_snapshots.find(0); |
+ ASSERT_TRUE(it0 != process_data.phased_process_data_snapshots.end()); |
+ const ProcessDataPhaseSnapshot& process_data_phase0 = it0->second; |
+ |
+ ASSERT_EQ(1u, process_data_phase0.tasks.size()); |
+ |
+ EXPECT_EQ(kFile, process_data_phase0.tasks[0].birth.location.file_name); |
+ EXPECT_EQ(kFunction, |
+ process_data_phase0.tasks[0].birth.location.function_name); |
+ EXPECT_EQ(kLineNumber, |
+ process_data_phase0.tasks[0].birth.location.line_number); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].birth.thread_name); |
+ |
+ EXPECT_EQ(1, process_data_phase0.tasks[0].death_data.count); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sum); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_max); |
+ EXPECT_EQ(2, process_data_phase0.tasks[0].death_data.run_duration_sample); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sum); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_max); |
+ EXPECT_EQ(4, process_data_phase0.tasks[0].death_data.queue_duration_sample); |
+ |
+ EXPECT_EQ(kMainThreadName, process_data_phase0.tasks[0].death_thread_name); |
+ |
+ EXPECT_EQ(0u, process_data_phase0.descendants.size()); |
+ |
+ auto it1 = process_data.phased_process_data_snapshots.find(1); |
+ ASSERT_TRUE(it1 != process_data.phased_process_data_snapshots.end()); |
+ const ProcessDataPhaseSnapshot& process_data_phase1 = it1->second; |
+ |
+ ASSERT_EQ(0u, process_data_phase1.tasks.size()); |
+ |
+ EXPECT_EQ(0u, process_data_phase1.descendants.size()); |
+ |
+ EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
+} |
+ |
// We will deactivate tracking after the birth, and before the death, and |
// demonstrate that the lifecycle is completely tallied. This ensures that |
// our tallied births are matched by tallied deaths (except for when the |
@@ -472,7 +648,7 @@ TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
kMainThreadName, 1, 2, 4); |
} |
@@ -506,7 +682,7 @@ TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |
@@ -556,7 +732,7 @@ TEST_F(TrackedObjectsTest, TwoLives) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
kMainThreadName, 2, 2, 4); |
} |
@@ -596,7 +772,7 @@ TEST_F(TrackedObjectsTest, DifferentLives) { |
pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |
@@ -669,7 +845,7 @@ TEST_F(TrackedObjectsTest, TaskWithNestedExclusion) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
kMainThreadName, 1, 6, 4); |
} |
@@ -712,7 +888,7 @@ TEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
kMainThreadName, 1, 13, 4); |
} |
@@ -765,7 +941,7 @@ TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) { |
ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
ProcessDataSnapshot process_data; |
- ThreadData::Snapshot(&process_data); |
+ ThreadData::Snapshot(0, &process_data); |
ASSERT_EQ(1u, process_data.phased_process_data_snapshots.size()); |
auto it = process_data.phased_process_data_snapshots.find(0); |