| 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 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 EXPECT_FALSE(log_manager.has_unsent_logs()); | 171 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 172 log_manager.LoadPersistedUnsentLogs(); | 172 log_manager.LoadPersistedUnsentLogs(); |
| 173 EXPECT_TRUE(log_manager.has_unsent_logs()); | 173 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 174 | 174 |
| 175 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 175 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 176 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 176 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 177 log_manager.FinishCurrentLog(); | 177 log_manager.FinishCurrentLog(); |
| 178 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 178 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 179 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 179 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 180 log_manager.StageNextLogForUpload(); | 180 log_manager.StageNextLogForUpload(); |
| 181 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); | |
| 182 log_manager.FinishCurrentLog(); | 181 log_manager.FinishCurrentLog(); |
| 183 | 182 |
| 184 // Nothing should be written out until PersistUnsentLogs is called. | 183 // Nothing should be written out until PersistUnsentLogs is called. |
| 185 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 184 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 186 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 185 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 187 log_manager.PersistUnsentLogs(); | 186 log_manager.PersistUnsentLogs(); |
| 188 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 187 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 189 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 188 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 190 } | 189 } |
| 191 | 190 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 // Ensure that types are preserved when storing staged logs. | 230 // Ensure that types are preserved when storing staged logs. |
| 232 { | 231 { |
| 233 TestLogPrefService pref_service; | 232 TestLogPrefService pref_service; |
| 234 MetricsLogManager log_manager(&pref_service, 0); | 233 MetricsLogManager log_manager(&pref_service, 0); |
| 235 log_manager.LoadPersistedUnsentLogs(); | 234 log_manager.LoadPersistedUnsentLogs(); |
| 236 | 235 |
| 237 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 236 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 238 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 237 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 239 log_manager.FinishCurrentLog(); | 238 log_manager.FinishCurrentLog(); |
| 240 log_manager.StageNextLogForUpload(); | 239 log_manager.StageNextLogForUpload(); |
| 241 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); | |
| 242 log_manager.PersistUnsentLogs(); | 240 log_manager.PersistUnsentLogs(); |
| 243 | 241 |
| 244 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 242 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 245 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 243 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 246 } | 244 } |
| 247 | 245 |
| 248 { | 246 { |
| 249 TestLogPrefService pref_service; | 247 TestLogPrefService pref_service; |
| 250 MetricsLogManager log_manager(&pref_service, 0); | 248 MetricsLogManager log_manager(&pref_service, 0); |
| 251 log_manager.LoadPersistedUnsentLogs(); | 249 log_manager.LoadPersistedUnsentLogs(); |
| 252 | 250 |
| 253 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 251 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 254 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 252 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 255 log_manager.FinishCurrentLog(); | 253 log_manager.FinishCurrentLog(); |
| 256 log_manager.StageNextLogForUpload(); | 254 log_manager.StageNextLogForUpload(); |
| 257 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); | |
| 258 log_manager.PersistUnsentLogs(); | 255 log_manager.PersistUnsentLogs(); |
| 259 | 256 |
| 260 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 257 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 261 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 258 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 262 } | 259 } |
| 263 } | 260 } |
| 264 | 261 |
| 265 TEST(MetricsLogManagerTest, LargeLogDiscarding) { | 262 TEST(MetricsLogManagerTest, LargeLogDiscarding) { |
| 266 TestMetricsServiceClient client; | 263 TestMetricsServiceClient client; |
| 267 TestLogPrefService pref_service; | 264 TestLogPrefService pref_service; |
| 268 // Set the size threshold very low, to verify that it's honored. | 265 // Set the size threshold very low, to verify that it's honored. |
| 269 MetricsLogManager log_manager(&pref_service, 1); | 266 MetricsLogManager log_manager(&pref_service, 1); |
| 270 log_manager.LoadPersistedUnsentLogs(); | 267 log_manager.LoadPersistedUnsentLogs(); |
| 271 | 268 |
| 272 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 269 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 273 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 270 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 274 log_manager.FinishCurrentLog(); | 271 log_manager.FinishCurrentLog(); |
| 275 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 272 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 276 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 273 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 277 log_manager.FinishCurrentLog(); | 274 log_manager.FinishCurrentLog(); |
| 278 | 275 |
| 279 // Only the ongoing log should be written out, due to the threshold. | 276 // Only the ongoing log should be written out, due to the threshold. |
| 280 log_manager.PersistUnsentLogs(); | 277 log_manager.PersistUnsentLogs(); |
| 281 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 278 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 282 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 279 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 283 } | 280 } |
| 284 | 281 |
| 285 TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) { | 282 TEST(MetricsLogManagerTest, DiscardOrder) { |
| 283 // Ensure that the correct log is discarded if new logs are pushed while |
| 284 // a log is staged. |
| 286 TestMetricsServiceClient client; | 285 TestMetricsServiceClient client; |
| 287 | |
| 288 // Ensure that provisional store works, and discards the correct log. | |
| 289 { | 286 { |
| 290 TestLogPrefService pref_service; | 287 TestLogPrefService pref_service; |
| 291 MetricsLogManager log_manager(&pref_service, 0); | 288 MetricsLogManager log_manager(&pref_service, 0); |
| 292 log_manager.LoadPersistedUnsentLogs(); | 289 log_manager.LoadPersistedUnsentLogs(); |
| 293 | 290 |
| 294 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 291 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 295 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); | 292 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 296 log_manager.FinishCurrentLog(); | 293 log_manager.FinishCurrentLog(); |
| 297 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | 294 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 298 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | 295 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 299 log_manager.StageNextLogForUpload(); | 296 log_manager.StageNextLogForUpload(); |
| 300 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); | |
| 301 log_manager.FinishCurrentLog(); | 297 log_manager.FinishCurrentLog(); |
| 302 log_manager.DiscardLastProvisionalStore(); | 298 log_manager.DiscardStagedLog(); |
| 303 | 299 |
| 304 log_manager.PersistUnsentLogs(); | 300 log_manager.PersistUnsentLogs(); |
| 305 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); | 301 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 306 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | 302 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 307 } | 303 } |
| 308 } | 304 } |
| 309 | |
| 310 TEST(MetricsLogManagerTest, ProvisionalStoreNoop) { | |
| 311 TestMetricsServiceClient client; | |
| 312 | |
| 313 // Ensure that trying to drop a sent log is a no-op, even if another log has | |
| 314 // since been staged. | |
| 315 { | |
| 316 TestLogPrefService pref_service; | |
| 317 MetricsLogManager log_manager(&pref_service, 0); | |
| 318 log_manager.LoadPersistedUnsentLogs(); | |
| 319 | |
| 320 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | |
| 321 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | |
| 322 log_manager.FinishCurrentLog(); | |
| 323 log_manager.StageNextLogForUpload(); | |
| 324 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); | |
| 325 log_manager.StageNextLogForUpload(); | |
| 326 log_manager.DiscardStagedLog(); | |
| 327 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | |
| 328 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | |
| 329 log_manager.FinishCurrentLog(); | |
| 330 log_manager.StageNextLogForUpload(); | |
| 331 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); | |
| 332 log_manager.DiscardLastProvisionalStore(); | |
| 333 | |
| 334 log_manager.PersistUnsentLogs(); | |
| 335 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | |
| 336 } | |
| 337 | |
| 338 // Ensure that trying to drop more than once is a no-op | |
| 339 { | |
| 340 TestLogPrefService pref_service; | |
| 341 MetricsLogManager log_manager(&pref_service, 0); | |
| 342 log_manager.LoadPersistedUnsentLogs(); | |
| 343 | |
| 344 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | |
| 345 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | |
| 346 log_manager.FinishCurrentLog(); | |
| 347 log_manager.StageNextLogForUpload(); | |
| 348 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE); | |
| 349 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( | |
| 350 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); | |
| 351 log_manager.FinishCurrentLog(); | |
| 352 log_manager.StageNextLogForUpload(); | |
| 353 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE); | |
| 354 log_manager.DiscardLastProvisionalStore(); | |
| 355 log_manager.DiscardLastProvisionalStore(); | |
| 356 | |
| 357 log_manager.PersistUnsentLogs(); | |
| 358 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); | |
| 359 } | |
| 360 } | |
| 361 | 305 |
| 362 } // namespace metrics | 306 } // namespace metrics |
| OLD | NEW |