diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-05 23:05:13 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-05 23:05:13 +0000 |
commit | de79ca9d31a185a8a965197b99fd628d9581b389 (patch) | |
tree | 150717c9541d6dc2ac4980778e08a7c3a5623731 /chrome/browser/safe_browsing | |
parent | aa50cea833408403849bd3722838ee4a78ed4ede (diff) | |
download | chromium_src-de79ca9d31a185a8a965197b99fd628d9581b389.zip chromium_src-de79ca9d31a185a8a965197b99fd628d9581b389.tar.gz chromium_src-de79ca9d31a185a8a965197b99fd628d9581b389.tar.bz2 |
Cleanup converting safe-browsing chunks to range list.
Rewrite multiple helper functions to just go directly from the vector
of chunks to the range string.
BUG=none
TEST=Unit tests green.
Review URL: http://codereview.chromium.org/4588001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@65271 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/safe_browsing')
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range.cc | 56 | ||||
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range.h | 13 | ||||
-rw-r--r-- | chrome/browser/safe_browsing/chunk_range_unittest.cc | 85 | ||||
-rw-r--r-- | chrome/browser/safe_browsing/safe_browsing_database.cc | 11 |
4 files changed, 57 insertions, 108 deletions
diff --git a/chrome/browser/safe_browsing/chunk_range.cc b/chrome/browser/safe_browsing/chunk_range.cc index 101cb5a..b2f60ba 100644 --- a/chrome/browser/safe_browsing/chunk_range.cc +++ b/chrome/browser/safe_browsing/chunk_range.cc @@ -23,23 +23,30 @@ ChunkRange::ChunkRange(const ChunkRange& rhs) // Helper functions ----------------------------------------------------------- -// Traverse the chunks vector looking for contiguous integers. -void ChunksToRanges(const std::vector<int>& chunks, - std::vector<ChunkRange>* ranges) { - DCHECK(ranges); - for (size_t i = 0; i < chunks.size(); ++i) { - int start = static_cast<int>(i); - int next = start + 1; - while (next < static_cast<int>(chunks.size()) && - (chunks[start] == chunks[next] - 1 || - chunks[start] == chunks[next])) { - ++start; - ++next; +void ChunksToRangeString(const std::vector<int>& chunks, std::string* result) { + // The following code requires the range to be sorted. + std::vector<int> sorted_chunks(chunks); + std::sort(sorted_chunks.begin(), sorted_chunks.end()); + + DCHECK(result); + result->clear(); + std::vector<int>::const_iterator iter = sorted_chunks.begin(); + while (iter != sorted_chunks.end()) { + const int range_begin = *iter; + int range_end = *iter; + + // Extend the range forward across duplicates and increments. + for (; iter != sorted_chunks.end() && *iter <= range_end + 1; ++iter) { + range_end = *iter; + } + + if (!result->empty()) + result->append(","); + result->append(base::IntToString(range_begin)); + if (range_end > range_begin) { + result->append("-"); + result->append(base::IntToString(range_end)); } - ranges->push_back(ChunkRange(chunks[i], chunks[start])); - if (next >= static_cast<int>(chunks.size())) - break; - i = start; } } @@ -54,23 +61,6 @@ void RangesToChunks(const std::vector<ChunkRange>& ranges, } } -void RangesToString(const std::vector<ChunkRange>& ranges, - std::string* result) { - DCHECK(result); - result->clear(); - std::vector<ChunkRange>::const_iterator it = ranges.begin(); - for (; it != ranges.end(); ++it) { - if (!result->empty()) - result->append(","); - if (it->start() == it->stop()) { - std::string num_buf = base::IntToString(it->start()); - result->append(num_buf); - } else { - result->append(StringPrintf("%d-%d", it->start(), it->stop())); - } - } -} - bool StringToRanges(const std::string& input, std::vector<ChunkRange>* ranges) { DCHECK(ranges); diff --git a/chrome/browser/safe_browsing/chunk_range.h b/chrome/browser/safe_browsing/chunk_range.h index ace591f..cc6d92f 100644 --- a/chrome/browser/safe_browsing/chunk_range.h +++ b/chrome/browser/safe_browsing/chunk_range.h @@ -42,25 +42,20 @@ class ChunkRange { // Helper functions ------------------------------------------------------------ -// Convert a series of chunk numbers into a more compact range representation. -// The 'chunks' vector must be sorted in ascending order. -void ChunksToRanges(const std::vector<int>& chunks, - std::vector<ChunkRange>* ranges); - // Convert a set of ranges into individual chunk numbers. void RangesToChunks(const std::vector<ChunkRange>& ranges, std::vector<int>* chunks); -// Convert a series of chunk ranges into a string in protocol format. -void RangesToString(const std::vector<ChunkRange>& ranges, - std::string* result); - // Returns 'true' if the string was successfully converted to ChunkRanges, // 'false' if the input was malformed. // The string must be in the form: "1-100,398,415,1138-2001,2019". bool StringToRanges(const std::string& input, std::vector<ChunkRange>* ranges); +// Convenience for going from a list of chunks to a string in protocol +// format. +void ChunksToRangeString(const std::vector<int>& chunks, std::string* result); + // Tests if a chunk number is contained a sorted vector of ChunkRanges. bool IsChunkInRange(int chunk_number, const std::vector<ChunkRange>& ranges); diff --git a/chrome/browser/safe_browsing/chunk_range_unittest.cc b/chrome/browser/safe_browsing/chunk_range_unittest.cc index a31faff..67686b9 100644 --- a/chrome/browser/safe_browsing/chunk_range_unittest.cc +++ b/chrome/browser/safe_browsing/chunk_range_unittest.cc @@ -7,38 +7,10 @@ #include "chunk_range.h" #include "testing/gtest/include/gtest/gtest.h" -// Test formatting chunks into a string representation. -TEST(SafeBrowsingChunkRangeTest, TestRangesToString) { - std::vector<ChunkRange> ranges; - ranges.push_back(ChunkRange(1, 10)); - ranges.push_back(ChunkRange(15, 17)); - ranges.push_back(ChunkRange(21, 410)); - ranges.push_back(ChunkRange(991, 1000)); - - std::string range_string; - RangesToString(ranges, &range_string); - EXPECT_EQ(range_string, "1-10,15-17,21-410,991-1000"); - ranges.clear(); - - ranges.push_back(ChunkRange(4, 4)); - RangesToString(ranges, &range_string); - EXPECT_EQ(range_string, "4"); - - ranges.push_back(ChunkRange(7)); - ranges.push_back(ChunkRange(9)); - RangesToString(ranges, &range_string); - EXPECT_EQ(range_string, "4,7,9"); - - ranges.push_back(ChunkRange(42, 99)); - RangesToString(ranges, &range_string); - EXPECT_EQ(range_string, "4,7,9,42-99"); -} - - // Test various configurations of chunk numbers. -TEST(SafeBrowsingChunkRangeTest, TestChunksToRanges) { +TEST(SafeBrowsingChunkRangeTest, TestChunksToRangeString) { std::vector<int> chunks; - std::vector<ChunkRange> ranges; + std::string range_string; // Test one chunk range and one single value. chunks.push_back(1); @@ -46,15 +18,11 @@ TEST(SafeBrowsingChunkRangeTest, TestChunksToRanges) { chunks.push_back(3); chunks.push_back(4); chunks.push_back(7); - ChunksToRanges(chunks, &ranges); - EXPECT_EQ(ranges.size(), static_cast<size_t>(2)); - EXPECT_EQ(ranges[0].start(), 1); - EXPECT_EQ(ranges[0].stop(), 4); - EXPECT_EQ(ranges[1].start(), 7); - EXPECT_EQ(ranges[1].stop(), 7); + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("1-4,7")); chunks.clear(); - ranges.clear(); + range_string.clear(); // Test all chunk numbers in one range. chunks.push_back(3); @@ -65,13 +33,11 @@ TEST(SafeBrowsingChunkRangeTest, TestChunksToRanges) { chunks.push_back(8); chunks.push_back(9); chunks.push_back(10); - ChunksToRanges(chunks, &ranges); - EXPECT_EQ(ranges.size(), static_cast<size_t>(1)); - EXPECT_EQ(ranges[0].start(), 3); - EXPECT_EQ(ranges[0].stop(), 10); + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("3-10")); chunks.clear(); - ranges.clear(); + range_string.clear(); // Test no chunk numbers in contiguous ranges. chunks.push_back(3); @@ -82,21 +48,19 @@ TEST(SafeBrowsingChunkRangeTest, TestChunksToRanges) { chunks.push_back(13); chunks.push_back(15); chunks.push_back(17); - ChunksToRanges(chunks, &ranges); - EXPECT_EQ(ranges.size(), static_cast<size_t>(8)); + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("3,5,7,9,11,13,15,17")); chunks.clear(); - ranges.clear(); + range_string.clear(); // Test a single chunk number. chunks.push_back(17); - ChunksToRanges(chunks, &ranges); - EXPECT_EQ(ranges.size(), static_cast<size_t>(1)); - EXPECT_EQ(ranges[0].start(), 17); - EXPECT_EQ(ranges[0].stop(), 17); + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("17")); chunks.clear(); - ranges.clear(); + range_string.clear(); // Test duplicates. chunks.push_back(1); @@ -108,14 +72,21 @@ TEST(SafeBrowsingChunkRangeTest, TestChunksToRanges) { chunks.push_back(7); chunks.push_back(7); chunks.push_back(7); - ChunksToRanges(chunks, &ranges); - EXPECT_EQ(ranges.size(), static_cast<size_t>(2)); - EXPECT_EQ(ranges[0].start(), 1); - EXPECT_EQ(ranges[0].stop(), 3); - EXPECT_EQ(ranges[1].start(), 7); - EXPECT_EQ(ranges[1].stop(), 7); -} + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("1-3,7")); + // Test unsorted chunks. + chunks.push_back(4); + chunks.push_back(1); + chunks.push_back(7); + chunks.push_back(3); + chunks.push_back(2); + ChunksToRangeString(chunks, &range_string); + EXPECT_EQ(range_string, std::string("1-4,7")); + + chunks.clear(); + range_string.clear(); +} TEST(SafeBrowsingChunkRangeTest, TestStringToRanges) { std::vector<ChunkRange> ranges; diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc index d5be448..e741c60 100644 --- a/chrome/browser/safe_browsing/safe_browsing_database.cc +++ b/chrome/browser/safe_browsing/safe_browsing_database.cc @@ -123,15 +123,8 @@ void GetChunkIds(const std::vector<int>& chunks, } } - std::sort(malware_chunks.begin(), malware_chunks.end()); - std::vector<ChunkRange> malware_ranges; - ChunksToRanges(malware_chunks, &malware_ranges); - RangesToString(malware_ranges, malware_list); - - std::sort(phishing_chunks.begin(), phishing_chunks.end()); - std::vector<ChunkRange> phishing_ranges; - ChunksToRanges(phishing_chunks, &phishing_ranges); - RangesToString(phishing_ranges, phishing_list); + ChunksToRangeString(malware_chunks, malware_list); + ChunksToRangeString(phishing_chunks, phishing_list); } // Order |SBAddFullHash| on the prefix part. |SBAddPrefixLess()| from |