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