blob: b43a514de70d86c366c86c8df9b4c3f7f77e6328 [file] [log] [blame]
bsimonnet@chromium.org064107e2014-05-02 00:59:061// Copyright 2014 The Chromium Authors. All rights reserved.
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:102// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
bsimonnet@chromium.org064107e2014-05-02 00:59:065#include "components/metrics/metrics_log_manager.h"
asvitkine@chromium.orgcfee9aa52013-10-19 17:53:056
isherman@chromium.orgfe58acc22012-02-29 01:29:587#include <string>
8#include <utility>
9#include <vector>
10
holte@chromium.org7f07db62014-05-15 01:12:4511#include "base/prefs/pref_registry_simple.h"
12#include "base/prefs/testing_pref_service.h"
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0113#include "components/metrics/metrics_log.h"
holte@chromium.org7f07db62014-05-15 01:12:4514#include "components/metrics/metrics_pref_names.h"
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0115#include "components/metrics/test_metrics_service_client.h"
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1016#include "testing/gtest/include/gtest/gtest.h"
17
bsimonnet@chromium.org064107e2014-05-02 00:59:0618namespace metrics {
19
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1020namespace {
isherman@chromium.orgfe58acc22012-02-29 01:29:5821
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1022// Dummy serializer that just stores logs in memory.
holte@chromium.org7f07db62014-05-15 01:12:4523class TestLogPrefService : public TestingPrefServiceSimple {
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1024 public:
holte@chromium.org7f07db62014-05-15 01:12:4525 TestLogPrefService() {
26 registry()->RegisterListPref(prefs::kMetricsInitialLogs);
asvitkine@chromium.org9706e1b2014-06-11 16:31:2427 registry()->RegisterListPref(prefs::kMetricsInitialLogsOld);
holte@chromium.org7f07db62014-05-15 01:12:4528 registry()->RegisterListPref(prefs::kMetricsOngoingLogs);
asvitkine@chromium.org9706e1b2014-06-11 16:31:2429 registry()->RegisterListPref(prefs::kMetricsOngoingLogsOld);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1030 }
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0131
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1032 // Returns the number of logs of the given type.
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0133 size_t TypeCount(MetricsLog::LogType log_type) {
holte@chromium.org7f07db62014-05-15 01:12:4534 int list_length = 0;
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0135 if (log_type == MetricsLog::INITIAL_STABILITY_LOG)
holte@chromium.org7f07db62014-05-15 01:12:4536 list_length = GetList(prefs::kMetricsInitialLogs)->GetSize();
37 else
38 list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize();
asvitkine@chromium.org9706e1b2014-06-11 16:31:2439 return list_length / 2;
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1040 }
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1041};
isherman@chromium.orgfe58acc22012-02-29 01:29:5842
43} // namespace
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1044
45TEST(MetricsLogManagerTest, StandardFlow) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0146 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:4547 TestLogPrefService pref_service;
48 MetricsLogManager log_manager(&pref_service, 0);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1049
50 // Make sure a new manager has a clean slate.
51 EXPECT_EQ(NULL, log_manager.current_log());
52 EXPECT_FALSE(log_manager.has_staged_log());
53 EXPECT_FALSE(log_manager.has_unsent_logs());
54
55 // Check that the normal flow works.
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0156 MetricsLog* initial_log = new MetricsLog(
57 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
isherman@chromium.org09dee82d2014-05-22 14:00:5358 log_manager.BeginLoggingWithLog(make_scoped_ptr(initial_log));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1059 EXPECT_EQ(initial_log, log_manager.current_log());
60 EXPECT_FALSE(log_manager.has_staged_log());
61
stuartmorgan@chromium.org29948262012-03-01 12:15:0862 log_manager.FinishCurrentLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1063 EXPECT_EQ(NULL, log_manager.current_log());
stuartmorgan@chromium.org29948262012-03-01 12:15:0864 EXPECT_TRUE(log_manager.has_unsent_logs());
65 EXPECT_FALSE(log_manager.has_staged_log());
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1066
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0167 MetricsLog* second_log =
68 new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service);
isherman@chromium.org09dee82d2014-05-22 14:00:5369 log_manager.BeginLoggingWithLog(make_scoped_ptr(second_log));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1070 EXPECT_EQ(second_log, log_manager.current_log());
stuartmorgan@chromium.org29948262012-03-01 12:15:0871
72 log_manager.StageNextLogForUpload();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1073 EXPECT_TRUE(log_manager.has_staged_log());
holte@chromium.org7f07db62014-05-15 01:12:4574 EXPECT_FALSE(log_manager.staged_log().empty());
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1075
isherman@chromium.org5f3e1642013-05-05 03:37:3476 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1077 EXPECT_EQ(second_log, log_manager.current_log());
78 EXPECT_FALSE(log_manager.has_staged_log());
stuartmorgan@chromium.org29948262012-03-01 12:15:0879 EXPECT_FALSE(log_manager.has_unsent_logs());
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1080
81 EXPECT_FALSE(log_manager.has_unsent_logs());
82}
83
84TEST(MetricsLogManagerTest, AbandonedLog) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0185 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:4586 TestLogPrefService pref_service;
87 MetricsLogManager log_manager(&pref_service, 0);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1088
asvitkine@chromium.orgbfb77b52014-06-07 01:54:0189 MetricsLog* dummy_log = new MetricsLog(
90 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
isherman@chromium.org09dee82d2014-05-22 14:00:5391 log_manager.BeginLoggingWithLog(make_scoped_ptr(dummy_log));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:1092 EXPECT_EQ(dummy_log, log_manager.current_log());
93
94 log_manager.DiscardCurrentLog();
95 EXPECT_EQ(NULL, log_manager.current_log());
96 EXPECT_FALSE(log_manager.has_staged_log());
97}
98
99TEST(MetricsLogManagerTest, InterjectedLog) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01100 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:45101 TestLogPrefService pref_service;
102 MetricsLogManager log_manager(&pref_service, 0);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10103
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01104 MetricsLog* ongoing_log =
105 new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service);
106 MetricsLog* temp_log = new MetricsLog(
107 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10108
isherman@chromium.org09dee82d2014-05-22 14:00:53109 log_manager.BeginLoggingWithLog(make_scoped_ptr(ongoing_log));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10110 EXPECT_EQ(ongoing_log, log_manager.current_log());
111
112 log_manager.PauseCurrentLog();
113 EXPECT_EQ(NULL, log_manager.current_log());
114
isherman@chromium.org09dee82d2014-05-22 14:00:53115 log_manager.BeginLoggingWithLog(make_scoped_ptr(temp_log));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10116 EXPECT_EQ(temp_log, log_manager.current_log());
stuartmorgan@chromium.org29948262012-03-01 12:15:08117 log_manager.FinishCurrentLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10118 EXPECT_EQ(NULL, log_manager.current_log());
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10119
120 log_manager.ResumePausedLog();
121 EXPECT_EQ(ongoing_log, log_manager.current_log());
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10122
stuartmorgan@chromium.org29948262012-03-01 12:15:08123 EXPECT_FALSE(log_manager.has_staged_log());
124 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34125 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10126 EXPECT_FALSE(log_manager.has_unsent_logs());
127}
128
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51129TEST(MetricsLogManagerTest, InterjectedLogPreservesType) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01130 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:45131 TestLogPrefService pref_service;
132 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30133 log_manager.LoadPersistedUnsentLogs();
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51134
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01135 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
136 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51137 log_manager.PauseCurrentLog();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01138 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
139 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service)));
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51140 log_manager.FinishCurrentLog();
141 log_manager.ResumePausedLog();
142 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34143 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51144
145 // Verify that the remaining log (which is the original ongoing log) still
146 // has the right type.
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51147 log_manager.FinishCurrentLog();
148 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01149 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
150 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgaa752c3f2012-04-27 22:31:51151}
152
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10153TEST(MetricsLogManagerTest, StoreAndLoad) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01154 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:45155 TestLogPrefService pref_service;
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10156 // Set up some in-progress logging in a scoped log manager simulating the
157 // leadup to quitting, then persist as would be done on quit.
158 {
holte@chromium.org7f07db62014-05-15 01:12:45159 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30160 log_manager.LoadPersistedUnsentLogs();
161
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10162 // Simulate a log having already been unsent from a previous session.
holte@chromium.org7f07db62014-05-15 01:12:45163 {
164 std::string log("proto");
asvitkine@chromium.org9706e1b2014-06-11 16:31:24165 PersistedLogs ongoing_logs(&pref_service, prefs::kMetricsOngoingLogs,
166 prefs::kMetricsOngoingLogsOld, 1, 1, 0);
167 ongoing_logs.StoreLog(log);
holte@chromium.org7f07db62014-05-15 01:12:45168 ongoing_logs.SerializeLogs();
169 }
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01170 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10171 EXPECT_FALSE(log_manager.has_unsent_logs());
172 log_manager.LoadPersistedUnsentLogs();
173 EXPECT_TRUE(log_manager.has_unsent_logs());
174
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01175 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
176 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service)));
stuartmorgan@chromium.org29948262012-03-01 12:15:08177 log_manager.FinishCurrentLog();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01178 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
179 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.org29948262012-03-01 12:15:08180 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24181 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE);
stuartmorgan@chromium.org29948262012-03-01 12:15:08182 log_manager.FinishCurrentLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10183
184 // Nothing should be written out until PersistUnsentLogs is called.
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01185 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
186 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10187 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01188 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
189 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10190 }
191
192 // Now simulate the relaunch, ensure that the log manager restores
193 // everything correctly, and verify that once the are handled they are not
194 // re-persisted.
195 {
holte@chromium.org7f07db62014-05-15 01:12:45196 MetricsLogManager log_manager(&pref_service, 0);
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10197 log_manager.LoadPersistedUnsentLogs();
198 EXPECT_TRUE(log_manager.has_unsent_logs());
199
stuartmorgan@chromium.org29948262012-03-01 12:15:08200 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34201 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10202 // The initial log should be sent first; update the persisted storage to
203 // verify.
204 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01205 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
206 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10207
208 // Handle the first ongoing log.
stuartmorgan@chromium.org29948262012-03-01 12:15:08209 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34210 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10211 EXPECT_TRUE(log_manager.has_unsent_logs());
212
213 // Handle the last log.
stuartmorgan@chromium.org29948262012-03-01 12:15:08214 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34215 log_manager.DiscardStagedLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10216 EXPECT_FALSE(log_manager.has_unsent_logs());
217
218 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been
219 // called again.
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01220 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10221 // Persist, and make sure nothing is left.
222 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01223 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
224 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10225 }
226}
227
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16228TEST(MetricsLogManagerTest, StoreStagedLogTypes) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01229 TestMetricsServiceClient client;
230
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16231 // Ensure that types are preserved when storing staged logs.
232 {
holte@chromium.org7f07db62014-05-15 01:12:45233 TestLogPrefService pref_service;
234 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30235 log_manager.LoadPersistedUnsentLogs();
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16236
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01237 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
238 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16239 log_manager.FinishCurrentLog();
240 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24241 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE);
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16242 log_manager.PersistUnsentLogs();
243
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01244 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
245 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16246 }
247
248 {
holte@chromium.org7f07db62014-05-15 01:12:45249 TestLogPrefService pref_service;
250 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30251 log_manager.LoadPersistedUnsentLogs();
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16252
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01253 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
254 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service)));
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16255 log_manager.FinishCurrentLog();
256 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24257 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE);
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16258 log_manager.PersistUnsentLogs();
259
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01260 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
261 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgf829cc362012-03-10 10:09:16262 }
263}
264
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10265TEST(MetricsLogManagerTest, LargeLogDiscarding) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01266 TestMetricsServiceClient client;
holte@chromium.org7f07db62014-05-15 01:12:45267 TestLogPrefService pref_service;
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10268 // Set the size threshold very low, to verify that it's honored.
holte@chromium.org7f07db62014-05-15 01:12:45269 MetricsLogManager log_manager(&pref_service, 1);
270 log_manager.LoadPersistedUnsentLogs();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10271
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01272 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
273 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service)));
stuartmorgan@chromium.org29948262012-03-01 12:15:08274 log_manager.FinishCurrentLog();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01275 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
276 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.org29948262012-03-01 12:15:08277 log_manager.FinishCurrentLog();
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10278
279 // Only the ongoing log should be written out, due to the threshold.
280 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01281 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
282 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orgcac267c2011-09-29 15:18:10283}
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53284
285TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01286 TestMetricsServiceClient client;
287
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53288 // Ensure that provisional store works, and discards the correct log.
289 {
holte@chromium.org7f07db62014-05-15 01:12:45290 TestLogPrefService pref_service;
291 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30292 log_manager.LoadPersistedUnsentLogs();
293
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01294 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
295 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53296 log_manager.FinishCurrentLog();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01297 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
298 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53299 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24300 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE);
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53301 log_manager.FinishCurrentLog();
302 log_manager.DiscardLastProvisionalStore();
303
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53304 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01305 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
306 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53307 }
308}
309
310TEST(MetricsLogManagerTest, ProvisionalStoreNoop) {
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01311 TestMetricsServiceClient client;
312
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53313 // Ensure that trying to drop a sent log is a no-op, even if another log has
314 // since been staged.
315 {
holte@chromium.org7f07db62014-05-15 01:12:45316 TestLogPrefService pref_service;
317 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30318 log_manager.LoadPersistedUnsentLogs();
319
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01320 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
321 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53322 log_manager.FinishCurrentLog();
323 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24324 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE);
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53325 log_manager.StageNextLogForUpload();
isherman@chromium.org5f3e1642013-05-05 03:37:34326 log_manager.DiscardStagedLog();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01327 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
328 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53329 log_manager.FinishCurrentLog();
330 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24331 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE);
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53332 log_manager.DiscardLastProvisionalStore();
333
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53334 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01335 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53336 }
337
338 // Ensure that trying to drop more than once is a no-op
339 {
holte@chromium.org7f07db62014-05-15 01:12:45340 TestLogPrefService pref_service;
341 MetricsLogManager log_manager(&pref_service, 0);
asvitkine@chromium.org80a8f312013-12-16 18:00:30342 log_manager.LoadPersistedUnsentLogs();
343
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01344 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
345 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53346 log_manager.FinishCurrentLog();
347 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24348 log_manager.StoreStagedLogAsUnsent(PersistedLogs::NORMAL_STORE);
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01349 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog(
350 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service)));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53351 log_manager.FinishCurrentLog();
352 log_manager.StageNextLogForUpload();
asvitkine@chromium.org9706e1b2014-06-11 16:31:24353 log_manager.StoreStagedLogAsUnsent(PersistedLogs::PROVISIONAL_STORE);
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53354 log_manager.DiscardLastProvisionalStore();
355 log_manager.DiscardLastProvisionalStore();
356
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53357 log_manager.PersistUnsentLogs();
asvitkine@chromium.orgbfb77b52014-06-07 01:54:01358 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
stuartmorgan@chromium.orge7508d82012-05-03 15:59:53359 }
360}
asvitkine@chromium.orgcfee9aa52013-10-19 17:53:05361
bsimonnet@chromium.org064107e2014-05-02 00:59:06362} // namespace metrics