X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2F3LocalhostTest.php;h=220878ea986012efd063d37fbe390714f739e40c;hb=19b99735570521d8172f73124ade5997b9dca75d;hp=629fc7c6ad57e881e004668f6f51aef93eb538ab;hpb=b74db4b586aab9fab355cce855776debea6e9819;p=plcapi.git diff --git a/tests/3LocalhostTest.php b/tests/3LocalhostTest.php index 629fc7c..220878e 100644 --- a/tests/3LocalhostTest.php +++ b/tests/3LocalhostTest.php @@ -5,6 +5,10 @@ include_once __DIR__ . '/../lib/xmlrpc_wrappers.inc'; 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 */ @@ -108,6 +112,12 @@ class LocalhostTest extends PHPUnit_Framework_TestCase } } + /** + * @param PhpXmlRpc\Request|array $msg + * @param int|array $errorCode + * @param bool $returnResponse + * @return mixed|\PhpXmlRpc\Response|\PhpXmlRpc\Response[]|\PhpXmlRpc\Value|string|void + */ protected function send($msg, $errorCode = 0, $returnResponse = false) { if ($this->collectCodeCoverageInformation) { @@ -529,7 +539,7 @@ And turned it into nylon'; )); $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']); $this->client->path = $this->args['URI'] . '?EXCEPTION_HANDLING=1'; - $v = $this->send($f, 1); + $v = $this->send($f, 1); // the error code of the expected exception $this->client->path = $this->args['URI'] . '?EXCEPTION_HANDLING=2'; // depending on whether display_errors is ON or OFF on the server, we will get back a different error here, // as php will generate an http status code of either 200 or 500... @@ -542,6 +552,30 @@ And turned it into nylon'; $v = $this->send($f); } + public function testNullParams() + { + $f = new xmlrpcmsg('tests.getStateName.12', array( + new xmlrpcval('whatever', 'null'), + new xmlrpcval(23, 'int'), + )); + $v = $this->send($f); + if ($v) { + $this->assertEquals('Michigan', $v->scalarval()); + } + $f = new xmlrpcmsg('tests.getStateName.12', array( + new xmlrpcval(23, 'int'), + new xmlrpcval('whatever', 'null'), + )); + $v = $this->send($f); + if ($v) { + $this->assertEquals('Michigan', $v->scalarval()); + } + $f = new xmlrpcmsg('tests.getStateName.12', array( + new xmlrpcval(23, 'int') + )); + $v = $this->send($f, array($GLOBALS['xmlrpcerr']['incorrect_params'])); + } + public function testCodeInjectionServerSide() { $f = new xmlrpcmsg('system.MethodHelp'); @@ -552,62 +586,196 @@ And turned it into nylon'; } } - 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); - 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()); + + // this generates an exception in the function which was wrapped, which is by default wrapped in a known error response + $f = new xmlrpcmsg('tests.getStateName.2', array( + new xmlrpcval(0, 'int'), + )); + $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']); + + // check if the generated function dispatch map is fine, by checking if the server registered it + $f = new xmlrpcmsg('system.methodSignature', array( + new xmlrpcval('tests.getStateName.2'), + )); + $v = $this->send($f); + $encoder = new \PhpXmlRpc\Encoder(); + $this->assertEquals(array(array('string', 'int')), $encoder->decode($v)); } - 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); - 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()); + + // this generates an exception in the function which was wrapped, which is by default wrapped in a known error response + $f = new xmlrpcmsg('tests.getStateName.6', array( + new xmlrpcval(0, 'int'), + )); + $v = $this->send($f, $GLOBALS['xmlrpcerr']['server_error']); + } + + 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 { - $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 (or old?) version of phpunit when reporting the error + /*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 - $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 { + eval($func['source']); + $func = $func['function']; $v = $func(23); - // work around bug in current version of phpunit - if (is_object($v)) { + // work around bug in current (or old?) version of phpunit when reporting the error + /*if (is_object($v)) { $v = var_export($v, true); - } + }*/ $this->assertEquals('Michigan', $v); } } - public function testClosure() + public function testWrappedClass() { - $f = new xmlrpcmsg('examples.php5.getStateName', array( - new xmlrpcval(23, 'int'), - )); - $v = $this->send($f); - $this->assertEquals('Michigan', $v->scalarval()); + // make a 'deep client copy' as the original one might have many properties set + // also for speed only wrap one method of the whole server + $class = wrap_xmlrpc_server($this->client, array('simple_client_copy' => 0, 'method_filter' => '/examples\.getStateName/' )); + if ($class == '') { + $this->fail('Registration of remote server failed'); + } else { + $obj = new $class(); + $v = $obj->examples_getStateName(23); + // work around bug in current (or old?) version of phpunit when reporting the error + /*if (is_object($v)) { + $v = var_export($v, true); + }*/ + $this->assertEquals('Michigan', $v); + } + } + + public function testTransferOfObjectViaWrapping() + { + // make a 'deep client copy' as the original one might have many properties set + $func = wrap_xmlrpc_method($this->client, 'tests.returnPhpObject', array('simple_client_copy' => true, + 'decode_php_objs' => true)); + if ($func == false) { + $this->fail('Registration of tests.returnPhpObject failed'); + } else { + $v = $func(); + $obj = new stdClass(); + $obj->hello = 'world'; + $this->assertEquals($obj, $v); + } } public function testGetCookies() @@ -684,6 +852,15 @@ And turned it into nylon'; } } + public function testServerComments() + { + $f = new xmlrpcmsg('tests.xmlrpcServerMethodsContainer.debugMessageGenerator', array( + new xmlrpcval('hello world', 'string'), + )); + $r = $this->send($f, 0, true); + $this->assertContains('hello world', $r->raw_data); + } + public function testSendTwiceSameMsg() { $f = new xmlrpcmsg('examples.stringecho', array(