1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/metrics/metrics_log_manager.h" 68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/pref_registry_simple.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/prefs/testing_pref_service.h" 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/metrics/metrics_log.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/metrics/metrics_pref_names.h" 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/metrics/test_metrics_service_client.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace metrics { 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dummy serializer that just stores logs in memory. 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class TestLogPrefService : public TestingPrefServiceSimple { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService() { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registry()->RegisterListPref(prefs::kMetricsInitialLogs); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) registry()->RegisterListPref(prefs::kMetricsOngoingLogs); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of logs of the given type. 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t TypeCount(MetricsLog::LogType log_type) { 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int list_length = 0; 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (log_type == MetricsLog::INITIAL_STABILITY_LOG) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) list_length = GetList(prefs::kMetricsInitialLogs)->GetSize(); 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize(); 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return list_length / 2; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, StandardFlow) { 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure a new manager has a clean slate. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, log_manager.current_log()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the normal flow works. 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MetricsLog* initial_log = new MetricsLog( 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(initial_log)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(initial_log, log_manager.current_log()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, log_manager.current_log()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(log_manager.has_unsent_logs()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MetricsLog* second_log = 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(second_log)); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(second_log, log_manager.current_log()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(log_manager.has_staged_log()); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(log_manager.staged_log().empty()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(second_log, log_manager.current_log()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, AbandonedLog) { 8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MetricsLog* dummy_log = new MetricsLog( 8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(dummy_log)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(dummy_log, log_manager.current_log()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.DiscardCurrentLog(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, log_manager.current_log()); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, InterjectedLog) { 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MetricsLog* ongoing_log = 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service); 10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MetricsLog* temp_log = new MetricsLog( 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(ongoing_log)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ongoing_log, log_manager.current_log()); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PauseCurrentLog(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, log_manager.current_log()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(temp_log)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(temp_log, log_manager.current_log()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, log_manager.current_log()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.ResumePausedLog(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ongoing_log, log_manager.current_log()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_staged_log()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, InterjectedLogPreservesType) { 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PauseCurrentLog(); 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.ResumePausedLog(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the remaining log (which is the original ongoing log) still 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has the right type. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, StoreAndLoad) { 15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up some in-progress logging in a scoped log manager simulating the 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // leadup to quitting, then persist as would be done on quit. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate a log having already been unsent from a previous session. 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string log("proto"); 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PersistedLogs ongoing_logs(&pref_service, prefs::kMetricsOngoingLogs, 1, 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1, 0); 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ongoing_logs.StoreLog(log); 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ongoing_logs.SerializeLogs(); 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(log_manager.has_unsent_logs()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing should be written out until PersistUnsentLogs is called. 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now simulate the relaunch, ensure that the log manager restores 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // everything correctly, and verify that once the are handled they are not 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // re-persisted. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(log_manager.has_unsent_logs()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The initial log should be sent first; update the persisted storage to 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // verify. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle the first ongoing log. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(log_manager.has_unsent_logs()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle the last log. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(log_manager.has_unsent_logs()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called again. 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Persist, and make sure nothing is left. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, StoreStagedLogTypes) { 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that types are preserved when storing staged logs. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(MetricsLogManagerTest, LargeLogDiscarding) { 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the size threshold very low, to verify that it's honored. 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 1); 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the ongoing log should be written out, due to the threshold. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST(MetricsLogManagerTest, DiscardOrder) { 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Ensure that the correct log is discarded if new logs are pushed while 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // a log is staged. 28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestMetricsServiceClient client; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestLogPrefService pref_service; 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MetricsLogManager log_manager(&pref_service, 0); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) log_manager.LoadPersistedUnsentLogs(); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 29246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( 29346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.StageNextLogForUpload(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.FinishCurrentLog(); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) log_manager.DiscardStagedLog(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_manager.PersistUnsentLogs(); 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); 30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace metrics 305