1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test program to convert lists of integers into ranges, and vice versa.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chunk_range.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test various configurations of chunk numbers.
11513209b27ff55e2841eac0e4120199c23acce758Ben MurdochTEST(SafeBrowsingChunkRangeTest, TestChunksToRangeString) {
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> chunks;
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string range_string;
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test one chunk range and one single value.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(1);
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(2);
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(3);
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(4);
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("1-4,7"));
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  range_string.clear();
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test all chunk numbers in one range.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(3);
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(4);
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(5);
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(6);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(8);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(9);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(10);
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("3-10"));
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  range_string.clear();
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test no chunk numbers in contiguous ranges.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(3);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(5);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(9);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(11);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(13);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(15);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(17);
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("3,5,7,9,11,13,15,17"));
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  range_string.clear();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test a single chunk number.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(17);
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("17"));
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.clear();
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  range_string.clear();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test duplicates.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(1);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(2);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(2);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(2);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(3);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  chunks.push_back(7);
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("1-3,7"));
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Test unsorted chunks.
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.push_back(4);
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.push_back(1);
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.push_back(7);
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.push_back(3);
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.push_back(2);
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ChunksToRangeString(chunks, &range_string);
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  EXPECT_EQ(range_string, std::string("1-4,7"));
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  chunks.clear();
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  range_string.clear();
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingChunkRangeTest, TestStringToRanges) {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkRange> ranges;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string input = "1-100,398,415,1138-2001,2019";
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(StringToRanges(input, &ranges));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges.size(), static_cast<size_t>(5));
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].start(), 1);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].stop(),  100);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[1].start(), 398);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[1].stop(),  398);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[3].start(), 1138);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[3].stop(),  2001);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.clear();
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  input = "1,2,3,4,5,6,7";
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(StringToRanges(input, &ranges));
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges.size(), static_cast<size_t>(7));
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.clear();
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  input = "300-3001";
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(StringToRanges(input, &ranges));
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges.size(), static_cast<size_t>(1));
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].start(),  300);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].stop(),  3001);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.clear();
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  input = "17";
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(StringToRanges(input, &ranges));
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges.size(), static_cast<size_t>(1));
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].start(), 17);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ranges[0].stop(),  17);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.clear();
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  input = "x-y";
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(StringToRanges(input, &ranges));
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingChunkRangeTest, TestRangesToChunks) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkRange> ranges;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.push_back(ChunkRange(1, 4));
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ranges.push_back(ChunkRange(17));
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> chunks;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RangesToChunks(ranges, &chunks);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks.size(), static_cast<size_t>(5));
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[0], 1);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[1], 2);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[2], 3);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[3], 4);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(chunks[4], 17);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingChunkRangeTest, TestSearchChunkRanges) {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string range_str("1-10,15-17,21-410,555,991-1000");
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ChunkRange> ranges;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StringToRanges(range_str, &ranges);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsChunkInRange(7, ranges));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsChunkInRange(300, ranges));
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsChunkInRange(555, ranges));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsChunkInRange(1, ranges));
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(IsChunkInRange(1000, ranges));
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(IsChunkInRange(11, ranges));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(IsChunkInRange(990, ranges));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(IsChunkInRange(2000, ranges));
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
165