Add a test for wrapping closures
[plcapi.git] / tests / 3LocalhostTest.php
index e73bf61..f559fa6 100644 (file)
@@ -5,6 +5,10 @@ include_once __DIR__ . '/../lib/xmlrpc_wrappers.inc';
 
 include_once __DIR__ . '/parse_args.php';
 
 
 include_once __DIR__ . '/parse_args.php';
 
+/**
+ * Tests which involve interaction between the client and the server.
+ * They are run against the server found in demo/server.php
+ */
 class LocalhostTest extends PHPUnit_Framework_TestCase
 {
     /** @var xmlrpc_client $client */
 class LocalhostTest extends PHPUnit_Framework_TestCase
 {
     /** @var xmlrpc_client $client */
@@ -108,7 +112,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
         }
     }
 
         }
     }
 
-    protected function send($msg, $errrorcode = 0, $return_response = false)
+    protected function send($msg, $errorCode = 0, $returnResponse = false)
     {
         if ($this->collectCodeCoverageInformation) {
             $this->client->setCookie('PHPUNIT_SELENIUM_TEST_ID', $this->testId);
     {
         if ($this->collectCodeCoverageInformation) {
             $this->client->setCookie('PHPUNIT_SELENIUM_TEST_ID', $this->testId);
@@ -119,13 +123,13 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
         if (is_array($r)) {
             return $r;
         }
         if (is_array($r)) {
             return $r;
         }
-        if (is_array($errrorcode)) {
-            $this->assertContains($r->faultCode(), $errrorcode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
+        if (is_array($errorCode)) {
+            $this->assertContains($r->faultCode(), $errorCode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
         } else {
         } else {
-            $this->assertEquals($r->faultCode(), $errrorcode, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
+            $this->assertEquals($errorCode, $r->faultCode(), 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
         }
         if (!$r->faultCode()) {
         }
         if (!$r->faultCode()) {
-            if ($return_response) {
+            if ($returnResponse) {
                 return $r;
             } else {
                 return $r->value();
                 return $r;
             } else {
                 return $r->value();
@@ -137,7 +141,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
 
     public function testString()
     {
 
     public function testString()
     {
-        $sendstring = "here are 3 \"entities\": < > & " .
+        $sendString = "here are 3 \"entities\": < > & " .
             "and here's a dollar sign: \$pretendvarname and a backslash too: " . chr(92) .
             " - isn't that great? \\\"hackery\\\" at it's best " .
             " also don't want to miss out on \$item[0]. " .
             "and here's a dollar sign: \$pretendvarname and a backslash too: " . chr(92) .
             " - isn't that great? \\\"hackery\\\" at it's best " .
             " also don't want to miss out on \$item[0]. " .
@@ -147,35 +151,59 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
             "and then LFCR" . chr(10) . chr(13) .
             "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne, and an xml comment closing tag: -->";
         $f = new xmlrpcmsg('examples.stringecho', array(
             "and then LFCR" . chr(10) . chr(13) .
             "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne, and an xml comment closing tag: -->";
         $f = new xmlrpcmsg('examples.stringecho', array(
-            new xmlrpcval($sendstring, 'string'),
+            new xmlrpcval($sendString, 'string'),
         ));
         $v = $this->send($f);
         if ($v) {
             // when sending/receiving non-US-ASCII encoded strings, XML says cr-lf can be normalized.
             // so we relax our tests...
         ));
         $v = $this->send($f);
         if ($v) {
             // when sending/receiving non-US-ASCII encoded strings, XML says cr-lf can be normalized.
             // so we relax our tests...
-            $l1 = strlen($sendstring);
+            $l1 = strlen($sendString);
             $l2 = strlen($v->scalarval());
             if ($l1 == $l2) {
             $l2 = strlen($v->scalarval());
             if ($l1 == $l2) {
-                $this->assertEquals($sendstring, $v->scalarval());
+                $this->assertEquals($sendString, $v->scalarval());
             } else {
             } else {
-                $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval());
+                $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendString), $v->scalarval());
             }
         }
     }
 
     public function testLatin1String()
     {
             }
         }
     }
 
     public function testLatin1String()
     {
-        $sendstring =
+        $sendString =
             "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne";
         $f = '<?xml version="1.0" encoding="ISO-8859-1"?><methodCall><methodName>examples.stringecho</methodName><params><param><value>'.
             "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne";
         $f = '<?xml version="1.0" encoding="ISO-8859-1"?><methodCall><methodName>examples.stringecho</methodName><params><param><value>'.
-            $sendstring.
+            $sendString.
             '</value></param></params></methodCall>';
         $v = $this->send($f);
         if ($v) {
             '</value></param></params></methodCall>';
         $v = $this->send($f);
         if ($v) {
-            $this->assertEquals($sendstring, $v->scalarval());
+            $this->assertEquals($sendString, $v->scalarval());
         }
     }
 
         }
     }
 
+    /*public function testLatin1Method()
+    {
+        $f = new xmlrpcmsg("tests.iso88591methodname." . chr(224) . chr(252) . chr(232), array(
+            new xmlrpcval('hello')
+        ));
+        $v = $this->send($f);
+        if ($v) {
+            $this->assertEquals('hello', $v->scalarval());
+        }
+    }*/
+
+    public function testUtf8Method()
+    {
+        PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding = 'UTF-8';
+        $f = new xmlrpcmsg("tests.utf8methodname." . 'κόσμε', array(
+            new xmlrpcval('hello')
+        ));
+        $v = $this->send($f);
+        if ($v) {
+            $this->assertEquals('hello', $v->scalarval());
+        }
+        PhpXmlRpc\PhpXmlRpc::$xmlrpc_internalencoding = 'ISO-8859-1';
+    }
+
     public function testAddingDoubles()
     {
         // note that rounding errors mean we
     public function testAddingDoubles()
     {
         // note that rounding errors mean we
@@ -225,9 +253,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
                 new xmlrpcval(true, 'boolean'),
                 new xmlrpcval(false, 'boolean'),
                 new xmlrpcval(1, 'boolean'),
                 new xmlrpcval(true, 'boolean'),
                 new xmlrpcval(false, 'boolean'),
                 new xmlrpcval(1, 'boolean'),
-                new xmlrpcval(0, 'boolean'),
-                //new xmlrpcval('true', 'boolean'),
-                //new xmlrpcval('false', 'boolean')
+                new xmlrpcval(0, 'boolean')
             ),
                 'array'
             ),));
             ),
                 'array'
             ),));
@@ -250,7 +276,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
 
     public function testBase64()
     {
 
     public function testBase64()
     {
-        $sendstring = 'Mary had a little lamb,
+        $sendString = 'Mary had a little lamb,
 Whose fleece was white as snow,
 And everywhere that Mary went
 the lamb was sure to go.
 Whose fleece was white as snow,
 And everywhere that Mary went
 the lamb was sure to go.
@@ -260,14 +286,14 @@ She tied it to a pylon
 Ten thousand volts went down its back
 And turned it into nylon';
         $f = new xmlrpcmsg('examples.decode64', array(
 Ten thousand volts went down its back
 And turned it into nylon';
         $f = new xmlrpcmsg('examples.decode64', array(
-            new xmlrpcval($sendstring, 'base64'),
+            new xmlrpcval($sendString, 'base64'),
         ));
         $v = $this->send($f);
         if ($v) {
         ));
         $v = $this->send($f);
         if ($v) {
-            if (strlen($sendstring) == strlen($v->scalarval())) {
-                $this->assertEquals($sendstring, $v->scalarval());
+            if (strlen($sendString) == strlen($v->scalarval())) {
+                $this->assertEquals($sendString, $v->scalarval());
             } else {
             } else {
-                $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendstring), $v->scalarval());
+                $this->assertEquals(str_replace(array("\r\n", "\r"), array("\n", "\n"), $sendString), $v->scalarval());
             }
         }
     }
             }
         }
     }
@@ -290,9 +316,9 @@ And turned it into nylon';
 
     public function testCountEntities()
     {
 
     public function testCountEntities()
     {
-        $sendstring = "h'fd>onc>>l>>rw&bpu>q>e<v&gxs<ytjzkami<";
+        $sendString = "h'fd>onc>>l>>rw&bpu>q>e<v&gxs<ytjzkami<";
         $f = new xmlrpcmsg('validator1.countTheEntities', array(
         $f = new xmlrpcmsg('validator1.countTheEntities', array(
-            new xmlrpcval($sendstring, 'string'),
+            new xmlrpcval($sendString, 'string'),
         ));
         $v = $this->send($f);
         if ($v) {
         ));
         $v = $this->send($f);
         if ($v) {
@@ -491,18 +517,18 @@ And turned it into nylon';
 
     public function testCatchWarnings()
     {
 
     public function testCatchWarnings()
     {
-        $f = new xmlrpcmsg('examples.generatePHPWarning', array(
+        $f = new xmlrpcmsg('tests.generatePHPWarning', array(
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f);
         if ($v) {
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f);
         if ($v) {
-            $this->assertEquals($v->scalarval(), true);
+            $this->assertEquals(true, $v->scalarval());
         }
     }
 
     public function testCatchExceptions()
     {
         }
     }
 
     public function testCatchExceptions()
     {
-        $f = new xmlrpcmsg('examples.raiseException', array(
+        $f = new xmlrpcmsg('tests.raiseException', array(
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']);
             new xmlrpcval('whatever', 'string'),
         ));
         $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']);
@@ -525,52 +551,141 @@ And turned it into nylon';
         $f = new xmlrpcmsg('system.MethodHelp');
         $f->payload = "<?xml version=\"1.0\"?><methodCall><methodName>validator1.echoStructTest</methodName><params><param><value><struct><member><name>','')); echo('gotcha!'); die(); //</name></member></struct></value></param></params></methodCall>";
         $v = $this->send($f);
         $f = new xmlrpcmsg('system.MethodHelp');
         $f->payload = "<?xml version=\"1.0\"?><methodCall><methodName>validator1.echoStructTest</methodName><params><param><value><struct><member><name>','')); echo('gotcha!'); die(); //</name></member></struct></value></param></params></methodCall>";
         $v = $this->send($f);
-        //$v = $r->faultCode();
         if ($v) {
             $this->assertEquals(0, $v->structsize());
         }
     }
 
         if ($v) {
             $this->assertEquals(0, $v->structsize());
         }
     }
 
-    public function testAutoRegisteredFunction()
+    public function testServerWrappedFunction()
     {
     {
-        $f = new xmlrpcmsg('examples.php.getStateName', array(
+        $f = new xmlrpcmsg('tests.getStateName.2', array(
             new xmlrpcval(23, 'int'),
         ));
         $v = $this->send($f);
             new xmlrpcval(23, 'int'),
         ));
         $v = $this->send($f);
-        if ($v) {
-            $this->assertEquals('Michigan', $v->scalarval());
-        } else {
-            $this->fail('Note: server can only auto register functions if running with PHP 5.0.3 and up');
-        }
+        $this->assertEquals('Michigan', $v->scalarval());
     }
 
     }
 
-    public function testAutoRegisteredClass()
+    public function testServerWrappedFunctionAsSource()
     {
     {
-        $f = new xmlrpcmsg('examples.php2.getStateName', array(
+        $f = new xmlrpcmsg('tests.getStateName.6', array(
             new xmlrpcval(23, 'int'),
         ));
         $v = $this->send($f);
             new xmlrpcval(23, 'int'),
         ));
         $v = $this->send($f);
-        if ($v) {
-            $this->assertEquals('Michigan', $v->scalarval());
-            $f = new xmlrpcmsg('examples.php3.getStateName', array(
-                new xmlrpcval(23, 'int'),
-            ));
-            $v = $this->send($f);
-            if ($v) {
-                $this->assertEquals('Michigan', $v->scalarval());
-            }
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testServerWrappedObjectMethods()
+    {
+        $f = new xmlrpcmsg('tests.getStateName.3', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.4', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.5', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.7', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.8', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.9', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testServerWrappedObjectMethodsAsSource()
+    {
+        $f = new xmlrpcmsg('tests.getStateName.7', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.8', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+
+        $f = new xmlrpcmsg('tests.getStateName.9', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testServerClosure()
+    {
+        $f = new xmlrpcmsg('tests.getStateName.10', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testServerWrappedClosure()
+    {
+        $f = new xmlrpcmsg('tests.getStateName.11', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testServerWrappedClass()
+    {
+        $f = new xmlrpcmsg('tests.xmlrpcServerMethodsContainer.findState', array(
+            new xmlrpcval(23, 'int'),
+        ));
+        $v = $this->send($f);
+        $this->assertEquals('Michigan', $v->scalarval());
+    }
+
+    public function testWrappedMethod()
+    {
+        // make a 'deep client copy' as the original one might have many properties set
+        $func = wrap_xmlrpc_method($this->client, 'examples.getStateName', array('simple_client_copy' => 0));
+        if ($func == false) {
+            $this->fail('Registration of examples.getStateName failed');
         } else {
         } else {
-            $this->fail('Note: server can only auto register class methods if running with PHP 5.0.3 and up');
+            $v = $func(23);
+            // work around bug in current version of phpunit
+            if (is_object($v)) {
+                $v = var_export($v, true);
+            }
+            $this->assertEquals('Michigan', $v);
         }
     }
 
         }
     }
 
-    public function testAutoRegisteredMethod()
+    public function testWrappedMethodAsSource()
     {
         // make a 'deep client copy' as the original one might have many properties set
     {
         // make a 'deep client copy' as the original one might have many properties set
-        $func = wrap_xmlrpc_method($this->client, 'examples.getStateName', array('simple_client_copy' => 1));
-        if ($func == '') {
+        $func = wrap_xmlrpc_method($this->client, 'examples.getStateName', array('simple_client_copy' => 0, 'return_source' => true));
+        if ($func == false) {
             $this->fail('Registration of examples.getStateName failed');
         } else {
             $this->fail('Registration of examples.getStateName failed');
         } else {
+            eval($func['source']);
+            $func = $func['function'];
             $v = $func(23);
             // work around bug in current version of phpunit
             if (is_object($v)) {
             $v = $func(23);
             // work around bug in current version of phpunit
             if (is_object($v)) {
@@ -580,6 +695,23 @@ And turned it into nylon';
         }
     }
 
         }
     }
 
+    public function testWrappedClass()
+    {
+        // make a 'deep client copy' as the original one might have many properties set
+        $class = wrap_xmlrpc_server($this->client, array('simple_client_copy' => 0));
+        if ($class == '') {
+            $this->fail('Registration of remote server failed');
+        } else {
+            $obj = new $class();
+            $v = $obj->examples_getStateName(23);
+            // work around bug in current version of phpunit
+            if (is_object($v)) {
+                $v = var_export($v, true);
+            }
+            $this->assertEquals('Michigan', $v);
+        }
+    }
+
     public function testGetCookies()
     {
         // let server set to us some cookies we tell it
     public function testGetCookies()
     {
         // let server set to us some cookies we tell it
@@ -639,7 +771,7 @@ And turned it into nylon';
             $cookies[$cookie] = (string)$cookies[$cookie];
         }
         $r = $this->client->send($f, $this->timeout, $this->method);
             $cookies[$cookie] = (string)$cookies[$cookie];
         }
         $r = $this->client->send($f, $this->timeout, $this->method);
-        $this->assertEquals($r->faultCode(), 0, 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
+        $this->assertEquals(0, $r->faultCode(), 'Error ' . $r->faultCode() . ' connecting to server: ' . $r->faultString());
         if (!$r->faultCode()) {
             $v = $r->value();
             $v = php_xmlrpc_decode($v);
         if (!$r->faultCode()) {
             $v = $r->value();
             $v = php_xmlrpc_decode($v);
@@ -650,7 +782,7 @@ And turned it into nylon';
             }
 
             // on IIS and Apache getallheaders returns something slightly different...
             }
 
             // on IIS and Apache getallheaders returns something slightly different...
-            $this->assertEquals($v, $cookies);
+            $this->assertEquals($cookies, $v);
         }
     }
 
         }
     }
 
@@ -661,9 +793,8 @@ And turned it into nylon';
         ));
         $v1 = $this->send($f);
         $v2 = $this->send($f);
         ));
         $v1 = $this->send($f);
         $v2 = $this->send($f);
-        //$v = $r->faultCode();
         if ($v1 && $v2) {
         if ($v1 && $v2) {
-            $this->assertEquals($v2, $v1);
+            $this->assertEquals($v1, $v2);
         }
     }
 }
         }
     }
 }