1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_byte_range.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpByteRangeTest, ValidRanges) {
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 first_byte_position;
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 last_byte_position;
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 suffix_length;
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    bool valid;
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } tests[] = {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1,  0, false },
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {   0,  0,  0, true  },
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { -10,  0,  0, false },
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10,  0,  0, false },
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10, -1,  0, true  },
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1, -1, false },
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, 50,  0, false },
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10, 10000, 0, true },
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1, 100000, true },
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    net::HttpByteRange range;
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_first_byte_position(tests[i].first_byte_position);
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_last_byte_position(tests[i].last_byte_position);
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_suffix_length(tests[i].suffix_length);
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(tests[i].valid, range.IsValid());
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpByteRangeTest, SetInstanceSize) {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const struct {
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 first_byte_position;
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 last_byte_position;
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 suffix_length;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 instance_size;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    bool expected_return_value;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 expected_lower_bound;
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int64 expected_upper_bound;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } tests[] = {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { -10,  0,  -1,   0, false,  -1,  -1 },
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10,  0,  -1,   0, false,  -1,  -1 },
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Zero instance size is valid, this is the case that user has to handle.
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1,  -1,   0,  true,   0,  -1 },
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1, 500,   0,  true,   0,  -1 },
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, 50,  -1,   0, false,  -1,  -1 },
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1, 500, 300,  true,   0, 299 },
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1,  -1, 100,  true,   0,  99 },
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10, -1,  -1, 100,  true,  10,  99 },
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  -1, -1, 500, 1000, true, 500, 999 },
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    {  10, 10000, -1, 1000000, true, 10, 10000 },
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    net::HttpByteRange range;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_first_byte_position(tests[i].first_byte_position);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_last_byte_position(tests[i].last_byte_position);
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    range.set_suffix_length(tests[i].suffix_length);
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    bool return_value = range.ComputeBounds(tests[i].instance_size);
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(tests[i].expected_return_value, return_value);
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (return_value) {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position());
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position());
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // Try to call SetInstanceSize the second time.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_FALSE(range.ComputeBounds(tests[i].instance_size));
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // And expect there's no side effect.
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(tests[i].expected_lower_bound, range.first_byte_position());
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(tests[i].expected_upper_bound, range.last_byte_position());
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_EQ(tests[i].suffix_length, range.suffix_length());
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
79