| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/metrics/metrics_log_manager.h" | 5 #include "components/metrics/metrics_log_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <utility> | 8 #include <utility> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/prefs/pref_registry_simple.h" | 11 #include "base/prefs/pref_registry_simple.h" |
| 12 #include "base/prefs/testing_pref_service.h" | 12 #include "base/prefs/testing_pref_service.h" |
| 13 #include "components/metrics/metrics_log_base.h" | 13 #include "components/metrics/metrics_log.h" |
| 14 #include "components/metrics/metrics_pref_names.h" | 14 #include "components/metrics/metrics_pref_names.h" |
| 15 #include "components/metrics/test_metrics_service_client.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 17 |
| 17 namespace metrics { | 18 namespace metrics { |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 // Dummy serializer that just stores logs in memory. | 22 // Dummy serializer that just stores logs in memory. |
| 22 class TestLogPrefService : public TestingPrefServiceSimple { | 23 class TestLogPrefService : public TestingPrefServiceSimple { |
| 23 public: | 24 public: |
| 24 TestLogPrefService() { | 25 TestLogPrefService() { |
| 25 registry()->RegisterListPref(prefs::kMetricsInitialLogs); | 26 registry()->RegisterListPref(prefs::kMetricsInitialLogs); |
| 26 registry()->RegisterListPref(prefs::kMetricsOngoingLogs); | 27 registry()->RegisterListPref(prefs::kMetricsOngoingLogs); |
| 27 } | 28 } |
| 29 |
| 28 // Returns the number of logs of the given type. | 30 // Returns the number of logs of the given type. |
| 29 size_t TypeCount(MetricsLogManager::LogType log_type) { | 31 size_t TypeCount(MetricsLog::LogType log_type) { |
| 30 int list_length = 0; | 32 int list_length = 0; |
| 31 if (log_type == MetricsLogBase::INITIAL_STABILITY_LOG) | 33 if (log_type == MetricsLog::INITIAL_STABILITY_LOG) |
| 32 list_length = GetList(prefs::kMetricsInitialLogs)->GetSize(); | 34 list_length = GetList(prefs::kMetricsInitialLogs)->GetSize(); |
| 33 else | 35 else |
| 34 list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize(); | 36 list_length = GetList(prefs::kMetricsOngoingLogs)->GetSize(); |
| 35 return list_length ? list_length - 2 : 0; | 37 return list_length ? list_length - 2 : 0; |
| 36 } | 38 } |
| 37 }; | 39 }; |
| 38 | 40 |
| 39 } // namespace | 41 } // namespace |
| 40 | 42 |
| 41 TEST(MetricsLogManagerTest, StandardFlow) { | 43 TEST(MetricsLogManagerTest, StandardFlow) { |
| 44 TestMetricsServiceClient client; |
| 42 TestLogPrefService pref_service; | 45 TestLogPrefService pref_service; |
| 43 MetricsLogManager log_manager(&pref_service, 0); | 46 MetricsLogManager log_manager(&pref_service, 0); |
| 44 | 47 |
| 45 // Make sure a new manager has a clean slate. | 48 // Make sure a new manager has a clean slate. |
| 46 EXPECT_EQ(NULL, log_manager.current_log()); | 49 EXPECT_EQ(NULL, log_manager.current_log()); |
| 47 EXPECT_FALSE(log_manager.has_staged_log()); | 50 EXPECT_FALSE(log_manager.has_staged_log()); |
| 48 EXPECT_FALSE(log_manager.has_unsent_logs()); | 51 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 49 | 52 |
| 50 // Check that the normal flow works. | 53 // Check that the normal flow works. |
| 51 MetricsLogBase* initial_log = | 54 MetricsLog* initial_log = new MetricsLog( |
| 52 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"); | 55 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); |
| 53 log_manager.BeginLoggingWithLog(make_scoped_ptr(initial_log)); | 56 log_manager.BeginLoggingWithLog(make_scoped_ptr(initial_log)); |
| 54 EXPECT_EQ(initial_log, log_manager.current_log()); | 57 EXPECT_EQ(initial_log, log_manager.current_log()); |
| 55 EXPECT_FALSE(log_manager.has_staged_log()); | 58 EXPECT_FALSE(log_manager.has_staged_log()); |
| 56 | 59 |
| 57 log_manager.FinishCurrentLog(); | 60 log_manager.FinishCurrentLog(); |
| 58 EXPECT_EQ(NULL, log_manager.current_log()); | 61 EXPECT_EQ(NULL, log_manager.current_log()); |
| 59 EXPECT_TRUE(log_manager.has_unsent_logs()); | 62 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 60 EXPECT_FALSE(log_manager.has_staged_log()); | 63 EXPECT_FALSE(log_manager.has_staged_log()); |
| 61 | 64 |
| 62 MetricsLogBase* second_log = | 65 MetricsLog* second_log = |
| 63 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"); | 66 new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service); |
| 64 log_manager.BeginLoggingWithLog(make_scoped_ptr(second_log)); | 67 log_manager.BeginLoggingWithLog(make_scoped_ptr(second_log)); |
| 65 EXPECT_EQ(second_log, log_manager.current_log()); | 68 EXPECT_EQ(second_log, log_manager.current_log()); |
| 66 | 69 |
| 67 log_manager.StageNextLogForUpload(); | 70 log_manager.StageNextLogForUpload(); |
| 68 EXPECT_TRUE(log_manager.has_staged_log()); | 71 EXPECT_TRUE(log_manager.has_staged_log()); |
| 69 EXPECT_FALSE(log_manager.staged_log().empty()); | 72 EXPECT_FALSE(log_manager.staged_log().empty()); |
| 70 | 73 |
| 71 log_manager.DiscardStagedLog(); | 74 log_manager.DiscardStagedLog(); |
| 72 EXPECT_EQ(second_log, log_manager.current_log()); | 75 EXPECT_EQ(second_log, log_manager.current_log()); |
| 73 EXPECT_FALSE(log_manager.has_staged_log()); | 76 EXPECT_FALSE(log_manager.has_staged_log()); |
| 74 EXPECT_FALSE(log_manager.has_unsent_logs()); | 77 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 75 | 78 |
| 76 EXPECT_FALSE(log_manager.has_unsent_logs()); | 79 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 77 } | 80 } |
| 78 | 81 |
| 79 TEST(MetricsLogManagerTest, AbandonedLog) { | 82 TEST(MetricsLogManagerTest, AbandonedLog) { |
| 83 TestMetricsServiceClient client; |
| 80 TestLogPrefService pref_service; | 84 TestLogPrefService pref_service; |
| 81 MetricsLogManager log_manager(&pref_service, 0); | 85 MetricsLogManager log_manager(&pref_service, 0); |
| 82 | 86 |
| 83 MetricsLogBase* dummy_log = | 87 MetricsLog* dummy_log = new MetricsLog( |
| 84 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"); | 88 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); |
| 85 log_manager.BeginLoggingWithLog(make_scoped_ptr(dummy_log)); | 89 log_manager.BeginLoggingWithLog(make_scoped_ptr(dummy_log)); |
| 86 EXPECT_EQ(dummy_log, log_manager.current_log()); | 90 EXPECT_EQ(dummy_log, log_manager.current_log()); |
| 87 | 91 |
| 88 log_manager.DiscardCurrentLog(); | 92 log_manager.DiscardCurrentLog(); |
| 89 EXPECT_EQ(NULL, log_manager.current_log()); | 93 EXPECT_EQ(NULL, log_manager.current_log()); |
| 90 EXPECT_FALSE(log_manager.has_staged_log()); | 94 EXPECT_FALSE(log_manager.has_staged_log()); |
| 91 } | 95 } |
| 92 | 96 |
| 93 TEST(MetricsLogManagerTest, InterjectedLog) { | 97 TEST(MetricsLogManagerTest, InterjectedLog) { |
| 98 TestMetricsServiceClient client; |
| 94 TestLogPrefService pref_service; | 99 TestLogPrefService pref_service; |
| 95 MetricsLogManager log_manager(&pref_service, 0); | 100 MetricsLogManager log_manager(&pref_service, 0); |
| 96 | 101 |
| 97 MetricsLogBase* ongoing_log = | 102 MetricsLog* ongoing_log = |
| 98 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v"); | 103 new MetricsLog("id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service); |
| 99 MetricsLogBase* temp_log = | 104 MetricsLog* temp_log = new MetricsLog( |
| 100 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"); | 105 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service); |
| 101 | 106 |
| 102 log_manager.BeginLoggingWithLog(make_scoped_ptr(ongoing_log)); | 107 log_manager.BeginLoggingWithLog(make_scoped_ptr(ongoing_log)); |
| 103 EXPECT_EQ(ongoing_log, log_manager.current_log()); | 108 EXPECT_EQ(ongoing_log, log_manager.current_log()); |
| 104 | 109 |
| 105 log_manager.PauseCurrentLog(); | 110 log_manager.PauseCurrentLog(); |
| 106 EXPECT_EQ(NULL, log_manager.current_log()); | 111 EXPECT_EQ(NULL, log_manager.current_log()); |
| 107 | 112 |
| 108 log_manager.BeginLoggingWithLog(make_scoped_ptr(temp_log)); | 113 log_manager.BeginLoggingWithLog(make_scoped_ptr(temp_log)); |
| 109 EXPECT_EQ(temp_log, log_manager.current_log()); | 114 EXPECT_EQ(temp_log, log_manager.current_log()); |
| 110 log_manager.FinishCurrentLog(); | 115 log_manager.FinishCurrentLog(); |
| 111 EXPECT_EQ(NULL, log_manager.current_log()); | 116 EXPECT_EQ(NULL, log_manager.current_log()); |
| 112 | 117 |
| 113 log_manager.ResumePausedLog(); | 118 log_manager.ResumePausedLog(); |
| 114 EXPECT_EQ(ongoing_log, log_manager.current_log()); | 119 EXPECT_EQ(ongoing_log, log_manager.current_log()); |
| 115 | 120 |
| 116 EXPECT_FALSE(log_manager.has_staged_log()); | 121 EXPECT_FALSE(log_manager.has_staged_log()); |
| 117 log_manager.StageNextLogForUpload(); | 122 log_manager.StageNextLogForUpload(); |
| 118 log_manager.DiscardStagedLog(); | 123 log_manager.DiscardStagedLog(); |
| 119 EXPECT_FALSE(log_manager.has_unsent_logs()); | 124 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 120 } | 125 } |
| 121 | 126 |
| 122 TEST(MetricsLogManagerTest, InterjectedLogPreservesType) { | 127 TEST(MetricsLogManagerTest, InterjectedLogPreservesType) { |
| 128 TestMetricsServiceClient client; |
| 123 TestLogPrefService pref_service; | 129 TestLogPrefService pref_service; |
| 124 MetricsLogManager log_manager(&pref_service, 0); | 130 MetricsLogManager log_manager(&pref_service, 0); |
| 125 log_manager.LoadPersistedUnsentLogs(); | 131 log_manager.LoadPersistedUnsentLogs(); |
| 126 | 132 |
| 127 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 133 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 128 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v"))); | 134 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 129 log_manager.PauseCurrentLog(); | 135 log_manager.PauseCurrentLog(); |
| 130 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 136 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 131 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"))); | 137 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 132 log_manager.FinishCurrentLog(); | 138 log_manager.FinishCurrentLog(); |
| 133 log_manager.ResumePausedLog(); | 139 log_manager.ResumePausedLog(); |
| 134 log_manager.StageNextLogForUpload(); | 140 log_manager.StageNextLogForUpload(); |
| 135 log_manager.DiscardStagedLog(); | 141 log_manager.DiscardStagedLog(); |
| 136 | 142 |
| 137 // Verify that the remaining log (which is the original ongoing log) still | 143 // Verify that the remaining log (which is the original ongoing log) still |
| 138 // has the right type. | 144 // has the right type. |
| 139 log_manager.FinishCurrentLog(); | 145 log_manager.FinishCurrentLog(); |
| 140 log_manager.PersistUnsentLogs(); | 146 log_manager.PersistUnsentLogs(); |
| 141 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG)); | 147 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 142 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 148 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 143 } | 149 } |
| 144 | 150 |
| 145 TEST(MetricsLogManagerTest, StoreAndLoad) { | 151 TEST(MetricsLogManagerTest, StoreAndLoad) { |
| 152 TestMetricsServiceClient client; |
| 146 TestLogPrefService pref_service; | 153 TestLogPrefService pref_service; |
| 147 // Set up some in-progress logging in a scoped log manager simulating the | 154 // Set up some in-progress logging in a scoped log manager simulating the |
| 148 // leadup to quitting, then persist as would be done on quit. | 155 // leadup to quitting, then persist as would be done on quit. |
| 149 { | 156 { |
| 150 MetricsLogManager log_manager(&pref_service, 0); | 157 MetricsLogManager log_manager(&pref_service, 0); |
| 151 log_manager.LoadPersistedUnsentLogs(); | 158 log_manager.LoadPersistedUnsentLogs(); |
| 152 | 159 |
| 153 // Simulate a log having already been unsent from a previous session. | 160 // Simulate a log having already been unsent from a previous session. |
| 154 { | 161 { |
| 155 std::string log("proto"); | 162 std::string log("proto"); |
| 156 metrics::PersistedLogs ongoing_logs( | 163 metrics::PersistedLogs ongoing_logs( |
| 157 &pref_service, prefs::kMetricsOngoingLogs, 1, 1, 0); | 164 &pref_service, prefs::kMetricsOngoingLogs, 1, 1, 0); |
| 158 ongoing_logs.StoreLog(&log); | 165 ongoing_logs.StoreLog(&log); |
| 159 ongoing_logs.SerializeLogs(); | 166 ongoing_logs.SerializeLogs(); |
| 160 } | 167 } |
| 161 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 168 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 162 EXPECT_FALSE(log_manager.has_unsent_logs()); | 169 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 163 log_manager.LoadPersistedUnsentLogs(); | 170 log_manager.LoadPersistedUnsentLogs(); |
| 164 EXPECT_TRUE(log_manager.has_unsent_logs()); | 171 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 165 | 172 |
| 166 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLogBase( | 173 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 167 "id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"))); | 174 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 168 log_manager.FinishCurrentLog(); | 175 log_manager.FinishCurrentLog(); |
| 169 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 176 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 170 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v"))); | 177 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 171 log_manager.StageNextLogForUpload(); | 178 log_manager.StageNextLogForUpload(); |
| 172 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 179 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); |
| 173 log_manager.FinishCurrentLog(); | 180 log_manager.FinishCurrentLog(); |
| 174 | 181 |
| 175 // Nothing should be written out until PersistUnsentLogs is called. | 182 // Nothing should be written out until PersistUnsentLogs is called. |
| 176 EXPECT_EQ(0U, pref_service.TypeCount( | 183 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 177 MetricsLogBase::INITIAL_STABILITY_LOG)); | 184 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 178 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 179 log_manager.PersistUnsentLogs(); | 185 log_manager.PersistUnsentLogs(); |
| 180 EXPECT_EQ(1U, pref_service.TypeCount( | 186 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 181 MetricsLogBase::INITIAL_STABILITY_LOG)); | 187 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 182 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 183 } | 188 } |
| 184 | 189 |
| 185 // Now simulate the relaunch, ensure that the log manager restores | 190 // Now simulate the relaunch, ensure that the log manager restores |
| 186 // everything correctly, and verify that once the are handled they are not | 191 // everything correctly, and verify that once the are handled they are not |
| 187 // re-persisted. | 192 // re-persisted. |
| 188 { | 193 { |
| 189 MetricsLogManager log_manager(&pref_service, 0); | 194 MetricsLogManager log_manager(&pref_service, 0); |
| 190 log_manager.LoadPersistedUnsentLogs(); | 195 log_manager.LoadPersistedUnsentLogs(); |
| 191 EXPECT_TRUE(log_manager.has_unsent_logs()); | 196 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 192 | 197 |
| 193 log_manager.StageNextLogForUpload(); | 198 log_manager.StageNextLogForUpload(); |
| 194 log_manager.DiscardStagedLog(); | 199 log_manager.DiscardStagedLog(); |
| 195 // The initial log should be sent first; update the persisted storage to | 200 // The initial log should be sent first; update the persisted storage to |
| 196 // verify. | 201 // verify. |
| 197 log_manager.PersistUnsentLogs(); | 202 log_manager.PersistUnsentLogs(); |
| 198 EXPECT_EQ(0U, pref_service.TypeCount( | 203 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 199 MetricsLogBase::INITIAL_STABILITY_LOG)); | 204 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 200 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 201 | 205 |
| 202 // Handle the first ongoing log. | 206 // Handle the first ongoing log. |
| 203 log_manager.StageNextLogForUpload(); | 207 log_manager.StageNextLogForUpload(); |
| 204 log_manager.DiscardStagedLog(); | 208 log_manager.DiscardStagedLog(); |
| 205 EXPECT_TRUE(log_manager.has_unsent_logs()); | 209 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 206 | 210 |
| 207 // Handle the last log. | 211 // Handle the last log. |
| 208 log_manager.StageNextLogForUpload(); | 212 log_manager.StageNextLogForUpload(); |
| 209 log_manager.DiscardStagedLog(); | 213 log_manager.DiscardStagedLog(); |
| 210 EXPECT_FALSE(log_manager.has_unsent_logs()); | 214 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 211 | 215 |
| 212 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been | 216 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been |
| 213 // called again. | 217 // called again. |
| 214 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 218 EXPECT_EQ(2U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 215 // Persist, and make sure nothing is left. | 219 // Persist, and make sure nothing is left. |
| 216 log_manager.PersistUnsentLogs(); | 220 log_manager.PersistUnsentLogs(); |
| 217 EXPECT_EQ(0U, pref_service.TypeCount( | 221 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 218 MetricsLogBase::INITIAL_STABILITY_LOG)); | 222 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 219 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 220 } | 223 } |
| 221 } | 224 } |
| 222 | 225 |
| 223 TEST(MetricsLogManagerTest, StoreStagedLogTypes) { | 226 TEST(MetricsLogManagerTest, StoreStagedLogTypes) { |
| 227 TestMetricsServiceClient client; |
| 228 |
| 224 // Ensure that types are preserved when storing staged logs. | 229 // Ensure that types are preserved when storing staged logs. |
| 225 { | 230 { |
| 226 TestLogPrefService pref_service; | 231 TestLogPrefService pref_service; |
| 227 MetricsLogManager log_manager(&pref_service, 0); | 232 MetricsLogManager log_manager(&pref_service, 0); |
| 228 log_manager.LoadPersistedUnsentLogs(); | 233 log_manager.LoadPersistedUnsentLogs(); |
| 229 | 234 |
| 230 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 235 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 231 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"))); | 236 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 232 log_manager.FinishCurrentLog(); | 237 log_manager.FinishCurrentLog(); |
| 233 log_manager.StageNextLogForUpload(); | 238 log_manager.StageNextLogForUpload(); |
| 234 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 239 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); |
| 235 log_manager.PersistUnsentLogs(); | 240 log_manager.PersistUnsentLogs(); |
| 236 | 241 |
| 237 EXPECT_EQ(0U, pref_service.TypeCount( | 242 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 238 MetricsLogBase::INITIAL_STABILITY_LOG)); | 243 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 239 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 240 } | 244 } |
| 241 | 245 |
| 242 { | 246 { |
| 243 TestLogPrefService pref_service; | 247 TestLogPrefService pref_service; |
| 244 MetricsLogManager log_manager(&pref_service, 0); | 248 MetricsLogManager log_manager(&pref_service, 0); |
| 245 log_manager.LoadPersistedUnsentLogs(); | 249 log_manager.LoadPersistedUnsentLogs(); |
| 246 | 250 |
| 247 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLogBase( | 251 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 248 "id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"))); | 252 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 249 log_manager.FinishCurrentLog(); | 253 log_manager.FinishCurrentLog(); |
| 250 log_manager.StageNextLogForUpload(); | 254 log_manager.StageNextLogForUpload(); |
| 251 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 255 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); |
| 252 log_manager.PersistUnsentLogs(); | 256 log_manager.PersistUnsentLogs(); |
| 253 | 257 |
| 254 EXPECT_EQ(1U, pref_service.TypeCount( | 258 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 255 MetricsLogBase::INITIAL_STABILITY_LOG)); | 259 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 256 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 257 } | 260 } |
| 258 } | 261 } |
| 259 | 262 |
| 260 TEST(MetricsLogManagerTest, LargeLogDiscarding) { | 263 TEST(MetricsLogManagerTest, LargeLogDiscarding) { |
| 264 TestMetricsServiceClient client; |
| 261 TestLogPrefService pref_service; | 265 TestLogPrefService pref_service; |
| 262 // Set the size threshold very low, to verify that it's honored. | 266 // Set the size threshold very low, to verify that it's honored. |
| 263 MetricsLogManager log_manager(&pref_service, 1); | 267 MetricsLogManager log_manager(&pref_service, 1); |
| 264 log_manager.LoadPersistedUnsentLogs(); | 268 log_manager.LoadPersistedUnsentLogs(); |
| 265 | 269 |
| 266 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 270 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 267 new MetricsLogBase("id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"))); | 271 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 268 log_manager.FinishCurrentLog(); | 272 log_manager.FinishCurrentLog(); |
| 269 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 273 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 270 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v"))); | 274 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 271 log_manager.FinishCurrentLog(); | 275 log_manager.FinishCurrentLog(); |
| 272 | 276 |
| 273 // Only the ongoing log should be written out, due to the threshold. | 277 // Only the ongoing log should be written out, due to the threshold. |
| 274 log_manager.PersistUnsentLogs(); | 278 log_manager.PersistUnsentLogs(); |
| 275 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::INITIAL_STABILITY_LOG)); | 279 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 276 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 280 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 277 } | 281 } |
| 278 | 282 |
| 279 TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) { | 283 TEST(MetricsLogManagerTest, ProvisionalStoreStandardFlow) { |
| 284 TestMetricsServiceClient client; |
| 285 |
| 280 // Ensure that provisional store works, and discards the correct log. | 286 // Ensure that provisional store works, and discards the correct log. |
| 281 { | 287 { |
| 282 TestLogPrefService pref_service; | 288 TestLogPrefService pref_service; |
| 283 MetricsLogManager log_manager(&pref_service, 0); | 289 MetricsLogManager log_manager(&pref_service, 0); |
| 284 log_manager.LoadPersistedUnsentLogs(); | 290 log_manager.LoadPersistedUnsentLogs(); |
| 285 | 291 |
| 286 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLogBase( | 292 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 287 "id", 0, MetricsLogBase::INITIAL_STABILITY_LOG, "v"))); | 293 "id", 0, MetricsLog::INITIAL_STABILITY_LOG, &client, &pref_service))); |
| 288 log_manager.FinishCurrentLog(); | 294 log_manager.FinishCurrentLog(); |
| 289 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 295 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 290 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "v"))); | 296 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 291 log_manager.StageNextLogForUpload(); | 297 log_manager.StageNextLogForUpload(); |
| 292 log_manager.StoreStagedLogAsUnsent( | 298 log_manager.StoreStagedLogAsUnsent( |
| 293 metrics::PersistedLogs::PROVISIONAL_STORE); | 299 metrics::PersistedLogs::PROVISIONAL_STORE); |
| 294 log_manager.FinishCurrentLog(); | 300 log_manager.FinishCurrentLog(); |
| 295 log_manager.DiscardLastProvisionalStore(); | 301 log_manager.DiscardLastProvisionalStore(); |
| 296 | 302 |
| 297 log_manager.PersistUnsentLogs(); | 303 log_manager.PersistUnsentLogs(); |
| 298 EXPECT_EQ(0U, pref_service.TypeCount( | 304 EXPECT_EQ(0U, pref_service.TypeCount(MetricsLog::INITIAL_STABILITY_LOG)); |
| 299 MetricsLogBase::INITIAL_STABILITY_LOG)); | 305 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 300 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | |
| 301 } | 306 } |
| 302 } | 307 } |
| 303 | 308 |
| 304 TEST(MetricsLogManagerTest, ProvisionalStoreNoop) { | 309 TEST(MetricsLogManagerTest, ProvisionalStoreNoop) { |
| 310 TestMetricsServiceClient client; |
| 311 |
| 305 // Ensure that trying to drop a sent log is a no-op, even if another log has | 312 // Ensure that trying to drop a sent log is a no-op, even if another log has |
| 306 // since been staged. | 313 // since been staged. |
| 307 { | 314 { |
| 308 TestLogPrefService pref_service; | 315 TestLogPrefService pref_service; |
| 309 MetricsLogManager log_manager(&pref_service, 0); | 316 MetricsLogManager log_manager(&pref_service, 0); |
| 310 log_manager.LoadPersistedUnsentLogs(); | 317 log_manager.LoadPersistedUnsentLogs(); |
| 311 | 318 |
| 312 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 319 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 313 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"))); | 320 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 314 log_manager.FinishCurrentLog(); | 321 log_manager.FinishCurrentLog(); |
| 315 log_manager.StageNextLogForUpload(); | 322 log_manager.StageNextLogForUpload(); |
| 316 log_manager.StoreStagedLogAsUnsent( | 323 log_manager.StoreStagedLogAsUnsent( |
| 317 metrics::PersistedLogs::PROVISIONAL_STORE); | 324 metrics::PersistedLogs::PROVISIONAL_STORE); |
| 318 log_manager.StageNextLogForUpload(); | 325 log_manager.StageNextLogForUpload(); |
| 319 log_manager.DiscardStagedLog(); | 326 log_manager.DiscardStagedLog(); |
| 320 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 327 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 321 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"))); | 328 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 322 log_manager.FinishCurrentLog(); | 329 log_manager.FinishCurrentLog(); |
| 323 log_manager.StageNextLogForUpload(); | 330 log_manager.StageNextLogForUpload(); |
| 324 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 331 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); |
| 325 log_manager.DiscardLastProvisionalStore(); | 332 log_manager.DiscardLastProvisionalStore(); |
| 326 | 333 |
| 327 log_manager.PersistUnsentLogs(); | 334 log_manager.PersistUnsentLogs(); |
| 328 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 335 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 329 } | 336 } |
| 330 | 337 |
| 331 // Ensure that trying to drop more than once is a no-op | 338 // Ensure that trying to drop more than once is a no-op |
| 332 { | 339 { |
| 333 TestLogPrefService pref_service; | 340 TestLogPrefService pref_service; |
| 334 MetricsLogManager log_manager(&pref_service, 0); | 341 MetricsLogManager log_manager(&pref_service, 0); |
| 335 log_manager.LoadPersistedUnsentLogs(); | 342 log_manager.LoadPersistedUnsentLogs(); |
| 336 | 343 |
| 337 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 344 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 338 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"))); | 345 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 339 log_manager.FinishCurrentLog(); | 346 log_manager.FinishCurrentLog(); |
| 340 log_manager.StageNextLogForUpload(); | 347 log_manager.StageNextLogForUpload(); |
| 341 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); | 348 log_manager.StoreStagedLogAsUnsent(metrics::PersistedLogs::NORMAL_STORE); |
| 342 log_manager.BeginLoggingWithLog(make_scoped_ptr( | 349 log_manager.BeginLoggingWithLog(make_scoped_ptr(new MetricsLog( |
| 343 new MetricsLogBase("id", 0, MetricsLogBase::ONGOING_LOG, "version"))); | 350 "id", 0, MetricsLog::ONGOING_LOG, &client, &pref_service))); |
| 344 log_manager.FinishCurrentLog(); | 351 log_manager.FinishCurrentLog(); |
| 345 log_manager.StageNextLogForUpload(); | 352 log_manager.StageNextLogForUpload(); |
| 346 log_manager.StoreStagedLogAsUnsent( | 353 log_manager.StoreStagedLogAsUnsent( |
| 347 metrics::PersistedLogs::PROVISIONAL_STORE); | 354 metrics::PersistedLogs::PROVISIONAL_STORE); |
| 348 log_manager.DiscardLastProvisionalStore(); | 355 log_manager.DiscardLastProvisionalStore(); |
| 349 log_manager.DiscardLastProvisionalStore(); | 356 log_manager.DiscardLastProvisionalStore(); |
| 350 | 357 |
| 351 log_manager.PersistUnsentLogs(); | 358 log_manager.PersistUnsentLogs(); |
| 352 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLogBase::ONGOING_LOG)); | 359 EXPECT_EQ(1U, pref_service.TypeCount(MetricsLog::ONGOING_LOG)); |
| 353 } | 360 } |
| 354 } | 361 } |
| 355 | 362 |
| 356 } // namespace metrics | 363 } // namespace metrics |
| OLD | NEW |