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