| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <utility> | 6 #include <utility> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "chrome/common/metrics/metrics_log_base.h" | 9 #include "chrome/common/metrics/metrics_log_base.h" |
| 10 #include "chrome/common/metrics/metrics_log_manager.h" | 10 #include "chrome/common/metrics/metrics_log_manager.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 TEST(MetricsLogManagerTest, StandardFlow) { | 45 TEST(MetricsLogManagerTest, StandardFlow) { |
| 46 MetricsLogManager log_manager; | 46 MetricsLogManager log_manager; |
| 47 | 47 |
| 48 // Make sure a new manager has a clean slate. | 48 // Make sure a new manager has a clean slate. |
| 49 EXPECT_EQ(NULL, log_manager.current_log()); | 49 EXPECT_EQ(NULL, log_manager.current_log()); |
| 50 EXPECT_FALSE(log_manager.has_staged_log()); | 50 EXPECT_FALSE(log_manager.has_staged_log()); |
| 51 EXPECT_FALSE(log_manager.has_unsent_logs()); | 51 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 52 | 52 |
| 53 // Check that the normal flow works. | 53 // Check that the normal flow works. |
| 54 MetricsLogBase* initial_log = new MetricsLogBase("id", 0, "version"); | 54 MetricsLogBase* initial_log = new MetricsLogBase("id", 0, "version"); |
| 55 log_manager.BeginLoggingWithLog(initial_log); | 55 log_manager.BeginLoggingWithLog(initial_log, MetricsLogManager::INITIAL_LOG); |
| 56 EXPECT_EQ(initial_log, log_manager.current_log()); | 56 EXPECT_EQ(initial_log, log_manager.current_log()); |
| 57 EXPECT_FALSE(log_manager.has_staged_log()); | 57 EXPECT_FALSE(log_manager.has_staged_log()); |
| 58 | 58 |
| 59 log_manager.StageCurrentLogForUpload(); | 59 log_manager.FinishCurrentLog(); |
| 60 EXPECT_EQ(NULL, log_manager.current_log()); | 60 EXPECT_EQ(NULL, log_manager.current_log()); |
| 61 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 62 EXPECT_FALSE(log_manager.has_staged_log()); |
| 63 |
| 64 MetricsLogBase* second_log = new MetricsLogBase("id", 0, "version"); |
| 65 log_manager.BeginLoggingWithLog(second_log, MetricsLogManager::ONGOING_LOG); |
| 66 EXPECT_EQ(second_log, log_manager.current_log()); |
| 67 |
| 68 log_manager.StageNextLogForUpload(); |
| 61 EXPECT_TRUE(log_manager.has_staged_log()); | 69 EXPECT_TRUE(log_manager.has_staged_log()); |
| 62 EXPECT_FALSE(log_manager.staged_log_text().empty()); | 70 EXPECT_FALSE(log_manager.staged_log_text().empty()); |
| 63 | 71 |
| 64 MetricsLogBase* second_log = new MetricsLogBase("id", 0, "version"); | |
| 65 log_manager.BeginLoggingWithLog(second_log); | |
| 66 EXPECT_EQ(second_log, log_manager.current_log()); | |
| 67 EXPECT_TRUE(log_manager.has_staged_log()); | |
| 68 | |
| 69 log_manager.DiscardStagedLog(); | 72 log_manager.DiscardStagedLog(); |
| 70 EXPECT_EQ(second_log, log_manager.current_log()); | 73 EXPECT_EQ(second_log, log_manager.current_log()); |
| 71 EXPECT_FALSE(log_manager.has_staged_log()); | 74 EXPECT_FALSE(log_manager.has_staged_log()); |
| 75 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 72 EXPECT_TRUE(log_manager.staged_log_text().empty()); | 76 EXPECT_TRUE(log_manager.staged_log_text().empty()); |
| 73 | 77 |
| 74 EXPECT_FALSE(log_manager.has_unsent_logs()); | 78 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 75 } | 79 } |
| 76 | 80 |
| 77 TEST(MetricsLogManagerTest, AbandonedLog) { | 81 TEST(MetricsLogManagerTest, AbandonedLog) { |
| 78 MetricsLogManager log_manager; | 82 MetricsLogManager log_manager; |
| 79 | 83 |
| 80 MetricsLogBase* dummy_log = new MetricsLogBase("id", 0, "version"); | 84 MetricsLogBase* dummy_log = new MetricsLogBase("id", 0, "version"); |
| 81 log_manager.BeginLoggingWithLog(dummy_log); | 85 log_manager.BeginLoggingWithLog(dummy_log, MetricsLogManager::INITIAL_LOG); |
| 82 EXPECT_EQ(dummy_log, log_manager.current_log()); | 86 EXPECT_EQ(dummy_log, log_manager.current_log()); |
| 83 | 87 |
| 84 log_manager.DiscardCurrentLog(); | 88 log_manager.DiscardCurrentLog(); |
| 85 EXPECT_EQ(NULL, log_manager.current_log()); | 89 EXPECT_EQ(NULL, log_manager.current_log()); |
| 86 EXPECT_FALSE(log_manager.has_staged_log()); | 90 EXPECT_FALSE(log_manager.has_staged_log()); |
| 87 } | 91 } |
| 88 | 92 |
| 89 TEST(MetricsLogManagerTest, InterjectedLog) { | 93 TEST(MetricsLogManagerTest, InterjectedLog) { |
| 90 MetricsLogManager log_manager; | 94 MetricsLogManager log_manager; |
| 91 | 95 |
| 92 MetricsLogBase* ongoing_log = new MetricsLogBase("id", 0, "version"); | 96 MetricsLogBase* ongoing_log = new MetricsLogBase("id", 0, "version"); |
| 93 MetricsLogBase* temp_log = new MetricsLogBase("id", 0, "version"); | 97 MetricsLogBase* temp_log = new MetricsLogBase("id", 0, "version"); |
| 94 | 98 |
| 95 log_manager.BeginLoggingWithLog(ongoing_log); | 99 log_manager.BeginLoggingWithLog(ongoing_log, MetricsLogManager::ONGOING_LOG); |
| 96 EXPECT_EQ(ongoing_log, log_manager.current_log()); | 100 EXPECT_EQ(ongoing_log, log_manager.current_log()); |
| 97 | 101 |
| 98 log_manager.PauseCurrentLog(); | 102 log_manager.PauseCurrentLog(); |
| 99 EXPECT_EQ(NULL, log_manager.current_log()); | 103 EXPECT_EQ(NULL, log_manager.current_log()); |
| 100 | 104 |
| 101 log_manager.BeginLoggingWithLog(temp_log); | 105 log_manager.BeginLoggingWithLog(temp_log, MetricsLogManager::INITIAL_LOG); |
| 102 EXPECT_EQ(temp_log, log_manager.current_log()); | 106 EXPECT_EQ(temp_log, log_manager.current_log()); |
| 103 log_manager.StageCurrentLogForUpload(); | 107 log_manager.FinishCurrentLog(); |
| 104 EXPECT_TRUE(log_manager.has_staged_log()); | |
| 105 log_manager.DiscardStagedLog(); | |
| 106 EXPECT_EQ(NULL, log_manager.current_log()); | 108 EXPECT_EQ(NULL, log_manager.current_log()); |
| 107 EXPECT_FALSE(log_manager.has_staged_log()); | |
| 108 | 109 |
| 109 log_manager.ResumePausedLog(); | 110 log_manager.ResumePausedLog(); |
| 110 EXPECT_EQ(ongoing_log, log_manager.current_log()); | 111 EXPECT_EQ(ongoing_log, log_manager.current_log()); |
| 112 |
| 111 EXPECT_FALSE(log_manager.has_staged_log()); | 113 EXPECT_FALSE(log_manager.has_staged_log()); |
| 112 | 114 log_manager.StageNextLogForUpload(); |
| 115 log_manager.DiscardStagedLog(); |
| 113 EXPECT_FALSE(log_manager.has_unsent_logs()); | 116 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 114 } | 117 } |
| 115 | 118 |
| 116 TEST(MetricsLogManagerTest, StoreAndLoad) { | 119 TEST(MetricsLogManagerTest, StoreAndLoad) { |
| 117 std::vector<SerializedLog> initial_logs; | 120 std::vector<SerializedLog> initial_logs; |
| 118 std::vector<SerializedLog> ongoing_logs; | 121 std::vector<SerializedLog> ongoing_logs; |
| 119 | 122 |
| 120 // Set up some in-progress logging in a scoped log manager simulating the | 123 // Set up some in-progress logging in a scoped log manager simulating the |
| 121 // leadup to quitting, then persist as would be done on quit. | 124 // leadup to quitting, then persist as would be done on quit. |
| 122 { | 125 { |
| 123 MetricsLogManager log_manager; | 126 MetricsLogManager log_manager; |
| 124 DummyLogSerializer* serializer = new DummyLogSerializer; | 127 DummyLogSerializer* serializer = new DummyLogSerializer; |
| 125 log_manager.set_log_serializer(serializer); | 128 log_manager.set_log_serializer(serializer); |
| 126 // Simulate a log having already been unsent from a previous session. | 129 // Simulate a log having already been unsent from a previous session. |
| 127 SerializedLog log = {"xml", "proto"}; | 130 SerializedLog log = {"xml", "proto"}; |
| 128 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG].push_back(log); | 131 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG].push_back(log); |
| 129 EXPECT_FALSE(log_manager.has_unsent_logs()); | 132 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 130 log_manager.LoadPersistedUnsentLogs(); | 133 log_manager.LoadPersistedUnsentLogs(); |
| 131 EXPECT_TRUE(log_manager.has_unsent_logs()); | 134 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 132 | 135 |
| 133 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); | 136 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); |
| 134 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); | 137 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); |
| 135 log_manager.BeginLoggingWithLog(log1); | 138 log_manager.BeginLoggingWithLog(log1, MetricsLogManager::INITIAL_LOG); |
| 136 log_manager.StageCurrentLogForUpload(); | 139 log_manager.FinishCurrentLog(); |
| 137 log_manager.BeginLoggingWithLog(log2); | 140 log_manager.BeginLoggingWithLog(log2, MetricsLogManager::ONGOING_LOG); |
| 138 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::INITIAL_LOG); | 141 log_manager.StageNextLogForUpload(); |
| 139 log_manager.StageCurrentLogForUpload(); | 142 log_manager.StoreStagedLogAsUnsent(); |
| 140 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::ONGOING_LOG); | 143 log_manager.FinishCurrentLog(); |
| 141 | 144 |
| 142 // Nothing should be written out until PersistUnsentLogs is called. | 145 // Nothing should be written out until PersistUnsentLogs is called. |
| 143 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 146 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
| 144 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 147 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 145 log_manager.PersistUnsentLogs(); | 148 log_manager.PersistUnsentLogs(); |
| 146 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 149 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
| 147 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 150 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 148 | 151 |
| 149 // Save the logs to transfer over to a new serializer (since log_manager | 152 // Save the logs to transfer over to a new serializer (since log_manager |
| 150 // owns |serializer|, so it's about to go away. | 153 // owns |serializer|, so it's about to go away. |
| 151 initial_logs = serializer->persisted_logs_[MetricsLogManager::INITIAL_LOG]; | 154 initial_logs = serializer->persisted_logs_[MetricsLogManager::INITIAL_LOG]; |
| 152 ongoing_logs = serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG]; | 155 ongoing_logs = serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG]; |
| 153 } | 156 } |
| 154 | 157 |
| 155 // Now simulate the relaunch, ensure that the log manager restores | 158 // Now simulate the relaunch, ensure that the log manager restores |
| 156 // everything correctly, and verify that once the are handled they are not | 159 // everything correctly, and verify that once the are handled they are not |
| 157 // re-persisted. | 160 // re-persisted. |
| 158 { | 161 { |
| 159 MetricsLogManager log_manager; | 162 MetricsLogManager log_manager; |
| 160 | 163 |
| 161 DummyLogSerializer* serializer = new DummyLogSerializer; | 164 DummyLogSerializer* serializer = new DummyLogSerializer; |
| 162 serializer->persisted_logs_[MetricsLogManager::INITIAL_LOG] = initial_logs; | 165 serializer->persisted_logs_[MetricsLogManager::INITIAL_LOG] = initial_logs; |
| 163 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG] = ongoing_logs; | 166 serializer->persisted_logs_[MetricsLogManager::ONGOING_LOG] = ongoing_logs; |
| 164 | 167 |
| 165 log_manager.set_log_serializer(serializer); | 168 log_manager.set_log_serializer(serializer); |
| 166 log_manager.LoadPersistedUnsentLogs(); | 169 log_manager.LoadPersistedUnsentLogs(); |
| 167 EXPECT_TRUE(log_manager.has_unsent_logs()); | 170 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 168 | 171 |
| 169 log_manager.StageNextStoredLogForUpload(); | 172 log_manager.StageNextLogForUpload(); |
| 170 log_manager.DiscardStagedLog(); | 173 log_manager.DiscardStagedLog(); |
| 171 // The initial log should be sent first; update the persisted storage to | 174 // The initial log should be sent first; update the persisted storage to |
| 172 // verify. | 175 // verify. |
| 173 log_manager.PersistUnsentLogs(); | 176 log_manager.PersistUnsentLogs(); |
| 174 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 177 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
| 175 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 178 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 176 | 179 |
| 177 // Handle the first ongoing log. | 180 // Handle the first ongoing log. |
| 178 log_manager.StageNextStoredLogForUpload(); | 181 log_manager.StageNextLogForUpload(); |
| 179 log_manager.DiscardStagedLog(); | 182 log_manager.DiscardStagedLog(); |
| 180 EXPECT_TRUE(log_manager.has_unsent_logs()); | 183 EXPECT_TRUE(log_manager.has_unsent_logs()); |
| 181 | 184 |
| 182 // Handle the last log. | 185 // Handle the last log. |
| 183 log_manager.StageNextStoredLogForUpload(); | 186 log_manager.StageNextLogForUpload(); |
| 184 log_manager.DiscardStagedLog(); | 187 log_manager.DiscardStagedLog(); |
| 185 EXPECT_FALSE(log_manager.has_unsent_logs()); | 188 EXPECT_FALSE(log_manager.has_unsent_logs()); |
| 186 | 189 |
| 187 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been | 190 // Nothing should have changed "on disk" since PersistUnsentLogs hasn't been |
| 188 // called again. | 191 // called again. |
| 189 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 192 EXPECT_EQ(2U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 190 // Persist, and make sure nothing is left. | 193 // Persist, and make sure nothing is left. |
| 191 log_manager.PersistUnsentLogs(); | 194 log_manager.PersistUnsentLogs(); |
| 192 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 195 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
| 193 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 196 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 194 } | 197 } |
| 195 } | 198 } |
| 196 | 199 |
| 197 TEST(MetricsLogManagerTest, LargeLogDiscarding) { | 200 TEST(MetricsLogManagerTest, LargeLogDiscarding) { |
| 198 MetricsLogManager log_manager; | 201 MetricsLogManager log_manager; |
| 199 DummyLogSerializer* serializer = new DummyLogSerializer; | 202 DummyLogSerializer* serializer = new DummyLogSerializer; |
| 200 log_manager.set_log_serializer(serializer); | 203 log_manager.set_log_serializer(serializer); |
| 201 // Set the size threshold very low, to verify that it's honored. | 204 // Set the size threshold very low, to verify that it's honored. |
| 202 log_manager.set_max_ongoing_log_store_size(1); | 205 log_manager.set_max_ongoing_log_store_size(1); |
| 203 | 206 |
| 204 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); | 207 MetricsLogBase* log1 = new MetricsLogBase("id", 0, "version"); |
| 205 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); | 208 MetricsLogBase* log2 = new MetricsLogBase("id", 0, "version"); |
| 206 log_manager.BeginLoggingWithLog(log1); | 209 log_manager.BeginLoggingWithLog(log1, MetricsLogManager::INITIAL_LOG); |
| 207 log_manager.StageCurrentLogForUpload(); | 210 log_manager.FinishCurrentLog(); |
| 208 log_manager.BeginLoggingWithLog(log2); | 211 log_manager.BeginLoggingWithLog(log2, MetricsLogManager::ONGOING_LOG); |
| 209 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::INITIAL_LOG); | 212 log_manager.FinishCurrentLog(); |
| 210 log_manager.StageCurrentLogForUpload(); | |
| 211 log_manager.StoreStagedLogAsUnsent(MetricsLogManager::ONGOING_LOG); | |
| 212 | 213 |
| 213 // Only the ongoing log should be written out, due to the threshold. | 214 // Only the ongoing log should be written out, due to the threshold. |
| 214 log_manager.PersistUnsentLogs(); | 215 log_manager.PersistUnsentLogs(); |
| 215 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); | 216 EXPECT_EQ(1U, serializer->TypeCount(MetricsLogManager::INITIAL_LOG)); |
| 216 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); | 217 EXPECT_EQ(0U, serializer->TypeCount(MetricsLogManager::ONGOING_LOG)); |
| 217 } | 218 } |
| OLD | NEW |