blob: ec0ca38fba5a6963a0af9f03dd1738e767e02aee [file] [log] [blame]
[email protected]064107e2014-05-02 00:59:061// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]cac267c2011-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
[email protected]064107e2014-05-02 00:59:065#include "components/metrics/metrics_log_manager.h"
[email protected]cfee9aa52013-10-19 17:53:056
[email protected]fe58acc22012-02-29 01:29:587#include <string>
8#include <utility>
9#include <vector>
10
[email protected]cfee9aa52013-10-19 17:53:0511#include "base/sha1.h"
[email protected]064107e2014-05-02 00:59:0612#include "components/metrics/metrics_log_base.h"
[email protected]cac267c2011-09-29 15:18:1013#include "testing/gtest/include/gtest/gtest.h"
14
[email protected]064107e2014-05-02 00:59:0615namespace metrics {
16
[email protected]cac267c2011-09-29 15:18:1017namespace {
[email protected]fe58acc22012-02-29 01:29:5818
[email protected]cac267c2011-09-29 15:18:1019// Dummy serializer that just stores logs in memory.
20class DummyLogSerializer : public MetricsLogManager::LogSerializer {
21 public:
[email protected]cfee9aa52013-10-19 17:53:0522 virtual void SerializeLogs(
23 const std::vector<MetricsLogManager::SerializedLog>& logs,
24 MetricsLogManager::LogType log_type) OVERRIDE {
[email protected]cac267c2011-09-29 15:18:1025 persisted_logs_[log_type] = logs;
26 }
27
[email protected]cfee9aa52013-10-19 17:53:0528 virtual void DeserializeLogs(
29 MetricsLogManager::LogType log_type,
30 std::vector<MetricsLogManager::SerializedLog>* logs) OVERRIDE {
[email protected]cac267c2011-09-29 15:18:1031 ASSERT_NE(static_cast<void*>(NULL), logs);
32 *logs = persisted_logs_[log_type];
33 }
34
35 // Returns the number of logs of the given type.
36 size_t TypeCount(MetricsLogManager::LogType log_type) {
37 return persisted_logs_[log_type].size();
38 }
39
40 // In-memory "persitent storage".
[email protected]cfee9aa52013-10-19 17:53:0541 std::vector<MetricsLogManager::SerializedLog> persisted_logs_[2];
[email protected]cac267c2011-09-29 15:18:1042};
[email protected]fe58acc22012-02-29 01:29:5843
44} // namespace
[email protected]cac267c2011-09-29 15:18:1045
46TEST(MetricsLogManagerTest, StandardFlow) {
47 MetricsLogManager log_manager;
48
49 // Make sure a new manager has a clean slate.
50 EXPECT_EQ(NULL, log_manager.current_log());
51 EXPECT_FALSE(log_manager.has_staged_log());
52 EXPECT_FALSE(log_manager.has_unsent_logs());
53
54 // Check that the normal flow works.
[email protected]9eae4032014-04-09 19:15:1955 MetricsLogBase* initial_log =
56 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
57 log_manager.BeginLoggingWithLog(initial_log);
[email protected]cac267c2011-09-29 15:18:1058 EXPECT_EQ(initial_log, log_manager.current_log());
59 EXPECT_FALSE(log_manager.has_staged_log());
60
[email protected]29948262012-03-01 12:15:0861 log_manager.FinishCurrentLog();
[email protected]cac267c2011-09-29 15:18:1062 EXPECT_EQ(NULL, log_manager.current_log());
[email protected]29948262012-03-01 12:15:0863 EXPECT_TRUE(log_manager.has_unsent_logs());
64 EXPECT_FALSE(log_manager.has_staged_log());
[email protected]cac267c2011-09-29 15:18:1065
[email protected]9eae4032014-04-09 19:15:1966 MetricsLogBase* second_log =
67 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
68 log_manager.BeginLoggingWithLog(second_log);
[email protected]cac267c2011-09-29 15:18:1069 EXPECT_EQ(second_log, log_manager.current_log());
[email protected]29948262012-03-01 12:15:0870
71 log_manager.StageNextLogForUpload();
[email protected]cac267c2011-09-29 15:18:1072 EXPECT_TRUE(log_manager.has_staged_log());
[email protected]29948262012-03-01 12:15:0873 EXPECT_FALSE(log_manager.staged_log_text().empty());
[email protected]cac267c2011-09-29 15:18:1074
[email protected]5f3e1642013-05-05 03:37:3475 log_manager.DiscardStagedLog();
[email protected]cac267c2011-09-29 15:18:1076 EXPECT_EQ(second_log, log_manager.current_log());
77 EXPECT_FALSE(log_manager.has_staged_log());
[email protected]29948262012-03-01 12:15:0878 EXPECT_FALSE(log_manager.has_unsent_logs());
[email protected]cac267c2011-09-29 15:18:1079 EXPECT_TRUE(log_manager.staged_log_text().empty());
80
81 EXPECT_FALSE(log_manager.has_unsent_logs());
82}
83
84TEST(MetricsLogManagerTest, AbandonedLog) {
85 MetricsLogManager log_manager;
86
[email protected]9eae4032014-04-09 19:15:1987 MetricsLogBase* dummy_log =
88 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
89 log_manager.BeginLoggingWithLog(dummy_log);
[email protected]cac267c2011-09-29 15:18:1090 EXPECT_EQ(dummy_log, log_manager.current_log());
91
92 log_manager.DiscardCurrentLog();
93 EXPECT_EQ(NULL, log_manager.current_log());
94 EXPECT_FALSE(log_manager.has_staged_log());
95}
96
97TEST(MetricsLogManagerTest, InterjectedLog) {
98 MetricsLogManager log_manager;
99
[email protected]9eae4032014-04-09 19:15:19100 MetricsLogBase* ongoing_log =
101 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
102 MetricsLogBase* temp_log =
103 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
[email protected]cac267c2011-09-29 15:18:10104
[email protected]9eae4032014-04-09 19:15:19105 log_manager.BeginLoggingWithLog(ongoing_log);
[email protected]cac267c2011-09-29 15:18:10106 EXPECT_EQ(ongoing_log, log_manager.current_log());
107
108 log_manager.PauseCurrentLog();
109 EXPECT_EQ(NULL, log_manager.current_log());
110
[email protected]9eae4032014-04-09 19:15:19111 log_manager.BeginLoggingWithLog(temp_log);
[email protected]cac267c2011-09-29 15:18:10112 EXPECT_EQ(temp_log, log_manager.current_log());
[email protected]29948262012-03-01 12:15:08113 log_manager.FinishCurrentLog();
[email protected]cac267c2011-09-29 15:18:10114 EXPECT_EQ(NULL, log_manager.current_log());
[email protected]cac267c2011-09-29 15:18:10115
116 log_manager.ResumePausedLog();
117 EXPECT_EQ(ongoing_log, log_manager.current_log());
[email protected]cac267c2011-09-29 15:18:10118
[email protected]29948262012-03-01 12:15:08119 EXPECT_FALSE(log_manager.has_staged_log());
120 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34121 log_manager.DiscardStagedLog();
[email protected]cac267c2011-09-29 15:18:10122 EXPECT_FALSE(log_manager.has_unsent_logs());
123}
124
[email protected]aa752c3f2012-04-27 22:31:51125TEST(MetricsLogManagerTest, InterjectedLogPreservesType) {
126 MetricsLogManager log_manager;
[email protected]80a8f312013-12-16 18:00:30127 DummyLogSerializer* serializer = new DummyLogSerializer;
128 log_manager.set_log_serializer(serializer);
129 log_manager.LoadPersistedUnsentLogs();
[email protected]aa752c3f2012-04-27 22:31:51130
[email protected]9eae4032014-04-09 19:15:19131 MetricsLogBase* ongoing_log =
132 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
133 MetricsLogBase* temp_log =
134 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
[email protected]aa752c3f2012-04-27 22:31:51135
[email protected]9eae4032014-04-09 19:15:19136 log_manager.BeginLoggingWithLog(ongoing_log);
[email protected]aa752c3f2012-04-27 22:31:51137 log_manager.PauseCurrentLog();
[email protected]9eae4032014-04-09 19:15:19138 log_manager.BeginLoggingWithLog(temp_log);
[email protected]aa752c3f2012-04-27 22:31:51139 log_manager.FinishCurrentLog();
140 log_manager.ResumePausedLog();
141 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34142 log_manager.DiscardStagedLog();
[email protected]aa752c3f2012-04-27 22:31:51143
144 // Verify that the remaining log (which is the original ongoing log) still
145 // has the right type.
[email protected]aa752c3f2012-04-27 22:31:51146 log_manager.FinishCurrentLog();
147 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19148 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30149 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]aa752c3f2012-04-27 22:31:51150}
151
[email protected]cac267c2011-09-29 15:18:10152TEST(MetricsLogManagerTest, StoreAndLoad) {
[email protected]cfee9aa52013-10-19 17:53:05153 std::vector<MetricsLogManager::SerializedLog> initial_logs;
154 std::vector<MetricsLogManager::SerializedLog> ongoing_logs;
[email protected]cac267c2011-09-29 15:18:10155
156 // 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 {
159 MetricsLogManager log_manager;
160 DummyLogSerializer* serializer = new DummyLogSerializer;
161 log_manager.set_log_serializer(serializer);
[email protected]80a8f312013-12-16 18:00:30162 log_manager.LoadPersistedUnsentLogs();
163
[email protected]cac267c2011-09-29 15:18:10164 // Simulate a log having already been unsent from a previous session.
[email protected]cfee9aa52013-10-19 17:53:05165 MetricsLogManager::SerializedLog log;
166 std::string text = "proto";
167 log.SwapLogText(&text);
[email protected]0edf8762013-11-21 18:33:30168 serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG].push_back(log);
[email protected]cac267c2011-09-29 15:18:10169 EXPECT_FALSE(log_manager.has_unsent_logs());
170 log_manager.LoadPersistedUnsentLogs();
171 EXPECT_TRUE(log_manager.has_unsent_logs());
172
[email protected]9eae4032014-04-09 19:15:19173 MetricsLogBase* log1 =
174 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
175 MetricsLogBase* log2 =
176 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
177 log_manager.BeginLoggingWithLog(log1);
[email protected]29948262012-03-01 12:15:08178 log_manager.FinishCurrentLog();
[email protected]9eae4032014-04-09 19:15:19179 log_manager.BeginLoggingWithLog(log2);
[email protected]29948262012-03-01 12:15:08180 log_manager.StageNextLogForUpload();
[email protected]e7508d82012-05-03 15:59:53181 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
[email protected]29948262012-03-01 12:15:08182 log_manager.FinishCurrentLog();
[email protected]cac267c2011-09-29 15:18:10183
184 // Nothing should be written out until PersistUnsentLogs is called.
[email protected]9eae4032014-04-09 19:15:19185 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30186 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10187 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19188 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30189 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10190
191 // Save the logs to transfer over to a new serializer (since log_manager
192 // owns |serializer|, so it's about to go away.
[email protected]9eae4032014-04-09 19:15:19193 initial_logs =
194 serializer->persisted_logs_[MetricsLogBase::INITIAL_STABILITY_LOG];
[email protected]0edf8762013-11-21 18:33:30195 ongoing_logs = serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG];
[email protected]cac267c2011-09-29 15:18:10196 }
197
198 // Now simulate the relaunch, ensure that the log manager restores
199 // everything correctly, and verify that once the are handled they are not
200 // re-persisted.
201 {
202 MetricsLogManager log_manager;
203
204 DummyLogSerializer* serializer = new DummyLogSerializer;
[email protected]9eae4032014-04-09 19:15:19205 serializer->persisted_logs_[MetricsLogBase::INITIAL_STABILITY_LOG] =
206 initial_logs;
[email protected]0edf8762013-11-21 18:33:30207 serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG] = ongoing_logs;
[email protected]cac267c2011-09-29 15:18:10208
209 log_manager.set_log_serializer(serializer);
210 log_manager.LoadPersistedUnsentLogs();
211 EXPECT_TRUE(log_manager.has_unsent_logs());
212
[email protected]29948262012-03-01 12:15:08213 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34214 log_manager.DiscardStagedLog();
[email protected]cac267c2011-09-29 15:18:10215 // The initial log should be sent first; update the persisted storage to
216 // verify.
217 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19218 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30219 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10220
221 // Handle the first ongoing log.
[email protected]29948262012-03-01 12:15:08222 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34223 log_manager.DiscardStagedLog();
[email protected]cac267c2011-09-29 15:18:10224 EXPECT_TRUE(log_manager.has_unsent_logs());
225
226 // Handle the last log.
[email protected]29948262012-03-01 12:15:08227 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34228 log_manager.DiscardStagedLog();
[email protected]cac267c2011-09-29 15:18:10229 EXPECT_FALSE(log_manager.has_unsent_logs());
230
231 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been
232 // called again.
[email protected]0edf8762013-11-21 18:33:30233 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10234 // Persist, and make sure nothing is left.
235 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19236 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30237 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10238 }
239}
240
[email protected]f829cc362012-03-10 10:09:16241TEST(MetricsLogManagerTest, StoreStagedLogTypes) {
242 // Ensure that types are preserved when storing staged logs.
243 {
244 MetricsLogManager log_manager;
245 DummyLogSerializer* serializer = new DummyLogSerializer;
246 log_manager.set_log_serializer(serializer);
[email protected]80a8f312013-12-16 18:00:30247 log_manager.LoadPersistedUnsentLogs();
[email protected]f829cc362012-03-10 10:09:16248
[email protected]9eae4032014-04-09 19:15:19249 MetricsLogBase* log =
250 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
251 log_manager.BeginLoggingWithLog(log);
[email protected]f829cc362012-03-10 10:09:16252 log_manager.FinishCurrentLog();
253 log_manager.StageNextLogForUpload();
[email protected]e7508d82012-05-03 15:59:53254 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
[email protected]f829cc362012-03-10 10:09:16255 log_manager.PersistUnsentLogs();
256
[email protected]9eae4032014-04-09 19:15:19257 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30258 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]f829cc362012-03-10 10:09:16259 }
260
261 {
262 MetricsLogManager log_manager;
263 DummyLogSerializer* serializer = new DummyLogSerializer;
264 log_manager.set_log_serializer(serializer);
[email protected]80a8f312013-12-16 18:00:30265 log_manager.LoadPersistedUnsentLogs();
[email protected]f829cc362012-03-10 10:09:16266
[email protected]9eae4032014-04-09 19:15:19267 MetricsLogBase* log =
268 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
269 log_manager.BeginLoggingWithLog(log);
[email protected]f829cc362012-03-10 10:09:16270 log_manager.FinishCurrentLog();
271 log_manager.StageNextLogForUpload();
[email protected]e7508d82012-05-03 15:59:53272 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
[email protected]f829cc362012-03-10 10:09:16273 log_manager.PersistUnsentLogs();
274
[email protected]9eae4032014-04-09 19:15:19275 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30276 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]f829cc362012-03-10 10:09:16277 }
278}
279
[email protected]cac267c2011-09-29 15:18:10280TEST(MetricsLogManagerTest, LargeLogDiscarding) {
281 MetricsLogManager log_manager;
282 DummyLogSerializer* serializer = new DummyLogSerializer;
283 log_manager.set_log_serializer(serializer);
[email protected]80a8f312013-12-16 18:00:30284 log_manager.LoadPersistedUnsentLogs();
285
[email protected]cac267c2011-09-29 15:18:10286 // Set the size threshold very low, to verify that it's honored.
287 log_manager.set_max_ongoing_log_store_size(1);
288
[email protected]9eae4032014-04-09 19:15:19289 MetricsLogBase* log1 =
290 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
291 MetricsLogBase* log2 =
292 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
293 log_manager.BeginLoggingWithLog(log1);
[email protected]29948262012-03-01 12:15:08294 log_manager.FinishCurrentLog();
[email protected]9eae4032014-04-09 19:15:19295 log_manager.BeginLoggingWithLog(log2);
[email protected]29948262012-03-01 12:15:08296 log_manager.FinishCurrentLog();
[email protected]cac267c2011-09-29 15:18:10297
298 // Only the ongoing log should be written out, due to the threshold.
299 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19300 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30301 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]cac267c2011-09-29 15:18:10302}
[email protected]e7508d82012-05-03 15:59:53303
304TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) {
305 // Ensure that provisional store works, and discards the correct log.
306 {
307 MetricsLogManager log_manager;
[email protected]80a8f312013-12-16 18:00:30308 DummyLogSerializer* serializer = new DummyLogSerializer;
309 log_manager.set_log_serializer(serializer);
310 log_manager.LoadPersistedUnsentLogs();
311
[email protected]9eae4032014-04-09 19:15:19312 MetricsLogBase* log1 =
313 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
314 MetricsLogBase* log2 =
315 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
316 log_manager.BeginLoggingWithLog(log1);
[email protected]e7508d82012-05-03 15:59:53317 log_manager.FinishCurrentLog();
[email protected]9eae4032014-04-09 19:15:19318 log_manager.BeginLoggingWithLog(log2);
[email protected]e7508d82012-05-03 15:59:53319 log_manager.StageNextLogForUpload();
320 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
321 log_manager.FinishCurrentLog();
322 log_manager.DiscardLastProvisionalStore();
323
[email protected]e7508d82012-05-03 15:59:53324 log_manager.PersistUnsentLogs();
[email protected]9eae4032014-04-09 19:15:19325 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
[email protected]0edf8762013-11-21 18:33:30326 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]e7508d82012-05-03 15:59:53327 }
328}
329
330TEST(MetricsLogManagerTest, ProvisionalStoreNoop) {
331 // Ensure that trying to drop a sent log is a no-op, even if another log has
332 // since been staged.
333 {
334 MetricsLogManager log_manager;
[email protected]80a8f312013-12-16 18:00:30335 DummyLogSerializer* serializer = new DummyLogSerializer;
336 log_manager.set_log_serializer(serializer);
337 log_manager.LoadPersistedUnsentLogs();
338
[email protected]9eae4032014-04-09 19:15:19339 MetricsLogBase* log1 =
340 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
341 MetricsLogBase* log2 =
342 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
343 log_manager.BeginLoggingWithLog(log1);
[email protected]e7508d82012-05-03 15:59:53344 log_manager.FinishCurrentLog();
345 log_manager.StageNextLogForUpload();
346 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
347 log_manager.StageNextLogForUpload();
[email protected]5f3e1642013-05-05 03:37:34348 log_manager.DiscardStagedLog();
[email protected]9eae4032014-04-09 19:15:19349 log_manager.BeginLoggingWithLog(log2);
[email protected]e7508d82012-05-03 15:59:53350 log_manager.FinishCurrentLog();
351 log_manager.StageNextLogForUpload();
352 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
353 log_manager.DiscardLastProvisionalStore();
354
[email protected]e7508d82012-05-03 15:59:53355 log_manager.PersistUnsentLogs();
[email protected]0edf8762013-11-21 18:33:30356 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]e7508d82012-05-03 15:59:53357 }
358
359 // Ensure that trying to drop more than once is a no-op
360 {
361 MetricsLogManager log_manager;
[email protected]80a8f312013-12-16 18:00:30362 DummyLogSerializer* serializer = new DummyLogSerializer;
363 log_manager.set_log_serializer(serializer);
364 log_manager.LoadPersistedUnsentLogs();
365
[email protected]9eae4032014-04-09 19:15:19366 MetricsLogBase* log1 =
367 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
368 MetricsLogBase* log2 =
369 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
370 log_manager.BeginLoggingWithLog(log1);
[email protected]e7508d82012-05-03 15:59:53371 log_manager.FinishCurrentLog();
372 log_manager.StageNextLogForUpload();
373 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
[email protected]9eae4032014-04-09 19:15:19374 log_manager.BeginLoggingWithLog(log2);
[email protected]e7508d82012-05-03 15:59:53375 log_manager.FinishCurrentLog();
376 log_manager.StageNextLogForUpload();
377 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
378 log_manager.DiscardLastProvisionalStore();
379 log_manager.DiscardLastProvisionalStore();
380
[email protected]e7508d82012-05-03 15:59:53381 log_manager.PersistUnsentLogs();
[email protected]0edf8762013-11-21 18:33:30382 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
[email protected]e7508d82012-05-03 15:59:53383 }
384}
[email protected]cfee9aa52013-10-19 17:53:05385
386TEST(MetricsLogManagerTest, SerializedLog) {
387 const char kFooText[] = "foo";
388 const std::string foo_hash = base::SHA1HashString(kFooText);
389 const char kBarText[] = "bar";
390 const std::string bar_hash = base::SHA1HashString(kBarText);
391
392 MetricsLogManager::SerializedLog log;
393 EXPECT_TRUE(log.log_text().empty());
394 EXPECT_TRUE(log.log_hash().empty());
395
396 std::string foo = kFooText;
397 log.SwapLogText(&foo);
398 EXPECT_TRUE(foo.empty());
399 EXPECT_FALSE(log.IsEmpty());
400 EXPECT_EQ(kFooText, log.log_text());
401 EXPECT_EQ(foo_hash, log.log_hash());
402
403 std::string bar = kBarText;
404 log.SwapLogText(&bar);
405 EXPECT_EQ(kFooText, bar);
406 EXPECT_FALSE(log.IsEmpty());
407 EXPECT_EQ(kBarText, log.log_text());
408 EXPECT_EQ(bar_hash, log.log_hash());
409
410 log.Clear();
411 EXPECT_TRUE(log.IsEmpty());
412 EXPECT_TRUE(log.log_text().empty());
413 EXPECT_TRUE(log.log_hash().empty());
414
415 MetricsLogManager::SerializedLog log2;
416 foo = kFooText;
417 log2.SwapLogText(&foo);
418 log.Swap(&log2);
419 EXPECT_FALSE(log.IsEmpty());
420 EXPECT_EQ(kFooText, log.log_text());
421 EXPECT_EQ(foo_hash, log.log_hash());
422 EXPECT_TRUE(log2.IsEmpty());
423 EXPECT_TRUE(log2.log_text().empty());
424 EXPECT_TRUE(log2.log_hash().empty());
425}
[email protected]064107e2014-05-02 00:59:06426
427} // namespace metrics