OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/metrics/profiler_metrics_provider.h" | |
6 | |
7 #include "base/tracked_objects.h" | |
8 #include "components/metrics/metrics_hashes.h" | |
9 #include "content/public/common/process_type.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 using metrics::ProfilerEventProto; | |
13 using tracked_objects::ProcessDataSnapshot; | |
14 using tracked_objects::TaskSnapshot; | |
15 | |
16 TEST(ProfilerMetricsProviderTest, RecordData) { | |
17 // WARNING: If you broke the below check, you've modified how | |
18 // metrics::HashMetricName works. Please also modify all server-side code that | |
19 // relies on the existing way of hashing. | |
20 EXPECT_EQ(GG_UINT64_C(1518842999910132863), | |
21 metrics::HashMetricName("birth_thread*")); | |
22 | |
23 ProfilerMetricsProvider profiler_metrics_provider; | |
24 | |
25 { | |
26 // Add data from the browser process. | |
27 ProcessDataSnapshot process_data; | |
28 process_data.process_id = 177; | |
29 process_data.tasks.push_back(TaskSnapshot()); | |
30 process_data.tasks.back().birth.location.file_name = "a/b/file.h"; | |
31 process_data.tasks.back().birth.location.function_name = "function"; | |
32 process_data.tasks.back().birth.location.line_number = 1337; | |
33 process_data.tasks.back().birth.thread_name = "birth_thread"; | |
34 process_data.tasks.back().death_data.count = 37; | |
35 process_data.tasks.back().death_data.run_duration_sum = 31; | |
36 process_data.tasks.back().death_data.run_duration_max = 17; | |
37 process_data.tasks.back().death_data.run_duration_sample = 13; | |
38 process_data.tasks.back().death_data.queue_duration_sum = 8; | |
39 process_data.tasks.back().death_data.queue_duration_max = 5; | |
40 process_data.tasks.back().death_data.queue_duration_sample = 3; | |
41 process_data.tasks.back().death_thread_name = "Still_Alive"; | |
42 process_data.tasks.push_back(TaskSnapshot()); | |
43 process_data.tasks.back().birth.location.file_name = "c\\d\\file2"; | |
44 process_data.tasks.back().birth.location.function_name = "function2"; | |
45 process_data.tasks.back().birth.location.line_number = 1773; | |
46 process_data.tasks.back().birth.thread_name = "birth_thread2"; | |
47 process_data.tasks.back().death_data.count = 19; | |
48 process_data.tasks.back().death_data.run_duration_sum = 23; | |
49 process_data.tasks.back().death_data.run_duration_max = 11; | |
50 process_data.tasks.back().death_data.run_duration_sample = 7; | |
51 process_data.tasks.back().death_data.queue_duration_sum = 0; | |
52 process_data.tasks.back().death_data.queue_duration_max = 0; | |
53 process_data.tasks.back().death_data.queue_duration_sample = 0; | |
54 process_data.tasks.back().death_thread_name = "death_thread"; | |
55 | |
56 profiler_metrics_provider.RecordProfilerData(process_data, | |
57 content::PROCESS_TYPE_BROWSER); | |
58 } | |
59 | |
60 { | |
61 // Add data from a renderer process. | |
62 ProcessDataSnapshot process_data; | |
63 process_data.process_id = 1177; | |
64 process_data.tasks.push_back(TaskSnapshot()); | |
65 process_data.tasks.back().birth.location.file_name = "file3"; | |
66 process_data.tasks.back().birth.location.function_name = "function3"; | |
67 process_data.tasks.back().birth.location.line_number = 7331; | |
68 process_data.tasks.back().birth.thread_name = "birth_thread3"; | |
69 process_data.tasks.back().death_data.count = 137; | |
70 process_data.tasks.back().death_data.run_duration_sum = 131; | |
71 process_data.tasks.back().death_data.run_duration_max = 117; | |
72 process_data.tasks.back().death_data.run_duration_sample = 113; | |
73 process_data.tasks.back().death_data.queue_duration_sum = 108; | |
74 process_data.tasks.back().death_data.queue_duration_max = 105; | |
75 process_data.tasks.back().death_data.queue_duration_sample = 103; | |
76 process_data.tasks.back().death_thread_name = "death_thread3"; | |
77 process_data.tasks.push_back(TaskSnapshot()); | |
78 process_data.tasks.back().birth.location.file_name = ""; | |
79 process_data.tasks.back().birth.location.function_name = ""; | |
80 process_data.tasks.back().birth.location.line_number = 7332; | |
81 process_data.tasks.back().birth.thread_name = ""; | |
82 process_data.tasks.back().death_data.count = 138; | |
83 process_data.tasks.back().death_data.run_duration_sum = 132; | |
84 process_data.tasks.back().death_data.run_duration_max = 118; | |
85 process_data.tasks.back().death_data.run_duration_sample = 114; | |
86 process_data.tasks.back().death_data.queue_duration_sum = 109; | |
87 process_data.tasks.back().death_data.queue_duration_max = 106; | |
88 process_data.tasks.back().death_data.queue_duration_sample = 104; | |
89 process_data.tasks.back().death_thread_name = ""; | |
90 | |
91 profiler_metrics_provider.RecordProfilerData( | |
92 process_data, content::PROCESS_TYPE_RENDERER); | |
93 | |
94 // Capture the data and verify that it is as expected. | |
95 metrics::ChromeUserMetricsExtension uma_proto; | |
96 profiler_metrics_provider.ProvideGeneralMetrics(&uma_proto); | |
97 | |
98 ASSERT_EQ(1, uma_proto.profiler_event_size()); | |
99 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | |
100 uma_proto.profiler_event(0).profile_type()); | |
101 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | |
102 uma_proto.profiler_event(0).time_source()); | |
103 ASSERT_EQ(4, uma_proto.profiler_event(0).tracked_object_size()); | |
104 | |
105 const ProfilerEventProto::TrackedObject* tracked_object = | |
106 &uma_proto.profiler_event(0).tracked_object(0); | |
107 EXPECT_EQ(metrics::HashMetricName("file.h"), | |
108 tracked_object->source_file_name_hash()); | |
109 EXPECT_EQ(metrics::HashMetricName("function"), | |
110 tracked_object->source_function_name_hash()); | |
111 EXPECT_EQ(1337, tracked_object->source_line_number()); | |
112 EXPECT_EQ(metrics::HashMetricName("birth_thread"), | |
113 tracked_object->birth_thread_name_hash()); | |
114 EXPECT_EQ(37, tracked_object->exec_count()); | |
115 EXPECT_EQ(31, tracked_object->exec_time_total()); | |
116 EXPECT_EQ(13, tracked_object->exec_time_sampled()); | |
117 EXPECT_EQ(8, tracked_object->queue_time_total()); | |
118 EXPECT_EQ(3, tracked_object->queue_time_sampled()); | |
119 EXPECT_EQ(metrics::HashMetricName("Still_Alive"), | |
120 tracked_object->exec_thread_name_hash()); | |
121 EXPECT_EQ(177U, tracked_object->process_id()); | |
122 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | |
123 tracked_object->process_type()); | |
124 | |
125 tracked_object = &uma_proto.profiler_event(0).tracked_object(1); | |
126 EXPECT_EQ(metrics::HashMetricName("file2"), | |
127 tracked_object->source_file_name_hash()); | |
128 EXPECT_EQ(metrics::HashMetricName("function2"), | |
129 tracked_object->source_function_name_hash()); | |
130 EXPECT_EQ(1773, tracked_object->source_line_number()); | |
131 EXPECT_EQ(metrics::HashMetricName("birth_thread*"), | |
132 tracked_object->birth_thread_name_hash()); | |
133 EXPECT_EQ(19, tracked_object->exec_count()); | |
134 EXPECT_EQ(23, tracked_object->exec_time_total()); | |
135 EXPECT_EQ(7, tracked_object->exec_time_sampled()); | |
136 EXPECT_EQ(0, tracked_object->queue_time_total()); | |
137 EXPECT_EQ(0, tracked_object->queue_time_sampled()); | |
138 EXPECT_EQ(metrics::HashMetricName("death_thread"), | |
139 tracked_object->exec_thread_name_hash()); | |
140 EXPECT_EQ(177U, tracked_object->process_id()); | |
141 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | |
142 tracked_object->process_type()); | |
143 | |
144 tracked_object = &uma_proto.profiler_event(0).tracked_object(2); | |
145 EXPECT_EQ(metrics::HashMetricName("file3"), | |
146 tracked_object->source_file_name_hash()); | |
147 EXPECT_EQ(metrics::HashMetricName("function3"), | |
148 tracked_object->source_function_name_hash()); | |
149 EXPECT_EQ(7331, tracked_object->source_line_number()); | |
150 EXPECT_EQ(metrics::HashMetricName("birth_thread*"), | |
151 tracked_object->birth_thread_name_hash()); | |
152 EXPECT_EQ(137, tracked_object->exec_count()); | |
153 EXPECT_EQ(131, tracked_object->exec_time_total()); | |
154 EXPECT_EQ(113, tracked_object->exec_time_sampled()); | |
155 EXPECT_EQ(108, tracked_object->queue_time_total()); | |
156 EXPECT_EQ(103, tracked_object->queue_time_sampled()); | |
157 EXPECT_EQ(metrics::HashMetricName("death_thread*"), | |
158 tracked_object->exec_thread_name_hash()); | |
159 EXPECT_EQ(1177U, tracked_object->process_id()); | |
160 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | |
161 tracked_object->process_type()); | |
162 | |
163 tracked_object = &uma_proto.profiler_event(0).tracked_object(3); | |
164 EXPECT_EQ(metrics::HashMetricName(""), | |
165 tracked_object->source_file_name_hash()); | |
166 EXPECT_EQ(metrics::HashMetricName(""), | |
167 tracked_object->source_function_name_hash()); | |
168 EXPECT_EQ(7332, tracked_object->source_line_number()); | |
169 EXPECT_EQ(metrics::HashMetricName(""), | |
170 tracked_object->birth_thread_name_hash()); | |
171 EXPECT_EQ(138, tracked_object->exec_count()); | |
172 EXPECT_EQ(132, tracked_object->exec_time_total()); | |
173 EXPECT_EQ(114, tracked_object->exec_time_sampled()); | |
174 EXPECT_EQ(109, tracked_object->queue_time_total()); | |
175 EXPECT_EQ(104, tracked_object->queue_time_sampled()); | |
176 EXPECT_EQ(metrics::HashMetricName(""), | |
177 tracked_object->exec_thread_name_hash()); | |
178 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | |
179 tracked_object->process_type()); | |
180 } | |
181 } | |
OLD | NEW |