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