source: trunk/server/www/vendors/simpletest/test/http_test.php @ 6

Last change on this file since 6 was 6, checked in by sander, 12 years ago

Added SimpleTest? test framework

File size: 18.7 KB
Line 
1<?php
2// $Id: http_test.php 1505 2007-04-30 23:39:59Z lastcraft $
3require_once(dirname(__FILE__) . '/../autorun.php');
4require_once(dirname(__FILE__) . '/../encoding.php');
5require_once(dirname(__FILE__) . '/../http.php');
6require_once(dirname(__FILE__) . '/../socket.php');
7require_once(dirname(__FILE__) . '/../cookies.php');
8Mock::generate('SimpleSocket');
9Mock::generate('SimpleCookieJar');
10Mock::generate('SimpleRoute');
11Mock::generatePartial('SimpleRoute', 'PartialSimpleRoute', array('_createSocket'));
12Mock::generatePartial(
13        'SimpleProxyRoute',
14        'PartialSimpleProxyRoute',
15        array('_createSocket'));
16
17class TestOfDirectRoute extends UnitTestCase {
18   
19    function testDefaultGetRequest() {
20        $socket = &new MockSimpleSocket();
21        $socket->expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
22        $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
23        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
24        $socket->expectCallCount('write', 3);
25       
26        $route = &new PartialSimpleRoute();
27        $route->setReturnReference('_createSocket', $socket);
28        $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html'));
29       
30        $this->assertReference($route->createConnection('GET', 15), $socket);
31    }
32   
33    function testDefaultPostRequest() {
34        $socket = &new MockSimpleSocket();
35        $socket->expectArgumentsAt(0, 'write', array("POST /here.html HTTP/1.0\r\n"));
36        $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
37        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
38        $socket->expectCallCount('write', 3);
39       
40        $route = &new PartialSimpleRoute();
41        $route->setReturnReference('_createSocket', $socket);
42        $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html'));
43       
44        $route->createConnection('POST', 15);
45    }
46   
47    function testGetWithPort() {
48        $socket = &new MockSimpleSocket();
49        $socket->expectArgumentsAt(0, 'write', array("GET /here.html HTTP/1.0\r\n"));
50        $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host:81\r\n"));
51        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
52        $socket->expectCallCount('write', 3);
53       
54        $route = &new PartialSimpleRoute();
55        $route->setReturnReference('_createSocket', $socket);
56        $route->SimpleRoute(new SimpleUrl('http://a.valid.host:81/here.html'));
57       
58        $route->createConnection('GET', 15);
59    }
60   
61    function testGetWithParameters() {
62        $socket = &new MockSimpleSocket();
63        $socket->expectArgumentsAt(0, 'write', array("GET /here.html?a=1&b=2 HTTP/1.0\r\n"));
64        $socket->expectArgumentsAt(1, 'write', array("Host: a.valid.host\r\n"));
65        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
66        $socket->expectCallCount('write', 3);
67       
68        $route = &new PartialSimpleRoute();
69        $route->setReturnReference('_createSocket', $socket);
70        $route->SimpleRoute(new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'));
71       
72        $route->createConnection('GET', 15);
73    }
74}
75
76class TestOfProxyRoute extends UnitTestCase {
77   
78    function testDefaultGet() {
79        $socket = &new MockSimpleSocket();
80        $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
81        $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
82        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
83        $socket->expectCallCount('write', 3);
84       
85        $route = &new PartialSimpleProxyRoute();
86        $route->setReturnReference('_createSocket', $socket);
87        $route->SimpleProxyRoute(
88                new SimpleUrl('http://a.valid.host/here.html'),
89                new SimpleUrl('http://my-proxy'));
90        $route->createConnection('GET', 15);
91    }
92   
93    function testDefaultPost() {
94        $socket = &new MockSimpleSocket();
95        $socket->expectArgumentsAt(0, 'write', array("POST http://a.valid.host/here.html HTTP/1.0\r\n"));
96        $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
97        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
98        $socket->expectCallCount('write', 3);
99       
100        $route = &new PartialSimpleProxyRoute();
101        $route->setReturnReference('_createSocket', $socket);
102        $route->SimpleProxyRoute(
103                new SimpleUrl('http://a.valid.host/here.html'),
104                new SimpleUrl('http://my-proxy'));
105        $route->createConnection('POST', 15);
106    }
107   
108    function testGetWithPort() {
109        $socket = &new MockSimpleSocket();
110        $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host:81/here.html HTTP/1.0\r\n"));
111        $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8081\r\n"));
112        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
113        $socket->expectCallCount('write', 3);
114       
115        $route = &new PartialSimpleProxyRoute();
116        $route->setReturnReference('_createSocket', $socket);
117        $route->SimpleProxyRoute(
118                new SimpleUrl('http://a.valid.host:81/here.html'),
119                new SimpleUrl('http://my-proxy:8081'));
120        $route->createConnection('GET', 15);
121    }
122   
123    function testGetWithParameters() {
124        $socket = &new MockSimpleSocket();
125        $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html?a=1&b=2 HTTP/1.0\r\n"));
126        $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
127        $socket->expectArgumentsAt(2, 'write', array("Connection: close\r\n"));
128        $socket->expectCallCount('write', 3);
129       
130        $route = &new PartialSimpleProxyRoute();
131        $route->setReturnReference('_createSocket', $socket);
132        $route->SimpleProxyRoute(
133                new SimpleUrl('http://a.valid.host/here.html?a=1&b=2'),
134                new SimpleUrl('http://my-proxy'));
135        $route->createConnection('GET', 15);
136    }
137   
138    function testGetWithAuthentication() {
139        $encoded = base64_encode('Me:Secret');
140
141        $socket = &new MockSimpleSocket();
142        $socket->expectArgumentsAt(0, 'write', array("GET http://a.valid.host/here.html HTTP/1.0\r\n"));
143        $socket->expectArgumentsAt(1, 'write', array("Host: my-proxy:8080\r\n"));
144        $socket->expectArgumentsAt(2, 'write', array("Proxy-Authorization: Basic $encoded\r\n"));
145        $socket->expectArgumentsAt(3, 'write', array("Connection: close\r\n"));
146        $socket->expectCallCount('write', 4);
147       
148        $route = &new PartialSimpleProxyRoute();
149        $route->setReturnReference('_createSocket', $socket);
150        $route->SimpleProxyRoute(
151                new SimpleUrl('http://a.valid.host/here.html'),
152                new SimpleUrl('http://my-proxy'),
153                'Me',
154                'Secret');
155        $route->createConnection('GET', 15);
156    }
157}
158
159class TestOfHttpRequest extends UnitTestCase {
160   
161    function testReadingBadConnection() {
162        $socket = &new MockSimpleSocket();
163       
164        $route = &new MockSimpleRoute();
165        $route->setReturnReference('createConnection', $socket);
166       
167        $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
168        $reponse = &$request->fetch(15);
169        $this->assertTrue($reponse->isError());
170    }
171   
172    function testReadingGoodConnection() {
173        $socket = &new MockSimpleSocket();
174        $socket->expectOnce('write', array("\r\n"));
175       
176        $route = &new MockSimpleRoute();
177        $route->setReturnReference('createConnection', $socket);
178        $route->expectArguments('createConnection', array('GET', 15));
179       
180        $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
181        $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
182    }
183   
184    function testWritingAdditionalHeaders() {
185        $socket = &new MockSimpleSocket();
186        $socket->expectArgumentsAt(0, 'write', array("My: stuff\r\n"));
187        $socket->expectArgumentsAt(1, 'write', array("\r\n"));
188        $socket->expectCallCount('write', 2);
189       
190        $route = &new MockSimpleRoute();
191        $route->setReturnReference('createConnection', $socket);
192       
193        $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
194        $request->addHeaderLine('My: stuff');
195        $request->fetch(15);
196    }
197   
198    function testCookieWriting() {
199        $socket = &new MockSimpleSocket();
200        $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A\r\n"));
201        $socket->expectArgumentsAt(1, 'write', array("\r\n"));
202        $socket->expectCallCount('write', 2);
203       
204        $route = &new MockSimpleRoute();
205        $route->setReturnReference('createConnection', $socket);
206       
207        $jar = new SimpleCookieJar();
208        $jar->setCookie('a', 'A');
209       
210        $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
211        $request->readCookiesFromJar($jar, new SimpleUrl('/'));
212        $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
213    }
214   
215    function testMultipleCookieWriting() {
216        $socket = &new MockSimpleSocket();
217        $socket->expectArgumentsAt(0, 'write', array("Cookie: a=A;b=B\r\n"));
218       
219        $route = &new MockSimpleRoute();
220        $route->setReturnReference('createConnection', $socket);
221       
222        $jar = new SimpleCookieJar();
223        $jar->setCookie('a', 'A');
224        $jar->setCookie('b', 'B');
225       
226        $request = &new SimpleHttpRequest($route, new SimpleGetEncoding());
227        $request->readCookiesFromJar($jar, new SimpleUrl('/'));
228        $request->fetch(15);
229    }
230}
231
232class TestOfHttpPostRequest extends UnitTestCase {
233   
234    function testReadingBadConnectionCausesErrorBecauseOfDeadSocket() {
235        $socket = &new MockSimpleSocket();
236       
237        $route = &new MockSimpleRoute();
238        $route->setReturnReference('createConnection', $socket);
239       
240        $request = &new SimpleHttpRequest($route, new SimplePostEncoding());
241        $reponse = &$request->fetch(15);
242        $this->assertTrue($reponse->isError());
243    }
244   
245    function testReadingGoodConnection() {
246        $socket = &new MockSimpleSocket();
247        $socket->expectArgumentsAt(0, 'write', array("Content-Length: 0\r\n"));
248        $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
249        $socket->expectArgumentsAt(2, 'write', array("\r\n"));
250        $socket->expectArgumentsAt(3, 'write', array(""));
251       
252        $route = &new MockSimpleRoute();
253        $route->setReturnReference('createConnection', $socket);
254        $route->expectArguments('createConnection', array('POST', 15));
255       
256        $request = &new SimpleHttpRequest($route, new SimplePostEncoding());
257        $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
258    }
259   
260    function testContentHeadersCalculated() {
261        $socket = &new MockSimpleSocket();
262        $socket->expectArgumentsAt(0, 'write', array("Content-Length: 3\r\n"));
263        $socket->expectArgumentsAt(1, 'write', array("Content-Type: application/x-www-form-urlencoded\r\n"));
264        $socket->expectArgumentsAt(2, 'write', array("\r\n"));
265        $socket->expectArgumentsAt(3, 'write', array("a=A"));
266       
267        $route = &new MockSimpleRoute();
268        $route->setReturnReference('createConnection', $socket);
269        $route->expectArguments('createConnection', array('POST', 15));
270       
271        $request = &new SimpleHttpRequest(
272                $route,
273                new SimplePostEncoding(array('a' => 'A')));
274        $this->assertIsA($request->fetch(15), 'SimpleHttpResponse');
275    }
276}
277   
278class TestOfHttpHeaders extends UnitTestCase {
279   
280    function testParseBasicHeaders() {
281        $headers = new SimpleHttpHeaders(
282                "HTTP/1.1 200 OK\r\n" .
283                "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
284                "Content-Type: text/plain\r\n" .
285                "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
286                "Connection: close");
287        $this->assertIdentical($headers->getHttpVersion(), "1.1");
288        $this->assertIdentical($headers->getResponseCode(), 200);
289        $this->assertEqual($headers->getMimeType(), "text/plain");
290    }
291   
292    function testNonStandardResponseHeader() {
293        $headers = new SimpleHttpHeaders(
294                "HTTP/1.1 302 (HTTP-Version SP Status-Code CRLF)\r\n" .
295                "Connection: close");
296        $this->assertIdentical($headers->getResponseCode(), 302);
297    }
298   
299    function testCanParseMultipleCookies() {
300        $jar = &new MockSimpleCookieJar();
301        $jar->expectAt(0, 'setCookie', array('a', 'aaa', 'host', '/here/', 'Wed, 25 Dec 2002 04:24:20 GMT'));
302        $jar->expectAt(1, 'setCookie', array('b', 'bbb', 'host', '/', false));
303
304        $headers = new SimpleHttpHeaders(
305                "HTTP/1.1 200 OK\r\n" .
306                "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n" .
307                "Content-Type: text/plain\r\n" .
308                "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\n" .
309                "Set-Cookie: a=aaa; expires=Wed, 25-Dec-02 04:24:20 GMT; path=/here/\r\n" .
310                "Set-Cookie: b=bbb\r\n" .
311                "Connection: close");
312        $headers->writeCookiesToJar($jar, new SimpleUrl('http://host'));
313    }
314   
315    function testCanRecogniseRedirect() {
316        $headers = new SimpleHttpHeaders("HTTP/1.1 301 OK\r\n" .
317                "Content-Type: text/plain\r\n" .
318                "Content-Length: 0\r\n" .
319                "Location: http://www.somewhere-else.com/\r\n" .
320                "Connection: close");
321        $this->assertIdentical($headers->getResponseCode(), 301);
322        $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
323        $this->assertTrue($headers->isRedirect());
324    }
325   
326    function testCanParseChallenge() {
327        $headers = new SimpleHttpHeaders("HTTP/1.1 401 Authorization required\r\n" .
328                "Content-Type: text/plain\r\n" .
329                "Connection: close\r\n" .
330                "WWW-Authenticate: Basic realm=\"Somewhere\"");
331        $this->assertEqual($headers->getAuthentication(), 'Basic');
332        $this->assertEqual($headers->getRealm(), 'Somewhere');
333        $this->assertTrue($headers->isChallenge());
334    }
335}
336
337class TestOfHttpResponse extends UnitTestCase {
338   
339    function testBadRequest() {
340        $socket = &new MockSimpleSocket();
341        $socket->setReturnValue('getSent', '');
342
343        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
344        $this->assertTrue($response->isError());
345        $this->assertPattern('/Nothing fetched/', $response->getError());
346        $this->assertIdentical($response->getContent(), false);
347        $this->assertIdentical($response->getSent(), '');
348    }
349   
350    function testBadSocketDuringResponse() {
351        $socket = &new MockSimpleSocket();
352        $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
353        $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
354        $socket->setReturnValue("read", "");
355        $socket->setReturnValue('getSent', 'HTTP/1.1 ...');
356
357        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
358        $this->assertTrue($response->isError());
359        $this->assertEqual($response->getContent(), '');
360        $this->assertEqual($response->getSent(), 'HTTP/1.1 ...');
361    }
362   
363    function testIncompleteHeader() {
364        $socket = &new MockSimpleSocket();
365        $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\n");
366        $socket->setReturnValueAt(1, "read", "Date: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
367        $socket->setReturnValueAt(2, "read", "Content-Type: text/plain\r\n");
368        $socket->setReturnValue("read", "");
369       
370        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
371        $this->assertTrue($response->isError());
372        $this->assertEqual($response->getContent(), "");
373    }
374   
375    function testParseOfResponseHeadersWhenChunked() {
376        $socket = &new MockSimpleSocket();
377        $socket->setReturnValueAt(0, "read", "HTTP/1.1 200 OK\r\nDate: Mon, 18 Nov 2002 15:50:29 GMT\r\n");
378        $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
379        $socket->setReturnValueAt(2, "read", "Server: Apache/1.3.24 (Win32) PHP/4.2.3\r\nConne");
380        $socket->setReturnValueAt(3, "read", "ction: close\r\n\r\nthis is a test file\n");
381        $socket->setReturnValueAt(4, "read", "with two lines in it\n");
382        $socket->setReturnValue("read", "");
383       
384        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
385        $this->assertFalse($response->isError());
386        $this->assertEqual(
387                $response->getContent(),
388                "this is a test file\nwith two lines in it\n");
389        $headers = $response->getHeaders();
390        $this->assertIdentical($headers->getHttpVersion(), "1.1");
391        $this->assertIdentical($headers->getResponseCode(), 200);
392        $this->assertEqual($headers->getMimeType(), "text/plain");
393        $this->assertFalse($headers->isRedirect());
394        $this->assertFalse($headers->getLocation());
395    }
396   
397    function testRedirect() {
398        $socket = &new MockSimpleSocket();
399        $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
400        $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
401        $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com/\r\n");
402        $socket->setReturnValueAt(3, "read", "Connection: close\r\n");
403        $socket->setReturnValueAt(4, "read", "\r\n");
404        $socket->setReturnValue("read", "");
405       
406        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
407        $headers = $response->getHeaders();
408        $this->assertTrue($headers->isRedirect());
409        $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com/");
410    }
411   
412    function testRedirectWithPort() {
413        $socket = &new MockSimpleSocket();
414        $socket->setReturnValueAt(0, "read", "HTTP/1.1 301 OK\r\n");
415        $socket->setReturnValueAt(1, "read", "Content-Type: text/plain\r\n");
416        $socket->setReturnValueAt(2, "read", "Location: http://www.somewhere-else.com:80/\r\n");
417        $socket->setReturnValueAt(3, "read", "Connection: close\r\n");
418        $socket->setReturnValueAt(4, "read", "\r\n");
419        $socket->setReturnValue("read", "");
420       
421        $response = &new SimpleHttpResponse($socket, new SimpleUrl('here'), new SimpleGetEncoding());
422        $headers = $response->getHeaders();
423        $this->assertTrue($headers->isRedirect());
424        $this->assertEqual($headers->getLocation(), "http://www.somewhere-else.com:80/");
425    }
426}
427?>
Note: See TracBrowser for help on using the repository browser.