summaryrefslogtreecommitdiffstats
path: root/chrome/browser/safe_browsing
diff options
context:
space:
mode:
authorshess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-05 23:05:13 +0000
committershess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-05 23:05:13 +0000
commitde79ca9d31a185a8a965197b99fd628d9581b389 (patch)
tree150717c9541d6dc2ac4980778e08a7c3a5623731 /chrome/browser/safe_browsing
parentaa50cea833408403849bd3722838ee4a78ed4ede (diff)
downloadchromium_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.cc56
-rw-r--r--chrome/browser/safe_browsing/chunk_range.h13
-rw-r--r--chrome/browser/safe_browsing/chunk_range_unittest.cc85
-rw-r--r--chrome/browser/safe_browsing/safe_browsing_database.cc11
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