15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test program to convert lists of integers into ranges, and vice versa. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chunk_range.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test various configurations of chunk numbers. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SafeBrowsingChunkRangeTest, TestChunksToRangeString) { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> chunks; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string range_string; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test one chunk range and one single value. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(1); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(2); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(3); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(4); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("1-4,7")); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.clear(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_string.clear(); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test all chunk numbers in one range. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(3); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(4); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(5); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(6); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(8); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(9); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(10); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("3-10")); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.clear(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_string.clear(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test no chunk numbers in contiguous ranges. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(3); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(5); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(9); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(11); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(13); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(15); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(17); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("3,5,7,9,11,13,15,17")); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.clear(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_string.clear(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test a single chunk number. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(17); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("17")); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.clear(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_string.clear(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test duplicates. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(1); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(2); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(2); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(2); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(3); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("1-3,7")); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test unsorted chunks. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(4); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(1); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(7); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(3); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.push_back(2); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChunksToRangeString(chunks, &range_string); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(range_string, std::string("1-4,7")); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chunks.clear(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range_string.clear(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SafeBrowsingChunkRangeTest, TestStringToRanges) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ChunkRange> ranges; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string input = "1-100,398,415,1138-2001,2019"; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StringToRanges(input, &ranges)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges.size(), static_cast<size_t>(5)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].start(), 1); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].stop(), 100); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[1].start(), 398); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[1].stop(), 398); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[3].start(), 1138); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[3].stop(), 2001); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.clear(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "1,2,3,4,5,6,7"; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StringToRanges(input, &ranges)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges.size(), static_cast<size_t>(7)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.clear(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "300-3001"; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StringToRanges(input, &ranges)); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges.size(), static_cast<size_t>(1)); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].start(), 300); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].stop(), 3001); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.clear(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "17"; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(StringToRanges(input, &ranges)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges.size(), static_cast<size_t>(1)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].start(), 17); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ranges[0].stop(), 17); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.clear(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input = "x-y"; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(StringToRanges(input, &ranges)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SafeBrowsingChunkRangeTest, TestRangesToChunks) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ChunkRange> ranges; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.push_back(ChunkRange(1, 4)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges.push_back(ChunkRange(17)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> chunks; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RangesToChunks(ranges, &chunks); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks.size(), static_cast<size_t>(5)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[0], 1); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[1], 2); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[2], 3); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[3], 4); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(chunks[4], 17); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SafeBrowsingChunkRangeTest, TestSearchChunkRanges) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string range_str("1-10,15-17,21-410,555,991-1000"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ChunkRange> ranges; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringToRanges(range_str, &ranges); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsChunkInRange(7, ranges)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsChunkInRange(300, ranges)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsChunkInRange(555, ranges)); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsChunkInRange(1, ranges)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsChunkInRange(1000, ranges)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsChunkInRange(11, ranges)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsChunkInRange(990, ranges)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsChunkInRange(2000, ranges)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165