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

Side by Side Diff: chrome/browser/metrics/metrics_log_serializer_unittest.cc

Issue 26646003: MetricsService: Send a hash of the UMA log in a header. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years, 2 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 "base/base64.h" 5 #include "base/base64.h"
6 #include "base/md5.h" 6 #include "base/md5.h"
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/metrics/metrics_log_serializer.h" 8 #include "chrome/browser/metrics/metrics_log_serializer.h"
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 10
11 namespace { 11 namespace {
12 12
13 const size_t kListLengthLimit = 3; 13 const size_t kListLengthLimit = 3;
14 const size_t kLogByteLimit = 1000; 14 const size_t kLogByteLimit = 1000;
15 15
16 } // namespace 16 } // namespace
17 17
18 class MetricsLogSerializerTest : public ::testing::Test { 18 class MetricsLogSerializerTest : public ::testing::Test {
19 }; 19 };
20 20
21 // Store and retrieve empty list. 21 // Store and retrieve empty list.
22 TEST(MetricsLogSerializerTest, EmptyLogList) { 22 TEST(MetricsLogSerializerTest, EmptyLogList) {
23 ListValue list; 23 ListValue list;
24 std::vector<std::string> local_list; 24 std::vector<MetricsLogManager::SerializedLog> local_list;
25 25
26 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 26 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
27 kLogByteLimit, &list); 27 kLogByteLimit, &list);
28 EXPECT_EQ(0U, list.GetSize()); 28 EXPECT_EQ(0U, list.GetSize());
29 29
30 local_list.clear(); // ReadLogsFromPrefList() expects empty |local_list|. 30 local_list.clear(); // ReadLogsFromPrefList() expects empty |local_list|.
31 EXPECT_EQ( 31 EXPECT_EQ(
32 MetricsLogSerializer::LIST_EMPTY, 32 MetricsLogSerializer::LIST_EMPTY,
33 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 33 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
34 EXPECT_EQ(0U, local_list.size()); 34 EXPECT_EQ(0U, local_list.size());
35 } 35 }
36 36
37 // Store and retrieve a single log value. 37 // Store and retrieve a single log value.
38 TEST(MetricsLogSerializerTest, SingleElementLogList) { 38 TEST(MetricsLogSerializerTest, SingleElementLogList) {
39 ListValue list; 39 ListValue list;
40 40
41 std::vector<std::string> local_list(1); 41 std::vector<MetricsLogManager::SerializedLog> local_list(1);
42 local_list[0] = "Hello world!"; 42 local_list[0].SetLogText("Hello world!");
43 43
44 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 44 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
45 kLogByteLimit, &list); 45 kLogByteLimit, &list);
46 46
47 // |list| will now contain the following: 47 // |list| will now contain the following:
48 // [1, Base64Encode("Hello world!"), MD5("Hello world!")]. 48 // [1, Base64Encode("Hello world!"), MD5("Hello world!")].
49 ASSERT_EQ(3U, list.GetSize()); 49 ASSERT_EQ(3U, list.GetSize());
50 50
51 // Examine each element. 51 // Examine each element.
52 ListValue::const_iterator it = list.begin(); 52 ListValue::const_iterator it = list.begin();
(...skipping 21 matching lines...) Expand all
74 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 74 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
75 EXPECT_EQ(1U, local_list.size()); 75 EXPECT_EQ(1U, local_list.size());
76 } 76 }
77 77
78 // Store a set of logs over the length limit, but smaller than the min number of 78 // Store a set of logs over the length limit, but smaller than the min number of
79 // bytes. 79 // bytes.
80 TEST(MetricsLogSerializerTest, LongButTinyLogList) { 80 TEST(MetricsLogSerializerTest, LongButTinyLogList) {
81 ListValue list; 81 ListValue list;
82 82
83 size_t log_count = kListLengthLimit * 5; 83 size_t log_count = kListLengthLimit * 5;
84 std::vector<std::string> local_list(log_count); 84 std::vector<MetricsLogManager::SerializedLog> local_list(log_count);
85 for (size_t i = 0; i < local_list.size(); ++i) { 85 for (size_t i = 0; i < local_list.size(); ++i)
86 local_list[0] = "x"; 86 local_list[i].SetLogText("x");
87 }
88 87
89 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 88 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
90 kLogByteLimit, &list); 89 kLogByteLimit, &list);
91 std::vector<std::string> result_list; 90 std::vector<MetricsLogManager::SerializedLog> result_list;
92 EXPECT_EQ( 91 EXPECT_EQ(
93 MetricsLogSerializer::RECALL_SUCCESS, 92 MetricsLogSerializer::RECALL_SUCCESS,
94 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list)); 93 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list));
95 EXPECT_EQ(local_list.size(), result_list.size()); 94 EXPECT_EQ(local_list.size(), result_list.size());
96 95
97 EXPECT_TRUE(result_list.front().find("x") == 0); 96 EXPECT_TRUE(result_list.front().log_text().find("x") == 0);
98 } 97 }
99 98
100 // Store a set of logs over the length limit, but that doesn't reach the minimum 99 // Store a set of logs over the length limit, but that doesn't reach the minimum
101 // number of bytes until after passing the length limit. 100 // number of bytes until after passing the length limit.
102 TEST(MetricsLogSerializerTest, LongButSmallLogList) { 101 TEST(MetricsLogSerializerTest, LongButSmallLogList) {
103 ListValue list; 102 ListValue list;
104 103
105 size_t log_count = kListLengthLimit * 5; 104 size_t log_count = kListLengthLimit * 5;
106 // Make log_count logs each slightly larger than 105 // Make log_count logs each slightly larger than
107 // kLogByteLimit / (log_count - 2) 106 // kLogByteLimit / (log_count - 2)
108 // so that the minimum is reached before the oldest (first) two logs. 107 // so that the minimum is reached before the oldest (first) two logs.
109 std::vector<std::string> local_list(log_count); 108 std::vector<MetricsLogManager::SerializedLog> local_list(log_count);
110 size_t log_size = (kLogByteLimit / (log_count - 2)) + 2; 109 size_t log_size = (kLogByteLimit / (log_count - 2)) + 2;
111 local_list[0] = "one"; 110 local_list[0].SetLogText("one");
112 local_list[1] = "two"; 111 local_list[1].SetLogText("two");
113 local_list[2] = "three"; 112 local_list[2].SetLogText("three");
114 local_list[log_count - 1] = "last"; 113 local_list[log_count - 1].SetLogText("last");
115 for (size_t i = 0; i < local_list.size(); ++i) { 114 for (size_t i = 0; i < local_list.size(); ++i) {
116 local_list[i].resize(log_size, ' '); 115 std::string log_text = local_list[i].log_text();
116 log_text.resize(log_size, ' ');
117 local_list[i].SetLogText(log_text);
117 } 118 }
118 119
119 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 120 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
120 kLogByteLimit, &list); 121 kLogByteLimit, &list);
121 std::vector<std::string> result_list; 122 std::vector<MetricsLogManager::SerializedLog> result_list;
122 EXPECT_EQ( 123 EXPECT_EQ(
123 MetricsLogSerializer::RECALL_SUCCESS, 124 MetricsLogSerializer::RECALL_SUCCESS,
124 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list)); 125 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list));
125 EXPECT_EQ(local_list.size() - 2, result_list.size()); 126 EXPECT_EQ(local_list.size() - 2, result_list.size());
126 127
127 EXPECT_TRUE(result_list.front().find("three") == 0); 128 EXPECT_TRUE(result_list.front().log_text().find("three") == 0);
128 EXPECT_TRUE(result_list.back().find("last") == 0); 129 EXPECT_TRUE(result_list.back().log_text().find("last") == 0);
129 } 130 }
130 131
131 // Store a set of logs within the length limit, but well over the minimum 132 // Store a set of logs within the length limit, but well over the minimum
132 // number of bytes. 133 // number of bytes.
133 TEST(MetricsLogSerializerTest, ShortButLargeLogList) { 134 TEST(MetricsLogSerializerTest, ShortButLargeLogList) {
134 ListValue list; 135 ListValue list;
135 136
136 std::vector<std::string> local_list(kListLengthLimit); 137 std::vector<MetricsLogManager::SerializedLog> local_list(kListLengthLimit);
137 // Make the total byte count about twice the minimum. 138 // Make the total byte count about twice the minimum.
138 size_t log_size = (kLogByteLimit / local_list.size()) * 2; 139 size_t log_size = (kLogByteLimit / local_list.size()) * 2;
139 for (size_t i = 0; i < local_list.size(); ++i) { 140 for (size_t i = 0; i < local_list.size(); ++i) {
140 local_list[i].resize(log_size, ' '); 141 std::string log_text = local_list[i].log_text();
142 log_text.resize(log_size, ' ');
143 local_list[i].SetLogText(log_text);
141 } 144 }
142 145
143 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 146 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
144 kLogByteLimit, &list); 147 kLogByteLimit, &list);
145 std::vector<std::string> result_list; 148 std::vector<MetricsLogManager::SerializedLog> result_list;
146 EXPECT_EQ( 149 EXPECT_EQ(
147 MetricsLogSerializer::RECALL_SUCCESS, 150 MetricsLogSerializer::RECALL_SUCCESS,
148 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list)); 151 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list));
149 EXPECT_EQ(local_list.size(), result_list.size()); 152 EXPECT_EQ(local_list.size(), result_list.size());
150 } 153 }
151 154
152 // Store a set of logs over the length limit, and over the minimum number of 155 // Store a set of logs over the length limit, and over the minimum number of
153 // bytes. 156 // bytes.
154 TEST(MetricsLogSerializerTest, LongAndLargeLogList) { 157 TEST(MetricsLogSerializerTest, LongAndLargeLogList) {
155 ListValue list; 158 ListValue list;
156 159
157 // Include twice the max number of logs. 160 // Include twice the max number of logs.
158 std::vector<std::string> local_list(kListLengthLimit * 2); 161 std::vector<MetricsLogManager::SerializedLog>
162 local_list(kListLengthLimit * 2);
159 // Make the total byte count about four times the minimum. 163 // Make the total byte count about four times the minimum.
160 size_t log_size = (kLogByteLimit / local_list.size()) * 4; 164 size_t log_size = (kLogByteLimit / local_list.size()) * 4;
161 local_list[local_list.size() - kListLengthLimit] = "First to keep"; 165 local_list[local_list.size() - kListLengthLimit].SetLogText("First to keep");
162 for (size_t i = 0; i < local_list.size(); ++i) { 166 for (size_t i = 0; i < local_list.size(); ++i) {
163 local_list[i].resize(log_size, ' '); 167 std::string log_text = local_list[i].log_text();
168 log_text.resize(log_size, ' ');
169 local_list[i].SetLogText(log_text);
164 } 170 }
165 171
166 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 172 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
167 kLogByteLimit, &list); 173 kLogByteLimit, &list);
168 std::vector<std::string> result_list; 174 std::vector<MetricsLogManager::SerializedLog> result_list;
169 EXPECT_EQ( 175 EXPECT_EQ(
170 MetricsLogSerializer::RECALL_SUCCESS, 176 MetricsLogSerializer::RECALL_SUCCESS,
171 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list)); 177 MetricsLogSerializer::ReadLogsFromPrefList(list, &result_list));
172 // The max length should control the resulting size. 178 // The max length should control the resulting size.
173 EXPECT_EQ(kListLengthLimit, result_list.size()); 179 EXPECT_EQ(kListLengthLimit, result_list.size());
174 EXPECT_TRUE(result_list.front().find("First to keep") == 0); 180 EXPECT_TRUE(result_list.front().log_text().find("First to keep") == 0);
175 } 181 }
176 182
177 // Induce LIST_SIZE_TOO_SMALL corruption 183 // Induce LIST_SIZE_TOO_SMALL corruption
178 TEST(MetricsLogSerializerTest, SmallRecoveredListSize) { 184 TEST(MetricsLogSerializerTest, SmallRecoveredListSize) {
179 ListValue list; 185 ListValue list;
180 186
181 std::vector<std::string> local_list(1); 187 std::vector<MetricsLogManager::SerializedLog> local_list(1);
182 local_list[0] = "Hello world!"; 188 local_list[0].SetLogText("Hello world!");
183 189
184 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 190 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
185 kLogByteLimit, &list); 191 kLogByteLimit, &list);
186 EXPECT_EQ(3U, list.GetSize()); 192 EXPECT_EQ(3U, list.GetSize());
187 193
188 // Remove last element. 194 // Remove last element.
189 list.Remove(list.GetSize() - 1, NULL); 195 list.Remove(list.GetSize() - 1, NULL);
190 EXPECT_EQ(2U, list.GetSize()); 196 EXPECT_EQ(2U, list.GetSize());
191 197
192 local_list.clear(); 198 local_list.clear();
193 EXPECT_EQ( 199 EXPECT_EQ(
194 MetricsLogSerializer::LIST_SIZE_TOO_SMALL, 200 MetricsLogSerializer::LIST_SIZE_TOO_SMALL,
195 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 201 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
196 } 202 }
197 203
198 // Remove size from the stored list. 204 // Remove size from the stored list.
199 TEST(MetricsLogSerializerTest, RemoveSizeFromLogList) { 205 TEST(MetricsLogSerializerTest, RemoveSizeFromLogList) {
200 ListValue list; 206 ListValue list;
201 207
202 std::vector<std::string> local_list(2); 208 std::vector<MetricsLogManager::SerializedLog> local_list(2);
203 local_list[0] = "one"; 209 local_list[0].SetLogText("one");
204 local_list[1] = "two"; 210 local_list[1].SetLogText("two");
205 EXPECT_EQ(2U, local_list.size()); 211 EXPECT_EQ(2U, local_list.size());
206 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 212 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
207 kLogByteLimit, &list); 213 kLogByteLimit, &list);
208 EXPECT_EQ(4U, list.GetSize()); 214 EXPECT_EQ(4U, list.GetSize());
209 215
210 list.Remove(0, NULL); // Delete size (1st element). 216 list.Remove(0, NULL); // Delete size (1st element).
211 EXPECT_EQ(3U, list.GetSize()); 217 EXPECT_EQ(3U, list.GetSize());
212 218
213 local_list.clear(); 219 local_list.clear();
214 EXPECT_EQ( 220 EXPECT_EQ(
215 MetricsLogSerializer::LIST_SIZE_MISSING, 221 MetricsLogSerializer::LIST_SIZE_MISSING,
216 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 222 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
217 } 223 }
218 224
219 // Corrupt size of stored list. 225 // Corrupt size of stored list.
220 TEST(MetricsLogSerializerTest, CorruptSizeOfLogList) { 226 TEST(MetricsLogSerializerTest, CorruptSizeOfLogList) {
221 ListValue list; 227 ListValue list;
222 228
223 std::vector<std::string> local_list(1); 229 std::vector<MetricsLogManager::SerializedLog> local_list(1);
224 local_list[0] = "Hello world!"; 230 local_list[0].SetLogText("Hello world!");
225 231
226 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 232 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
227 kLogByteLimit, &list); 233 kLogByteLimit, &list);
228 EXPECT_EQ(3U, list.GetSize()); 234 EXPECT_EQ(3U, list.GetSize());
229 235
230 // Change list size from 1 to 2. 236 // Change list size from 1 to 2.
231 EXPECT_TRUE(list.Set(0, Value::CreateIntegerValue(2))); 237 EXPECT_TRUE(list.Set(0, Value::CreateIntegerValue(2)));
232 EXPECT_EQ(3U, list.GetSize()); 238 EXPECT_EQ(3U, list.GetSize());
233 239
234 local_list.clear(); 240 local_list.clear();
235 EXPECT_EQ( 241 EXPECT_EQ(
236 MetricsLogSerializer::LIST_SIZE_CORRUPTION, 242 MetricsLogSerializer::LIST_SIZE_CORRUPTION,
237 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 243 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
238 } 244 }
239 245
240 // Corrupt checksum of stored list. 246 // Corrupt checksum of stored list.
241 TEST(MetricsLogSerializerTest, CorruptChecksumOfLogList) { 247 TEST(MetricsLogSerializerTest, CorruptChecksumOfLogList) {
242 ListValue list; 248 ListValue list;
243 249
244 std::vector<std::string> local_list(1); 250 std::vector<MetricsLogManager::SerializedLog> local_list(1);
245 local_list[0] = "Hello world!"; 251 local_list[0].SetLogText("Hello world!");
246 252
247 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit, 253 MetricsLogSerializer::WriteLogsToPrefList(local_list, kListLengthLimit,
248 kLogByteLimit, &list); 254 kLogByteLimit, &list);
249 EXPECT_EQ(3U, list.GetSize()); 255 EXPECT_EQ(3U, list.GetSize());
250 256
251 // Fetch checksum (last element) and change it. 257 // Fetch checksum (last element) and change it.
252 std::string checksum; 258 std::string checksum;
253 EXPECT_TRUE((*(list.end() - 1))->GetAsString(&checksum)); 259 EXPECT_TRUE((*(list.end() - 1))->GetAsString(&checksum));
254 checksum[0] = (checksum[0] == 'a') ? 'b' : 'a'; 260 checksum[0] = (checksum[0] == 'a') ? 'b' : 'a';
255 EXPECT_TRUE(list.Set(2, Value::CreateStringValue(checksum))); 261 EXPECT_TRUE(list.Set(2, Value::CreateStringValue(checksum)));
256 EXPECT_EQ(3U, list.GetSize()); 262 EXPECT_EQ(3U, list.GetSize());
257 263
258 local_list.clear(); 264 local_list.clear();
259 EXPECT_EQ( 265 EXPECT_EQ(
260 MetricsLogSerializer::CHECKSUM_CORRUPTION, 266 MetricsLogSerializer::CHECKSUM_CORRUPTION,
261 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list)); 267 MetricsLogSerializer::ReadLogsFromPrefList(list, &local_list));
262 } 268 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698