OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
11 #include "base/tracked_objects.h" | |
12 #include "chrome/browser/metrics/metrics_log.h" | 11 #include "chrome/browser/metrics/metrics_log.h" |
13 #include "chrome/browser/prefs/browser_prefs.h" | 12 #include "chrome/browser/prefs/browser_prefs.h" |
14 #include "chrome/browser/prefs/pref_service.h" | 13 #include "chrome/browser/prefs/pref_service.h" |
15 #include "chrome/common/metrics/proto/profiler_event.pb.h" | |
16 #include "chrome/common/metrics/proto/system_profile.pb.h" | 14 #include "chrome/common/metrics/proto/system_profile.pb.h" |
17 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
18 #include "chrome/test/base/testing_pref_service.h" | 16 #include "chrome/test/base/testing_pref_service.h" |
19 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
21 #include "ui/gfx/size.h" | 19 #include "ui/gfx/size.h" |
22 #include "webkit/plugins/webplugininfo.h" | 20 #include "webkit/plugins/webplugininfo.h" |
23 | 21 |
24 using base::TimeDelta; | 22 using base::TimeDelta; |
25 using metrics::ProfilerEventProto; | |
26 using tracked_objects::ProcessDataSnapshot; | |
27 using tracked_objects::TaskSnapshot; | |
28 | 23 |
29 namespace { | 24 namespace { |
30 | 25 |
31 const char kClientId[] = "bogus client ID"; | 26 const char kClientId[] = "bogus client ID"; |
32 const int kSessionId = 127; | 27 const int kSessionId = 127; |
33 const int kScreenWidth = 1024; | 28 const int kScreenWidth = 1024; |
34 const int kScreenHeight = 768; | 29 const int kScreenHeight = 768; |
35 const int kScreenCount = 3; | 30 const int kScreenCount = 3; |
36 const base::FieldTrial::NameGroupId kFieldTrialIds[] = { | 31 const base::FieldTrial::NameGroupId kFieldTrialIds[] = { |
37 {37, 43}, | 32 {37, 43}, |
(...skipping 13 matching lines...) Expand all Loading... |
51 prefs_.SetInteger(prefs::kStabilityKernelCrashCount, 12); | 46 prefs_.SetInteger(prefs::kStabilityKernelCrashCount, 12); |
52 prefs_.SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 13); | 47 prefs_.SetInteger(prefs::kStabilitySystemUncleanShutdownCount, 13); |
53 #endif // OS_CHROMEOS | 48 #endif // OS_CHROMEOS |
54 } | 49 } |
55 virtual ~TestMetricsLog() {} | 50 virtual ~TestMetricsLog() {} |
56 | 51 |
57 virtual PrefService* GetPrefService() OVERRIDE { | 52 virtual PrefService* GetPrefService() OVERRIDE { |
58 return &prefs_; | 53 return &prefs_; |
59 } | 54 } |
60 | 55 |
61 const metrics::ChromeUserMetricsExtension& uma_proto() const { | |
62 return *MetricsLog::uma_proto(); | |
63 } | |
64 | |
65 const metrics::SystemProfileProto& system_profile() const { | 56 const metrics::SystemProfileProto& system_profile() const { |
66 return uma_proto().system_profile(); | 57 return uma_proto()->system_profile(); |
67 } | 58 } |
68 | 59 |
69 private: | 60 private: |
70 virtual std::string GetCurrentTimeString() OVERRIDE { | 61 virtual std::string GetCurrentTimeString() OVERRIDE { |
71 return std::string(); | 62 return std::string(); |
72 } | 63 } |
73 | 64 |
74 virtual void GetFieldTrialIds( | 65 virtual void GetFieldTrialIds( |
75 std::vector<base::FieldTrial::NameGroupId>* field_trial_ids) const | 66 std::vector<base::FieldTrial::NameGroupId>* field_trial_ids) const |
76 OVERRIDE { | 67 OVERRIDE { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } | 113 } |
123 }; | 114 }; |
124 | 115 |
125 TEST_F(MetricsLogTest, RecordEnvironment) { | 116 TEST_F(MetricsLogTest, RecordEnvironment) { |
126 // Test that recording the environment works via both of the public methods | 117 // Test that recording the environment works via both of the public methods |
127 // RecordEnvironment() and RecordEnvironmentProto(). | 118 // RecordEnvironment() and RecordEnvironmentProto(). |
128 TestRecordEnvironment(false); | 119 TestRecordEnvironment(false); |
129 TestRecordEnvironment(true); | 120 TestRecordEnvironment(true); |
130 } | 121 } |
131 | 122 |
132 // Test that we properly write profiler data to the log. | |
133 TEST_F(MetricsLogTest, RecordProfilerData) { | |
134 TestMetricsLog log(kClientId, kSessionId); | |
135 EXPECT_EQ(0, log.uma_proto().profiler_event_size()); | |
136 | |
137 { | |
138 ProcessDataSnapshot process_data; | |
139 process_data.process_id = 177; | |
140 process_data.tasks.push_back(TaskSnapshot()); | |
141 process_data.tasks.back().birth.location.file_name = "file"; | |
142 process_data.tasks.back().birth.location.function_name = "function"; | |
143 process_data.tasks.back().birth.location.line_number = 1337; | |
144 process_data.tasks.back().birth.thread_name = "birth_thread"; | |
145 process_data.tasks.back().death_data.count = 37; | |
146 process_data.tasks.back().death_data.run_duration_sum = 31; | |
147 process_data.tasks.back().death_data.run_duration_max = 17; | |
148 process_data.tasks.back().death_data.run_duration_sample = 13; | |
149 process_data.tasks.back().death_data.queue_duration_sum = 8; | |
150 process_data.tasks.back().death_data.queue_duration_max = 5; | |
151 process_data.tasks.back().death_data.queue_duration_sample = 3; | |
152 process_data.tasks.back().death_thread_name = "Still_Alive"; | |
153 process_data.tasks.push_back(TaskSnapshot()); | |
154 process_data.tasks.back().birth.location.file_name = "file2"; | |
155 process_data.tasks.back().birth.location.function_name = "function2"; | |
156 process_data.tasks.back().birth.location.line_number = 1773; | |
157 process_data.tasks.back().birth.thread_name = "birth_thread2"; | |
158 process_data.tasks.back().death_data.count = 19; | |
159 process_data.tasks.back().death_data.run_duration_sum = 23; | |
160 process_data.tasks.back().death_data.run_duration_max = 11; | |
161 process_data.tasks.back().death_data.run_duration_sample = 7; | |
162 process_data.tasks.back().death_data.queue_duration_sum = 0; | |
163 process_data.tasks.back().death_data.queue_duration_max = 0; | |
164 process_data.tasks.back().death_data.queue_duration_sample = 0; | |
165 process_data.tasks.back().death_thread_name = "death_thread"; | |
166 | |
167 log.RecordProfilerData(process_data, content::PROCESS_TYPE_BROWSER); | |
168 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | |
169 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | |
170 log.uma_proto().profiler_event(0).profile_type()); | |
171 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | |
172 log.uma_proto().profiler_event(0).time_source()); | |
173 | |
174 ASSERT_EQ(2, log.uma_proto().profiler_event(0).tracked_object_size()); | |
175 | |
176 const ProfilerEventProto::TrackedObject* tracked_object = | |
177 &log.uma_proto().profiler_event(0).tracked_object(0); | |
178 EXPECT_EQ(13962325592283560029U, tracked_object->source_file_name_hash()); | |
179 EXPECT_EQ(10123486280357988687U, | |
180 tracked_object->source_function_name_hash()); | |
181 EXPECT_EQ(1337, tracked_object->source_line_number()); | |
182 EXPECT_EQ(3400908935414830400U, tracked_object->birth_thread_name_hash()); | |
183 EXPECT_EQ(37, tracked_object->exec_count()); | |
184 EXPECT_EQ(31, tracked_object->exec_time_total()); | |
185 EXPECT_EQ(13, tracked_object->exec_time_sampled()); | |
186 EXPECT_EQ(8, tracked_object->queue_time_total()); | |
187 EXPECT_EQ(3, tracked_object->queue_time_sampled()); | |
188 EXPECT_EQ(10151977472163283085U, tracked_object->exec_thread_name_hash()); | |
189 EXPECT_EQ(177U, tracked_object->process_id()); | |
190 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | |
191 tracked_object->process_type()); | |
192 | |
193 tracked_object = &log.uma_proto().profiler_event(0).tracked_object(1); | |
194 EXPECT_EQ(55232426147951219U, tracked_object->source_file_name_hash()); | |
195 EXPECT_EQ(2025659946535236365U, | |
196 tracked_object->source_function_name_hash()); | |
197 EXPECT_EQ(1773, tracked_object->source_line_number()); | |
198 EXPECT_EQ(15727396632046120663U, tracked_object->birth_thread_name_hash()); | |
199 EXPECT_EQ(19, tracked_object->exec_count()); | |
200 EXPECT_EQ(23, tracked_object->exec_time_total()); | |
201 EXPECT_EQ(7, tracked_object->exec_time_sampled()); | |
202 EXPECT_EQ(0, tracked_object->queue_time_total()); | |
203 EXPECT_EQ(0, tracked_object->queue_time_sampled()); | |
204 EXPECT_EQ(14275151213201158253U, tracked_object->exec_thread_name_hash()); | |
205 EXPECT_EQ(177U, tracked_object->process_id()); | |
206 EXPECT_EQ(ProfilerEventProto::TrackedObject::BROWSER, | |
207 tracked_object->process_type()); | |
208 } | |
209 | |
210 { | |
211 ProcessDataSnapshot process_data; | |
212 process_data.process_id = 1177; | |
213 process_data.tasks.push_back(TaskSnapshot()); | |
214 process_data.tasks.back().birth.location.file_name = "file3"; | |
215 process_data.tasks.back().birth.location.function_name = "function3"; | |
216 process_data.tasks.back().birth.location.line_number = 7331; | |
217 process_data.tasks.back().birth.thread_name = "birth_thread3"; | |
218 process_data.tasks.back().death_data.count = 137; | |
219 process_data.tasks.back().death_data.run_duration_sum = 131; | |
220 process_data.tasks.back().death_data.run_duration_max = 117; | |
221 process_data.tasks.back().death_data.run_duration_sample = 113; | |
222 process_data.tasks.back().death_data.queue_duration_sum = 108; | |
223 process_data.tasks.back().death_data.queue_duration_max = 105; | |
224 process_data.tasks.back().death_data.queue_duration_sample = 103; | |
225 process_data.tasks.back().death_thread_name = "death_thread3"; | |
226 | |
227 log.RecordProfilerData(process_data, content::PROCESS_TYPE_RENDERER); | |
228 ASSERT_EQ(1, log.uma_proto().profiler_event_size()); | |
229 EXPECT_EQ(ProfilerEventProto::STARTUP_PROFILE, | |
230 log.uma_proto().profiler_event(0).profile_type()); | |
231 EXPECT_EQ(ProfilerEventProto::WALL_CLOCK_TIME, | |
232 log.uma_proto().profiler_event(0).time_source()); | |
233 ASSERT_EQ(3, log.uma_proto().profiler_event(0).tracked_object_size()); | |
234 | |
235 const ProfilerEventProto::TrackedObject* tracked_object = | |
236 &log.uma_proto().profiler_event(0).tracked_object(2); | |
237 EXPECT_EQ(5081672290546182009U, tracked_object->source_file_name_hash()); | |
238 EXPECT_EQ(2686523203278102732U, | |
239 tracked_object->source_function_name_hash()); | |
240 EXPECT_EQ(7331, tracked_object->source_line_number()); | |
241 EXPECT_EQ(8768512930949373716U, tracked_object->birth_thread_name_hash()); | |
242 EXPECT_EQ(137, tracked_object->exec_count()); | |
243 EXPECT_EQ(131, tracked_object->exec_time_total()); | |
244 EXPECT_EQ(113, tracked_object->exec_time_sampled()); | |
245 EXPECT_EQ(108, tracked_object->queue_time_total()); | |
246 EXPECT_EQ(103, tracked_object->queue_time_sampled()); | |
247 EXPECT_EQ(7246674144371406371U, tracked_object->exec_thread_name_hash()); | |
248 EXPECT_EQ(1177U, tracked_object->process_id()); | |
249 EXPECT_EQ(ProfilerEventProto::TrackedObject::RENDERER, | |
250 tracked_object->process_type()); | |
251 } | |
252 } | |
253 | |
254 #if defined(OS_CHROMEOS) | 123 #if defined(OS_CHROMEOS) |
255 TEST_F(MetricsLogTest, ChromeOSStabilityData) { | 124 TEST_F(MetricsLogTest, ChromeOSStabilityData) { |
256 TestMetricsLog log(kClientId, kSessionId); | 125 TestMetricsLog log(kClientId, kSessionId); |
257 | 126 |
258 // Expect 3 warnings about not yet being able to send the | 127 // Expect 3 warnings about not yet being able to send the |
259 // Chrome OS stability stats. | 128 // Chrome OS stability stats. |
260 std::vector<webkit::WebPluginInfo> plugins; | 129 std::vector<webkit::WebPluginInfo> plugins; |
261 PrefService* prefs = log.GetPrefService(); | 130 PrefService* prefs = log.GetPrefService(); |
262 log.WriteStabilityElement(plugins, prefs); | 131 log.WriteStabilityElement(plugins, prefs); |
263 log.CloseLog(); | 132 log.CloseLog(); |
(...skipping 18 matching lines...) Expand all Loading... |
282 EXPECT_NE(std::string::npos, | 151 EXPECT_NE(std::string::npos, |
283 encoded.find(" childprocesscrashcount=\"10\"")); | 152 encoded.find(" childprocesscrashcount=\"10\"")); |
284 EXPECT_EQ(std::string::npos, | 153 EXPECT_EQ(std::string::npos, |
285 encoded.find(" otherusercrashcount=")); | 154 encoded.find(" otherusercrashcount=")); |
286 EXPECT_EQ(std::string::npos, | 155 EXPECT_EQ(std::string::npos, |
287 encoded.find(" kernelcrashcount=")); | 156 encoded.find(" kernelcrashcount=")); |
288 EXPECT_EQ(std::string::npos, | 157 EXPECT_EQ(std::string::npos, |
289 encoded.find(" systemuncleanshutdowns=")); | 158 encoded.find(" systemuncleanshutdowns=")); |
290 } | 159 } |
291 #endif // OS_CHROMEOS | 160 #endif // OS_CHROMEOS |
OLD | NEW |