Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "components/metrics/metrics_service.h" | 5 #include "components/metrics/metrics_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 | 25 |
| 26 using metrics::MetricsLogManager; | 26 using metrics::MetricsLogManager; |
| 27 | 27 |
| 28 void StoreNoClientInfoBackup(const metrics::ClientInfo& /* client_info */) { | 28 void StoreNoClientInfoBackup(const metrics::ClientInfo& /* client_info */) { |
| 29 } | 29 } |
| 30 | 30 |
| 31 scoped_ptr<metrics::ClientInfo> ReturnNoBackup() { | 31 scoped_ptr<metrics::ClientInfo> ReturnNoBackup() { |
| 32 return scoped_ptr<metrics::ClientInfo>(); | 32 return scoped_ptr<metrics::ClientInfo>(); |
| 33 } | 33 } |
| 34 | 34 |
| 35 class TestMetricsProvider : public metrics::MetricsProvider { | |
| 36 public: | |
| 37 explicit TestMetricsProvider(bool has_stability_metrics) : | |
| 38 has_stability_metrics_(has_stability_metrics), | |
| 39 provide_stability_metrics_called_(false) { | |
| 40 } | |
| 41 | |
| 42 virtual bool HasStabilityMetrics() OVERRIDE { return has_stability_metrics_; } | |
| 43 virtual void ProvideStabilityMetrics( | |
| 44 metrics::SystemProfileProto* system_profile_proto) OVERRIDE { | |
| 45 provide_stability_metrics_called_ = true; | |
| 46 } | |
| 47 | |
| 48 bool provide_stability_metrics_called() const { | |
| 49 return provide_stability_metrics_called_; | |
| 50 } | |
| 51 | |
| 52 private: | |
| 53 bool has_stability_metrics_; | |
| 54 bool provide_stability_metrics_called_; | |
| 55 | |
| 56 DISALLOW_COPY_AND_ASSIGN(TestMetricsProvider); | |
| 57 }; | |
| 58 | |
| 35 class TestMetricsService : public MetricsService { | 59 class TestMetricsService : public MetricsService { |
| 36 public: | 60 public: |
| 37 TestMetricsService(metrics::MetricsStateManager* state_manager, | 61 TestMetricsService(metrics::MetricsStateManager* state_manager, |
| 38 metrics::MetricsServiceClient* client, | 62 metrics::MetricsServiceClient* client, |
| 39 PrefService* local_state) | 63 PrefService* local_state) |
| 40 : MetricsService(state_manager, client, local_state) {} | 64 : MetricsService(state_manager, client, local_state) {} |
| 41 virtual ~TestMetricsService() {} | 65 virtual ~TestMetricsService() {} |
| 42 | 66 |
| 43 using MetricsService::log_manager; | 67 using MetricsService::log_manager; |
| 44 | 68 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 148 | 172 |
| 149 } // namespace | 173 } // namespace |
| 150 | 174 |
| 151 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { | 175 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCleanShutDown) { |
| 152 EnableMetricsReporting(); | 176 EnableMetricsReporting(); |
| 153 GetLocalState()->SetBoolean(metrics::prefs::kStabilityExitedCleanly, true); | 177 GetLocalState()->SetBoolean(metrics::prefs::kStabilityExitedCleanly, true); |
| 154 | 178 |
| 155 metrics::TestMetricsServiceClient client; | 179 metrics::TestMetricsServiceClient client; |
| 156 TestMetricsService service( | 180 TestMetricsService service( |
| 157 GetMetricsStateManager(), &client, GetLocalState()); | 181 GetMetricsStateManager(), &client, GetLocalState()); |
| 182 | |
| 183 TestMetricsProvider* test_provider = new TestMetricsProvider(false); | |
| 184 service.RegisterMetricsProvider( | |
| 185 scoped_ptr<metrics::MetricsProvider>(test_provider)); | |
| 186 | |
| 158 service.InitializeMetricsRecordingState(); | 187 service.InitializeMetricsRecordingState(); |
| 159 // No initial stability log should be generated. | 188 // No initial stability log should be generated. |
| 160 EXPECT_FALSE(service.log_manager()->has_unsent_logs()); | 189 EXPECT_FALSE(service.log_manager()->has_unsent_logs()); |
| 161 EXPECT_FALSE(service.log_manager()->has_staged_log()); | 190 EXPECT_FALSE(service.log_manager()->has_staged_log()); |
| 191 | |
| 192 // The test provider should not have been called upon to provide stability | |
| 193 // metrics. | |
| 194 EXPECT_FALSE(test_provider->provide_stability_metrics_called()); | |
| 195 } | |
| 196 | |
| 197 TEST_F(MetricsServiceTest, InitialStabilityLogAtProviderRequest) { | |
| 198 EnableMetricsReporting(); | |
| 199 | |
| 200 // Save an existing system profile to prefs, to correspond to what would be | |
| 201 // saved from a previous session. | |
| 202 metrics::TestMetricsServiceClient client; | |
| 203 TestMetricsLog log("client", 1, &client, GetLocalState()); | |
| 204 log.RecordEnvironment(std::vector<metrics::MetricsProvider*>(), | |
| 205 std::vector<variations::ActiveGroupId>(), | |
| 206 0); | |
| 207 | |
| 208 // Record stability build time and version from previous session, so that | |
| 209 // stability metrics (including exited cleanly flag) won't be cleared. | |
| 210 GetLocalState()->SetInt64(metrics::prefs::kStabilityStatsBuildTime, | |
| 211 MetricsLog::GetBuildTime()); | |
| 212 GetLocalState()->SetString(metrics::prefs::kStabilityStatsVersion, | |
| 213 client.GetVersionString()); | |
| 214 | |
| 215 // Set the clean exit flag, as that will otherwise cause a stabilty | |
| 216 // log to be produced, irrespective provider requests. | |
| 217 GetLocalState()->SetBoolean(metrics::prefs::kStabilityExitedCleanly, true); | |
| 218 | |
| 219 TestMetricsService service( | |
| 220 GetMetricsStateManager(), &client, GetLocalState()); | |
| 221 // Add a metrics provider that requests a stability log. | |
| 222 TestMetricsProvider* test_provider = new TestMetricsProvider(true); | |
| 223 service.RegisterMetricsProvider( | |
| 224 scoped_ptr<metrics::MetricsProvider>(test_provider)); | |
| 225 | |
| 226 service.InitializeMetricsRecordingState(); | |
| 227 | |
| 228 // The initial stability log should be generated and persisted in unsent logs. | |
| 229 MetricsLogManager* log_manager = service.log_manager(); | |
| 230 EXPECT_TRUE(log_manager->has_unsent_logs()); | |
| 231 EXPECT_FALSE(log_manager->has_staged_log()); | |
| 232 | |
| 233 // The test provider should have been called upon to provide stabilit | |
|
Alexei Svitkine (slow)
2014/09/09 19:28:26
Nit: stability
Sigurður Ásgeirsson
2014/09/09 21:13:14
Done.
| |
| 234 // metrics. | |
| 235 EXPECT_TRUE(test_provider->provide_stability_metrics_called()); | |
| 236 | |
| 237 // Stage the log and retrieve it. | |
| 238 log_manager->StageNextLogForUpload(); | |
| 239 EXPECT_TRUE(log_manager->has_staged_log()); | |
| 240 | |
| 241 std::string uncompressed_log; | |
| 242 EXPECT_TRUE(metrics::GzipUncompress(log_manager->staged_log(), | |
| 243 &uncompressed_log)); | |
| 244 | |
| 245 metrics::ChromeUserMetricsExtension uma_log; | |
| 246 EXPECT_TRUE(uma_log.ParseFromString(uncompressed_log)); | |
| 247 | |
| 248 EXPECT_TRUE(uma_log.has_client_id()); | |
| 249 EXPECT_TRUE(uma_log.has_session_id()); | |
| 250 EXPECT_TRUE(uma_log.has_system_profile()); | |
| 251 EXPECT_EQ(0, uma_log.user_action_event_size()); | |
| 252 EXPECT_EQ(0, uma_log.omnibox_event_size()); | |
| 253 EXPECT_EQ(0, uma_log.histogram_event_size()); | |
| 254 EXPECT_EQ(0, uma_log.profiler_event_size()); | |
| 255 EXPECT_EQ(0, uma_log.perf_data_size()); | |
| 256 | |
| 257 // As there wasn't an unclean shutdown, this log has zero crash count. | |
| 258 EXPECT_EQ(0, uma_log.system_profile().stability().crash_count()); | |
| 162 } | 259 } |
| 163 | 260 |
| 164 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) { | 261 TEST_F(MetricsServiceTest, InitialStabilityLogAfterCrash) { |
| 165 EnableMetricsReporting(); | 262 EnableMetricsReporting(); |
| 166 GetLocalState()->ClearPref(metrics::prefs::kStabilityExitedCleanly); | 263 GetLocalState()->ClearPref(metrics::prefs::kStabilityExitedCleanly); |
| 167 | 264 |
| 168 // Set up prefs to simulate restarting after a crash. | 265 // Set up prefs to simulate restarting after a crash. |
| 169 | 266 |
| 170 // Save an existing system profile to prefs, to correspond to what would be | 267 // Save an existing system profile to prefs, to correspond to what would be |
| 171 // saved from a previous session. | 268 // saved from a previous session. |
| 172 metrics::TestMetricsServiceClient client; | 269 metrics::TestMetricsServiceClient client; |
| 173 TestMetricsLog log("client", 1, &client, GetLocalState()); | 270 TestMetricsLog log("client", 1, &client, GetLocalState()); |
| 174 log.RecordEnvironment(std::vector<metrics::MetricsProvider*>(), | 271 log.RecordEnvironment(std::vector<metrics::MetricsProvider*>(), |
| 175 std::vector<variations::ActiveGroupId>(), | 272 std::vector<variations::ActiveGroupId>(), |
| 176 0); | 273 0); |
| 177 | 274 |
| 178 // Record stability build time and version from previous session, so that | 275 // Record stability build time and version from previous session, so that |
| 179 // stability metrics (including exited cleanly flag) won't be cleared. | 276 // stability metrics (including exited cleanly flag) won't be cleared. |
| 180 GetLocalState()->SetInt64(metrics::prefs::kStabilityStatsBuildTime, | 277 GetLocalState()->SetInt64(metrics::prefs::kStabilityStatsBuildTime, |
| 181 MetricsLog::GetBuildTime()); | 278 MetricsLog::GetBuildTime()); |
| 182 GetLocalState()->SetString(metrics::prefs::kStabilityStatsVersion, | 279 GetLocalState()->SetString(metrics::prefs::kStabilityStatsVersion, |
| 183 client.GetVersionString()); | 280 client.GetVersionString()); |
| 184 | 281 |
| 185 GetLocalState()->SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); | 282 GetLocalState()->SetBoolean(metrics::prefs::kStabilityExitedCleanly, false); |
| 186 | 283 |
| 187 TestMetricsService service( | 284 TestMetricsService service( |
| 188 GetMetricsStateManager(), &client, GetLocalState()); | 285 GetMetricsStateManager(), &client, GetLocalState()); |
| 189 service.InitializeMetricsRecordingState(); | 286 service.InitializeMetricsRecordingState(); |
| 190 | 287 |
| 191 // The initial stability log should be generated and persisted in unsent logs. | 288 // The initial stability log should be generated and persisted in unsent logs. |
| 192 MetricsLogManager* log_manager = service.log_manager(); | 289 MetricsLogManager* log_manager = service.log_manager(); |
| 193 EXPECT_TRUE(log_manager->has_unsent_logs()); | 290 EXPECT_TRUE(log_manager->has_unsent_logs()); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 | 404 |
| 308 service.RemoveObserver(&observer1); | 405 service.RemoveObserver(&observer1); |
| 309 | 406 |
| 310 service.OpenNewLog(); | 407 service.OpenNewLog(); |
| 311 EXPECT_EQ(2, observer1.observed()); | 408 EXPECT_EQ(2, observer1.observed()); |
| 312 EXPECT_EQ(2, observer2.observed()); | 409 EXPECT_EQ(2, observer2.observed()); |
| 313 service.log_manager_.FinishCurrentLog(); | 410 service.log_manager_.FinishCurrentLog(); |
| 314 | 411 |
| 315 service.RemoveObserver(&observer2); | 412 service.RemoveObserver(&observer2); |
| 316 } | 413 } |
| OLD | NEW |