| 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 "chrome/browser/metrics/metrics_service.h" | 5 #include "chrome/browser/metrics/metrics_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/threading/platform_thread.h" | 10 #include "base/threading/platform_thread.h" |
| 11 #include "chrome/browser/metrics/metrics_service_observer.h" | 11 #include "chrome/browser/metrics/metrics_service_observer.h" |
| 12 #include "chrome/browser/metrics/metrics_state_manager.h" | 12 #include "chrome/browser/metrics/metrics_state_manager.h" |
| 13 #include "chrome/common/chrome_switches.h" | 13 #include "chrome/common/chrome_switches.h" |
| 14 #include "chrome/common/pref_names.h" | 14 #include "chrome/common/pref_names.h" |
| 15 #include "chrome/test/base/scoped_testing_local_state.h" | 15 #include "chrome/test/base/scoped_testing_local_state.h" |
| 16 #include "chrome/test/base/testing_browser_process.h" | 16 #include "chrome/test/base/testing_browser_process.h" |
| 17 #include "components/metrics/test_metrics_service_client.h" |
| 17 #include "components/variations/metrics_util.h" | 18 #include "components/variations/metrics_util.h" |
| 18 #include "content/public/common/process_type.h" | 19 #include "content/public/common/process_type.h" |
| 19 #include "content/public/common/webplugininfo.h" | 20 #include "content/public/common/webplugininfo.h" |
| 20 #include "content/public/test/test_browser_thread_bundle.h" | 21 #include "content/public/test/test_browser_thread_bundle.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 #include "ui/gfx/size.h" | 23 #include "ui/gfx/size.h" |
| 23 | 24 |
| 24 #if defined(OS_CHROMEOS) | 25 #if defined(OS_CHROMEOS) |
| 25 #include "chrome/browser/metrics/metrics_log_chromeos.h" | 26 #include "chrome/browser/metrics/metrics_log_chromeos.h" |
| 26 #endif // OS_CHROMEOS | 27 #endif // OS_CHROMEOS |
| 27 | 28 |
| 28 namespace { | 29 namespace { |
| 29 | 30 |
| 30 using metrics::MetricsLogManager; | 31 using metrics::MetricsLogManager; |
| 31 | 32 |
| 32 class TestMetricsService : public MetricsService { | 33 class TestMetricsService : public MetricsService { |
| 33 public: | 34 public: |
| 34 explicit TestMetricsService(metrics::MetricsStateManager* state_manager) | 35 TestMetricsService(metrics::MetricsStateManager* state_manager, |
| 35 : MetricsService(state_manager) { | 36 metrics::MetricsServiceClient* client) |
| 37 : MetricsService(state_manager, client) { |
| 36 } | 38 } |
| 37 virtual ~TestMetricsService() {} | 39 virtual ~TestMetricsService() {} |
| 38 | 40 |
| 39 MetricsLogManager* log_manager() { | 41 MetricsLogManager* log_manager() { |
| 40 return &log_manager_; | 42 return &log_manager_; |
| 41 } | 43 } |
| 42 | 44 |
| 43 private: | 45 private: |
| 44 DISALLOW_COPY_AND_ASSIGN(TestMetricsService); | 46 DISALLOW_COPY_AND_ASSIGN(TestMetricsService); |
| 45 }; | 47 }; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 EXPECT_TRUE( | 172 EXPECT_TRUE( |
| 171 MetricsService::IsPluginProcess(content::PROCESS_TYPE_PPAPI_PLUGIN)); | 173 MetricsService::IsPluginProcess(content::PROCESS_TYPE_PPAPI_PLUGIN)); |
| 172 EXPECT_FALSE( | 174 EXPECT_FALSE( |
| 173 MetricsService::IsPluginProcess(content::PROCESS_TYPE_GPU)); | 175 MetricsService::IsPluginProcess(content::PROCESS_TYPE_GPU)); |
| 174 } | 176 } |
| 175 | 177 |
| 176 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { | 178 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { |
| 177 EnableMetricsReporting(); | 179 EnableMetricsReporting(); |
| 178 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, true); | 180 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, true); |
| 179 | 181 |
| 180 TestMetricsService service(GetMetricsStateManager()); | 182 metrics::TestMetricsServiceClient client; |
| 183 TestMetricsService service(GetMetricsStateManager(), &client); |
| 181 service.InitializeMetricsRecordingState(); | 184 service.InitializeMetricsRecordingState(); |
| 182 // No initial stability log should be generated. | 185 // No initial stability log should be generated. |
| 183 EXPECT_FALSE(service.log_manager()->has_unsent_logs()); | 186 EXPECT_FALSE(service.log_manager()->has_unsent_logs()); |
| 184 EXPECT_FALSE(service.log_manager()->has_staged_log()); | 187 EXPECT_FALSE(service.log_manager()->has_staged_log()); |
| 185 } | 188 } |
| 186 | 189 |
| 187 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) { | 190 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) { |
| 188 EnableMetricsReporting(); | 191 EnableMetricsReporting(); |
| 189 GetLocalState()->ClearPref(prefs::kStabilityExitedCleanly); | 192 GetLocalState()->ClearPref(prefs::kStabilityExitedCleanly); |
| 190 | 193 |
| 191 // Set up prefs to simulate restarting after a crash. | 194 // Set up prefs to simulate restarting after a crash. |
| 192 | 195 |
| 193 // Save an existing system profile to prefs, to correspond to what would be | 196 // Save an existing system profile to prefs, to correspond to what would be |
| 194 // saved from a previous session. | 197 // saved from a previous session. |
| 195 TestMetricsLog log("client", 1); | 198 TestMetricsLog log("client", 1); |
| 196 log.RecordEnvironment(std::vector<content::WebPluginInfo>(), | 199 log.RecordEnvironment(std::vector<content::WebPluginInfo>(), |
| 197 GoogleUpdateMetrics(), | 200 GoogleUpdateMetrics(), |
| 198 std::vector<chrome_variations::ActiveGroupId>()); | 201 std::vector<chrome_variations::ActiveGroupId>()); |
| 199 | 202 |
| 200 // Record stability build time and version from previous session, so that | 203 // Record stability build time and version from previous session, so that |
| 201 // stability metrics (including exited cleanly flag) won't be cleared. | 204 // stability metrics (including exited cleanly flag) won't be cleared. |
| 202 GetLocalState()->SetInt64(prefs::kStabilityStatsBuildTime, | 205 GetLocalState()->SetInt64(prefs::kStabilityStatsBuildTime, |
| 203 MetricsLog::GetBuildTime()); | 206 MetricsLog::GetBuildTime()); |
| 204 GetLocalState()->SetString(prefs::kStabilityStatsVersion, | 207 GetLocalState()->SetString(prefs::kStabilityStatsVersion, |
| 205 MetricsLog::GetVersionString()); | 208 MetricsLog::GetVersionString()); |
| 206 | 209 |
| 207 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, false); | 210 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, false); |
| 208 | 211 |
| 209 TestMetricsService service(GetMetricsStateManager()); | 212 metrics::TestMetricsServiceClient client; |
| 213 TestMetricsService service(GetMetricsStateManager(), &client); |
| 210 service.InitializeMetricsRecordingState(); | 214 service.InitializeMetricsRecordingState(); |
| 211 | 215 |
| 212 // The initial stability log should be generated and persisted in unsent logs. | 216 // The initial stability log should be generated and persisted in unsent logs. |
| 213 MetricsLogManager* log_manager = service.log_manager(); | 217 MetricsLogManager* log_manager = service.log_manager(); |
| 214 EXPECT_TRUE(log_manager->has_unsent_logs()); | 218 EXPECT_TRUE(log_manager->has_unsent_logs()); |
| 215 EXPECT_FALSE(log_manager->has_staged_log()); | 219 EXPECT_FALSE(log_manager->has_staged_log()); |
| 216 | 220 |
| 217 // Stage the log and retrieve it. | 221 // Stage the log and retrieve it. |
| 218 log_manager->StageNextLogForUpload(); | 222 log_manager->StageNextLogForUpload(); |
| 219 EXPECT_TRUE(log_manager->has_staged_log()); | 223 EXPECT_TRUE(log_manager->has_staged_log()); |
| 220 | 224 |
| 221 metrics::ChromeUserMetricsExtension uma_log; | 225 metrics::ChromeUserMetricsExtension uma_log; |
| 222 EXPECT_TRUE(uma_log.ParseFromString(log_manager->staged_log())); | 226 EXPECT_TRUE(uma_log.ParseFromString(log_manager->staged_log())); |
| 223 | 227 |
| 224 EXPECT_TRUE(uma_log.has_client_id()); | 228 EXPECT_TRUE(uma_log.has_client_id()); |
| 225 EXPECT_TRUE(uma_log.has_session_id()); | 229 EXPECT_TRUE(uma_log.has_session_id()); |
| 226 EXPECT_TRUE(uma_log.has_system_profile()); | 230 EXPECT_TRUE(uma_log.has_system_profile()); |
| 227 EXPECT_EQ(0, uma_log.user_action_event_size()); | 231 EXPECT_EQ(0, uma_log.user_action_event_size()); |
| 228 EXPECT_EQ(0, uma_log.omnibox_event_size()); | 232 EXPECT_EQ(0, uma_log.omnibox_event_size()); |
| 229 EXPECT_EQ(0, uma_log.histogram_event_size()); | 233 EXPECT_EQ(0, uma_log.histogram_event_size()); |
| 230 EXPECT_EQ(0, uma_log.profiler_event_size()); | 234 EXPECT_EQ(0, uma_log.profiler_event_size()); |
| 231 EXPECT_EQ(0, uma_log.perf_data_size()); | 235 EXPECT_EQ(0, uma_log.perf_data_size()); |
| 232 | 236 |
| 233 EXPECT_EQ(1, uma_log.system_profile().stability().crash_count()); | 237 EXPECT_EQ(1, uma_log.system_profile().stability().crash_count()); |
| 234 } | 238 } |
| 235 | 239 |
| 236 TEST_F(MetricsServiceTest, RegisterSyntheticTrial) { | 240 TEST_F(MetricsServiceTest, RegisterSyntheticTrial) { |
| 237 MetricsService service(GetMetricsStateManager()); | 241 metrics::TestMetricsServiceClient client; |
| 242 MetricsService service(GetMetricsStateManager(), &client); |
| 238 | 243 |
| 239 // Add two synthetic trials and confirm that they show up in the list. | 244 // Add two synthetic trials and confirm that they show up in the list. |
| 240 SyntheticTrialGroup trial1(metrics::HashName("TestTrial1"), | 245 SyntheticTrialGroup trial1(metrics::HashName("TestTrial1"), |
| 241 metrics::HashName("Group1")); | 246 metrics::HashName("Group1")); |
| 242 service.RegisterSyntheticFieldTrial(trial1); | 247 service.RegisterSyntheticFieldTrial(trial1); |
| 243 | 248 |
| 244 SyntheticTrialGroup trial2(metrics::HashName("TestTrial2"), | 249 SyntheticTrialGroup trial2(metrics::HashName("TestTrial2"), |
| 245 metrics::HashName("Group2")); | 250 metrics::HashName("Group2")); |
| 246 service.RegisterSyntheticFieldTrial(trial2); | 251 service.RegisterSyntheticFieldTrial(trial2); |
| 247 // Ensure that time has advanced by at least a tick before proceeding. | 252 // Ensure that time has advanced by at least a tick before proceeding. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 GetLocalState()->ClearPref(crash_pref); | 330 GetLocalState()->ClearPref(crash_pref); |
| 326 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); | 331 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); |
| 327 #endif // !defined(OS_CHROMEOS) | 332 #endif // !defined(OS_CHROMEOS) |
| 328 #else // defined(GOOGLE_CHROME_BUILD) | 333 #else // defined(GOOGLE_CHROME_BUILD) |
| 329 // Chromium branded browsers never have crash reporting enabled. | 334 // Chromium branded browsers never have crash reporting enabled. |
| 330 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); | 335 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); |
| 331 #endif // defined(GOOGLE_CHROME_BUILD) | 336 #endif // defined(GOOGLE_CHROME_BUILD) |
| 332 } | 337 } |
| 333 | 338 |
| 334 TEST_F(MetricsServiceTest, MetricsServiceObserver) { | 339 TEST_F(MetricsServiceTest, MetricsServiceObserver) { |
| 335 MetricsService service(GetMetricsStateManager()); | 340 metrics::TestMetricsServiceClient client; |
| 341 MetricsService service(GetMetricsStateManager(), &client); |
| 336 TestMetricsServiceObserver observer1; | 342 TestMetricsServiceObserver observer1; |
| 337 TestMetricsServiceObserver observer2; | 343 TestMetricsServiceObserver observer2; |
| 338 | 344 |
| 339 service.AddObserver(&observer1); | 345 service.AddObserver(&observer1); |
| 340 EXPECT_EQ(0, observer1.observed()); | 346 EXPECT_EQ(0, observer1.observed()); |
| 341 EXPECT_EQ(0, observer2.observed()); | 347 EXPECT_EQ(0, observer2.observed()); |
| 342 | 348 |
| 343 service.OpenNewLog(); | 349 service.OpenNewLog(); |
| 344 EXPECT_EQ(1, observer1.observed()); | 350 EXPECT_EQ(1, observer1.observed()); |
| 345 EXPECT_EQ(0, observer2.observed()); | 351 EXPECT_EQ(0, observer2.observed()); |
| 346 service.log_manager_.FinishCurrentLog(); | 352 service.log_manager_.FinishCurrentLog(); |
| 347 | 353 |
| 348 service.AddObserver(&observer2); | 354 service.AddObserver(&observer2); |
| 349 | 355 |
| 350 service.OpenNewLog(); | 356 service.OpenNewLog(); |
| 351 EXPECT_EQ(2, observer1.observed()); | 357 EXPECT_EQ(2, observer1.observed()); |
| 352 EXPECT_EQ(1, observer2.observed()); | 358 EXPECT_EQ(1, observer2.observed()); |
| 353 service.log_manager_.FinishCurrentLog(); | 359 service.log_manager_.FinishCurrentLog(); |
| 354 | 360 |
| 355 service.RemoveObserver(&observer1); | 361 service.RemoveObserver(&observer1); |
| 356 | 362 |
| 357 service.OpenNewLog(); | 363 service.OpenNewLog(); |
| 358 EXPECT_EQ(2, observer1.observed()); | 364 EXPECT_EQ(2, observer1.observed()); |
| 359 EXPECT_EQ(2, observer2.observed()); | 365 EXPECT_EQ(2, observer2.observed()); |
| 360 service.log_manager_.FinishCurrentLog(); | 366 service.log_manager_.FinishCurrentLog(); |
| 361 | 367 |
| 362 service.RemoveObserver(&observer2); | 368 service.RemoveObserver(&observer2); |
| 363 } | 369 } |
| OLD | NEW |