include_once __DIR__ . '/../lib/xmlrpc.inc';
include_once __DIR__ . '/../lib/xmlrpcs.inc';
+include_once __DIR__ . '/parse_args.php';
+
+/**
+ * Tests involving parsing of xml and handling of xmlrpc values
+ */
class ParsingBugsTests extends PHPUnit_Framework_TestCase
{
+ public $args = array();
+
+ protected function setUp()
+ {
+ $this->args = argParser::getArgs();
+ 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 newMsg($methodName, $params = array())
+ {
+ $msg = new xmlrpcmsg($methodName, $params);
+ $msg->setDebug($this->args['DEBUG']);
+ return $msg;
+ }
+
public function testMinusOneString()
{
$v = new xmlrpcval('-1');
$u = new xmlrpcval('-1', 'string');
- $this->assertEquals($u->scalarval(), $v->scalarval());
+ $t = new xmlrpcval(-1, 'string');
+ $this->assertEquals($v->scalarval(), $u->scalarval());
+ $this->assertEquals($v->scalarval(), $t->scalarval());
}
+ /**
+ * This looks funny, and we might call it a bug. But we strive for 100 backwards compat...
+ */
public function testMinusOneInt()
{
+ $u = new xmlrpcval();
$v = new xmlrpcval(-1);
- $u = new xmlrpcval(-1, 'string');
$this->assertEquals($u->scalarval(), $v->scalarval());
}
$v = array($str => new xmlrpcval(1));
$r = new xmlrpcresp(new xmlrpcval($v, 'struct'));
$r = $r->serialize();
- $m = new xmlrpcmsg('dummy');
+ $m = $this->newMsg('dummy');
$r = $m->parseResponse($r);
$v = $r->value();
- $this->assertEquals($v->structmemexists($str), true);
+ $this->assertEquals(true, $v->structmemexists($str));
}
public function testUnicodeInErrorString()
</value>
</fault>
</methodResponse>');
- $m = new xmlrpcmsg('dummy');
+ $m = $this->newMsg('dummy');
$r = $m->parseResponse($response);
$v = $r->faultString();
$this->assertEquals(chr(224) . chr(252) . chr(232) . chr(224) . chr(252) . chr(232), $v);
public function testValidNumbers()
{
- $m = new xmlrpcmsg('dummy');
+ $m = $this->newMsg('dummy');
$fp =
'<?xml version="1.0"?>
<methodResponse>
<value><int>01</int></value>
</member>
<member>
-<name>float1</name>
-<value><double>01.10</double></value>
-</member>
-<member>
<name>integer2</name>
<value><int>+1</int></value>
</member>
<member>
+<name>integer3</name>
+<value><i4>1</i4></value>
+</member>
+<member>
+<name>float1</name>
+<value><double>01.10</double></value>
+</member>
+<member>
<name>float2</name>
<value><double>+1.10</double></value>
</member>
$r = $m->parseResponse($fp);
$v = $r->value();
$s = $v->structmem('integer1');
- $t = $v->structmem('float1');
- $u = $v->structmem('integer2');
- $w = $v->structmem('float2');
- $x = $v->structmem('float3');
+ $t = $v->structmem('integer2');
+ $u = $v->structmem('integer3');
+ $x = $v->structmem('float1');
+ $y = $v->structmem('float2');
+ $z = $v->structmem('float3');
$this->assertEquals(1, $s->scalarval());
- $this->assertEquals(1.1, $t->scalarval());
+ $this->assertEquals(1, $t->scalarval());
$this->assertEquals(1, $u->scalarval());
- $this->assertEquals(1.1, $w->scalarval());
- $this->assertEquals(-110.0, $x->scalarval());
+
+ $this->assertEquals(1.1, $x->scalarval());
+ $this->assertEquals(1.1, $y->scalarval());
+ $this->assertEquals(-110.0, $z->scalarval());
+ }
+
+ public function testI8()
+ {
+ if (PHP_INT_SIZE == 4 ) {
+ $this->markTestSkipped('did not find a locale which sets decimal separator to comma');
+ return;
+ }
+
+ $m = $this->newMsg('dummy');
+ $fp =
+ '<?xml version="1.0"?>
+<methodResponse>
+<params>
+<param>
+<value>
+<struct>
+<member>
+<name>integer1</name>
+<value><i8>1</i8></value>
+</member>
+</struct>
+</value>
+</param>
+</params>
+</methodResponse>';
+ $r = $m->parseResponse($fp);
+ $v = $r->value();
+ $s = $v->structmem('integer1');
+ $this->assertEquals(1, $s->scalarval());
}
public function testAddScalarToStruct()
public function testBrokenResponses()
{
- $m = new xmlrpcmsg('dummy');
- //$m->debug = 1;
+ $m = $this->newMsg('dummy');
// omitting the 'params' tag: no more tolerated by the lib...
$f = '<?xml version="1.0"?>
<methodResponse>
public function testBuggyHttp()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = 'HTTP/1.1 100 Welcome to the jungle
HTTP/1.0 200 OK
public function testStringBug()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?>
<!-- $Id -->
<!-- found by 2z69xks7bpy001@sneakemail.com, amongst others
public function testWhiteSpace()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
public function testDoubleDataInArrayTag()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?><methodResponse><params><param><value><array>
<data></data>
<data></data>
public function testDoubleStuffInValueTag()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?><methodResponse><params><param><value>
<string>hello world</string>
<array><data></data></array>
public function testAutodecodeResponse()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
public function testNoDecodeResponse()
{
- $s = new xmlrpcmsg('dummy');
+ $s = $this->newMsg('dummy');
$f = '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>hello world. 2 newlines follow
public function testUTF8Response()
{
- $s = new xmlrpcmsg('dummy');
+ $string = chr(224) . chr(252) . chr(232);
+
+ $s = $this->newMsg('dummy');
$f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=UTF-8\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode('������') . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
';
$r = $s->parseResponse($f, false, 'phpvals');
$v = $r->value();
$v = $v['content'];
- $this->assertEquals("������", $v);
- $f = '<?xml version="1.0" encoding="utf-8"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
-<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode('������') . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+ $this->assertEquals($string, $v);
+
+ $f = '<?xml version="1.0" encoding="UTF-8"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . utf8_encode($string) . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
';
$r = $s->parseResponse($f, false, 'phpvals');
$v = $r->value();
$v = $v['content'];
- $this->assertEquals("������", $v);
+ $this->assertEquals($string, $v);
+
+ $r = php_xmlrpc_decode_xml($f);
+ $v = $r->value();
+ $v = $v->structmem('content')->scalarval();
+ $this->assertEquals($string, $v);
+ }
+
+ public function testLatin1Response()
+ {
+ $string = chr(224) . chr(252) . chr(232);
+
+ $s = $this->newMsg('dummy');
+ $f = "HTTP/1.1 200 OK\r\nContent-type: text/xml; charset=ISO-8859-1\r\n\r\n" . '<?xml version="1.0"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+';
+ $r = $s->parseResponse($f, false, 'phpvals');
+ $v = $r->value();
+ $v = $v['content'];
+ $this->assertEquals($string, $v);
+
+ $f = '<?xml version="1.0" encoding="ISO-8859-1"?><methodResponse><params><param><value><struct><member><name>userid</name><value>311127</value></member>
+<member><name>dateCreated</name><value><dateTime.iso8601>20011126T09:17:52</dateTime.iso8601></value></member><member><name>content</name><value>' . $string . '</value></member><member><name>postid</name><value>7414222</value></member></struct></value></param></params></methodResponse>
+';
+ $r = $s->parseResponse($f, false, 'phpvals');
+ $v = $r->value();
+ $v = $v['content'];
+ $this->assertEquals($string, $v);
+
+ $r = php_xmlrpc_decode_xml($f);
+ $v = $r->value();
+ $v = $v->structmem('content')->scalarval();
+ $this->assertEquals($string, $v);
}
public function testUTF8IntString()
$v = new xmlrpcval('hello', 'null');
$r = new xmlrpcresp($v);
$s = $r->serialize();
- $m = new xmlrpcmsg('dummy');
+ $m = $this->newMsg('dummy');
$r = $m->parseresponse($s);
$this->assertequals(2, $r->faultCode());
// enable reception of nil values
$this->assertequals(2, $r->faultCode());
}
- public function TestLocale()
+ public function testLocale()
{
$locale = setlocale(LC_NUMERIC, 0);
/// @todo on php 5.3/win setting locale to german does not seem to set decimal separator to comma...
$this->markTestSkipped('did not find a locale which sets decimal separator to comma');
}
}
+
+ public function testArrayAccess()
+ {
+ $v1 = new xmlrpcval(array(new xmlrpcval('one'), new xmlrpcval('two')), 'array');
+ $this->assertequals(1, count($v1));
+ $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
+ foreach($v1 as $key => $val)
+ {
+ $expected = each($out);
+ $this->assertequals($expected['key'], $key);
+ if (gettype($expected['value']) == 'array') {
+ $this->assertequals('array', gettype($val));
+ } else {
+ $this->assertequals($expected['value'], $val);
+ }
+ }
+
+ $v2 = new \PhpXmlRpc\Value(array(new \PhpXmlRpc\Value('one'), new \PhpXmlRpc\Value('two')), 'array');
+ $this->assertequals(2, count($v2));
+ $out = array(0 => 'object', 1 => 'object');
+ foreach($v2 as $key => $val)
+ {
+ $expected = each($out);
+ $this->assertequals($expected['key'], $key);
+ $this->assertequals($expected['value'], gettype($val));
+ }
+ }
}