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 |