X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2F3LocalhostTest.php;h=220878ea986012efd063d37fbe390714f739e40c;hb=19b99735570521d8172f73124ade5997b9dca75d;hp=e73bf61f07619bb9f237602d665ff69e177f7d12;hpb=4bc0f6904a12381079bec46ad648f6170f07d449;p=plcapi.git
diff --git a/tests/3LocalhostTest.php b/tests/3LocalhostTest.php
index e73bf61..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,7 +112,13 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
}
}
- protected function send($msg, $errrorcode = 0, $return_response = false)
+ /**
+ * @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) {
$this->client->setCookie('PHPUNIT_SELENIUM_TEST_ID', $this->testId);
@@ -119,13 +129,13 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
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();
@@ -137,7 +147,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
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]. " .
@@ -147,35 +157,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(
- 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 =
+ $sendString =
"last but not least weird names: G" . chr(252) . "nter, El" . chr(232) . "ne";
$f = 'examples.stringecho'.
- $sendstring.
+ $sendString.
'';
$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
@@ -225,9 +259,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
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'
),));
@@ -250,7 +282,7 @@ class LocalhostTest extends PHPUnit_Framework_TestCase
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.
@@ -260,14 +292,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(
- 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());
}
}
}
@@ -290,9 +322,9 @@ And turned it into nylon';
public function testCountEntities()
{
- $sendstring = "h'fd>onc>>l>>rw&bpu>q>eonc>>l>>rw&bpu>q>esend($f);
if ($v) {
@@ -491,23 +523,23 @@ And turned it into nylon';
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...
@@ -520,66 +552,232 @@ 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');
$f->payload = "validator1.echoStructTest','')); echo('gotcha!'); die(); //";
$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
@@ -639,7 +837,7 @@ And turned it into nylon';
$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);
@@ -650,10 +848,19 @@ And turned it into nylon';
}
// on IIS and Apache getallheaders returns something slightly different...
- $this->assertEquals($v, $cookies);
+ $this->assertEquals($cookies, $v);
}
}
+ 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(
@@ -661,9 +868,8 @@ And turned it into nylon';
));
$v1 = $this->send($f);
$v2 = $this->send($f);
- //$v = $r->faultCode();
if ($v1 && $v2) {
- $this->assertEquals($v2, $v1);
+ $this->assertEquals($v1, $v2);
}
}
}