| 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_log_manager.h" | 5 #include "components/metrics/metrics_log_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/prefs/pref_registry_simple.h" | 11 #include "base/prefs/pref_registry_simple.h" |
| 12 #include "base/prefs/testing_pref_service.h" | 12 #include "base/prefs/testing_pref_service.h" |
| 13 #include "components/metrics/metrics_log.h" | 13 #include "components/metrics/metrics_log.h" |
| 14 #include "components/metrics/metrics_pref_names.h" | 14 #include "components/metrics/metrics_pref_names.h" |
| 15 #include "components/metrics/test_metrics_service_client.h" | 15 #include "components/metrics/test_metrics_service_client.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 17 |
| 18 namespace metrics { | 18 namespace metrics { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 // Dummy serializer that just stores logs in memory. | 22 // Dummy serializer that just stores logs in memory. |
| 23 class TestLogPrefService : public TestingPrefServiceSimple { | 23 class TestLogPrefService : public TestingPrefServiceSimple { |
| 24 public: | 24 public: |
| 25 TestLogPrefService() { | 25 TestLogPrefService() { |
| 26 registry()->RegisterListPref(prefs::kMetricsInitialLogs); | 26 registry()->RegisterListPref(prefs::kMetricsInitialLogs); |
| 27 registry()->RegisterListPref(prefs::kMetricsInitialLogsOld); |
| 27 registry()->RegisterListPref(prefs::kMetricsOngoingLogs); | 28 registry()->RegisterListPref(prefs::kMetricsOngoingLogs); |
| 29 registry()->RegisterListPref(prefs::kMetricsOngoingLogsOld); |
| 28 } | 30 } |
| 29 | 31 |
| 30 // Returns the number of logs of the given type. | 32 // Returns the number of logs of the given type. |
| 31 size_t TypeCount(MetricsLog::LogType log_type) { | 33 size_t TypeCount(MetricsLog::LogType log_type) { |
| 32 int list_length = 0; | 34 int list_length = 0; |
| 33 if (log_type == MetricsLog::INITIAL_STABILITY_LOG) | 35 if (log_type == MetricsLog::INITIAL_STABILITY_LOG) |
| 34 list_length = GetList(prefs::kMetricsInitialLogs)->GetSize(); | 36 list_length = GetList(prefs::kMetricsInitialLogs)->GetSize(); |
| 35 else | 37 else |
| 36 list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize(); | 38 list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize(); |
| 37 return list_length ? list_length - 2 : 0; | 39 return list_length / 2; |
| 38 } | 40 } |
| 39 }; | 41 }; |
| 40 | 42 |
| 41 } // namespace | 43 } // namespace |
| 42 | 44 |
| 43 TEST(MetricsLogManagerTest, StandardFlow) { | 45 TEST(MetricsLogManagerTest, StandardFlow) { |
| 44 TestMetricsServiceClient client; | 46 TestMetricsServiceClient client; |
| 45 TestLogPrefService pref_service; | 47 TestLogPrefService pref_service; |
| 46 MetricsLogManager log_manager(&pref_service, 0); | 48 MetricsLogManager log_manager(&pref_service, 0); |
| 47 | 49 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 TestLogPrefService pref_service; | 155 TestLogPrefService pref_service; |
| 154 // Set up some in-progress logging in a scoped log manager simulating the | 156 // Set up some in-progress logging in a scoped log manager simulating the |
| 155 // leadup to quitting, then persist as would be done on quit. | 157 // leadup to quitting, then persist as would be done on quit. |
| 156 { | 158 { |
| 157 MetricsLogManager log_manager(&pref_service, 0); | 159 MetricsLogManager log_manager(&pref_service, 0); |
| 158 log_manager.LoadPersistedUnsentLogs(); | 160 log_manager.LoadPersistedUnsentLogs(); |
| 159 | 161 |
| 160 // Simulate a log having already been unsent from a previous session. | 162 // Simulate a log having already been unsent from a previous session. |
| 161 { | 163 { |
| 162 std::string log("proto"); | 164 std::string log("proto"); |
| 163 metrics::PersistedLogs ongoing_logs( | 165 PersistedLogs ongoing_logs(&pref_service, prefs::kMetricsOngoingLogs, |
| 164 &pref_service, prefs::kMetricsOngoingLogs, 1, 1, 0); | 166 prefs::kMetricsOngoingLogsOld, 1, 1, 0); |
| 165 ongoing_logs.StoreLog(&log); | 167 ongoing_logs.StoreLog(log); |
| 166 ongoing_logs.SerializeLogs(); | 168 ongoing_logs.SerializeLogs(); |
| 167 } | 169 } |
| 168 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 170 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 169 EXPECT_FALSE(log_manager.has_unsent_logs()); | 171 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 170 log_manager.LoadPersistedUnsentLogs(); | 172 log_manager.LoadPersistedUnsentLogs(); |
| 171 EXPECT_TRUE(log_manager.has_unsent_logs()); | 173 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 172 | 174 |
| 173 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 175 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 174 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 176 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 175 log_manager.FinishCurrentLog(); | 177 log_manager.FinishCurrentLog(); |
| 176 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 178 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 177 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 179 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 178 log_manager.StageNextLogForUpload(); | 180 log_manager.StageNextLogForUpload(); |
| 179 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 181 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); |
| 180 log_manager.FinishCurrentLog(); | 182 log_manager.FinishCurrentLog(); |
| 181 | 183 |
| 182 // Nothing should be written out until PersistUnsentLogs is called. | 184 // Nothing should be written out until PersistUnsentLogs is called. |
| 183 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 185 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 184 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 186 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 185 log_manager.PersistUnsentLogs(); | 187 log_manager.PersistUnsentLogs(); |
| 186 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 188 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 187 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 189 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 188 } | 190 } |
| 189 | 191 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 // Ensure that types are preserved when storing staged logs. | 231 // Ensure that types are preserved when storing staged logs. |
| 230 { | 232 { |
| 231 TestLogPrefService pref_service; | 233 TestLogPrefService pref_service; |
| 232 MetricsLogManager log_manager(&pref_service, 0); | 234 MetricsLogManager log_manager(&pref_service, 0); |
| 233 log_manager.LoadPersistedUnsentLogs(); | 235 log_manager.LoadPersistedUnsentLogs(); |
| 234 | 236 |
| 235 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 237 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 236 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 238 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 237 log_manager.FinishCurrentLog(); | 239 log_manager.FinishCurrentLog(); |
| 238 log_manager.StageNextLogForUpload(); | 240 log_manager.StageNextLogForUpload(); |
| 239 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 241 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); |
| 240 log_manager.PersistUnsentLogs(); | 242 log_manager.PersistUnsentLogs(); |
| 241 | 243 |
| 242 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 244 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 243 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 245 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 244 } | 246 } |
| 245 | 247 |
| 246 { | 248 { |
| 247 TestLogPrefService pref_service; | 249 TestLogPrefService pref_service; |
| 248 MetricsLogManager log_manager(&pref_service, 0); | 250 MetricsLogManager log_manager(&pref_service, 0); |
| 249 log_manager.LoadPersistedUnsentLogs(); | 251 log_manager.LoadPersistedUnsentLogs(); |
| 250 | 252 |
| 251 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 253 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 252 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 254 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 253 log_manager.FinishCurrentLog(); | 255 log_manager.FinishCurrentLog(); |
| 254 log_manager.StageNextLogForUpload(); | 256 log_manager.StageNextLogForUpload(); |
| 255 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 257 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); |
| 256 log_manager.PersistUnsentLogs(); | 258 log_manager.PersistUnsentLogs(); |
| 257 | 259 |
| 258 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 260 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 259 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 261 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 260 } | 262 } |
| 261 } | 263 } |
| 262 | 264 |
| 263 TEST(MetricsLogManagerTest, LargeLogDiscarding) { | 265 TEST(MetricsLogManagerTest, LargeLogDiscarding) { |
| 264 TestMetricsServiceClient client; | 266 TestMetricsServiceClient client; |
| 265 TestLogPrefService pref_service; | 267 TestLogPrefService pref_service; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 288 TestLogPrefService pref_service; | 290 TestLogPrefService pref_service; |
| 289 MetricsLogManager log_manager(&pref_service, 0); | 291 MetricsLogManager log_manager(&pref_service, 0); |
| 290 log_manager.LoadPersistedUnsentLogs(); | 292 log_manager.LoadPersistedUnsentLogs(); |
| 291 | 293 |
| 292 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 294 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 293 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 295 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 294 log_manager.FinishCurrentLog(); | 296 log_manager.FinishCurrentLog(); |
| 295 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 297 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 296 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 298 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 297 log_manager.StageNextLogForUpload(); | 299 log_manager.StageNextLogForUpload(); |
| 298 log_manager.StoreStagedLogAsUnsent( | 300 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); |
| 299 metrics::PersistedLogs::PROVISIONAL_STORE); | |
| 300 log_manager.FinishCurrentLog(); | 301 log_manager.FinishCurrentLog(); |
| 301 log_manager.DiscardLastProvisionalStore(); | 302 log_manager.DiscardLastProvisionalStore(); |
| 302 | 303 |
| 303 log_manager.PersistUnsentLogs(); | 304 log_manager.PersistUnsentLogs(); |
| 304 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 305 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 305 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 306 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 306 } | 307 } |
| 307 } | 308 } |
| 308 | 309 |
| 309 TEST(MetricsLogManagerTest, ProvisionalStoreNoop) { | 310 TEST(MetricsLogManagerTest, ProvisionalStoreNoop) { |
| 310 TestMetricsServiceClient client; | 311 TestMetricsServiceClient client; |
| 311 | 312 |
| 312 // Ensure that trying to drop a sent log is a no-op, even if another log has | 313 // Ensure that trying to drop a sent log is a no-op, even if another log has |
| 313 // since been staged. | 314 // since been staged. |
| 314 { | 315 { |
| 315 TestLogPrefService pref_service; | 316 TestLogPrefService pref_service; |
| 316 MetricsLogManager log_manager(&pref_service, 0); | 317 MetricsLogManager log_manager(&pref_service, 0); |
| 317 log_manager.LoadPersistedUnsentLogs(); | 318 log_manager.LoadPersistedUnsentLogs(); |
| 318 | 319 |
| 319 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 320 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 320 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 321 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 321 log_manager.FinishCurrentLog(); | 322 log_manager.FinishCurrentLog(); |
| 322 log_manager.StageNextLogForUpload(); | 323 log_manager.StageNextLogForUpload(); |
| 323 log_manager.StoreStagedLogAsUnsent( | 324 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); |
| 324 metrics::PersistedLogs::PROVISIONAL_STORE); | |
| 325 log_manager.StageNextLogForUpload(); | 325 log_manager.StageNextLogForUpload(); |
| 326 log_manager.DiscardStagedLog(); | 326 log_manager.DiscardStagedLog(); |
| 327 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 327 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 328 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 328 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 329 log_manager.FinishCurrentLog(); | 329 log_manager.FinishCurrentLog(); |
| 330 log_manager.StageNextLogForUpload(); | 330 log_manager.StageNextLogForUpload(); |
| 331 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 331 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); |
| 332 log_manager.DiscardLastProvisionalStore(); | 332 log_manager.DiscardLastProvisionalStore(); |
| 333 | 333 |
| 334 log_manager.PersistUnsentLogs(); | 334 log_manager.PersistUnsentLogs(); |
| 335 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 335 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 336 } | 336 } |
| 337 | 337 |
| 338 // Ensure that trying to drop more than once is a no-op | 338 // Ensure that trying to drop more than once is a no-op |
| 339 { | 339 { |
| 340 TestLogPrefService pref_service; | 340 TestLogPrefService pref_service; |
| 341 MetricsLogManager log_manager(&pref_service, 0); | 341 MetricsLogManager log_manager(&pref_service, 0); |
| 342 log_manager.LoadPersistedUnsentLogs(); | 342 log_manager.LoadPersistedUnsentLogs(); |
| 343 | 343 |
| 344 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 344 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 345 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 345 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 346 log_manager.FinishCurrentLog(); | 346 log_manager.FinishCurrentLog(); |
| 347 log_manager.StageNextLogForUpload(); | 347 log_manager.StageNextLogForUpload(); |
| 348 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 348 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); |
| 349 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 349 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 350 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 350 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 351 log_manager.FinishCurrentLog(); | 351 log_manager.FinishCurrentLog(); |
| 352 log_manager.StageNextLogForUpload(); | 352 log_manager.StageNextLogForUpload(); |
| 353 log_manager.StoreStagedLogAsUnsent( | 353 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); |
| 354 metrics::PersistedLogs::PROVISIONAL_STORE); | |
| 355 log_manager.DiscardLastProvisionalStore(); | 354 log_manager.DiscardLastProvisionalStore(); |
| 356 log_manager.DiscardLastProvisionalStore(); | 355 log_manager.DiscardLastProvisionalStore(); |
| 357 | 356 |
| 358 log_manager.PersistUnsentLogs(); | 357 log_manager.PersistUnsentLogs(); |
| 359 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 358 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 360 } | 359 } |
| 361 } | 360 } |
| 362 | 361 |
| 363 } // namespace metrics | 362 } // namespace metrics |
| OLD | NEW |