OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/common/metrics/metrics_log_manager.h" |
| 6 |
5 #include <string> | 7 #include <string> |
6 #include <utility> | 8 #include <utility> |
7 #include <vector> | 9 #include <vector> |
8 | 10 |
| 11 #include "base/sha1.h" |
9 #include "chrome/common/metrics/metrics_log_base.h" | 12 #include "chrome/common/metrics/metrics_log_base.h" |
10 #include "chrome/common/metrics/metrics_log_manager.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 | 14 |
13 namespace { | 15 namespace { |
14 | 16 |
15 class MetricsLogManagerTest : public testing::Test { | |
16 }; | |
17 | |
18 // Dummy serializer that just stores logs in memory. | 17 // Dummy serializer that just stores logs in memory. |
19 class DummyLogSerializer : public MetricsLogManager::LogSerializer { | 18 class DummyLogSerializer : public MetricsLogManager::LogSerializer { |
20 public: | 19 public: |
21 virtual void SerializeLogs(const std::vector<std::string>& logs, | 20 virtual void SerializeLogs( |
22 MetricsLogManager::LogType log_type) OVERRIDE { | 21 const std::vector<MetricsLogManager::SerializedLog>& logs, |
| 22 MetricsLogManager::LogType log_type) OVERRIDE { |
23 persisted_logs_[log_type] = logs; | 23 persisted_logs_[log_type] = logs; |
24 } | 24 } |
25 | 25 |
26 virtual void DeserializeLogs(MetricsLogManager::LogType log_type, | 26 virtual void DeserializeLogs( |
27 std::vector<std::string>* logs) OVERRIDE { | 27 MetricsLogManager::LogType log_type, |
| 28 std::vector<MetricsLogManager::SerializedLog>* logs) OVERRIDE { |
28 ASSERT_NE(static_cast<void*>(NULL), logs); | 29 ASSERT_NE(static_cast<void*>(NULL), logs); |
29 *logs = persisted_logs_[log_type]; | 30 *logs = persisted_logs_[log_type]; |
30 } | 31 } |
31 | 32 |
32 // Returns the number of logs of the given type. | 33 // Returns the number of logs of the given type. |
33 size_t TypeCount(MetricsLogManager::LogType log_type) { | 34 size_t TypeCount(MetricsLogManager::LogType log_type) { |
34 return persisted_logs_[log_type].size(); | 35 return persisted_logs_[log_type].size(); |
35 } | 36 } |
36 | 37 |
37 // In-memory "persitent storage". | 38 // In-memory "persitent storage". |
38 std::vector<std::string> persisted_logs_[2]; | 39 std::vector<MetricsLogManager::SerializedLog> persisted_logs_[2]; |
39 }; | 40 }; |
40 | 41 |
41 } // namespace | 42 } // namespace |
42 | 43 |
43 TEST(MetricsLogManagerTest, StandardFlow) { | 44 TEST(MetricsLogManagerTest, StandardFlow) { |
44 MetricsLogManager log_manager; | 45 MetricsLogManager log_manager; |
45 | 46 |
46 // Make sure a new manager has a clean slate. | 47 // Make sure a new manager has a clean slate. |
47 EXPECT_EQ(NULL, log_manager.current_log()); | 48 EXPECT_EQ(NULL, log_manager.current_log()); |
48 EXPECT_FALSE(log_manager.has_staged_log()); | 49 EXPECT_FALSE(log_manager.has_staged_log()); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 // has the right type. | 133 // has the right type. |
133 DummyLogSerializer* serializer = new DummyLogSerializer; | 134 DummyLogSerializer* serializer = new DummyLogSerializer; |
134 log_manager.set_log_serializer(serializer); | 135 log_manager.set_log_serializer(serializer); |
135 log_manager.FinishCurrentLog(); | 136 log_manager.FinishCurrentLog(); |
136 log_manager.PersistUnsentLogs(); | 137 log_manager.PersistUnsentLogs(); |
137 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 138 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
138 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 139 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
139 } | 140 } |
140 | 141 |
141 TEST(MetricsLogManagerTest, StoreAndLoad) { | 142 TEST(MetricsLogManagerTest, StoreAndLoad) { |
142 std::vector<std::string> initial_logs; | 143 std::vector<MetricsLogManager::SerializedLog> initial_logs; |
143 std::vector<std::string> ongoing_logs; | 144 std::vector<MetricsLogManager::SerializedLog> ongoing_logs; |
144 | 145 |
145 // Set up some in-progress logging in a scoped log manager simulating the | 146 // Set up some in-progress logging in a scoped log manager simulating the |
146 // leadup to quitting, then persist as would be done on quit. | 147 // leadup to quitting, then persist as would be done on quit. |
147 { | 148 { |
148 MetricsLogManager log_manager; | 149 MetricsLogManager log_manager; |
149 DummyLogSerializer* serializer = new DummyLogSerializer; | 150 DummyLogSerializer* serializer = new DummyLogSerializer; |
150 log_manager.set_log_serializer(serializer); | 151 log_manager.set_log_serializer(serializer); |
151 // Simulate a log having already been unsent from a previous session. | 152 // Simulate a log having already been unsent from a previous session. |
152 std::string log = "proto"; | 153 MetricsLogManager::SerializedLog log; |
| 154 std::string text = "proto"; |
| 155 log.SwapLogText(&text); |
153 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG].push_back(log); | 156 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG].push_back(log); |
154 EXPECT_FALSE(log_manager.has_unsent_logs()); | 157 EXPECT_FALSE(log_manager.has_unsent_logs()); |
155 log_manager.LoadPersistedUnsentLogs(); | 158 log_manager.LoadPersistedUnsentLogs(); |
156 EXPECT_TRUE(log_manager.has_unsent_logs()); | 159 EXPECT_TRUE(log_manager.has_unsent_logs()); |
157 | 160 |
158 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); | 161 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); |
159 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); | 162 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); |
160 log_manager.BeginLoggingWithLog(log1, MetricsLogManager::INITIAL_LOG); | 163 log_manager.BeginLoggingWithLog(log1, MetricsLogManager::INITIAL_LOG); |
161 log_manager.FinishCurrentLog(); | 164 log_manager.FinishCurrentLog(); |
162 log_manager.BeginLoggingWithLog(log2, MetricsLogManager::ONGOING_LOG); | 165 log_manager.BeginLoggingWithLog(log2, MetricsLogManager::ONGOING_LOG); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE); | 339 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE); |
337 log_manager.DiscardLastProvisionalStore(); | 340 log_manager.DiscardLastProvisionalStore(); |
338 log_manager.DiscardLastProvisionalStore(); | 341 log_manager.DiscardLastProvisionalStore(); |
339 | 342 |
340 DummyLogSerializer* serializer = new DummyLogSerializer; | 343 DummyLogSerializer* serializer = new DummyLogSerializer; |
341 log_manager.set_log_serializer(serializer); | 344 log_manager.set_log_serializer(serializer); |
342 log_manager.PersistUnsentLogs(); | 345 log_manager.PersistUnsentLogs(); |
343 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 346 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
344 } | 347 } |
345 } | 348 } |
| 349 |
| 350 TEST(MetricsLogManagerTest, SerializedLog) { |
| 351 const char kFooText[] = "foo"; |
| 352 const std::string foo_hash = base::SHA1HashString(kFooText); |
| 353 const char kBarText[] = "bar"; |
| 354 const std::string bar_hash = base::SHA1HashString(kBarText); |
| 355 |
| 356 MetricsLogManager::SerializedLog log; |
| 357 EXPECT_TRUE(log.log_text().empty()); |
| 358 EXPECT_TRUE(log.log_hash().empty()); |
| 359 |
| 360 std::string foo = kFooText; |
| 361 log.SwapLogText(&foo); |
| 362 EXPECT_TRUE(foo.empty()); |
| 363 EXPECT_FALSE(log.IsEmpty()); |
| 364 EXPECT_EQ(kFooText, log.log_text()); |
| 365 EXPECT_EQ(foo_hash, log.log_hash()); |
| 366 |
| 367 std::string bar = kBarText; |
| 368 log.SwapLogText(&bar); |
| 369 EXPECT_EQ(kFooText, bar); |
| 370 EXPECT_FALSE(log.IsEmpty()); |
| 371 EXPECT_EQ(kBarText, log.log_text()); |
| 372 EXPECT_EQ(bar_hash, log.log_hash()); |
| 373 |
| 374 log.Clear(); |
| 375 EXPECT_TRUE(log.IsEmpty()); |
| 376 EXPECT_TRUE(log.log_text().empty()); |
| 377 EXPECT_TRUE(log.log_hash().empty()); |
| 378 |
| 379 MetricsLogManager::SerializedLog log2; |
| 380 foo = kFooText; |
| 381 log2.SwapLogText(&foo); |
| 382 log.Swap(&log2); |
| 383 EXPECT_FALSE(log.IsEmpty()); |
| 384 EXPECT_EQ(kFooText, log.log_text()); |
| 385 EXPECT_EQ(foo_hash, log.log_hash()); |
| 386 EXPECT_TRUE(log2.IsEmpty()); |
| 387 EXPECT_TRUE(log2.log_text().empty()); |
| 388 EXPECT_TRUE(log2.log_hash().empty()); |
| 389 } |
OLD | NEW |