testHttpRange.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3  *
4  * Squid software is distributed under GPLv2+ license and includes
5  * contributions from numerous individuals and organizations.
6  * Please see the COPYING and CONTRIBUTORS files for details.
7  */
8 
9 #include "squid.h"
10 #include "compat/cppunit.h"
11 #include "HttpHeaderRange.h"
12 #include "HttpHeaderTools.h"
13 #include "unitTestMain.h"
14 
15 class TestHttpRange : public CPPUNIT_NS::TestFixture
16 {
22 
23 protected:
24  void testRangeParser();
25  void testRangeParsing(char const *rangestring);
26  void testRangeIter();
27  void testRangeCanonization();
28 };
30 
31 void
33 {
34  testRangeParsing("bytes=0-3");
35  testRangeParsing("bytes=-3");
36  testRangeParsing("bytes=1-");
37  testRangeParsing("bytes=0-3, 1-, -2");
38 }
39 
40 void
41 TestHttpRange::testRangeParsing(char const *rangestring)
42 {
43  String aString (rangestring);
44  HttpHdrRange *range = HttpHdrRange::ParseCreate (&aString);
45 
46  if (!range)
47  exit(EXIT_FAILURE);
48 
49  HttpHdrRange copy(*range);
50 
51  CPPUNIT_ASSERT_EQUAL(range->specs.size(), copy.specs.size());
52 
53  HttpHdrRange::iterator pos = range->begin();
54 
55  CPPUNIT_ASSERT(*pos);
56 
57  delete range;
58 }
59 
60 static HttpHdrRange *
61 rangeFromString(char const *rangestring)
62 {
63  String aString (rangestring);
64  HttpHdrRange *range = HttpHdrRange::ParseCreate (&aString);
65 
66  if (!range)
67  exit(EXIT_FAILURE);
68 
69  return range;
70 }
71 
72 void
74 {
75  HttpHdrRange *range=rangeFromString("bytes=0-3, 1-, -2");
76  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), range->specs.size());
77  size_t counter = 0;
78  HttpHdrRange::iterator i = range->begin();
79 
80  while (i != range->end()) {
81  ++counter;
82  ++i;
83  }
84 
85  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), counter);
86  i = range->begin();
87  CPPUNIT_ASSERT_EQUAL(static_cast<ptrdiff_t>(0), i - range->begin());
88  ++i;
89  CPPUNIT_ASSERT_EQUAL(static_cast<ptrdiff_t>(1), i - range->begin());
90  CPPUNIT_ASSERT_EQUAL(static_cast<ptrdiff_t>(-2), i - range->end());
91 }
92 
93 void
95 {
96  HttpHdrRange *range=rangeFromString("bytes=0-3, 1-, -2");
97  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), range->specs.size());
98 
99  /* 0-3 needs a content length of 4 */
100  /* This passes in the extant code - but should it? */
101 
102  if (!range->canonize(3))
103  exit(EXIT_FAILURE);
104 
105  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), range->specs.size());
106 
107  delete range;
108 
109  range=rangeFromString("bytes=0-3, 1-, -2");
110 
111  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), range->specs.size());
112 
113  /* 0-3 needs a content length of 4 */
114  if (!range->canonize(4))
115  exit(EXIT_FAILURE);
116 
117  delete range;
118 
119  range=rangeFromString("bytes=3-6");
120 
121  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), range->specs.size());
122 
123  /* 3-6 needs a content length of 4 or more */
124  if (range->canonize(3))
125  exit(EXIT_FAILURE);
126 
127  delete range;
128 
129  range=rangeFromString("bytes=3-6");
130 
131  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), range->specs.size());
132 
133  /* 3-6 needs a content length of 4 or more */
134  if (!range->canonize(4))
135  exit(EXIT_FAILURE);
136 
137  delete range;
138 
139  range=rangeFromString("bytes=1-1,2-3");
140 
141  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), range->specs.size());
142 
143  if (!range->canonize(4))
144  exit(EXIT_FAILURE);
145 
146  CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), range->specs.size());
147 
148  delete range;
149 }
150 
151 int
152 main(int argc, char *argv[])
153 {
154  return TestProgram().run(argc, argv);
155 }
156 
CPPUNIT_TEST(testRangeParser)
static HttpHdrRange * rangeFromString(char const *rangestring)
CPPUNIT_TEST_SUITE(TestHttpRange)
implements test program's main() function while enabling customization
Definition: unitTestMain.h:25
void testRangeCanonization()
void testRangeIter()
std::vector< HttpHdrRangeSpec * >::iterator iterator
int run(int argc, char *argv[])
Definition: unitTestMain.h:44
CPPUNIT_TEST_SUITE_REGISTRATION(TestHttpRange)
iterator end()
static HttpHdrRange * ParseCreate(const String *range_spec)
std::vector< HttpHdrRangeSpec * > specs
int canonize(int64_t)
void testRangeParsing(char const *rangestring)
void testRangeParser()
iterator begin()
int main(int argc, char *argv[])

 

Introduction

Documentation

Support

Miscellaneous