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