include_once __DIR__ . '/../lib/xmlrpc.inc';
include_once __DIR__ . '/../lib/xmlrpcs.inc';
+include_once __DIR__ . '/parse_args.php';
+
+include_once __DIR__ . '/PolyfillTestCase.php';
+
/**
* Tests involving parsing of xml and handling of xmlrpc values
*/
-class ParsingBugsTests extends PHPUnit_Framework_TestCase
+class ParsingBugsTests extends PhpXmlRpc_PolyfillTestCase
{
public $args = array();
- protected function setUp()
+ protected function set_up()
{
$this->args = argParser::getArgs();
if ($this->args['DEBUG'] == 1)
ob_start();
}
- protected function tearDown()
+ protected function tear_down()
{
if ($this->args['DEBUG'] != 1)
return;
$response = utf8_encode(
'<?xml version="1.0"?>
<!-- $Id -->
-<!-- found by G. giunta, covers what happens when lib receives
- UTF8 chars in response text and comments -->
+<!-- found by G. Giunta, covers what happens when lib receives UTF8 chars in response text and comments -->
<!-- ' . chr(224) . chr(252) . chr(232) . 'àüè -->
<methodResponse>
<fault>
<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()
$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)
+ {
+ $this->assertArrayHasKey($key, $out);
+ $expected = $out[$key];
+ if (gettype($expected) == 'array') {
+ $this->assertequals('array', gettype($val));
+ } else {
+ $this->assertequals($expected, $val);
+ }
+ }
+
+ $v2 = new \PhpXmlRpc\Value(array(new \PhpXmlRpc\Value('one'), new \PhpXmlRpc\Value('two')), 'array');
+ $this->assertequals(2, count($v2));
+ $out = array(array('key' => 0, 'value' => 'object'), array('key' => 1, 'value' => 'object'));
+ $i = 0;
+ foreach($v2 as $key => $val)
+ {
+ $expected = $out[$i];
+ $this->assertequals($expected['key'], $key);
+ $this->assertequals($expected['value'], gettype($val));
+ $i++;
+ }
+ }
+
+ function testBigXML()
+ {
+ // nb: make sure that the serialized xml corresponding to this is > 10MB in size
+ $data = array();
+ for ($i = 0; $i < 500000; $i++ ) {
+ $data[] = 'hello world';
+ }
+
+ $encoder = new \PhpXmlRpc\Encoder();
+ $val = $encoder->encode($data);
+ $req = new \PhpXmlRpc\Request('test', array($val));
+ $xml = $req->serialize();
+ $parser = new \PhpXmlRpc\Helper\XMLParser();
+ $parser->parse($xml);
+
+ $this->assertequals(0, $parser->_xh['isf']);
+ }
}