assertXmlRpcType('boolean', $val);
}
}
public function testMarshalBooleanFromNative()
{
$native = true;
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_BOOLEAN);
$this->assertXmlRpcType('boolean', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalBooleanFromXmlRpc()
{
$xml = '1';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('boolean', $val);
$this->assertEquals('boolean', $val->getType());
$this->assertSame(true, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
// Integer
public function testFactoryAutodetectsInteger()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue(1);
$this->assertXmlRpcType('integer', $val);
}
public function testMarshalIntegerFromNative()
{
$native = 1;
$types = array(Zend_XmlRpc_Value::XMLRPC_TYPE_I4,
Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER);
foreach ($types as $type) {
$val = Zend_XmlRpc_Value::getXmlRpcValue($native, $type);
$this->assertXmlRpcType('integer', $val);
$this->assertSame($native, $val->getValue());
}
}
public function testMarshalIntegerFromXmlRpc()
{
$native = 1;
$xmls = array("$native",
"$native");
foreach ($xmls as $xml) {
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('integer', $val);
$this->assertEquals('int', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
}
/**
* @group ZF-3310
*/
public function testMarshalI4FromOverlongNativeThrowsException()
{
$this->setExpectedException('Zend_XmlRpc_Value_Exception', 'Overlong integer given');
Zend_XmlRpc_Value::getXmlRpcValue(PHP_INT_MAX + 1, Zend_XmlRpc_Value::XMLRPC_TYPE_I4);
}
/**
* @group ZF-3310
*/
public function testMarshalIntegerFromOverlongNativeThrowsException()
{
$this->setExpectedException('Zend_XmlRpc_Value_Exception', 'Overlong integer given');
Zend_XmlRpc_Value::getXmlRpcValue(PHP_INT_MAX + 1, Zend_XmlRpc_Value::XMLRPC_TYPE_INTEGER);
}
// BigInteger
/**
* @group ZF-6445
*/
public function testMarshalBigIntegerFromFromXmlRpc()
{
$bigInt = (string)(PHP_INT_MAX + 1);
$native = new Zend_Crypt_Math_BigInteger();
$native->init($bigInt);
$xmlStrings = array("$bigInt",
"$bigInt");
foreach ($xmlStrings as $xml) {
$value = Zend_XmlRpc_Value::getXmlRpcValue($xml, Zend_XmlRpc_Value::XML_STRING);
$this->assertEquals($native, $value->getValue());
$this->assertEquals('i8', $value->getType());
$this->assertType('DOMElement', $value->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $value->saveXml());
}
}
/**
* @group ZF-6445
*/
public function testMarshalBigIntegerFromNative()
{
$native = (string)(PHP_INT_MAX + 1);
$types = array(Zend_XmlRpc_Value::XMLRPC_TYPE_APACHEI8,
Zend_XmlRpc_Value::XMLRPC_TYPE_I8);
$bigInt = new Zend_Crypt_Math_BigInteger();
$bigInt->init($native);
foreach ($types as $type) {
$value = Zend_XmlRpc_Value::getXmlRpcValue($native, $type);
$this->assertSame('i8', $value->getType());
$this->assertEquals($bigInt, $value->getValue());
}
}
// Double
public function testFactoryAutodetectsFloat()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue((float)1);
$this->assertXmlRpcType('double', $val);
}
public function testMarshalDoubleFromNative()
{
$native = 1.1;
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE);
$this->assertXmlRpcType('double', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalDoubleFromXmlRpc()
{
$native = 1.1;
$xml = "$native";
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('double', $val);
$this->assertEquals('double', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
/**
* @group ZF-7712
*/
public function testMarshallingDoubleWithHigherPrecisionFromNative()
{
if (ini_get('precision') < 7) {
$this->markTestSkipped('precision is too low');
}
$native = 0.1234567;
$value = Zend_XmlRpc_Value::getXmlRpcValue($native, Zend_XmlRpc_Value::XMLRPC_TYPE_DOUBLE);
$this->assertXmlRpcType('double', $value);
$this->assertSame($native, $value->getValue());
}
// String
public function testFactoryAutodetectsString()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue('');
$this->assertXmlRpcType('string', $val);
}
public function testMarshalStringFromNative()
{
$native = 'foo';
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_STRING);
$this->assertXmlRpcType('string', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalStringFromXmlRpc()
{
$native = 'foo';
$xml = "$native";
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('string', $val);
$this->assertEquals('string', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testMarshalStringFromDefault()
{
$native = 'foo';
$xml = "$native";
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('string', $val);
$this->assertEquals('string', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
//Nil
public function testFactoryAutodetectsNil()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue(NULL);
$this->assertXmlRpcType('nil', $val);
}
public function testMarshalNilFromNative()
{
$native = NULL;
$types = array(Zend_XmlRpc_Value::XMLRPC_TYPE_NIL,
Zend_XmlRpc_Value::XMLRPC_TYPE_APACHENIL);
foreach ($types as $type) {
$value = Zend_XmlRpc_Value::getXmlRpcValue($native, $type);
$this->assertXmlRpcType('nil', $value);
$this->assertSame($native, $value->getValue());
}
}
public function testMarshalNilFromXmlRpc()
{
$xmls = array('',
'');
foreach ($xmls as $xml) {
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('nil', $val);
$this->assertEquals('nil', $val->getType());
$this->assertSame(NULL, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
}
// Array
public function testFactoryAutodetectsArray()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue(array(0, 'foo'));
$this->assertXmlRpcType('array', $val);
}
public function testMarshalArrayFromNative()
{
$native = array(0,1);
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_ARRAY);
$this->assertXmlRpcType('array', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalArrayFromXmlRpc()
{
$native = array(0,1);
$xml = '0'
. '1';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('array', $val);
$this->assertEquals('array', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testEmptyXmlRpcArrayResultsInEmptyArray()
{
$native = array();
$xml = '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('array', $val);
$this->assertEquals('array', $val->getType());
$this->assertSame($native, $val->getValue());
$value = Zend_XmlRpc_Value::getXmlRpcValue($xml, Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('array', $value);
$this->assertEquals('array', $value->getType());
$this->assertSame($native, $value->getValue());
}
public function testArrayMustContainDataElement()
{
$native = array();
$xml = '';
$this->setExpectedException('Zend_XmlRpc_Value_Exception',
'Invalid XML for XML-RPC native array type: ARRAY tag must contain DATA tag');
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
}
/**
* @group ZF-5405
*/
public function testMarshalNilInStructWrappedInArray()
{
$expected = array(array('id' => '1', 'name' => 'vertebra, caudal', 'description' => null));
$xml = ''
. 'id1'
. 'namevertebra, caudal'
. 'description'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml, Zend_XmlRpc_Value::XML_STRING);
$this->assertSame($expected, $val->getValue());
}
// Struct
public function testFactoryAutodetectsStruct()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue(array('foo' => 0));
$this->assertXmlRpcType('struct', $val);
}
public function testFactoryAutodetectsStructFromObject()
{
$val = Zend_XmlRpc_Value::getXmlRpcValue((object)array('foo' => 0));
$this->assertXmlRpcType('struct', $val);
}
public function testMarshalStructFromNative()
{
$native = array('foo' => 0);
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT);
$this->assertXmlRpcType('struct', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalStructFromXmlRpc()
{
$native = array('foo' => 0);
$xml = 'foo0'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertEquals('struct', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testMarshallingStructWithMemberWithoutValue()
{
$native = array('foo' => 0, 'bar' => 1);
$xml = ''
. 'foo0'
. 'foo'
. 'bar1'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertEquals('struct', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testMarshallingStructWithMemberWithoutName()
{
$native = array('foo' => 0, 'bar' => 1);
$xml = ''
. 'foo0'
. 'foo'
. 'bar1'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertEquals('struct', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
/**
* @group ZF-7639
*/
public function testMarshalStructFromXmlRpcWithEntities()
{
$native = array(' ' => 0);
$xml = ' 0'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml, Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertSame($native, $val->getValue());
$this->assertSame($this->wrapXml($xml), $val->saveXML());
}
/**
* @group ZF-3947
*/
public function testMarshallingStructsWithEmptyValueFromXmlRpcShouldRetainKeys()
{
$native = array('foo' => '');
$xml = 'foo'
. '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertEquals('struct', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testMarshallingStructWithMultibyteValueFromXmlRpcRetainsMultibyteValue()
{
$native = array('foo' => 'ß');
$xml = 'foo'
. 'ß';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('struct', $val);
$this->assertEquals('struct', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
$val = Zend_XmlRpc_Value::getXmlRpcValue($native, Zend_XmlRpc_Value::XMLRPC_TYPE_STRUCT);
$this->assertSame($native, $val->getValue());
$this->assertSame($xml . "\n", $val->saveXML());
}
// DateTime
public function testMarshalDateTimeFromNativeString()
{
$native = '1997-07-16T19:20+01:00';
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME);
$this->assertXmlRpcType('dateTime', $val);
$expected = '1997-07-16T19:20+01:00';
$this->assertSame(strtotime($native), strtotime($val->getValue()));
}
public function testMarshalDateTimeFromNativeStringProducesIsoOutput()
{
$native = '1997-07-16T19:20+01:00';
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME);
$this->assertXmlRpcType('dateTime', $val);
$expected = date('c', strtotime($native));
$expected = substr($expected, 0, strlen($expected) - 6);
$expected = str_replace('-', '', $expected);
$received = $val->getValue();
$this->assertEquals($expected, $received);
}
public function testMarshalDateTimeFromInvalidString()
{
$this->setExpectedException('Zend_XmlRpc_Value_Exception',
"Cannot convert given value 'foobarbaz' to a timestamp");
Zend_XmlRpc_Value::getXmlRpcValue('foobarbaz', Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME);
}
public function testMarshalDateTimeFromNativeInteger()
{
$native = strtotime('1997-07-16T19:20+01:00');
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_DATETIME);
$this->assertXmlRpcType('dateTime', $val);
$this->assertSame($native, strtotime($val->getValue()));
}
public function testMarshalDateTimeFromXmlRpc()
{
$iso8601 = '1997-07-16T19:20+01:00';
$xml = "$iso8601";
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('dateTime', $val);
$this->assertEquals('dateTime.iso8601', $val->getType());
$this->assertSame(strtotime($iso8601), strtotime($val->getValue()));
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
// Base64
public function testMarshalBase64FromString()
{
$native = 'foo';
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64);
$this->assertXmlRpcType('base64', $val);
$this->assertSame($native, $val->getValue());
}
public function testMarshalBase64FromXmlRpc()
{
$native = 'foo';
$xml = '' .base64_encode($native). '';
$val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
Zend_XmlRpc_Value::XML_STRING);
$this->assertXmlRpcType('base64', $val);
$this->assertEquals('base64', $val->getType());
$this->assertSame($native, $val->getValue());
$this->assertType('DomElement', $val->getAsDOM());
$this->assertEquals($this->wrapXml($xml), $val->saveXML());
}
public function testXmlRpcValueBase64GeneratedXmlContainsBase64EncodedText()
{
$native = 'foo';
$val = Zend_XmlRpc_Value::getXmlRpcValue($native,
Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64);
$this->assertXmlRpcType('base64', $val);
$xml = $val->saveXML();
$encoded = base64_encode($native);
$this->assertContains($encoded, $xml);
}
/**
* @group ZF-3862
*/
public function testMarshalSerializedObjectAsBase64()
{
$o = new Zend_XmlRpc_SerializableTestClass();
$o->setProperty('foobar');
$serialized = serialize($o);
$val = Zend_XmlRpc_Value::getXmlRpcValue($serialized,
Zend_XmlRpc_Value::XMLRPC_TYPE_BASE64);
$this->assertXmlRpcType('base64', $val);
$o2 = unserialize($val->getValue());
$this->assertSame('foobar', $o2->getProperty());
}
// Exceptions
public function testFactoryThrowsWhenInvalidTypeSpecified()
{
try {
Zend_XmlRpc_Value::getXmlRpcValue('', 'bad type here');
$this->fail();
} catch (Exception $e) {
$this->assertRegexp('/given type is not/i', $e->getMessage());
}
}
// Custom Assertions and Helper Methods
public function assertXmlRpcType($type, $object)
{
$type = 'Zend_XmlRpc_Value_' . ucfirst($type);
$this->assertType($type, $object);
}
public function wrapXml($xml)
{
return "\n$xml\n";
}
}
class Zend_XmlRpc_SerializableTestClass
{
protected $_property;
public function setProperty($property)
{
$this->_property = $property;
}
public function getProperty()
{
return $this->_property;
}
}
// Call Zend_XmlRpc_ValueTest::main() if this source file is executed directly.
if (PHPUnit_MAIN_METHOD == "Zend_XmlRpc_ValueTest::main") {
Zend_XmlRpc_ValueTest::main();
}