15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test of classes in the tracked_objects.h classes. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <stddef.h> 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 1258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "base/process/process_handle.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/tracking_info.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kLineNumber = 1776; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kFile[] = "FixedUnitTestFileName"; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWorkerThreadName[] = "WorkerThread-1"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kMainThreadName[] = "SomeMainThreadName"; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStillAlive[] = "Still_Alive"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tracked_objects { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TrackedObjectsTest : public testing::Test { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TrackedObjectsTest() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On entry, leak any database structures in case they are still in use by 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prior threads. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(true); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_time_ = 0; 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::SetAlternateTimeSource(&TrackedObjectsTest::GetTestTime); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::now_function_is_time_ = true; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TrackedObjectsTest() { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We should not need to leak any structures we create, since we are 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // single threaded, and carefully accounting for items. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(false); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the profiler state. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset() { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ShutdownSingleThreadedCleanup(false); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci test_time_ = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a birth on the thread named |thread_name|, at the given 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |location|. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TallyABirth(const Location& location, const std::string& thread_name) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the |thread_name| is empty, we don't initialize system with a thread 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name, so we're viewed as a worker thread. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!thread_name.empty()) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::InitializeThreadContext(kMainThreadName); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not delete |birth|. We don't own it. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* birth = ThreadData::TallyABirthIfActive(location); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::status() == ThreadData::DEACTIVATED) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(reinterpret_cast<Births*>(NULL), birth); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function to verify the most common test expectations. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectSimpleProcessData(const ProcessDataSnapshot& process_data, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& function_name, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& birth_thread, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& death_thread, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int run_ms, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int queue_ms) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.tasks.size()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(function_name, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].birth.location.function_name); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(birth_thread, process_data.tasks[0].birth.thread_name); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count, process_data.tasks[0].death_data.count); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count * run_ms, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].death_data.run_duration_sum); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, process_data.tasks[0].death_data.run_duration_max); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, process_data.tasks[0].death_data.run_duration_sample); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(count * queue_ms, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[0].death_data.queue_duration_sum); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_max); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_sample); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(death_thread, process_data.tasks[0].death_thread_name); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sets time that will be returned by ThreadData::Now(). 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void SetTestTime(unsigned int test_time) { test_time_ = test_time; } 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns test time in milliseconds. 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static unsigned int GetTestTime() { return test_time_; } 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Test time in milliseconds. 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static unsigned int test_time_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciunsigned int TrackedObjectsTest::test_time_; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Minimal test doesn't even create any tasks. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData* data = ThreadData::Get(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::BirthMap birth_map; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DeathMap death_map; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ParentChildSet parent_child_set; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, birth_map.size()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up with no leaking. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reset(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do it again, just to be sure we reset state completely. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::PROFILING_CHILDREN_ACTIVE)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = ThreadData::Get(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) birth_map.clear(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) death_map.clear(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.clear(); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, birth_map.size()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, TinyStartupShutdown) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Instigate tracking on a single tracked object, on our thread. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "TinyStartupShutdown"; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* first_birth = ThreadData::TallyABirthIfActive(location); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData* data = ThreadData::first(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(data); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(data->next()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data, ThreadData::Get()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::BirthMap birth_map; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DeathMap death_map; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::ParentChildSet parent_child_set; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, death_map.size()); // No deaths. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); // No children. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now instigate another birth, while we are timing the run of the first 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // execution. 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PrepareForStartOfRun(first_birth); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a child (using the same birth location). 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int32 start_time = 1; 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeTicks kBogusBirthTime = base::TimeTicks() + 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(start_time); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kBogusBirthTime); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(1); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally conclude the outer run. 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int32 time_elapsed = 1000; 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(start_time + time_elapsed); 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) birth_map.clear(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) death_map.clear(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.clear(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, death_map.size()); // 1 location. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::TrackingParentChildStatus()) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, parent_child_set.size()); // 1 child. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(parent_child_set.begin()->first, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent_child_set.begin()->second); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, parent_child_set.size()); // no stats. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The births were at the same location as the one known death. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.tasks.size()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[0].death_data.count); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sum); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_max); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sample); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].death_thread_name); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ThreadData::TrackingParentChildStatus()) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data.descendants.size()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.descendants[0].parent.location.file_name); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.location.function_name); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.location.line_number); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].parent.thread_name); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.descendants[0].child.location.file_name); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].child.location.function_name); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.descendants[0].child.location.line_number); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, process_data.descendants[0].child.thread_name); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeathDataTest) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<DeathData> data(new DeathData()); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), 0); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), 0); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), 0); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), 0); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 0); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 run_ms = 42; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 queue_ms = 8; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kUnrandomInt = 0; // Fake random int that ensure we sample data. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), run_ms); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), run_ms); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), queue_ms); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), queue_ms); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 1); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data->RecordDeath(queue_ms, run_ms, kUnrandomInt); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sum(), run_ms + run_ms); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->run_duration_sample(), run_ms); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sum(), queue_ms + queue_ms); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->queue_duration_sample(), queue_ms); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(data->count(), 2); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeathDataSnapshot snapshot(*data); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, snapshot.count); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2 * run_ms, snapshot.run_duration_sum); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, snapshot.run_duration_max); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(run_ms, snapshot.run_duration_sample); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2 * queue_ms, snapshot.queue_duration_sum); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, snapshot.queue_duration_max); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(queue_ms, snapshot.queue_duration_sample); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, std::string()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, std::string()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kStillAlive, 1, 0, 0); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "BirthOnlyToSnapshotMainThread"; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 0); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleToSnapshotMainThread"; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 1, 2, 4); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We will deactivate tracking after the birth, and before the death, and 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// demonstrate that the lifecycle is completely tallied. This ensures that 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// our tallied births are matched by tallied deaths (except for when the 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// task is still running, or is queued). 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleMidDeactivatedToSnapshotMainThread"; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Turn off tracking now that we have births. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::DEACTIVATED)); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 1, 2, 4); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We will deactivate tracking before starting a life cycle, and neither 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the birth nor the death will be recorded. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start in the deactivated state. 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCyclePreDeactivatedToSnapshotMainThread"; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.tasks.size()); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, LifeCycleToSnapshotWorkerThread) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "LifeCycleToSnapshotWorkerThread"; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do not delete |birth|. We don't own it. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Births* birth = ThreadData::TallyABirthIfActive(location); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kTimePosted = 1; 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnWorkerThreadIfTracking( 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci birth, TrackedTime() + Duration::FromMilliseconds(kTimePosted), stopwatch); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, but tell it to not reset the maxes after scanning. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWorkerThreadName, 1, 2, 4); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, but tell it to reset the maxes after scanning. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We'll still get the same values, but the data will be reset (which we'll 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see in a moment). 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data_pre_reset; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(true, &process_data_pre_reset); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kWorkerThreadName, 1, 2, 4); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call for the ToSnapshot, and now we'll see the result of the last 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // translation, as the max will have been pushed back to zero. 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data_post_reset; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(true, &process_data_post_reset); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, process_data_post_reset.tasks.size()); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data_post_reset.tasks[0].birth.location.file_name); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.location.function_name); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.location.line_number); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].birth.thread_name); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data_post_reset.tasks[0].death_data.count); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sum); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.run_duration_max); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sample); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data_post_reset.tasks[0].death_data.queue_duration_sum); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.queue_duration_max); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].death_data.queue_duration_sample); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kWorkerThreadName, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data_post_reset.tasks[0].death_thread_name); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data_post_reset.descendants.size()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data_post_reset.process_id); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, TwoLives) { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "TwoLives"; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TallyABirth(location, kMainThreadName); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task2(location, kDelayedStartTime); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch2; 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch2.Stop(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMainThreadName, 2, 2, 4); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(TrackedObjectsTest, DifferentLives) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ThreadData::InitializeAndSetTrackingStatus( 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a well named thread. 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::InitializeThreadContext(kMainThreadName); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char kFunction[] = "DifferentLives"; 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location location(kFunction, kFile, kLineNumber, NULL); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kTimePosted = base::TimeTicks() + 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(1); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task(location, kDelayedStartTime); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kStartOfRun = 5; 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const unsigned int kEndOfRun = 7; 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kStartOfRun); 5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch stopwatch; 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(kEndOfRun); 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stopwatch.Stop(); 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSecondFakeLineNumber = 999; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TrackingInfo will call TallyABirth() during construction. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TrackingInfo pending_task2(second_location, kDelayedStartTime); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessDataSnapshot process_data; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadData::Snapshot(false, &process_data); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2u, process_data.tasks.size()); 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[0].death_data.count); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sum); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_max); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sample); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[0].death_thread_name); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFile, process_data.tasks[1].birth.location.file_name); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFunction, process_data.tasks[1].birth.location.function_name); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSecondFakeLineNumber, 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_data.tasks[1].birth.location.line_number); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kMainThreadName, process_data.tasks[1].birth.thread_name); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, process_data.tasks[1].death_data.count); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sum); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_max); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sample); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sum); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_max); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sample); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kStillAlive, process_data.tasks[1].death_thread_name); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, process_data.descendants.size()); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TrackedObjectsTest, TaskWithNestedExclusion) { 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus( 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char kFunction[] = "TaskWithNestedExclusion"; 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Location location(kFunction, kFile, kLineNumber, NULL); 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TallyABirth(location, kMainThreadName); 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kTimePosted = base::TimeTicks() + 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(1); 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TrackingInfo will call TallyABirth() during construction. 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TrackingInfo pending_task(location, kDelayedStartTime); 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(5); 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch task_stopwatch; 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(8); 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch exclusion_stopwatch; 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(12); 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exclusion_stopwatch.Stop(); 6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(15); 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci task_stopwatch.Stop(); 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessDataSnapshot process_data; 6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::Snapshot(false, &process_data); 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kMainThreadName, 1, 6, 4); 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) { 6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus( 6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char kFunction[] = "TaskWith2NestedExclusions"; 6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Location location(kFunction, kFile, kLineNumber, NULL); 6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TallyABirth(location, kMainThreadName); 6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kTimePosted = base::TimeTicks() + 6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(1); 6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TrackingInfo will call TallyABirth() during construction. 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TrackingInfo pending_task(location, kDelayedStartTime); 6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(5); 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch task_stopwatch; 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(8); 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch exclusion_stopwatch; 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(12); 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exclusion_stopwatch.Stop(); 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(15); 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch exclusion_stopwatch2; 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(18); 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exclusion_stopwatch2.Stop(); 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(25); 7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci task_stopwatch.Stop(); 7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessDataSnapshot process_data; 7151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::Snapshot(false, &process_data); 7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 7171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kMainThreadName, 1, 13, 4); 7181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) { 7211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!ThreadData::InitializeAndSetTrackingStatus( 7221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::PROFILING_CHILDREN_ACTIVE)) { 7231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 7241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char kFunction[] = "TaskWithNestedExclusionWithNestedTask"; 7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Location location(kFunction, kFile, kLineNumber, NULL); 7281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const int kSecondFakeLineNumber = 999; 7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TallyABirth(location, kMainThreadName); 7321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kTimePosted = base::TimeTicks() + 7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta::FromMilliseconds(1); 7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TrackingInfo will call TallyABirth() during construction. 7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TrackingInfo pending_task(location, kDelayedStartTime); 7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(5); 7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch task_stopwatch; 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(8); 7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch exclusion_stopwatch; 7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { 7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TrackingInfo nested_task(second_location, kDelayedStartTime); 7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Overwrite implied Now(). 7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nested_task.time_posted = 7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeTicks() + base::TimeDelta::FromMilliseconds(8); 7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(9); 7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TaskStopwatch nested_task_stopwatch; 7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(11); 7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nested_task_stopwatch.Stop(); 7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking( 7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nested_task, nested_task_stopwatch); 7571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(12); 7591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci exclusion_stopwatch.Stop(); 7601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetTestTime(15); 7621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci task_stopwatch.Stop(); 7631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); 7651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessDataSnapshot process_data; 7671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadData::Snapshot(false, &process_data); 7681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The order in which the two task follow is platform-dependent. 7701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int t0 = (process_data.tasks[0].birth.location.line_number == kLineNumber) ? 7711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0 : 1; 7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int t1 = 1 - t0; 7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_EQ(2u, process_data.tasks.size()); 7751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFile, process_data.tasks[t0].birth.location.file_name); 7761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFunction, process_data.tasks[t0].birth.location.function_name); 7771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kLineNumber, process_data.tasks[t0].birth.location.line_number); 7781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kMainThreadName, process_data.tasks[t0].birth.thread_name); 7791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, process_data.tasks[t0].death_data.count); 7801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_sum); 7811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_max); 7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_sample); 7831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_sum); 7841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_max); 7851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_sample); 7861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kMainThreadName, process_data.tasks[t0].death_thread_name); 7871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFile, process_data.tasks[t1].birth.location.file_name); 7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kFunction, process_data.tasks[t1].birth.location.function_name); 7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kSecondFakeLineNumber, 7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci process_data.tasks[t1].birth.location.line_number); 7911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kMainThreadName, process_data.tasks[t1].birth.thread_name); 7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, process_data.tasks[t1].death_data.count); 7931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sum); 7941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_max); 7951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sample); 7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sum); 7971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_max); 7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sample); 7991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(kMainThreadName, process_data.tasks[t1].death_thread_name); 8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0u, process_data.descendants.size()); 8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 8021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace tracked_objects 805