| Index: chrome/common/metrics/metrics_log_manager_unittest.cc
|
| diff --git a/chrome/common/metrics/metrics_log_manager_unittest.cc b/chrome/common/metrics/metrics_log_manager_unittest.cc
|
| deleted file mode 100644
|
| index 899cc0b4ecaeaea8304e515c7f87a4b66ef047bc..0000000000000000000000000000000000000000
|
| --- a/chrome/common/metrics/metrics_log_manager_unittest.cc
|
| +++ /dev/null
|
| @@ -1,423 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/common/metrics/metrics_log_manager.h"
|
| -
|
| -#include <string>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/sha1.h"
|
| -#include "chrome/common/metrics/metrics_log_base.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace {
|
| -
|
| -// Dummy serializer that just stores logs in memory.
|
| -class DummyLogSerializer : public MetricsLogManager::LogSerializer {
|
| - public:
|
| - virtual void SerializeLogs(
|
| - const std::vector<MetricsLogManager::SerializedLog>& logs,
|
| - MetricsLogManager::LogType log_type) OVERRIDE {
|
| - persisted_logs_[log_type] = logs;
|
| - }
|
| -
|
| - virtual void DeserializeLogs(
|
| - MetricsLogManager::LogType log_type,
|
| - std::vector<MetricsLogManager::SerializedLog>* logs) OVERRIDE {
|
| - ASSERT_NE(static_cast<void*>(NULL), logs);
|
| - *logs = persisted_logs_[log_type];
|
| - }
|
| -
|
| - // Returns the number of logs of the given type.
|
| - size_t TypeCount(MetricsLogManager::LogType log_type) {
|
| - return persisted_logs_[log_type].size();
|
| - }
|
| -
|
| - // In-memory "persitent storage".
|
| - std::vector<MetricsLogManager::SerializedLog> persisted_logs_[2];
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST(MetricsLogManagerTest, StandardFlow) {
|
| - MetricsLogManager log_manager;
|
| -
|
| - // Make sure a new manager has a clean slate.
|
| - EXPECT_EQ(NULL, log_manager.current_log());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| -
|
| - // Check that the normal flow works.
|
| - MetricsLogBase* initial_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(initial_log);
|
| - EXPECT_EQ(initial_log, log_manager.current_log());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| -
|
| - log_manager.FinishCurrentLog();
|
| - EXPECT_EQ(NULL, log_manager.current_log());
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| -
|
| - MetricsLogBase* second_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - log_manager.BeginLoggingWithLog(second_log);
|
| - EXPECT_EQ(second_log, log_manager.current_log());
|
| -
|
| - log_manager.StageNextLogForUpload();
|
| - EXPECT_TRUE(log_manager.has_staged_log());
|
| - EXPECT_FALSE(log_manager.staged_log_text().empty());
|
| -
|
| - log_manager.DiscardStagedLog();
|
| - EXPECT_EQ(second_log, log_manager.current_log());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| - EXPECT_TRUE(log_manager.staged_log_text().empty());
|
| -
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, AbandonedLog) {
|
| - MetricsLogManager log_manager;
|
| -
|
| - MetricsLogBase* dummy_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(dummy_log);
|
| - EXPECT_EQ(dummy_log, log_manager.current_log());
|
| -
|
| - log_manager.DiscardCurrentLog();
|
| - EXPECT_EQ(NULL, log_manager.current_log());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, InterjectedLog) {
|
| - MetricsLogManager log_manager;
|
| -
|
| - MetricsLogBase* ongoing_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
|
| - MetricsLogBase* temp_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| -
|
| - log_manager.BeginLoggingWithLog(ongoing_log);
|
| - EXPECT_EQ(ongoing_log, log_manager.current_log());
|
| -
|
| - log_manager.PauseCurrentLog();
|
| - EXPECT_EQ(NULL, log_manager.current_log());
|
| -
|
| - log_manager.BeginLoggingWithLog(temp_log);
|
| - EXPECT_EQ(temp_log, log_manager.current_log());
|
| - log_manager.FinishCurrentLog();
|
| - EXPECT_EQ(NULL, log_manager.current_log());
|
| -
|
| - log_manager.ResumePausedLog();
|
| - EXPECT_EQ(ongoing_log, log_manager.current_log());
|
| -
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, InterjectedLogPreservesType) {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* ongoing_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
|
| - MetricsLogBase* temp_log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| -
|
| - log_manager.BeginLoggingWithLog(ongoing_log);
|
| - log_manager.PauseCurrentLog();
|
| - log_manager.BeginLoggingWithLog(temp_log);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.ResumePausedLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| -
|
| - // Verify that the remaining log (which is the original ongoing log) still
|
| - // has the right type.
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, StoreAndLoad) {
|
| - std::vector<MetricsLogManager::SerializedLog> initial_logs;
|
| - std::vector<MetricsLogManager::SerializedLog> ongoing_logs;
|
| -
|
| - // Set up some in-progress logging in a scoped log manager simulating the
|
| - // leadup to quitting, then persist as would be done on quit.
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - // Simulate a log having already been unsent from a previous session.
|
| - MetricsLogManager::SerializedLog log;
|
| - std::string text = "proto";
|
| - log.SwapLogText(&text);
|
| - serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG].push_back(log);
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| - log_manager.LoadPersistedUnsentLogs();
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| -
|
| - MetricsLogBase* log1 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - MetricsLogBase* log2 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(log1);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(log2);
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
|
| - log_manager.FinishCurrentLog();
|
| -
|
| - // Nothing should be written out until PersistUnsentLogs is called.
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| -
|
| - // Save the logs to transfer over to a new serializer (since log_manager
|
| - // owns |serializer|, so it's about to go away.
|
| - initial_logs =
|
| - serializer->persisted_logs_[MetricsLogBase::INITIAL_STABILITY_LOG];
|
| - ongoing_logs = serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG];
|
| - }
|
| -
|
| - // Now simulate the relaunch, ensure that the log manager restores
|
| - // everything correctly, and verify that once the are handled they are not
|
| - // re-persisted.
|
| - {
|
| - MetricsLogManager log_manager;
|
| -
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - serializer->persisted_logs_[MetricsLogBase::INITIAL_STABILITY_LOG] =
|
| - initial_logs;
|
| - serializer->persisted_logs_[MetricsLogBase::ONGOING_LOG] = ongoing_logs;
|
| -
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| -
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| - // The initial log should be sent first; update the persisted storage to
|
| - // verify.
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| -
|
| - // Handle the first ongoing log.
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| -
|
| - // Handle the last log.
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| -
|
| - // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been
|
| - // called again.
|
| - EXPECT_EQ(2U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - // Persist, and make sure nothing is left.
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, StoreStagedLogTypes) {
|
| - // Ensure that types are preserved when storing staged logs.
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - log_manager.BeginLoggingWithLog(log);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
|
| - log_manager.PersistUnsentLogs();
|
| -
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* log =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(log);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
|
| - log_manager.PersistUnsentLogs();
|
| -
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, LargeLogDiscarding) {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - // Set the size threshold very low, to verify that it's honored.
|
| - log_manager.set_max_ongoing_log_store_size(1);
|
| -
|
| - MetricsLogBase* log1 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - MetricsLogBase* log2 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(log1);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(log2);
|
| - log_manager.FinishCurrentLog();
|
| -
|
| - // Only the ongoing log should be written out, due to the threshold.
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) {
|
| - // Ensure that provisional store works, and discards the correct log.
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* log1 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v");
|
| - MetricsLogBase* log2 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v");
|
| - log_manager.BeginLoggingWithLog(log1);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(log2);
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.DiscardLastProvisionalStore();
|
| -
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, serializer->TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, ProvisionalStoreNoop) {
|
| - // Ensure that trying to drop a sent log is a no-op, even if another log has
|
| - // since been staged.
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* log1 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - MetricsLogBase* log2 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - log_manager.BeginLoggingWithLog(log1);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.DiscardStagedLog();
|
| - log_manager.BeginLoggingWithLog(log2);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
|
| - log_manager.DiscardLastProvisionalStore();
|
| -
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -
|
| - // Ensure that trying to drop more than once is a no-op
|
| - {
|
| - MetricsLogManager log_manager;
|
| - DummyLogSerializer* serializer = new DummyLogSerializer;
|
| - log_manager.set_log_serializer(serializer);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - MetricsLogBase* log1 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - MetricsLogBase* log2 =
|
| - new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version");
|
| - log_manager.BeginLoggingWithLog(log1);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::NORMAL_STORE);
|
| - log_manager.BeginLoggingWithLog(log2);
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.StoreStagedLogAsUnsent(MetricsLogManager::PROVISIONAL_STORE);
|
| - log_manager.DiscardLastProvisionalStore();
|
| - log_manager.DiscardLastProvisionalStore();
|
| -
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, serializer->TypeCount(MetricsLogBase::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, SerializedLog) {
|
| - const char kFooText[] = "foo";
|
| - const std::string foo_hash = base::SHA1HashString(kFooText);
|
| - const char kBarText[] = "bar";
|
| - const std::string bar_hash = base::SHA1HashString(kBarText);
|
| -
|
| - MetricsLogManager::SerializedLog log;
|
| - EXPECT_TRUE(log.log_text().empty());
|
| - EXPECT_TRUE(log.log_hash().empty());
|
| -
|
| - std::string foo = kFooText;
|
| - log.SwapLogText(&foo);
|
| - EXPECT_TRUE(foo.empty());
|
| - EXPECT_FALSE(log.IsEmpty());
|
| - EXPECT_EQ(kFooText, log.log_text());
|
| - EXPECT_EQ(foo_hash, log.log_hash());
|
| -
|
| - std::string bar = kBarText;
|
| - log.SwapLogText(&bar);
|
| - EXPECT_EQ(kFooText, bar);
|
| - EXPECT_FALSE(log.IsEmpty());
|
| - EXPECT_EQ(kBarText, log.log_text());
|
| - EXPECT_EQ(bar_hash, log.log_hash());
|
| -
|
| - log.Clear();
|
| - EXPECT_TRUE(log.IsEmpty());
|
| - EXPECT_TRUE(log.log_text().empty());
|
| - EXPECT_TRUE(log.log_hash().empty());
|
| -
|
| - MetricsLogManager::SerializedLog log2;
|
| - foo = kFooText;
|
| - log2.SwapLogText(&foo);
|
| - log.Swap(&log2);
|
| - EXPECT_FALSE(log.IsEmpty());
|
| - EXPECT_EQ(kFooText, log.log_text());
|
| - EXPECT_EQ(foo_hash, log.log_hash());
|
| - EXPECT_TRUE(log2.IsEmpty());
|
| - EXPECT_TRUE(log2.log_text().empty());
|
| - EXPECT_TRUE(log2.log_hash().empty());
|
| -}
|
|
|