PageRenderTime 51ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/Zend/XmlRpc/RequestTest.php

https://github.com/shevron/zf2
PHP | 339 lines | 231 code | 43 blank | 65 comment | 3 complexity | 432be630a7d75dc81958636902bbda45 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework (http://framework.zend.com/)
  4. *
  5. * @link http://github.com/zendframework/zf2 for the canonical source repository
  6. * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
  7. * @license http://framework.zend.com/license/new-bsd New BSD License
  8. * @package Zend_XmlRpc
  9. */
  10. namespace ZendTest\XmlRpc;
  11. use Zend\XmlRpc\Request;
  12. use Zend\XmlRpc\AbstractValue;
  13. use Zend\XmlRpc\Value;
  14. /**
  15. * Test case for Zend_XmlRpc_Request
  16. *
  17. * @category Zend
  18. * @package Zend_XmlRpc
  19. * @subpackage UnitTests
  20. * @group Zend_XmlRpc
  21. */
  22. class RequestTest extends \PHPUnit_Framework_TestCase
  23. {
  24. /**
  25. * Zend_XmlRpc_Request object
  26. * @var Zend_XmlRpc_Request
  27. */
  28. protected $_request;
  29. /**
  30. * Setup environment
  31. */
  32. public function setUp()
  33. {
  34. $this->_request = new Request();
  35. }
  36. /**
  37. * Teardown environment
  38. */
  39. public function tearDown()
  40. {
  41. unset($this->_request);
  42. }
  43. /**
  44. * get/setMethod() test
  45. */
  46. public function testMethod()
  47. {
  48. $this->assertTrue($this->_request->setMethod('testMethod'));
  49. $this->assertTrue($this->_request->setMethod('testMethod9'));
  50. $this->assertTrue($this->_request->setMethod('test.Method'));
  51. $this->assertTrue($this->_request->setMethod('test_method'));
  52. $this->assertTrue($this->_request->setMethod('test:method'));
  53. $this->assertTrue($this->_request->setMethod('test/method'));
  54. $this->assertFalse($this->_request->setMethod('testMethod-bogus'));
  55. $this->assertEquals('test/method', $this->_request->getMethod());
  56. }
  57. /**
  58. * __construct() test
  59. */
  60. public function testConstructorOptionallySetsMethodAndParams()
  61. {
  62. $r = new Request();
  63. $this->assertEquals('', $r->getMethod());
  64. $this->assertEquals(array(), $r->getParams());
  65. $method = 'foo.bar';
  66. $params = array('baz', 1, array('foo' => 'bar'));
  67. $r = new Request($method, $params);
  68. $this->assertEquals($method, $r->getMethod());
  69. $this->assertEquals($params, $r->getParams());
  70. }
  71. /**
  72. * addParam()/getParams() test
  73. */
  74. public function testAddParam()
  75. {
  76. $this->_request->addParam('string1');
  77. $params = $this->_request->getParams();
  78. $this->assertEquals(1, count($params));
  79. $this->assertEquals('string1', $params[0]);
  80. $this->_request->addParam('string2');
  81. $params = $this->_request->getParams();
  82. $this->assertSame(2, count($params));
  83. $this->assertSame('string1', $params[0]);
  84. $this->assertSame('string2', $params[1]);
  85. $this->_request->addParam(new Value\String('foo'));
  86. $params = $this->_request->getParams();
  87. $this->assertSame(3, count($params));
  88. $this->assertSame('string1', $params[0]);
  89. $this->assertSame('string2', $params[1]);
  90. $this->assertSame('foo', $params[2]->getValue());
  91. }
  92. public function testAddDateParamGeneratesCorrectXml()
  93. {
  94. $time = time();
  95. $this->_request->addParam($time, AbstractValue::XMLRPC_TYPE_DATETIME);
  96. $this->_request->setMethod('foo.bar');
  97. $xml = $this->_request->saveXml();
  98. $sxl = new \SimpleXMLElement($xml);
  99. $param = $sxl->params->param->value;
  100. $type = 'dateTime.iso8601';
  101. $this->assertTrue(isset($param->{$type}), var_export($param, 1));
  102. $this->assertEquals($time, strtotime((string) $param->{$type}));
  103. }
  104. /**
  105. * setParams()/getParams() test
  106. */
  107. public function testSetParams()
  108. {
  109. $params = array(
  110. 'string1',
  111. true,
  112. array('one', 'two')
  113. );
  114. $this->_request->setParams($params);
  115. $returned = $this->_request->getParams();
  116. $this->assertSame($params, $returned);
  117. $params = array(
  118. 'string2',
  119. array('two', 'one')
  120. );
  121. $this->_request->setParams($params);
  122. $returned = $this->_request->getParams();
  123. $this->assertSame($params, $returned);
  124. $params = array(array('value' => 'foobar'));
  125. $this->_request->setParams($params);
  126. $this->assertSame(array('foobar'), $this->_request->getParams());
  127. $this->assertSame(array('string'), $this->_request->getTypes());
  128. $null = new Value\Nil();
  129. $this->_request->setParams('foo', 1, $null);
  130. $this->assertSame(array('foo', 1, $null), $this->_request->getParams());
  131. $this->assertSame(array('string', 'int', 'nil'), $this->_request->getTypes());
  132. $this->assertNull($this->_request->setParams(), 'Call without argument returns null');
  133. }
  134. /**
  135. * loadXml() test
  136. */
  137. public function testLoadXml()
  138. {
  139. $dom = new \DOMDocument('1.0', 'UTF-8');
  140. $mCall = $dom->appendChild($dom->createElement('methodCall'));
  141. $mName = $mCall->appendChild($dom->createElement('methodName', 'do.Something'));
  142. $params = $mCall->appendChild($dom->createElement('params'));
  143. $param1 = $params->appendChild($dom->createElement('param'));
  144. $value1 = $param1->appendChild($dom->createElement('value'));
  145. $value1->appendChild($dom->createElement('string', 'string1'));
  146. $param2 = $params->appendChild($dom->createElement('param'));
  147. $value2 = $param2->appendChild($dom->createElement('value'));
  148. $value2->appendChild($dom->createElement('boolean', 1));
  149. $xml = $dom->saveXml();
  150. $parsed = $this->_request->loadXml($xml);
  151. $this->assertTrue($parsed, $xml);
  152. $this->assertEquals('do.Something', $this->_request->getMethod());
  153. $test = array('string1', true);
  154. $params = $this->_request->getParams();
  155. $this->assertSame($test, $params);
  156. $parsed = $this->_request->loadXml('foo');
  157. $this->assertFalse($parsed, 'Parsed non-XML string?');
  158. }
  159. public function testPassingInvalidTypeToLoadXml()
  160. {
  161. $this->assertFalse($this->_request->loadXml(new \stdClass()));
  162. $this->assertTrue($this->_request->isFault());
  163. $this->assertSame(635, $this->_request->getFault()->getCode());
  164. $this->assertSame('Invalid XML provided to request', $this->_request->getFault()->getMessage());
  165. }
  166. public function testLoadingXmlWithoutMethodNameElement()
  167. {
  168. $this->assertFalse($this->_request->loadXml('<empty/>'));
  169. $this->assertTrue($this->_request->isFault());
  170. $this->assertSame(632, $this->_request->getFault()->getCode());
  171. $this->assertSame("Invalid request, no method passed; request must contain a 'methodName' tag",
  172. $this->_request->getFault()->getMessage());
  173. }
  174. public function testLoadingXmlWithInvalidParams()
  175. {
  176. $this->assertFalse($this->_request->loadXml(
  177. '<methodCall>'
  178. . '<methodName>foo</methodName>'
  179. . '<params><param/><param/><param><foo/></param></params>'
  180. . '</methodCall>'));
  181. $this->assertTrue($this->_request->isFault());
  182. $this->assertSame(633, $this->_request->getFault()->getCode());
  183. $this->assertSame(
  184. 'Param must contain a value',
  185. $this->_request->getFault()->getMessage());
  186. }
  187. public function testExceptionWhileLoadingXmlParamValueIsHandled()
  188. {
  189. $this->assertFalse($this->_request->loadXml(
  190. '<methodCall>'
  191. . '<methodName>foo</methodName>'
  192. . '<params><param><value><foo/></value></param></params>'
  193. . '</methodCall>'));
  194. $this->assertTrue($this->_request->isFault());
  195. $this->assertSame(636, $this->_request->getFault()->getCode());
  196. $this->assertSame(
  197. 'Error creating xmlrpc value',
  198. $this->_request->getFault()->getMessage());
  199. }
  200. /**
  201. * isFault() test
  202. */
  203. public function testIsFault()
  204. {
  205. $this->assertFalse($this->_request->isFault());
  206. $this->_request->loadXml('foo');
  207. $this->assertTrue($this->_request->isFault());
  208. }
  209. /**
  210. * getFault() test
  211. */
  212. public function testGetFault()
  213. {
  214. $fault = $this->_request->getFault();
  215. $this->assertTrue(null === $fault);
  216. $this->_request->loadXml('foo');
  217. $fault = $this->_request->getFault();
  218. $this->assertTrue($fault instanceof \Zend\XmlRpc\Fault);
  219. }
  220. /**
  221. * helper for saveXml() and __toString() tests
  222. *
  223. * @param string $xml
  224. * @return void
  225. */
  226. protected function _testXmlRequest($xml, $argv)
  227. {
  228. $sx = new \SimpleXMLElement($xml);
  229. $result = $sx->xpath('//methodName');
  230. $count = 0;
  231. while (list( , $node) = each($result)) {
  232. ++$count;
  233. }
  234. $this->assertEquals(1, $count, $xml);
  235. $result = $sx->xpath('//params');
  236. $count = 0;
  237. while (list( , $node) = each($result)) {
  238. ++$count;
  239. }
  240. $this->assertEquals(1, $count, $xml);
  241. $methodName = (string) $sx->methodName;
  242. $params = array(
  243. (string) $sx->params->param[0]->value->string,
  244. (bool) $sx->params->param[1]->value->boolean
  245. );
  246. $this->assertEquals('do.Something', $methodName);
  247. $this->assertSame($argv, $params, $xml);
  248. }
  249. /**
  250. * testSaveXML() test
  251. */
  252. public function testSaveXML()
  253. {
  254. $argv = array('string', true);
  255. $this->_request->setMethod('do.Something');
  256. $this->_request->setParams($argv);
  257. $xml = $this->_request->saveXml();
  258. $this->_testXmlRequest($xml, $argv);
  259. }
  260. /**
  261. * __toString() test
  262. */
  263. public function test__toString()
  264. {
  265. $argv = array('string', true);
  266. $this->_request->setMethod('do.Something');
  267. $this->_request->setParams($argv);
  268. $xml = $this->_request->__toString();
  269. $this->_testXmlRequest($xml, $argv);
  270. }
  271. /**
  272. * Test encoding settings
  273. */
  274. public function testSetGetEncoding()
  275. {
  276. $this->assertEquals('UTF-8', $this->_request->getEncoding());
  277. $this->assertEquals('UTF-8', AbstractValue::getGenerator()->getEncoding());
  278. $this->assertSame($this->_request, $this->_request->setEncoding('ISO-8859-1'));
  279. $this->assertEquals('ISO-8859-1', $this->_request->getEncoding());
  280. $this->assertEquals('ISO-8859-1', AbstractValue::getGenerator()->getEncoding());
  281. }
  282. /**
  283. * @group ZF-12293
  284. */
  285. public function testDoesNotAllowExternalEntities()
  286. {
  287. $payload = file_get_contents(dirname(__FILE__) . '/_files/ZF12293-request.xml');
  288. $payload = sprintf($payload, 'file://' . realpath(dirname(__FILE__) . '/_files/ZF12293-payload.txt'));
  289. $this->_request->loadXml($payload);
  290. $method = $this->_request->getMethod();
  291. $this->assertTrue(empty($method));
  292. if (is_string($method)) {
  293. $this->assertNotContains('Local file inclusion', $method);
  294. }
  295. }
  296. }