Procházet zdrojové kódy

ZF-6993: better type introspection for Zend_XmlRpc client

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17709 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew před 16 roky
rodič
revize
07c05ca7e4
2 změnil soubory, kde provedl 75 přidání a 20 odebrání
  1. 22 15
      library/Zend/XmlRpc/Client.php
  2. 53 5
      tests/Zend/XmlRpc/ClientTest.php

+ 22 - 15
library/Zend/XmlRpc/Client.php

@@ -314,24 +314,31 @@ class Zend_XmlRpc_Client
                 $success = false;
             }
             if ($success) {
+                $validTypes = array(
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_I4,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_NIL,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_STRING,
+                    Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT,
+                );
+                $params = (array)$params;
                 foreach ($params as $key => $param) {
-                    if (is_array($param) && empty($param)) {
-                        $type = 'array';
-                        foreach ($signatures as $signature) {
-                            if (!is_array($signature)) {
-                                continue;
-                            }
-                            if (array_key_exists($key + 1, $signature)) {
-                                $type = $signature[$key + 1];
-                                $type = (in_array($type, array('array', 'struct'))) ? $type : 'array';
-                                break;
-                            }
+                    $type = Zend_XmlRpc_Value::AUTO_DETECT_TYPE;
+                    foreach ($signatures as $signature) {
+                        if (!is_array($signature)) {
+                            continue;
+                        }
+                        if (isset($signature['parameters'][$key])) {
+                            $type = $signature['parameters'][$key];
+                            $type = in_array($type, $validTypes) ? $type : Zend_XmlRpc_Value::AUTO_DETECT_TYPE;
                         }
-                        $params[$key] = array(
-                            'type'  => $type,
-                            'value' => $param
-                        );
                     }
+                    $params[$key] = Zend_XmlRpc_Value::getXmlRpcValue($param, $type);
                 }
             }
         }

+ 53 - 5
tests/Zend/XmlRpc/ClientTest.php

@@ -157,7 +157,13 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
         $response = $this->xmlrpcClient->getLastResponse();
 
         $this->assertSame($expectedMethod, $request->getMethod());
-        $this->assertSame($expectedParams, $request->getParams());
+        $params = $request->getParams();
+        $this->assertSame(count($expectedParams), count($params));
+        $this->assertSame($expectedParams[0], $params[0]->getValue());
+        $this->assertSame($expectedParams[1], $params[1]->getValue());
+        $this->assertSame($expectedParams[2], $params[2]->getValue());
+        $this->assertSame($expectedParams['foo'], $params['foo']->getValue());
+
         $this->assertSame($expectedReturn, $response->getReturnValue());
         $this->assertFalse($response->isFault());
     }
@@ -178,11 +184,13 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
 
         $request  = $this->xmlrpcClient->getLastRequest();
 
-        $this->assertSame($expectedParams, $request->getParams());
+        $params = $request->getParams();
+        $this->assertSame(count($expectedParams), count($params));
+        $this->assertSame($expectedParams[0], $params[0]->getValue());
     }
     
     /**
-     * Test for ZF-1412
+     * @see ZF-1412
      * 
      * @return void
      */
@@ -205,7 +213,10 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
         $response = $this->xmlrpcClient->getLastResponse();
 
         $this->assertSame($expectedMethod, $request->getMethod());
-        $this->assertSame($expectedParams, $request->getParams());
+        $params = $request->getParams();
+        $this->assertSame(count($expectedParams), count($params));
+        $this->assertSame($expectedParams[0], $params[0]->getValue());
+        $this->assertSame($expectedParams[1], $params[1]);
         $this->assertSame($expectedReturn, $response->getReturnValue());
         $this->assertFalse($response->isFault());
     }
@@ -237,7 +248,7 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($response->isFault());
     }
 
-    /**#@+
+    /**
      * @see ZF-2978
      */
     public function testSkippingSystemCallDisabledByDefault()
@@ -245,6 +256,30 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($this->xmlrpcClient->skipSystemLookup());
     }
 
+    /**
+     * @see ZF-6993
+     */
+    public function testWhenPassingAStringAndAnIntegerIsExpectedParamIsConverted()
+    {
+        $this->mockIntrospector();
+        $this->mockedIntrospector->expects($this->exactly(2))
+                           ->method('getMethodSignature')
+                           ->with('test.method')
+                           ->will($this->returnValue(array(array('parameters' => array('int')))));
+
+        $expect = 'test.method response';
+        $this->setServerResponseTo($expect);
+
+        $this->assertSame($expect, $this->xmlrpcClient->call('test.method', array('1')));
+        $params = $this->xmlrpcClient->getLastRequest()->getParams();
+        $this->assertSame(1, $params[0]->getValue());
+
+        $this->setServerResponseTo($expect);
+        $this->assertSame($expect, $this->xmlrpcClient->call('test.method', '1'));
+        $params = $this->xmlrpcClient->getLastRequest()->getParams();
+        $this->assertSame(1, $params[0]->getValue());
+    }
+
     public function testAllowsSkippingSystemCallForArrayStructLookup()
     {
         $this->xmlrpcClient->setSkipSystemLookup(true);
@@ -623,6 +658,19 @@ class Zend_XmlRpc_ClientTest extends PHPUnit_Framework_TestCase
                          );
         return implode("\r\n", $headers) . "\r\n\r\n$data\r\n\r\n";
     }
+
+    public function mockIntrospector()
+    {
+        $this->mockedIntrospector = $this->getMock(
+            'Zend_XmlRpc_Client_ServerIntrospection',
+            array(),
+            array(),
+            '',
+            false,
+            false
+        );
+        $this->xmlrpcClient->setIntrospector($this->mockedIntrospector);
+    }
 }
 
 // Call Zend_XmlRpc_ClientTest::main() if this source file is executed directly.