// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Test program to convert lists of integers into ranges, and vice versa.
#include "chunk_range.h"
#include "testing/gtest/include/gtest/gtest.h"
// Test various configurations of chunk numbers.
TEST(SafeBrowsingChunkRangeTest, TestChunksToRangeString) {
std::vector<int> chunks;
std::string range_string;
// Test one chunk range and one single value.
chunks.push_back(1);
chunks.push_back(2);
chunks.push_back(3);
chunks.push_back(4);
chunks.push_back(7);
ChunksToRangeString(chunks, &range_string);
EXPECT_EQ(range_string, std::string("1-4,7"));
chunks.clear();
range_string.clear();
// Test all chunk numbers in one range.
chunks.push_back(3);
chunks.push_back(4);
chunks.push_back(5);
chunks.push_back(6);
chunks.push_back(7);
chunks.push_back(8);
chunks.push_back(9);
chunks.push_back(10);
ChunksToRangeString(chunks, &range_string);
EXPECT_EQ(range_string, std::string("3-10"));
chunks.clear();
range_string.clear();
// Test no chunk numbers in contiguous ranges.
chunks.push_back(3);
chunks.push_back(5);
chunks.push_back(7);
chunks.push_back(9);
chunks.push_back(11);
chunks.push_back(13);
chunks.push_back(15);
chunks.push_back(17);
ChunksToRangeString(chunks, &range_string);
EXPECT_EQ(range_string, std::string("3,5,7,9,11,13,15,17"));
chunks.clear();
range_string.clear();
// Test a single chunk number.
chunks.push_back(17);
ChunksToRangeString(chunks, &range_string);
EXPECT_EQ(range_string, std::string("17"));
chunks.clear();
range_string.clear();
// Test duplicates.
chunks.push_back(1);
chunks.push_back(2);
chunks.push_back(2);
chunks.push_back(2);
chunks.push_back(3);
chunks.push_back(7);
chunks.push_back(7);
chunks.push_back(7);
chunks.push_back(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;
std::string input = "1-100,398,415,1138-2001,2019";
EXPECT_TRUE(StringToRanges(input, &ranges));
EXPECT_EQ(ranges.size(), static_cast<size_t>(5));
EXPECT_EQ(ranges[0].start(), 1);
EXPECT_EQ(ranges[0].stop(), 100);
EXPECT_EQ(ranges[1].start(), 398);
EXPECT_EQ(ranges[1].stop(), 398);
EXPECT_EQ(ranges[3].start(), 1138);
EXPECT_EQ(ranges[3].stop(), 2001);
ranges.clear();
input = "1,2,3,4,5,6,7";
EXPECT_TRUE(StringToRanges(input, &ranges));
EXPECT_EQ(ranges.size(), static_cast<size_t>(7));
ranges.clear();
input = "300-3001";
EXPECT_TRUE(StringToRanges(input, &ranges));
EXPECT_EQ(ranges.size(), static_cast<size_t>(1));
EXPECT_EQ(ranges[0].start(), 300);
EXPECT_EQ(ranges[0].stop(), 3001);
ranges.clear();
input = "17";
EXPECT_TRUE(StringToRanges(input, &ranges));
EXPECT_EQ(ranges.size(), static_cast<size_t>(1));
EXPECT_EQ(ranges[0].start(), 17);
EXPECT_EQ(ranges[0].stop(), 17);
ranges.clear();
input = "x-y";
EXPECT_FALSE(StringToRanges(input, &ranges));
}
TEST(SafeBrowsingChunkRangeTest, TestRangesToChunks) {
std::vector<ChunkRange> ranges;
ranges.push_back(ChunkRange(1, 4));
ranges.push_back(ChunkRange(17));
std::vector<int> chunks;
RangesToChunks(ranges, &chunks);
EXPECT_EQ(chunks.size(), static_cast<size_t>(5));
EXPECT_EQ(chunks[0], 1);
EXPECT_EQ(chunks[1], 2);
EXPECT_EQ(chunks[2], 3);
EXPECT_EQ(chunks[3], 4);
EXPECT_EQ(chunks[4], 17);
}
TEST(SafeBrowsingChunkRangeTest, TestSearchChunkRanges) {
std::string range_str("1-10,15-17,21-410,555,991-1000");
std::vector<ChunkRange> ranges;
StringToRanges(range_str, &ranges);
EXPECT_TRUE(IsChunkInRange(7, ranges));
EXPECT_TRUE(IsChunkInRange(300, ranges));
EXPECT_TRUE(IsChunkInRange(555, ranges));
EXPECT_TRUE(IsChunkInRange(1, ranges));
EXPECT_TRUE(IsChunkInRange(1000, ranges));
EXPECT_FALSE(IsChunkInRange(11, ranges));
EXPECT_FALSE(IsChunkInRange(990, ranges));
EXPECT_FALSE(IsChunkInRange(2000, ranges));
}