XsdTest.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\MessageQueue\Test\Unit\Consumer\Config;
  7. class XsdTest extends \PHPUnit\Framework\TestCase
  8. {
  9. /**
  10. * @var string
  11. */
  12. private $schemaFile;
  13. /**
  14. * @var string
  15. */
  16. private $schemaQueueFile;
  17. /**
  18. * Set up.
  19. *
  20. * @return void
  21. */
  22. protected function setUp()
  23. {
  24. if (!function_exists('libxml_set_external_entity_loader')) {
  25. $this->markTestSkipped('Skipped on HHVM. Will be fixed in MAGETWO-45033');
  26. }
  27. $urnResolver = new \Magento\Framework\Config\Dom\UrnResolver();
  28. $this->schemaFile = $urnResolver->getRealPath('urn:magento:framework-message-queue:etc/consumer.xsd');
  29. $this->schemaQueueFile = $urnResolver->getRealPath('urn:magento:framework-message-queue:etc/queue.xsd');
  30. }
  31. /**
  32. * @param string $fixtureXml
  33. * @param array $expectedErrors
  34. * @dataProvider exemplarXmlDataProvider
  35. */
  36. public function testExemplarXml($fixtureXml, array $expectedErrors)
  37. {
  38. $validationState = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
  39. $validationState->expects($this->atLeastOnce())
  40. ->method('isValidationRequired')
  41. ->willReturn(true);
  42. $messageFormat = '%message%';
  43. $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationState, [], null, null, $messageFormat);
  44. $actualErrors = [];
  45. $actualResult = $dom->validate($this->schemaFile, $actualErrors);
  46. $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
  47. $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
  48. }
  49. /**
  50. * @return array
  51. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  52. */
  53. public function exemplarXmlDataProvider()
  54. {
  55. // @codingStandardsIgnoreStart
  56. return [
  57. /** Valid configurations */
  58. 'valid' => [
  59. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  60. <consumer name="consumer1" queue="queue1" handler="handlerClassOne::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="100"/>
  61. <consumer name="consumer2" queue="queue2" handler="handlerClassTwo::handlerMethodTwo" consumerInstance="consumerClass2" connection="db"/>
  62. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  63. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  64. <consumer name="consumer5" queue="queue4"/>
  65. </config>',
  66. [],
  67. ],
  68. 'non unique consumer name' => [
  69. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  70. <consumer name="consumer1" queue="queue1" handler="handlerClassOne::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="100"/>
  71. <consumer name="consumer1" queue="queue2" handler="handlerClassTwo::handlerMethodTwo" consumerInstance="consumerClass2" connection="db"/>
  72. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  73. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  74. <consumer name="consumer5" queue="queue4"/>
  75. </config>',
  76. [
  77. "Element 'consumer': Duplicate key-sequence ['consumer1'] in unique identity-constraint 'consumer-unique-name'."
  78. ],
  79. ],
  80. 'invalid handler format' => [
  81. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  82. <consumer name="consumer1" queue="queue1" handler="handlerClass1::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="100"/>
  83. <consumer name="consumer2" queue="queue2" handler="handlerClassTwo::handlerMethod2" consumerInstance="consumerClass2" connection="db"/>
  84. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  85. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  86. <consumer name="consumer5" queue="queue4"/>
  87. </config>',
  88. [
  89. "Element 'consumer', attribute 'handler': [facet 'pattern'] The value 'handlerClass1::handlerMethodOne' is not accepted by the pattern '[a-zA-Z\\\\]+::[a-zA-Z]+'.",
  90. "Element 'consumer', attribute 'handler': 'handlerClass1::handlerMethodOne' is not a valid value of the atomic type 'handlerType'.",
  91. "Element 'consumer', attribute 'handler': [facet 'pattern'] The value 'handlerClassTwo::handlerMethod2' is not accepted by the pattern '[a-zA-Z\\\\]+::[a-zA-Z]+'.",
  92. "Element 'consumer', attribute 'handler': 'handlerClassTwo::handlerMethod2' is not a valid value of the atomic type 'handlerType'.",
  93. ],
  94. ],
  95. 'invalid maxMessages format' => [
  96. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  97. <consumer name="consumer1" queue="queue1" handler="handlerClassOne::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="ABC"/>
  98. <consumer name="consumer2" queue="queue2" handler="handlerClassTwo::handlerMethodTwo" consumerInstance="consumerClass2" connection="db"/>
  99. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  100. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  101. <consumer name="consumer5" queue="queue4"/>
  102. </config>',
  103. [
  104. "Element 'consumer', attribute 'maxMessages': 'ABC' is not a valid value of the atomic type 'xs:integer'.",
  105. ],
  106. ],
  107. 'unexpected element' => [
  108. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  109. <consumer name="consumer1" queue="queue1" handler="handlerClassOne::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="100"/>
  110. <consumer name="consumer2" queue="queue2" handler="handlerClassTwo::handlerMethodTwo" consumerInstance="consumerClass2" connection="db"/>
  111. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  112. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  113. <unexpected name="consumer5" queue="queue4"/>
  114. </config>',
  115. [
  116. "Element 'unexpected': This element is not expected. Expected is ( consumer ).",
  117. ],
  118. ],
  119. 'unexpected attribute' => [
  120. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
  121. <consumer name="consumer1" queue="queue1" handler="handlerClassOne::handlerMethodOne" consumerInstance="consumerClass1" connection="amqp" maxMessages="100"/>
  122. <consumer name="consumer2" queue="queue2" handler="handlerClassTwo::handlerMethodTwo" consumerInstance="consumerClass2" connection="db"/>
  123. <consumer name="consumer3" queue="queue3" handler="handlerClassThree::handlerMethodThree" consumerInstance="consumerClass3"/>
  124. <consumer name="consumer4" queue="queue4" handler="handlerClassFour::handlerMethodFour"/>
  125. <consumer name="consumer5" queue="queue4" unexpected=""/>
  126. </config>',
  127. [
  128. "Element 'consumer', attribute 'unexpected': The attribute 'unexpected' is not allowed.",
  129. ],
  130. ],
  131. ];
  132. // @codingStandardsIgnoreEnd
  133. }
  134. /**
  135. * @param string $fixtureXml
  136. * @param array $expectedErrors
  137. * @dataProvider exemplarQueueXmlDataProvider
  138. */
  139. public function testExemplarQueueXml($fixtureXml, array $expectedErrors)
  140. {
  141. $validationState = $this->createMock(\Magento\Framework\Config\ValidationStateInterface::class);
  142. $validationState->expects($this->atLeastOnce())
  143. ->method('isValidationRequired')
  144. ->willReturn(true);
  145. $messageFormat = '%message%';
  146. $dom = new \Magento\Framework\Config\Dom($fixtureXml, $validationState, [], null, null, $messageFormat);
  147. $actualErrors = [];
  148. $actualResult = $dom->validate($this->schemaQueueFile, $actualErrors);
  149. $this->assertEquals(empty($expectedErrors), $actualResult, "Validation result is invalid.");
  150. $this->assertEquals($expectedErrors, $actualErrors, "Validation errors does not match.");
  151. }
  152. /**
  153. * @return array
  154. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  155. */
  156. public function exemplarQueueXmlDataProvider()
  157. {
  158. // @codingStandardsIgnoreStart
  159. return [
  160. 'valid' => [
  161. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  162. <broker topic="asd" >
  163. <queue name="queue1" consumer="consumer1" handler="handlerClassOne1::handlerMethod1" consumerInstance="consumerClass1" maxMessages="5"/>
  164. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handlerMethod2" consumerInstance="consumerClass2" maxMessages="5"/>
  165. </broker>
  166. </config>',
  167. [],
  168. ],
  169. 'invalid handler format' => [
  170. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  171. <broker topic="asd" >
  172. <queue name="queue1" consumer="consumer1" handler="handlerClass_One1::handlerMethod1" consumerInstance="consumerClass1" maxMessages="5"/>
  173. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handler_Method2" consumerInstance="consumerClass2" maxMessages="5"/>
  174. </broker>
  175. </config>',
  176. [
  177. "Element 'queue', attribute 'handler': [facet 'pattern'] The value 'handlerClass_One1::handlerMethod1' is not accepted by the pattern '[a-zA-Z0-9\\\\]+::[a-zA-Z0-9]+'.",
  178. "Element 'queue', attribute 'handler': 'handlerClass_One1::handlerMethod1' is not a valid value of the atomic type 'handlerType'.",
  179. "Element 'queue', attribute 'handler': [facet 'pattern'] The value 'handlerClassOne2::handler_Method2' is not accepted by the pattern '[a-zA-Z0-9\\\\]+::[a-zA-Z0-9]+'.",
  180. "Element 'queue', attribute 'handler': 'handlerClassOne2::handler_Method2' is not a valid value of the atomic type 'handlerType'.",
  181. ],
  182. ],
  183. 'invalid instance format' => [
  184. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  185. <broker topic="asd" >
  186. <queue name="queue1" consumer="consumer1" handler="handlerClassOne1::handlerMethod1" consumerInstance="consumer_Class1" maxMessages="5"/>
  187. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handlerMethod2" consumerInstance="consumerClass_2" maxMessages="5"/>
  188. </broker>
  189. </config>',
  190. [
  191. "Element 'queue', attribute 'consumerInstance': [facet 'pattern'] The value 'consumer_Class1' is not accepted by the pattern '[a-zA-Z0-9\\\\]+'.",
  192. "Element 'queue', attribute 'consumerInstance': 'consumer_Class1' is not a valid value of the atomic type 'instanceType'.",
  193. "Element 'queue', attribute 'consumerInstance': [facet 'pattern'] The value 'consumerClass_2' is not accepted by the pattern '[a-zA-Z0-9\\\\]+'.",
  194. "Element 'queue', attribute 'consumerInstance': 'consumerClass_2' is not a valid value of the atomic type 'instanceType'.",
  195. ],
  196. ],
  197. 'invalid maxMessages format' => [
  198. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  199. <broker topic="asd" >
  200. <queue name="queue1" consumer="consumer1" handler="handlerClassOne1::handlerMethod1" consumerInstance="consumerClass1" maxMessages="ABC"/>
  201. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handlerMethod2" consumerInstance="consumerClass2" maxMessages="5"/>
  202. </broker>
  203. </config>',
  204. [
  205. "Element 'queue', attribute 'maxMessages': 'ABC' is not a valid value of the atomic type 'xs:integer'.",
  206. ],
  207. ],
  208. 'unexpected element' => [
  209. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  210. <broker topic="asd" >
  211. <queue name="queue1" consumer="consumer1" handler="handlerClassOne1::handlerMethod1" consumerInstance="consumerClass1" maxMessages="2"/>
  212. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handlerMethod2" consumerInstance="consumerClass2" maxMessages="5"/>
  213. <unexpected name="queue2"/>
  214. </broker>
  215. </config>',
  216. [
  217. "Element 'unexpected': This element is not expected. Expected is ( queue ).",
  218. ],
  219. ],
  220. 'unexpected attribute' => [
  221. '<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/queue.xsd">
  222. <broker topic="asd" >
  223. <queue name="queue1" consumer="consumer1" handler="handlerClassOne1::handlerMethod1" consumerInstance="consumerClass1" maxMessages="2"/>
  224. <queue name="queue2" consumer="consumer2" handler="handlerClassOne2::handlerMethod2" consumerInstance="consumerClass2" maxMessages="5" unexpected="unexpected"/>
  225. </broker>
  226. </config>',
  227. [
  228. "Element 'queue', attribute 'unexpected': The attribute 'unexpected' is not allowed.",
  229. ],
  230. ],
  231. ];
  232. // @codingStandardsIgnoreEnd
  233. }
  234. }