| Index: chrome/browser/metrics/metrics_log_unittest.cc | 
| diff --git a/chrome/browser/metrics/metrics_log_unittest.cc b/chrome/browser/metrics/metrics_log_unittest.cc | 
| index 03654653866fd64b39543f19b96d2c69d2d0d049..6abe9f8d9446721505c392291e0b1dc6c3588d29 100644 | 
| --- a/chrome/browser/metrics/metrics_log_unittest.cc | 
| +++ b/chrome/browser/metrics/metrics_log_unittest.cc | 
| @@ -8,9 +8,11 @@ | 
| #include "base/stringprintf.h" | 
| #include "base/string_util.h" | 
| #include "base/time.h" | 
| +#include "base/tracked_objects.h" | 
| #include "chrome/browser/metrics/metrics_log.h" | 
| #include "chrome/browser/prefs/browser_prefs.h" | 
| #include "chrome/browser/prefs/pref_service.h" | 
| +#include "chrome/common/metrics/proto/profiler_event.pb.h" | 
| #include "chrome/common/metrics/proto/system_profile.pb.h" | 
| #include "chrome/common/pref_names.h" | 
| #include "chrome/test/base/testing_pref_service.h" | 
| @@ -20,6 +22,9 @@ | 
| #include "webkit/plugins/webplugininfo.h" | 
|  | 
| using base::TimeDelta; | 
| +using metrics::ProfilerEventProto; | 
| +using tracked_objects::ProcessDataSnapshot; | 
| +using tracked_objects::TaskSnapshot; | 
|  | 
| namespace { | 
|  | 
| @@ -53,8 +58,12 @@ class TestMetricsLog : public MetricsLog { | 
| return &prefs_; | 
| } | 
|  | 
| +  const metrics::ChromeUserMetricsExtension& uma_proto() const { | 
| +    return *MetricsLog::uma_proto(); | 
| +  } | 
| + | 
| const metrics::SystemProfileProto& system_profile() const { | 
| -    return uma_proto()->system_profile(); | 
| +    return uma_proto().system_profile(); | 
| } | 
|  | 
| private: | 
| @@ -120,6 +129,128 @@ TEST_F(MetricsLogTest, RecordEnvironment) { | 
| TestRecordEnvironment(true); | 
| } | 
|  | 
| +// Test that we properly write profiler data to the log. | 
| +TEST_F(MetricsLogTest, RecordProfilerData) { | 
| +  TestMetricsLog log(kClientId, kSessionId); | 
| +  EXPECT_EQ(0, log.uma_proto().profiler_event_size()); | 
| + | 
| +  { | 
| +    ProcessDataSnapshot process_data; | 
| +    process_data.process_id = 177; | 
| +    process_data.tasks.push_back(TaskSnapshot()); | 
| +    process_data.tasks.back().birth.location.file_name = "file"; | 
| +    process_data.tasks.back().birth.location.function_name = "function"; | 
| +    process_data.tasks.back().birth.location.line_number = 1337; | 
| +    process_data.tasks.back().birth.thread_name = "birth_thread"; | 
| +    process_data.tasks.back().death_data.count = 37; | 
| +    process_data.tasks.back().death_data.run_duration_sum = 31; | 
| +    process_data.tasks.back().death_data.run_duration_max = 17; | 
| +    process_data.tasks.back().death_data.run_duration_sample = 13; | 
| +    process_data.tasks.back().death_data.queue_duration_sum = 8; | 
| +    process_data.tasks.back().death_data.queue_duration_max = 5; | 
| +    process_data.tasks.back().death_data.queue_duration_sample = 3; | 
| +    process_data.tasks.back().death_thread_name = "Still_Alive"; | 
| +    process_data.tasks.push_back(TaskSnapshot()); | 
| +    process_data.tasks.back().birth.location.file_name = "file2"; | 
| +    process_data.tasks.back().birth.location.function_name = "function2"; | 
| +    process_data.tasks.back().birth.location.line_number = 1773; | 
| +    process_data.tasks.back().birth.thread_name = "birth_thread2"; | 
| +    process_data.tasks.back().death_data.count = 19; | 
| +    process_data.tasks.back().death_data.run_duration_sum = 23; | 
| +    process_data.tasks.back().death_data.run_duration_max = 11; | 
| +    process_data.tasks.back().death_data.run_duration_sample = 7; | 
| +    process_data.tasks.back().death_data.queue_duration_sum = 0; | 
| +    process_data.tasks.back().death_data.queue_duration_max = 0; | 
| +    process_data.tasks.back().death_data.queue_duration_sample = 0; | 
| +    process_data.tasks.back().death_thread_name = "death_thread"; | 
| + | 
| +    log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER); | 
| +    ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | 
| +    EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | 
| +              log.uma_proto().profiler_event(0).profile_type()); | 
| +    EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | 
| +              log.uma_proto().profiler_event(0).time_source()); | 
| + | 
| +    ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size()); | 
| + | 
| +    const ProfilerEventProto::TrackedObject* tracked_object = | 
| +        &log.uma_proto().profiler_event(0).tracked_object(0); | 
| +    EXPECT_EQ(13962325592283560029U, tracked_object->source_file_name_hash()); | 
| +    EXPECT_EQ(10123486280357988687U, | 
| +              tracked_object->source_function_name_hash()); | 
| +    EXPECT_EQ(1337, tracked_object->source_line_number()); | 
| +    EXPECT_EQ(3400908935414830400U, tracked_object->birth_thread_name_hash()); | 
| +    EXPECT_EQ(37, tracked_object->exec_count()); | 
| +    EXPECT_EQ(31, tracked_object->exec_time_total()); | 
| +    EXPECT_EQ(13, tracked_object->exec_time_sampled()); | 
| +    EXPECT_EQ(8, tracked_object->queue_time_total()); | 
| +    EXPECT_EQ(3, tracked_object->queue_time_sampled()); | 
| +    EXPECT_EQ(10151977472163283085U, tracked_object->exec_thread_name_hash()); | 
| +    EXPECT_EQ(177U, tracked_object->process_id()); | 
| +    EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | 
| +              tracked_object->process_type()); | 
| + | 
| +    tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1); | 
| +    EXPECT_EQ(55232426147951219U, tracked_object->source_file_name_hash()); | 
| +    EXPECT_EQ(2025659946535236365U, | 
| +              tracked_object->source_function_name_hash()); | 
| +    EXPECT_EQ(1773, tracked_object->source_line_number()); | 
| +    EXPECT_EQ(15727396632046120663U, tracked_object->birth_thread_name_hash()); | 
| +    EXPECT_EQ(19, tracked_object->exec_count()); | 
| +    EXPECT_EQ(23, tracked_object->exec_time_total()); | 
| +    EXPECT_EQ(7, tracked_object->exec_time_sampled()); | 
| +    EXPECT_EQ(0, tracked_object->queue_time_total()); | 
| +    EXPECT_EQ(0, tracked_object->queue_time_sampled()); | 
| +    EXPECT_EQ(14275151213201158253U, tracked_object->exec_thread_name_hash()); | 
| +    EXPECT_EQ(177U, tracked_object->process_id()); | 
| +    EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | 
| +              tracked_object->process_type()); | 
| +  } | 
| + | 
| +  { | 
| +    ProcessDataSnapshot process_data; | 
| +    process_data.process_id = 1177; | 
| +    process_data.tasks.push_back(TaskSnapshot()); | 
| +    process_data.tasks.back().birth.location.file_name = "file3"; | 
| +    process_data.tasks.back().birth.location.function_name = "function3"; | 
| +    process_data.tasks.back().birth.location.line_number = 7331; | 
| +    process_data.tasks.back().birth.thread_name = "birth_thread3"; | 
| +    process_data.tasks.back().death_data.count = 137; | 
| +    process_data.tasks.back().death_data.run_duration_sum = 131; | 
| +    process_data.tasks.back().death_data.run_duration_max = 117; | 
| +    process_data.tasks.back().death_data.run_duration_sample = 113; | 
| +    process_data.tasks.back().death_data.queue_duration_sum = 108; | 
| +    process_data.tasks.back().death_data.queue_duration_max = 105; | 
| +    process_data.tasks.back().death_data.queue_duration_sample = 103; | 
| +    process_data.tasks.back().death_thread_name = "death_thread3"; | 
| + | 
| +    log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER); | 
| +    ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | 
| +    EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | 
| +              log.uma_proto().profiler_event(0).profile_type()); | 
| +    EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | 
| +              log.uma_proto().profiler_event(0).time_source()); | 
| +    ASSERT_EQ(3, log.uma_proto().profiler_event(0).tracked_object_size()); | 
| + | 
| +    const ProfilerEventProto::TrackedObject* tracked_object = | 
| +        &log.uma_proto().profiler_event(0).tracked_object(2); | 
| +    EXPECT_EQ(5081672290546182009U, tracked_object->source_file_name_hash()); | 
| +    EXPECT_EQ(2686523203278102732U, | 
| +              tracked_object->source_function_name_hash()); | 
| +    EXPECT_EQ(7331, tracked_object->source_line_number()); | 
| +    EXPECT_EQ(8768512930949373716U, tracked_object->birth_thread_name_hash()); | 
| +    EXPECT_EQ(137, tracked_object->exec_count()); | 
| +    EXPECT_EQ(131, tracked_object->exec_time_total()); | 
| +    EXPECT_EQ(113, tracked_object->exec_time_sampled()); | 
| +    EXPECT_EQ(108, tracked_object->queue_time_total()); | 
| +    EXPECT_EQ(103, tracked_object->queue_time_sampled()); | 
| +    EXPECT_EQ(7246674144371406371U, tracked_object->exec_thread_name_hash()); | 
| +    EXPECT_EQ(1177U, tracked_object->process_id()); | 
| +    EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | 
| +              tracked_object->process_type()); | 
| +  } | 
| +} | 
| + | 
| #if defined(OS_CHROMEOS) | 
| TEST_F(MetricsLogTest, ChromeOSStabilityData) { | 
| TestMetricsLog log(kClientId, kSessionId); | 
|  |