codename: client meltdown
[m6w6/ext-http] / phpunit / MessageTest.php
index 6f425245f413f8365fb2fa76f725b7ecc3caa5e8..b572f57273adfb0192dc3536ba65c88ae74737cd 100644 (file)
@@ -46,6 +46,13 @@ class MessageTest extends PHPUnit_Framework_TestCase
                $test->testSetBody($body);
                $this->assertEquals($body, $test->testGetBody());
                $this->assertEquals($body, $test->getBody());
+               $file = fopen(__FILE__,"r");
+               $test->testSetBody($file);
+               $this->assertEquals($file, $test->testGetBody()->getResource());
+               $this->assertEquals($file, $test->getBody()->getResource());
+               $test->testSetBody("data");
+               $this->assertEquals("data", (string) $test->testGetBody());
+               $this->assertEquals("data", (string) $test->getBody());
                $test->testSetRequestMethod("HEAD");
                $this->assertEquals("HEAD", $test->testGetRequestMethod());
                $this->assertEquals("HEAD", $test->getRequestMethod());
@@ -134,7 +141,7 @@ class MessageTest extends PHPUnit_Framework_TestCase
                        array(
                                array(
                                        "cookies" => array("foo" => "bar"),
-                                       "expires" => date_create("2012-12-31 23:59:59")->format(
+                                       "expires" => date_create("2012-12-31 22:59:59 GMT")->format(
                                                DateTime::COOKIE
                                        ),
                                        "path" => "/somewhere"
@@ -155,5 +162,122 @@ class MessageTest extends PHPUnit_Framework_TestCase
                        $m->toString()
                );
        }
+       
+       function testDetach() {
+               $m = new http\Message(
+                       "HTTP/1.1 200 Ok\r\n".
+                       "HTTP/1.1 201 Created\n".
+                       "HTTP/1.1 302 Found\r\n"
+               );
+               
+               $this->assertCount(3, $m);
+               $d = $m->detach();
+               $this->assertCount(3, $m);
+               $this->assertCount(1, $d);
+               
+               $this->assertEquals("HTTP/1.1 302 Found\r\n\r\n", $d->toString(true));
+       }
+       
+       function testPrepend() {
+               for ($i=0; $i<9; ++$i) {
+                       $a[] = new http\Message("HTTP/1.1 ".($i+200));
+               }
+               
+               foreach ($a as $m) {
+                       if (isset($p)) $m->prepend($p);
+                       $p = $m;
+               }
+               
+               $this->assertEquals(
+                       "HTTP/1.1 200\r\n\r\n".
+                       "HTTP/1.1 201\r\n\r\n".
+                       "HTTP/1.1 202\r\n\r\n".
+                       "HTTP/1.1 203\r\n\r\n".
+                       "HTTP/1.1 204\r\n\r\n".
+                       "HTTP/1.1 205\r\n\r\n".
+                       "HTTP/1.1 206\r\n\r\n".
+                       "HTTP/1.1 207\r\n\r\n".
+                       "HTTP/1.1 208\r\n\r\n",
+                       $m->toString(true)
+               );
+       }
+       
+       function testEmptyUrlWarning() {
+               $m = new http\Message;
+               $this->setExpectedException("PHPUnit_Framework_Error_Notice");
+               $m->setRequestUrl("/foo");
+               $m->setType(http\Message::TYPE_REQUEST);
+               $this->setExpectedException("PHPUnit_Framework_Error_Warning");
+               $m->setRequestUrl("");
+       }
+       
+       function testEmptyParentMessage() {
+               $m = new http\Message;
+               try {
+                       $m->getParentMessage();
+                       $this->assertFalse("this code should not be reached");
+               } catch (http\Exception $e) {
+                       $this->assertEquals("HttpMessage does not have a parent message", $e->getMessage());
+               }
+       }
+       
+       function testPrependError() {
+               $m = new http\Message("HTTP/1.1 200\r\nHTTP/1.1 201");
+               try {
+                       $m->prepend($m->getParentMessage());
+                       $this->assertFalse("this code should not be reached");
+               } catch (http\Exception $e) {
+                       $this->assertEquals("Cannot prepend a message located within the same message chain", $e->getMessage());
+               }
+       }
+       
+       function testToCallback() {
+               $m = new http\Message("HTTP/1.1 200 Ok");
+               $m->addHeader("Content-Type", "text/plain");
+               $m->getBody()->append("this\nis\nthe\ntext");
+               
+               $d = new http\Encoding\Stream\Deflate;
+               $s = "";
+               $m->toCallback(function ($m, $data) use ($d, &$s) {
+                       $s.=$d->update($data);
+               });
+               $s.=$d->finish();
+               $this->assertEquals($m->toString(), http\Encoding\Stream\Inflate::decode($s));
+       }
+       
+       function testToStream() {
+               $m = new http\Message("HTTP/1.1 200 Ok");
+               $m->addHeader("Content-Type", "text/plain");
+               $m->getBody()->append("this\nis\nthe\ntext");
+               
+               $f = tmpfile();
+               $m->toStream($f);
+               rewind($f);
+               $this->assertEquals((string) $m, stream_get_contents($f));
+               fclose($f);
+       }
+       
+       function testBoundary() {
+               $p = new http\Message;
+               $p->addHeader("Content-Type", "text/plain");
+               $p->getBody()->append("data");
+               
+               $m = new http\Message("HTTP/1.1 200");
+               $m->getBody()->addPart($p);
+               $this->assertStringMatchesFormat(
+                       "HTTP/1.1 200\r\n".
+                       "Content-Length: %d\r\n".
+                       "Content-Type: multipart/form-data; boundary=\"%x.%x\"\r\n".
+                       "\r\n".
+                       "--%x.%x\r\n".
+                       "Content-Type: text/plain\r\n".
+                       "Content-Length: 4\r\n".
+                       "\r\n".
+                       "data\r\n".
+                       "--%x.%x--\r\n".
+                       "", 
+                       str_replace("\r", "", $m->toString()) // phpunit replaces \r\n with \n
+               );
+       }
 }