| 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_state_manager.h" | 11 #include "chrome/browser/metrics/metrics_state_manager.h" |
| 12 #include "chrome/common/chrome_switches.h" | 12 #include "chrome/common/chrome_switches.h" |
| 13 #include "chrome/common/pref_names.h" | 13 #include "chrome/common/pref_names.h" |
| 14 #include "chrome/test/base/scoped_testing_local_state.h" | 14 #include "chrome/test/base/scoped_testing_local_state.h" |
| 15 #include "chrome/test/base/testing_browser_process.h" | 15 #include "chrome/test/base/testing_browser_process.h" |
| 16 #include "components/metrics/metrics_service_observer.h" | 16 #include "components/metrics/metrics_service_observer.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<metrics::MetricsProvider*>(), | 199 log.RecordEnvironment(std::vector<metrics::MetricsProvider*>(), |
| 197 std::vector<content::WebPluginInfo>(), | 200 std::vector<content::WebPluginInfo>(), |
| 198 GoogleUpdateMetrics(), | 201 GoogleUpdateMetrics(), |
| 199 std::vector<variations::ActiveGroupId>()); | 202 std::vector<variations::ActiveGroupId>()); |
| 200 | 203 |
| 201 // Record stability build time and version from previous session, so that | 204 // Record stability build time and version from previous session, so that |
| 202 // stability metrics (including exited cleanly flag) won't be cleared. | 205 // stability metrics (including exited cleanly flag) won't be cleared. |
| 203 GetLocalState()->SetInt64(prefs::kStabilityStatsBuildTime, | 206 GetLocalState()->SetInt64(prefs::kStabilityStatsBuildTime, |
| 204 MetricsLog::GetBuildTime()); | 207 MetricsLog::GetBuildTime()); |
| 205 GetLocalState()->SetString(prefs::kStabilityStatsVersion, | 208 GetLocalState()->SetString(prefs::kStabilityStatsVersion, |
| 206 MetricsLog::GetVersionString()); | 209 MetricsLog::GetVersionString()); |
| 207 | 210 |
| 208 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, false); | 211 GetLocalState()->SetBoolean(prefs::kStabilityExitedCleanly, false); |
| 209 | 212 |
| 210 TestMetricsService service(GetMetricsStateManager()); | 213 metrics::TestMetricsServiceClient client; |
| 214 TestMetricsService service(GetMetricsStateManager(), &client); |
| 211 service.InitializeMetricsRecordingState(); | 215 service.InitializeMetricsRecordingState(); |
| 212 | 216 |
| 213 // The initial stability log should be generated and persisted in unsent logs. | 217 // The initial stability log should be generated and persisted in unsent logs. |
| 214 MetricsLogManager* log_manager = service.log_manager(); | 218 MetricsLogManager* log_manager = service.log_manager(); |
| 215 EXPECT_TRUE(log_manager->has_unsent_logs()); | 219 EXPECT_TRUE(log_manager->has_unsent_logs()); |
| 216 EXPECT_FALSE(log_manager->has_staged_log()); | 220 EXPECT_FALSE(log_manager->has_staged_log()); |
| 217 | 221 |
| 218 // Stage the log and retrieve it. | 222 // Stage the log and retrieve it. |
| 219 log_manager->StageNextLogForUpload(); | 223 log_manager->StageNextLogForUpload(); |
| 220 EXPECT_TRUE(log_manager->has_staged_log()); | 224 EXPECT_TRUE(log_manager->has_staged_log()); |
| 221 | 225 |
| 222 metrics::ChromeUserMetricsExtension uma_log; | 226 metrics::ChromeUserMetricsExtension uma_log; |
| 223 EXPECT_TRUE(uma_log.ParseFromString(log_manager->staged_log())); | 227 EXPECT_TRUE(uma_log.ParseFromString(log_manager->staged_log())); |
| 224 | 228 |
| 225 EXPECT_TRUE(uma_log.has_client_id()); | 229 EXPECT_TRUE(uma_log.has_client_id()); |
| 226 EXPECT_TRUE(uma_log.has_session_id()); | 230 EXPECT_TRUE(uma_log.has_session_id()); |
| 227 EXPECT_TRUE(uma_log.has_system_profile()); | 231 EXPECT_TRUE(uma_log.has_system_profile()); |
| 228 EXPECT_EQ(0, uma_log.user_action_event_size()); | 232 EXPECT_EQ(0, uma_log.user_action_event_size()); |
| 229 EXPECT_EQ(0, uma_log.omnibox_event_size()); | 233 EXPECT_EQ(0, uma_log.omnibox_event_size()); |
| 230 EXPECT_EQ(0, uma_log.histogram_event_size()); | 234 EXPECT_EQ(0, uma_log.histogram_event_size()); |
| 231 EXPECT_EQ(0, uma_log.profiler_event_size()); | 235 EXPECT_EQ(0, uma_log.profiler_event_size()); |
| 232 EXPECT_EQ(0, uma_log.perf_data_size()); | 236 EXPECT_EQ(0, uma_log.perf_data_size()); |
| 233 | 237 |
| 234 EXPECT_EQ(1, uma_log.system_profile().stability().crash_count()); | 238 EXPECT_EQ(1, uma_log.system_profile().stability().crash_count()); |
| 235 } | 239 } |
| 236 | 240 |
| 237 TEST_F(MetricsServiceTest, RegisterSyntheticTrial) { | 241 TEST_F(MetricsServiceTest, RegisterSyntheticTrial) { |
| 238 MetricsService service(GetMetricsStateManager()); | 242 metrics::TestMetricsServiceClient client; |
| 243 MetricsService service(GetMetricsStateManager(), &client); |
| 239 | 244 |
| 240 // Add two synthetic trials and confirm that they show up in the list. | 245 // Add two synthetic trials and confirm that they show up in the list. |
| 241 SyntheticTrialGroup trial1(metrics::HashName("TestTrial1"), | 246 SyntheticTrialGroup trial1(metrics::HashName("TestTrial1"), |
| 242 metrics::HashName("Group1")); | 247 metrics::HashName("Group1")); |
| 243 service.RegisterSyntheticFieldTrial(trial1); | 248 service.RegisterSyntheticFieldTrial(trial1); |
| 244 | 249 |
| 245 SyntheticTrialGroup trial2(metrics::HashName("TestTrial2"), | 250 SyntheticTrialGroup trial2(metrics::HashName("TestTrial2"), |
| 246 metrics::HashName("Group2")); | 251 metrics::HashName("Group2")); |
| 247 service.RegisterSyntheticFieldTrial(trial2); | 252 service.RegisterSyntheticFieldTrial(trial2); |
| 248 // Ensure that time has advanced by at least a tick before proceeding. | 253 // 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... |
| 326 GetLocalState()->ClearPref(crash_pref); | 331 GetLocalState()->ClearPref(crash_pref); |
| 327 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); | 332 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); |
| 328 #endif // !defined(OS_CHROMEOS) | 333 #endif // !defined(OS_CHROMEOS) |
| 329 #else // defined(GOOGLE_CHROME_BUILD) | 334 #else // defined(GOOGLE_CHROME_BUILD) |
| 330 // Chromium branded browsers never have crash reporting enabled. | 335 // Chromium branded browsers never have crash reporting enabled. |
| 331 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); | 336 EXPECT_FALSE(MetricsServiceHelper::IsCrashReportingEnabled()); |
| 332 #endif // defined(GOOGLE_CHROME_BUILD) | 337 #endif // defined(GOOGLE_CHROME_BUILD) |
| 333 } | 338 } |
| 334 | 339 |
| 335 TEST_F(MetricsServiceTest, MetricsServiceObserver) { | 340 TEST_F(MetricsServiceTest, MetricsServiceObserver) { |
| 336 MetricsService service(GetMetricsStateManager()); | 341 metrics::TestMetricsServiceClient client; |
| 342 MetricsService service(GetMetricsStateManager(), &client); |
| 337 TestMetricsServiceObserver observer1; | 343 TestMetricsServiceObserver observer1; |
| 338 TestMetricsServiceObserver observer2; | 344 TestMetricsServiceObserver observer2; |
| 339 | 345 |
| 340 service.AddObserver(&observer1); | 346 service.AddObserver(&observer1); |
| 341 EXPECT_EQ(0, observer1.observed()); | 347 EXPECT_EQ(0, observer1.observed()); |
| 342 EXPECT_EQ(0, observer2.observed()); | 348 EXPECT_EQ(0, observer2.observed()); |
| 343 | 349 |
| 344 service.OpenNewLog(); | 350 service.OpenNewLog(); |
| 345 EXPECT_EQ(1, observer1.observed()); | 351 EXPECT_EQ(1, observer1.observed()); |
| 346 EXPECT_EQ(0, observer2.observed()); | 352 EXPECT_EQ(0, observer2.observed()); |
| 347 service.log_manager_.FinishCurrentLog(); | 353 service.log_manager_.FinishCurrentLog(); |
| 348 | 354 |
| 349 service.AddObserver(&observer2); | 355 service.AddObserver(&observer2); |
| 350 | 356 |
| 351 service.OpenNewLog(); | 357 service.OpenNewLog(); |
| 352 EXPECT_EQ(2, observer1.observed()); | 358 EXPECT_EQ(2, observer1.observed()); |
| 353 EXPECT_EQ(1, observer2.observed()); | 359 EXPECT_EQ(1, observer2.observed()); |
| 354 service.log_manager_.FinishCurrentLog(); | 360 service.log_manager_.FinishCurrentLog(); |
| 355 | 361 |
| 356 service.RemoveObserver(&observer1); | 362 service.RemoveObserver(&observer1); |
| 357 | 363 |
| 358 service.OpenNewLog(); | 364 service.OpenNewLog(); |
| 359 EXPECT_EQ(2, observer1.observed()); | 365 EXPECT_EQ(2, observer1.observed()); |
| 360 EXPECT_EQ(2, observer2.observed()); | 366 EXPECT_EQ(2, observer2.observed()); |
| 361 service.log_manager_.FinishCurrentLog(); | 367 service.log_manager_.FinishCurrentLog(); |
| 362 | 368 |
| 363 service.RemoveObserver(&observer2); | 369 service.RemoveObserver(&observer2); |
| 364 } | 370 } |
| OLD | NEW |