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 */
} else {
$this->client = new xmlrpc_client($this->args['URI'], $this->args['LOCALSERVER']);
}
- if ($this->args['DEBUG']) {
- $this->client->setDebug($this->args['DEBUG']);
- }
+
+ $this->client->setDebug($this->args['DEBUG']);
$this->client->request_compression = $this->request_compression;
$this->client->accepted_compression = $this->accepted_compression;
$this->coverageScriptUrl = 'http://' . $this->args['LOCALSERVER'] . '/' . str_replace( '/demo/server/server.php', 'tests/phpunit_coverage.php', $this->args['URI'] );
+
+ if ($this->args['DEBUG'] == 1)
+ ob_start();
+ }
+
+ protected function tearDown()
+ {
+ if ($this->args['DEBUG'] != 1)
+ return;
+ $out = ob_get_clean();
+ $status = $this->getStatus();
+ if ($status == PHPUnit_Runner_BaseTestRunner::STATUS_ERROR
+ || $status == PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE) {
+ echo $out;
+ }
}
- 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 (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 {
- $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 ($return_response) {
+ if ($returnResponse) {
return $r;
} else {
return $r->value();
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 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...
- $l1 = strlen($sendstring);
+ $l1 = strlen($sendString);
$l2 = strlen($v->scalarval());
if ($l1 == $l2) {
- $this->assertEquals($sendstring, $v->scalarval());
+ $this->assertEquals($sendString, $v->scalarval());
} 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()
{
- $sendstring =
- "last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne, and an xml comment closing tag: -->";
- $f = '<?xml version="1.0" encoding="iso-8859-1"?><methodCall><methodName>examples.stringecho</methodName><params><param><value>'.
- $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>'.
+ $sendString.
'</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()
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'
),));
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.
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) {
- if (strlen($sendstring) == strlen($v->scalarval())) {
- $this->assertEquals($sendstring, $v->scalarval());
+ if (strlen($sendString) == strlen($v->scalarval())) {
+ $this->assertEquals($sendString, $v->scalarval());
} 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 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(
- new xmlrpcval($sendstring, 'string'),
+ new xmlrpcval($sendString, 'string'),
));
$v = $this->send($f);
if ($v) {
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) {
- $this->assertEquals($v->scalarval(), true);
+ $this->assertEquals(true, $v->scalarval());
}
}
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']);
$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...
$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());
}
}
- 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 testWrappedClass()
+ {
+ // 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()
{
// let server set to us some cookies we tell it
$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);
}
// on IIS and Apache getallheaders returns something slightly different...
- $this->assertEquals($v, $cookies);
+ $this->assertEquals($cookies, $v);
}
}
));
$v1 = $this->send($f);
$v2 = $this->send($f);
- //$v = $r->faultCode();
if ($v1 && $v2) {
- $this->assertEquals($v2, $v1);
+ $this->assertEquals($v1, $v2);
}
}
}