Kaynağa Gözat

Testing php://input interaction

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17962 44c647ce-9c0f-0410-b52a-842ac1e357ba
lars 16 yıl önce
ebeveyn
işleme
21b8fbd66c

+ 4 - 9
library/Zend/XmlRpc/Request/Http.php

@@ -61,18 +61,13 @@ class Zend_XmlRpc_Request_Http extends Zend_XmlRpc_Request
      */
     public function __construct()
     {
-        $fh = fopen('php://input', 'r');
-        if (!$fh) {
-            $this->_fault = new Zend_XmlRpc_Server_Exception(630);
+        $xml = @file_get_contents('php://input');
+        if (!$xml) {
+            require_once 'Zend/XmlRpc/Fault.php';
+            $this->_fault = new Zend_XmlRpc_Fault(630);
             return;
         }
 
-        $xml = '';
-        while (!feof($fh)) {
-            $xml .= fgets($fh);
-        }
-        fclose($fh);
-
         $this->_xml = $xml;
 
         $this->loadXml($xml);

+ 72 - 6
tests/Zend/AllTests/StreamWrapper/PhpInput.php

@@ -23,14 +23,26 @@
 /**
  * Class for mocking php://input
  *
- * To use: 
  * <code>
- * Zend_AllTests_StreamWrapper_PhpInput::mockInput($string);
- * $value = file_get_contents('php://input');
- * </code>
+ * class ...
+ * {
+ *     public function setUp()
+ *     {
+ *         Zend_AllTests_StreamWrapper_PhpInput::mockInput('expected string');
+ *     }
  *
- * Once done, call stream_wrapper_restore('php') to restore the original behavior.
+ *     public function testReadingFromPhpInput()
+ *     {
+ *         $this->assertSame('expected string', file_get_contents('php://input'));
+ *         $this->assertSame('php://input', Zend_AllTests_StreamWrapper_PhpInput::getCurrentPath());
+ *     }
  *
+ *     public function tearDown()
+ *     {
+ *         Zend_AllTests_StreamWrapper_PhpInput::restoreDefault();
+ *     }
+ * }
+*
  * @category   Zend
  * @package    Zend
  * @subpackage UnitTests
@@ -41,6 +53,10 @@ class Zend_AllTests_StreamWrapper_PhpInput
 {
     protected static $_data;
 
+    protected static $_returnValues = array();
+
+    protected static $_arguments = array();
+
     protected $_position = 0;
 
     public static function mockInput($data)
@@ -50,19 +66,63 @@ class Zend_AllTests_StreamWrapper_PhpInput
         self::$_data = $data;
     }
 
+    public static function restoreDefault()
+    {
+        // Reset static values
+        self::$_returnValues = array();
+        self::$_arguments = array();
+
+        // Restore original stream wrapper
+        stream_wrapper_restore('php');
+    }
+
+    public static function methodWillReturn($methodName, $returnValue)
+    {
+        $methodName = strtolower($methodName);
+        self::$_returnValues[$methodName] = $returnValue;
+    }
+
+    public static function argumentsPassedTo($methodName)
+    {
+        $methodName = strtolower($methodName);
+        if (isset(self::$_arguments[$methodName])) {
+            return self::$_arguments[$methodName];
+        }
+
+        return null;
+    }
+
     public function stream_open()
     {
+        self::$_arguments[__FUNCTION__] = func_get_args();
+
+        if (array_key_exists(__FUNCTION__, self::$_returnValues)) {
+            return self::$_returnValues[__FUNCTION__];
+        }
+
         return true;
     }
 
     public function stream_eof()
     {
+        self::$_arguments[__FUNCTION__] = func_get_args();
+
+        if (array_key_exists(__FUNCTION__, self::$_returnValues)) {
+            return self::$_returnValues[__FUNCTION__];
+        }
+
         return (0 == strlen(self::$_data));
     }
 
     public function stream_read($count)
     {
-        // To match the behavior of php://input, we need to clear out the data 
+        self::$_arguments[__FUNCTION__] = func_get_args();
+
+        if (array_key_exists(__FUNCTION__, self::$_returnValues)) {
+            return self::$_returnValues[__FUNCTION__];
+        }
+
+        // To match the behavior of php://input, we need to clear out the data
         // as it is read
         if ($count > strlen(self::$_data)) {
             $data = self::$_data;
@@ -76,6 +136,12 @@ class Zend_AllTests_StreamWrapper_PhpInput
 
     public function stream_stat()
     {
+        self::$_arguments[__FUNCTION__] = func_get_args();
+
+        if (array_key_exists(__FUNCTION__, self::$_returnValues)) {
+            return self::$_returnValues[__FUNCTION__];
+        }
+
         return array();
     }
 }

+ 24 - 3
tests/Zend/XmlRpc/Request/HttpTest.php

@@ -26,6 +26,7 @@ if (!defined("PHPUnit_MAIN_METHOD")) {
 }
 
 require_once dirname(__FILE__) . '/../../../TestHelper.php';
+require_once 'Zend/AllTests/StreamWrapper/PhpInput.php';
 require_once 'Zend/XmlRpc/Request/Http.php';
 
 /**
@@ -38,7 +39,7 @@ require_once 'Zend/XmlRpc/Request/Http.php';
  * @license    http://framework.zend.com/license/new-bsd     New BSD License
  * @group      Zend_XmlRpc
  */
-class Zend_XmlRpc_Request_HttpTest extends PHPUnit_Framework_TestCase 
+class Zend_XmlRpc_Request_HttpTest extends PHPUnit_Framework_TestCase
 {
     /**
      * Runs the test methods of this class.
@@ -54,7 +55,7 @@ class Zend_XmlRpc_Request_HttpTest extends PHPUnit_Framework_TestCase
     /**
      * Setup environment
      */
-    public function setUp() 
+    public function setUp()
     {
         $this->xml =<<<EOX
 <?xml version="1.0" encoding="UTF-8"?>
@@ -100,15 +101,17 @@ EOX;
         $_SERVER['HTTP_HOST']           = 'localhost';
         $_SERVER['HTTP_CONTENT_TYPE']   = 'text/xml';
         $_SERVER['HTTP_CONTENT_LENGTH'] = strlen($this->xml) + 1;
+        Zend_AllTests_StreamWrapper_PhpInput::mockInput($this->xml);
     }
 
     /**
      * Teardown environment
      */
-    public function tearDown() 
+    public function tearDown()
     {
         $_SERVER = $this->server;
         unset($this->request);
+        Zend_AllTests_StreamWrapper_PhpInput::restoreDefault();
     }
 
     public function testGetRawRequest()
@@ -160,6 +163,24 @@ EOT;
         $this->assertEquals('foo', $request->method);
         $this->assertEquals(array('bar', 'baz'), $request->params);
     }
+
+    public function testHttpRequestReadsFromPhpInput()
+    {
+        $this->assertNull(Zend_AllTests_StreamWrapper_PhpInput::argumentsPassedTo('stream_open'));
+        $request = new Zend_XmlRpc_Request_Http();
+        list($path, $mode,) = Zend_AllTests_StreamWrapper_PhpInput::argumentsPassedTo('stream_open');
+        $this->assertSame('php://input', $path);
+        $this->assertSame('rb', $mode);
+        $this->assertSame($this->xml, $request->getRawRequest());
+    }
+
+    public function testHttpRequestGeneratesFaultIfReadFromPhpInputFails()
+    {
+        Zend_AllTests_StreamWrapper_PhpInput::methodWillReturn('stream_open', false);
+        $request = new Zend_XmlRpc_Request_Http();
+        $this->assertTrue($request->isFault());
+        $this->assertSame(630, $request->getFault()->getCode());
+    }
 }
 
 class Zend_XmlRpc_Request_HttpTest_Extension extends Zend_XmlRpc_Request_Http