Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Side by Side Diff: chrome/common/metrics/metrics_log_manager_unittest.cc

Issue 9396001: Begin to separate the MetricsService logic for creating vs uploading logs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address review comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698