| Index: components/metrics/metrics_log_manager_unittest.cc
|
| diff --git a/components/metrics/metrics_log_manager_unittest.cc b/components/metrics/metrics_log_manager_unittest.cc
|
| index e30a16c50c9bc5a1084de36232389c9da73194cd..3dafa34dcd3e4efcbd3a42ff952cedc6a2df9abf 100644
|
| --- a/components/metrics/metrics_log_manager_unittest.cc
|
| +++ b/components/metrics/metrics_log_manager_unittest.cc
|
| @@ -12,6 +12,7 @@
|
|
|
| #include "base/memory/ptr_util.h"
|
| #include "components/metrics/metrics_log.h"
|
| +#include "components/metrics/metrics_log_store.h"
|
| #include "components/metrics/metrics_pref_names.h"
|
| #include "components/metrics/persisted_logs_metrics_impl.h"
|
| #include "components/metrics/test_metrics_service_client.h"
|
| @@ -23,90 +24,68 @@ namespace metrics {
|
|
|
| namespace {
|
|
|
| -// Dummy serializer that just stores logs in memory.
|
| -class TestLogPrefService : public TestingPrefServiceSimple {
|
| +class MetricsLogManagerTest : public testing::Test {
|
| public:
|
| - TestLogPrefService() {
|
| - registry()->RegisterListPref(prefs::kMetricsInitialLogs);
|
| - registry()->RegisterListPref(prefs::kMetricsOngoingLogs);
|
| + MetricsLogManagerTest() : log_store_(&pref_service_, 0) {
|
| + MetricsLogStore::RegisterPrefs(pref_service_.registry());
|
| + log_store()->LoadPersistedUnsentLogs();
|
| }
|
| + ~MetricsLogManagerTest() override {}
|
|
|
| - // Returns the number of logs of the given type.
|
| - size_t TypeCount(MetricsLog::LogType log_type) {
|
| - int list_length = 0;
|
| - if (log_type == MetricsLog::INITIAL_STABILITY_LOG)
|
| - list_length = GetList(prefs::kMetricsInitialLogs)->GetSize();
|
| - else
|
| - list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize();
|
| - return list_length;
|
| + MetricsLogStore* log_store() { return &log_store_; }
|
| +
|
| + MetricsLog* CreateLog(MetricsLog::LogType log_type) {
|
| + return new MetricsLog("id", 0, log_type, &client_, &pref_service_);
|
| }
|
| +
|
| + private:
|
| + TestMetricsServiceClient client_;
|
| + TestingPrefServiceSimple pref_service_;
|
| + MetricsLogStore log_store_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MetricsLogManagerTest);
|
| };
|
|
|
| } // namespace
|
|
|
| -TEST(MetricsLogManagerTest, StandardFlow) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| +TEST_F(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.
|
| - MetricsLog* initial_log = new MetricsLog(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
|
| + MetricsLog* initial_log = CreateLog(MetricsLog::INITIAL_STABILITY_LOG);
|
| log_manager.BeginLoggingWithLog(base::WrapUnique(initial_log));
|
| EXPECT_EQ(initial_log, log_manager.current_log());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
|
|
| - log_manager.FinishCurrentLog();
|
| + EXPECT_FALSE(log_store()->has_unsent_logs());
|
| + log_manager.FinishCurrentLog(log_store());
|
| EXPECT_EQ(NULL, log_manager.current_log());
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| - EXPECT_FALSE(log_manager.has_staged_log());
|
| + EXPECT_TRUE(log_store()->has_unsent_logs());
|
|
|
| - MetricsLog* second_log =
|
| - new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service);
|
| + MetricsLog* second_log = CreateLog(MetricsLog::ONGOING_LOG);
|
| log_manager.BeginLoggingWithLog(base::WrapUnique(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().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_FALSE(log_manager.has_unsent_logs());
|
| }
|
|
|
| -TEST(MetricsLogManagerTest, AbandonedLog) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| +TEST_F(MetricsLogManagerTest, AbandonedLog) {
|
| + MetricsLogManager log_manager;
|
|
|
| - MetricsLog* dummy_log = new MetricsLog(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
|
| + MetricsLog* dummy_log = CreateLog(MetricsLog::INITIAL_STABILITY_LOG);
|
| log_manager.BeginLoggingWithLog(base::WrapUnique(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) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| +// Make sure that interjecting logs updates the "current" log correctly.
|
| +TEST_F(MetricsLogManagerTest, InterjectedLog) {
|
| + MetricsLogManager log_manager;
|
|
|
| - MetricsLog* ongoing_log =
|
| - new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service);
|
| - MetricsLog* temp_log = new MetricsLog(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service);
|
| + MetricsLog* ongoing_log = CreateLog(MetricsLog::ONGOING_LOG);
|
| + MetricsLog* temp_log = CreateLog(MetricsLog::INITIAL_STABILITY_LOG);
|
|
|
| log_manager.BeginLoggingWithLog(base::WrapUnique(ongoing_log));
|
| EXPECT_EQ(ongoing_log, log_manager.current_log());
|
| @@ -116,195 +95,33 @@ TEST(MetricsLogManagerTest, InterjectedLog) {
|
|
|
| log_manager.BeginLoggingWithLog(base::WrapUnique(temp_log));
|
| EXPECT_EQ(temp_log, log_manager.current_log());
|
| - log_manager.FinishCurrentLog();
|
| + log_manager.FinishCurrentLog(log_store());
|
| 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) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| +// Make sure that when one log is interjected by another, that finishing them
|
| +// creates logs of the correct type.
|
| +TEST_F(MetricsLogManagerTest, InterjectedLogPreservesType) {
|
| + MetricsLogManager log_manager;
|
|
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service));
|
| + log_manager.BeginLoggingWithLog(
|
| + base::WrapUnique(CreateLog(MetricsLog::ONGOING_LOG)));
|
| log_manager.PauseCurrentLog();
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| + log_manager.BeginLoggingWithLog(
|
| + base::WrapUnique(CreateLog(MetricsLog::INITIAL_STABILITY_LOG)));
|
| + log_manager.FinishCurrentLog(log_store());
|
| 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, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, StoreAndLoad) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - // 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(&pref_service, 0);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - // Simulate a log having already been unsent from a previous session.
|
| - {
|
| - std::string log("proto");
|
| - PersistedLogs ongoing_logs(std::unique_ptr<PersistedLogsMetricsImpl>(
|
| - new PersistedLogsMetricsImpl()),
|
| - &pref_service, prefs::kMetricsOngoingLogs,
|
| - 1, 1, 0);
|
| - ongoing_logs.StoreLog(log);
|
| - ongoing_logs.SerializeLogs();
|
| - }
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - EXPECT_FALSE(log_manager.has_unsent_logs());
|
| - log_manager.LoadPersistedUnsentLogs();
|
| - EXPECT_TRUE(log_manager.has_unsent_logs());
|
| -
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service));
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.FinishCurrentLog();
|
| -
|
| - // Nothing should be written out until PersistUnsentLogs is called.
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::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(&pref_service, 0);
|
| - 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, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::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, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - // Persist, and make sure nothing is left.
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, StoreStagedLogTypes) {
|
| - TestMetricsServiceClient client;
|
| -
|
| - // Ensure that types are preserved when storing staged logs.
|
| - {
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.PersistUnsentLogs();
|
| -
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - }
|
| -
|
| - {
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.PersistUnsentLogs();
|
| -
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - }
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, LargeLogDiscarding) {
|
| - TestMetricsServiceClient client;
|
| - TestLogPrefService pref_service;
|
| - // Set the size threshold very low, to verify that it's honored.
|
| - MetricsLogManager log_manager(&pref_service, 1);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| -
|
| - // Only the ongoing log should be written out, due to the threshold.
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| -}
|
| -
|
| -TEST(MetricsLogManagerTest, DiscardOrder) {
|
| - // Ensure that the correct log is discarded if new logs are pushed while
|
| - // a log is staged.
|
| - TestMetricsServiceClient client;
|
| - {
|
| - TestLogPrefService pref_service;
|
| - MetricsLogManager log_manager(&pref_service, 0);
|
| - log_manager.LoadPersistedUnsentLogs();
|
| -
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service));
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.BeginLoggingWithLog(base::MakeUnique<MetricsLog>(
|
| - "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service));
|
| - log_manager.StageNextLogForUpload();
|
| - log_manager.FinishCurrentLog();
|
| - log_manager.DiscardStagedLog();
|
| -
|
| - log_manager.PersistUnsentLogs();
|
| - EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG));
|
| - EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG));
|
| - }
|
| + // Finishing the interjecting inital log should have stored an initial log.
|
| + EXPECT_EQ(1U, log_store()->initial_log_count());
|
| + EXPECT_EQ(0U, log_store()->ongoing_log_count());
|
| +
|
| + // Finishing the interjected ongoing log should store an ongoing log.
|
| + log_manager.FinishCurrentLog(log_store());
|
| + EXPECT_EQ(1U, log_store()->initial_log_count());
|
| + EXPECT_EQ(1U, log_store()->ongoing_log_count());
|
| }
|
|
|
| } // namespace metrics
|
|
|