| 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 "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 Loading... |
| 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 } |
| OLD | NEW |