]> git.ipfire.org Git - thirdparty/squid.git/blob - src/tests/testHttpReply.cc
Removed squid-old.h
[thirdparty/squid.git] / src / tests / testHttpReply.cc
1 #define SQUID_UNIT_TEST 1
2 #include "squid.h"
3 #include <cppunit/TestAssert.h>
4
5 #include "testHttpReply.h"
6 #include "HttpReply.h"
7 #include "Mem.h"
8 #include "protos.h"
9
10 CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply );
11
12 struct SquidConfig Config;
13
14 /* stub functions to link successfully */
15
16 #include "MemObject.h"
17 int64_t
18 MemObject::endOffset() const
19 {
20 return 0;
21 }
22
23 #include "ConfigParser.h"
24 void
25 ConfigParser::destruct()
26 {
27 // CALLED as shutdown no-op
28 // fatal("ConfigParser::destruct. Not implemented.");
29 }
30
31 void
32 eventAdd(const char *name, EVH * func, void *arg, double when, int, bool cbdata)
33 {
34 // CALLED as setUp no-op
35 // fatal("eventAdd. Not implemented.");
36 }
37
38 /* end */
39
40 void
41 testHttpReply::setUp()
42 {
43 Mem::Init();
44 httpHeaderInitModule();
45 }
46
47 void
48 testHttpReply::testSanityCheckFirstLine()
49 {
50 MemBuf input;
51 HttpReply engine;
52 http_status error = HTTP_STATUS_NONE;
53 size_t hdr_len;
54 input.init();
55
56 // a valid status line
57 input.append("HTTP/1.1 200 Okay\n\n", 19);
58 hdr_len = headersEnd(input.content(),input.contentSize());
59 CPPUNIT_ASSERT( 1 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
60 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
61 input.reset();
62 error = HTTP_STATUS_NONE;
63
64 input.append("HTTP/1.1 200 Okay \n\n", 28);
65 hdr_len = headersEnd(input.content(),input.contentSize());
66 CPPUNIT_ASSERT( 2 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
67 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
68 input.reset();
69 error = HTTP_STATUS_NONE;
70
71 #if TODO // these cases are only checked after parse...
72 // invalid status line
73 input.append("HTTP/1.1 999 Okay\n\n", 19);
74 hdr_len = headersEnd(input.content(),input.contentSize());
75 CPPUNIT_ASSERT( 3 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
76 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
77 input.reset();
78 error = HTTP_STATUS_NONE;
79
80 input.append("HTTP/1.1 2000 Okay \n\n", 29);
81 hdr_len = headersEnd(input.content(),input.contentSize());
82 CPPUNIT_ASSERT( 4 && engine.sanityCheckStartLine(&input, hdr_len, &error) );
83 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
84 input.reset();
85 error = HTTP_STATUS_NONE;
86 #endif
87
88 // valid ICY protocol status line
89 input.append("ICY 200 Okay\n\n", 18);
90 hdr_len = headersEnd(input.content(),input.contentSize());
91 CPPUNIT_ASSERT( engine.sanityCheckStartLine(&input, hdr_len, &error) );
92 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
93 input.reset();
94 error = HTTP_STATUS_NONE;
95 /* NP: the engine saves details about the protocol. even when being reset :( */
96 engine.protoPrefix="HTTP/";
97 engine.reset();
98
99 // empty status line
100 input.append("\n\n", 2);
101 hdr_len = headersEnd(input.content(),input.contentSize());
102 CPPUNIT_ASSERT( 5 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
103 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
104 input.reset();
105 error = HTTP_STATUS_NONE;
106
107 input.append(" \n\n", 8);
108 hdr_len = headersEnd(input.content(),input.contentSize());
109 CPPUNIT_ASSERT( 6 && !engine.sanityCheckStartLine(&input, hdr_len, &error) );
110 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
111 input.reset();
112 error = HTTP_STATUS_NONE;
113
114 // status line with no message
115 input.append("HTTP/1.1 200\n\n", 14); /* real case seen */
116 hdr_len = headersEnd(input.content(),input.contentSize());
117 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
118 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
119 input.reset();
120 error = HTTP_STATUS_NONE;
121
122 input.append("HTTP/1.1 200 \n\n", 15); /* real case seen */
123 hdr_len = headersEnd(input.content(),input.contentSize());
124 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
125 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
126 input.reset();
127 error = HTTP_STATUS_NONE;
128
129 // incomplete (short) status lines... not sane (yet), but no error either.
130 input.append("H", 1);
131 hdr_len = headersEnd(input.content(),input.contentSize());
132 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
133 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
134 input.reset();
135 error = HTTP_STATUS_NONE;
136
137 input.append("HTTP/", 5);
138 hdr_len = headersEnd(input.content(),input.contentSize());
139 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
140 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
141 input.reset();
142 error = HTTP_STATUS_NONE;
143
144 input.append("HTTP/1", 6);
145 hdr_len = headersEnd(input.content(),input.contentSize());
146 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
147 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
148 input.reset();
149 error = HTTP_STATUS_NONE;
150
151 input.append("HTTP/1.1", 8);
152 hdr_len = headersEnd(input.content(),input.contentSize());
153 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
154 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
155 input.reset();
156 error = HTTP_STATUS_NONE;
157
158 input.append("HTTP/1.1 ", 9); /* real case seen */
159 hdr_len = headersEnd(input.content(),input.contentSize());
160 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
161 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
162 input.reset();
163 error = HTTP_STATUS_NONE;
164
165 input.append("HTTP/1.1 20", 14);
166 hdr_len = headersEnd(input.content(),input.contentSize());
167 CPPUNIT_ASSERT(engine.sanityCheckStartLine(&input, hdr_len, &error) );
168 CPPUNIT_ASSERT_EQUAL(error, HTTP_STATUS_NONE);
169 input.reset();
170 error = HTTP_STATUS_NONE;
171
172 // status line with no status
173 input.append("HTTP/1.1 \n\n", 11);
174 hdr_len = headersEnd(input.content(),input.contentSize());
175 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
176 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
177 input.reset();
178 error = HTTP_STATUS_NONE;
179
180 input.append("HTTP/1.1 \n\n", 15);
181 hdr_len = headersEnd(input.content(),input.contentSize());
182 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
183 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
184 input.reset();
185 error = HTTP_STATUS_NONE;
186
187 input.append("HTTP/1.1 Okay\n\n", 16); /* real case seen */
188 hdr_len = headersEnd(input.content(),input.contentSize());
189 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
190 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
191 input.reset();
192 error = HTTP_STATUS_NONE;
193
194 // status line with nul-byte
195 input.append("HTTP/1.1\0200 Okay\n\n", 19); /* real case seen */
196 hdr_len = headersEnd(input.content(),input.contentSize());
197 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
198 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
199 input.reset();
200 error = HTTP_STATUS_NONE;
201
202 // status line with negative status
203 input.append("HTTP/1.1 -000\n\n", 15); /* real case seen */
204 hdr_len = headersEnd(input.content(),input.contentSize());
205 CPPUNIT_ASSERT(!engine.sanityCheckStartLine(&input, hdr_len, &error) );
206 CPPUNIT_ASSERT_EQUAL(error, HTTP_INVALID_HEADER);
207 input.reset();
208 error = HTTP_STATUS_NONE;
209 }