15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 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)#include "net/http/http_byte_range.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpByteRangeTest, ValidRanges) { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 first_byte_position; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 last_byte_position; 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 suffix_length; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool valid; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 0, false }, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 0, 0, 0, true }, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -10, 0, 0, false }, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 0, 0, false }, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, -1, 0, true }, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, -1, false }, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, 50, 0, false }, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10000, 0, true }, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 100000, true }, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpByteRange range; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_first_byte_position(tests[i].first_byte_position); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_last_byte_position(tests[i].last_byte_position); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_suffix_length(tests[i].suffix_length); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].valid, range.IsValid()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpByteRangeTest, SetInstanceSize) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 first_byte_position; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 last_byte_position; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 suffix_length; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 instance_size; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool expected_return_value; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 expected_lower_bound; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 expected_upper_bound; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -10, 0, -1, 0, false, -1, -1 }, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 0, -1, 0, false, -1, -1 }, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Zero instance size is valid, this is the case that user has to handle. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, -1, 0, true, 0, -1 }, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 500, 0, true, 0, -1 }, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, 50, -1, 0, false, -1, -1 }, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 500, 300, true, 0, 299 }, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, -1, 100, true, 0, 99 }, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, -1, -1, 100, true, 10, 99 }, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { -1, -1, 500, 1000, true, 500, 999 }, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10, 10000, -1, 1000000, true, 10, 10000 }, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HttpByteRange range; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_first_byte_position(tests[i].first_byte_position); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_last_byte_position(tests[i].last_byte_position); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range.set_suffix_length(tests[i].suffix_length); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool return_value = range.ComputeBounds(tests[i].instance_size); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_return_value, return_value); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (return_value) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position()); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try to call SetInstanceSize the second time. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(range.ComputeBounds(tests[i].instance_size)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And expect there's no side effect. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].suffix_length, range.suffix_length()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(HttpByteRangeTest, GetHeaderValue) { 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static const struct { 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::HttpByteRange range; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const char* expected; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } tests[] = {{net::HttpByteRange::Bounded(0, 0), "bytes=0-0"}, 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) {net::HttpByteRange::Bounded(0, 100), "bytes=0-100"}, 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) {net::HttpByteRange::Bounded(0, -1), "bytes=0-"}, 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) {net::HttpByteRange::RightUnbounded(100), "bytes=100-"}, 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) {net::HttpByteRange::Suffix(100), "bytes=-100"}, }; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(tests[i].expected, tests[i].range.GetHeaderValue()); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 93