Index: chrome/browser/metrics/metrics_log_serializer_unittest.cc |
diff --git a/chrome/browser/metrics/metrics_log_serializer_unittest.cc b/chrome/browser/metrics/metrics_log_serializer_unittest.cc |
index f023a7cb2ef0b119f2f49a6dbbe8197d75a6bc44..e72df36bfa52ea1f28a67176af086730797183e3 100644 |
--- a/chrome/browser/metrics/metrics_log_serializer_unittest.cc |
+++ b/chrome/browser/metrics/metrics_log_serializer_unittest.cc |
@@ -12,7 +12,8 @@ typedef MetricsLogManager::SerializedLog SerializedLog; |
namespace { |
-const size_t kMaxLocalListSize = 3; |
+const size_t kListLengthLimit = 3; |
+const size_t kLogByteLimit = 1000; |
} // namespace |
@@ -24,8 +25,8 @@ TEST(MetricsLogSerializerTest, EmptyLogList) { |
ListValue list; |
std::vector<SerializedLog> local_list; |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
EXPECT_EQ(0U, list.GetSize()); |
local_list.clear(); // ReadLogsFromPrefList() expects empty |local_list|. |
@@ -42,8 +43,8 @@ TEST(MetricsLogSerializerTest, SingleElementLogList) { |
std::vector<SerializedLog> local_list(1); |
local_list[0].xml = "Hello world!"; |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
// |list| will now contain the following: |
// [1, Base64Encode("Hello world!"), MD5("Hello world!")]. |
@@ -76,40 +77,103 @@ TEST(MetricsLogSerializerTest, SingleElementLogList) { |
EXPECT_EQ(1U, local_list.size()); |
} |
-// Store elements greater than the limit. |
-TEST(MetricsLogSerializerTest, OverLimitLogList) { |
+// Store a set of logs over the length limit, but smaller than the min number of |
+// bytes. |
+TEST(MetricsLogSerializerTest, LongButTinyLogList) { |
ListValue list; |
- std::vector<SerializedLog> local_list(4); |
- local_list[0].proto = "one"; |
- local_list[1].proto = "two"; |
- local_list[2].proto = "three"; |
- local_list[3].proto = "four"; |
+ size_t log_count = kListLengthLimit * 5; |
+ std::vector<SerializedLog> local_list(log_count); |
+ for (size_t i = 0; i < local_list.size(); ++i) { |
+ local_list[0].xml = "x"; |
+ } |
- std::string expected_first; |
- base::Base64Encode(local_list[local_list.size() - kMaxLocalListSize].proto, |
- &expected_first); |
- std::string expected_last; |
- base::Base64Encode(local_list[local_list.size() - 1].proto, |
- &expected_last); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
+ std::vector<SerializedLog> result_list; |
+ EXPECT_EQ( |
+ MetricsLogSerializer::RECALL_SUCCESS, |
+ MetricsLogSerializer::ReadLogsFromPrefList(list, true, &result_list)); |
+ EXPECT_EQ(local_list.size(), result_list.size()); |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, false, |
- kMaxLocalListSize, &list); |
- EXPECT_EQ(kMaxLocalListSize + 2, list.GetSize()); |
+ EXPECT_TRUE(result_list.front().xml.find("x") == 0); |
+} |
- std::string actual_first; |
- EXPECT_TRUE((*(list.begin() + 1))->GetAsString(&actual_first)); |
- EXPECT_EQ(expected_first, actual_first); |
+// Store a set of logs over the length limit, but that doesn't reach the minimum |
+// number of bytes until after passing the length limit. |
+TEST(MetricsLogSerializerTest, LongButSmallLogList) { |
+ ListValue list; |
- std::string actual_last; |
- EXPECT_TRUE((*(list.end() - 2))->GetAsString(&actual_last)); |
- EXPECT_EQ(expected_last, actual_last); |
+ size_t log_count = kListLengthLimit * 5; |
+ // Make log_count logs each slightly larger than |
+ // kLogByteLimit / (log_count - 2) |
+ // so that the minimum is reached before the oldest (first) two logs. |
+ std::vector<SerializedLog> local_list(log_count); |
+ size_t log_size = (kLogByteLimit / (log_count - 2)) + 2; |
+ local_list[0].xml = "one"; |
+ local_list[1].xml = "two"; |
+ local_list[2].xml = "three"; |
+ local_list[log_count - 1].xml = "last"; |
+ for (size_t i = 0; i < local_list.size(); ++i) { |
+ local_list[i].xml.resize(log_size, ' '); |
+ } |
+ |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
+ std::vector<SerializedLog> result_list; |
+ EXPECT_EQ( |
+ MetricsLogSerializer::RECALL_SUCCESS, |
+ MetricsLogSerializer::ReadLogsFromPrefList(list, true, &result_list)); |
+ EXPECT_EQ(local_list.size() - 2, result_list.size()); |
- local_list.clear(); |
+ EXPECT_TRUE(result_list.front().xml.find("three") == 0); |
+ EXPECT_TRUE(result_list.back().xml.find("last") == 0); |
+} |
+ |
+// Store a set of logs within the length limit, but well over the minimum |
+// number of bytes. |
+TEST(MetricsLogSerializerTest, ShortButLargeLogList) { |
+ ListValue list; |
+ |
+ std::vector<SerializedLog> local_list(kListLengthLimit); |
+ // Make the total byte count about twice the minimum. |
+ size_t log_size = (kLogByteLimit / local_list.size()) * 2; |
+ for (size_t i = 0; i < local_list.size(); ++i) { |
+ local_list[i].xml.resize(log_size, ' '); |
+ } |
+ |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
+ std::vector<SerializedLog> result_list; |
EXPECT_EQ( |
MetricsLogSerializer::RECALL_SUCCESS, |
- MetricsLogSerializer::ReadLogsFromPrefList(list, true, &local_list)); |
- EXPECT_EQ(kMaxLocalListSize, local_list.size()); |
+ MetricsLogSerializer::ReadLogsFromPrefList(list, true, &result_list)); |
+ EXPECT_EQ(local_list.size(), result_list.size()); |
+} |
+ |
+// Store a set of logs over the length limit, and over the minimum number of |
+// bytes. |
+TEST(MetricsLogSerializerTest, LongAndLargeLogList) { |
+ ListValue list; |
+ |
+ // Include twice the max number of logs. |
+ std::vector<SerializedLog> local_list(kListLengthLimit * 2); |
+ // Make the total byte count about four times the minimum. |
+ size_t log_size = (kLogByteLimit / local_list.size()) * 4; |
+ local_list[local_list.size() - kListLengthLimit].xml = "First to keep"; |
+ for (size_t i = 0; i < local_list.size(); ++i) { |
+ local_list[i].xml.resize(log_size, ' '); |
+ } |
+ |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
+ std::vector<SerializedLog> result_list; |
+ EXPECT_EQ( |
+ MetricsLogSerializer::RECALL_SUCCESS, |
+ MetricsLogSerializer::ReadLogsFromPrefList(list, true, &result_list)); |
+ // The max length should control the resulting size. |
+ EXPECT_EQ(kListLengthLimit, result_list.size()); |
+ EXPECT_TRUE(result_list.front().xml.find("First to keep") == 0); |
} |
// Induce LIST_SIZE_TOO_SMALL corruption |
@@ -119,8 +183,8 @@ TEST(MetricsLogSerializerTest, SmallRecoveredListSize) { |
std::vector<SerializedLog> local_list(1); |
local_list[0].xml = "Hello world!"; |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Remove last element. |
@@ -141,8 +205,8 @@ TEST(MetricsLogSerializerTest, RemoveSizeFromLogList) { |
local_list[0].xml = "one"; |
local_list[1].xml = "two"; |
EXPECT_EQ(2U, local_list.size()); |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
EXPECT_EQ(4U, list.GetSize()); |
list.Remove(0, NULL); // Delete size (1st element). |
@@ -161,8 +225,8 @@ TEST(MetricsLogSerializerTest, CorruptSizeOfLogList) { |
std::vector<SerializedLog> local_list(1); |
local_list[0].xml = "Hello world!"; |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Change list size from 1 to 2. |
@@ -182,8 +246,8 @@ TEST(MetricsLogSerializerTest, CorruptChecksumOfLogList) { |
std::vector<SerializedLog> local_list(1); |
local_list[0].xml = "Hello world!"; |
- MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kListLengthLimit, |
+ kLogByteLimit, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Fetch checksum (last element) and change it. |