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..41efdcdfb6b0eb9c635cc06dd9ee65a94b9c4f9b 100644 |
--- a/chrome/browser/metrics/metrics_log_serializer_unittest.cc |
+++ b/chrome/browser/metrics/metrics_log_serializer_unittest.cc |
@@ -13,6 +13,7 @@ typedef MetricsLogManager::SerializedLog SerializedLog; |
namespace { |
const size_t kMaxLocalListSize = 3; |
+const size_t kMinLogByteTotal = 1000; |
} // namespace |
@@ -25,7 +26,7 @@ TEST(MetricsLogSerializerTest, EmptyLogList) { |
std::vector<SerializedLog> local_list; |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &list); |
EXPECT_EQ(0U, list.GetSize()); |
local_list.clear(); // ReadLogsFromPrefList() expects empty |local_list|. |
@@ -43,7 +44,7 @@ TEST(MetricsLogSerializerTest, SingleElementLogList) { |
local_list[0].xml = "Hello world!"; |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &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 = kMaxLocalListSize * 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, kMaxLocalListSize, |
+ kMinLogByteTotal, &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 = kMaxLocalListSize * 5; |
+ // Make log_count logs each slightly larger than |
+ // kMinLogByteTotal / (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 = (kMinLogByteTotal / (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, ' '); |
+ } |
- local_list.clear(); |
+ MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
+ kMinLogByteTotal, &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() - 2, result_list.size()); |
+ |
+ 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(kMaxLocalListSize); |
+ // Make the total byte count about twice the minimum. |
+ size_t log_size = (kMinLogByteTotal / 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, kMaxLocalListSize, |
+ kMinLogByteTotal, &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()); |
+} |
+ |
+// 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(kMaxLocalListSize * 2); |
+ // Make the total byte count about four times the minimum. |
+ size_t log_size = (kMinLogByteTotal / local_list.size()) * 4; |
+ local_list[local_list.size() - kMaxLocalListSize].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, kMaxLocalListSize, |
+ kMinLogByteTotal, &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(kMaxLocalListSize, result_list.size()); |
+ EXPECT_TRUE(result_list.front().xml.find("First to keep") == 0); |
} |
// Induce LIST_SIZE_TOO_SMALL corruption |
@@ -120,7 +184,7 @@ TEST(MetricsLogSerializerTest, SmallRecoveredListSize) { |
local_list[0].xml = "Hello world!"; |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Remove last element. |
@@ -142,7 +206,7 @@ TEST(MetricsLogSerializerTest, RemoveSizeFromLogList) { |
local_list[1].xml = "two"; |
EXPECT_EQ(2U, local_list.size()); |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &list); |
EXPECT_EQ(4U, list.GetSize()); |
list.Remove(0, NULL); // Delete size (1st element). |
@@ -162,7 +226,7 @@ TEST(MetricsLogSerializerTest, CorruptSizeOfLogList) { |
local_list[0].xml = "Hello world!"; |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Change list size from 1 to 2. |
@@ -183,7 +247,7 @@ TEST(MetricsLogSerializerTest, CorruptChecksumOfLogList) { |
local_list[0].xml = "Hello world!"; |
MetricsLogSerializer::WriteLogsToPrefList(local_list, true, kMaxLocalListSize, |
- &list); |
+ kMinLogByteTotal, &list); |
EXPECT_EQ(3U, list.GetSize()); |
// Fetch checksum (last element) and change it. |