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