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 |