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 = '&nbsp;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(); }