PageRenderTime 258ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/Zend/Validator/HostnameTest.php

https://github.com/snippet/zf2
PHP | 385 lines | 242 code | 33 blank | 110 comment | 1 complexity | 52aecc40ed7b0d5fc1f25dccc1efc217 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Validate
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. /**
  23. * @namespace
  24. */
  25. namespace ZendTest\Validator;
  26. use Zend\Validator\Hostname;
  27. /**
  28. * @category Zend
  29. * @package Zend_Validate
  30. * @subpackage UnitTests
  31. * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
  32. * @license http://framework.zend.com/license/new-bsd New BSD License
  33. * @group Zend_Validate
  34. */
  35. class HostnameTest extends \PHPUnit_Framework_TestCase
  36. {
  37. /**
  38. * Default instance created for all test methods
  39. *
  40. * @var Zend_Validate_Hostname
  41. */
  42. protected $_validator;
  43. /**
  44. * Creates a new Zend_Validate_Hostname object for each test method
  45. *
  46. * @return void
  47. */
  48. public function setUp()
  49. {
  50. $this->_origEncoding = iconv_get_encoding('internal_encoding');
  51. $this->_validator = new Hostname\Hostname();
  52. }
  53. /**
  54. * Reset iconv
  55. */
  56. public function tearDown()
  57. {
  58. iconv_set_encoding('internal_encoding', $this->_origEncoding);
  59. }
  60. /**
  61. * Ensures that the validator follows expected behavior
  62. *
  63. * @return void
  64. */
  65. public function testBasic()
  66. {
  67. $valuesExpected = array(
  68. array(Hostname\Hostname::ALLOW_IP, true, array('1.2.3.4', '10.0.0.1', '255.255.255.255')),
  69. array(Hostname\Hostname::ALLOW_IP, false, array('1.2.3.4.5', '0.0.0.256')),
  70. array(Hostname\Hostname::ALLOW_DNS, true, array('example.com', 'example.museum', 'd.hatena.ne.jp')),
  71. array(Hostname\Hostname::ALLOW_DNS, false, array('localhost', 'localhost.localdomain', '1.2.3.4', 'domain.invalid')),
  72. array(Hostname\Hostname::ALLOW_LOCAL, true, array('localhost', 'localhost.localdomain', 'example.com')),
  73. array(Hostname\Hostname::ALLOW_ALL, true, array('localhost', 'example.com', '1.2.3.4')),
  74. array(Hostname\Hostname::ALLOW_LOCAL, false, array('local host', 'example,com', 'exam_ple.com'))
  75. );
  76. foreach ($valuesExpected as $element) {
  77. $validator = new Hostname\Hostname($element[0]);
  78. foreach ($element[2] as $input) {
  79. $this->assertEquals($element[1], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  80. }
  81. }
  82. }
  83. public function testCombination()
  84. {
  85. $valuesExpected = array(
  86. array(Hostname\Hostname::ALLOW_DNS | Hostname\Hostname::ALLOW_LOCAL, true, array('domain.com', 'localhost', 'local.localhost')),
  87. array(Hostname\Hostname::ALLOW_DNS | Hostname\Hostname::ALLOW_LOCAL, false, array('1.2.3.4', '255.255.255.255')),
  88. array(Hostname\Hostname::ALLOW_DNS | Hostname\Hostname::ALLOW_IP, true, array('1.2.3.4', '255.255.255.255')),
  89. array(Hostname\Hostname::ALLOW_DNS | Hostname\Hostname::ALLOW_IP, false, array('localhost', 'local.localhost'))
  90. );
  91. foreach ($valuesExpected as $element) {
  92. $validator = new Hostname\Hostname($element[0]);
  93. foreach ($element[2] as $input) {
  94. $this->assertEquals($element[1], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  95. }
  96. }
  97. }
  98. /**
  99. * Ensure the dash character tests work as expected
  100. *
  101. */
  102. public function testDashes()
  103. {
  104. $valuesExpected = array(
  105. array(Hostname\Hostname::ALLOW_DNS, true, array('domain.com', 'doma-in.com')),
  106. array(Hostname\Hostname::ALLOW_DNS, false, array('-domain.com', 'domain-.com', 'do--main.com'))
  107. );
  108. foreach ($valuesExpected as $element) {
  109. $validator = new Hostname\Hostname($element[0]);
  110. foreach ($element[2] as $input) {
  111. $this->assertEquals($element[1], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  112. }
  113. }
  114. }
  115. /**
  116. * Ensures that getMessages() returns expected default value
  117. *
  118. * @return void
  119. */
  120. public function testGetMessages()
  121. {
  122. $this->assertEquals(array(), $this->_validator->getMessages());
  123. }
  124. /**
  125. * Ensure the IDN check works as expected
  126. *
  127. */
  128. public function testIDN()
  129. {
  130. $validator = new Hostname\Hostname();
  131. // Check IDN matching
  132. $valuesExpected = array(
  133. array(true, array('bürger.de', 'hãllo.de', 'hållo.se')),
  134. array(true, array('bÜrger.de', 'hÃllo.de', 'hÅllo.se')),
  135. array(false, array('hãllo.se', 'bürger.lt', 'hãllo.uk'))
  136. );
  137. foreach ($valuesExpected as $element) {
  138. foreach ($element[1] as $input) {
  139. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  140. }
  141. }
  142. // Check no IDN matching
  143. $validator->setValidateIdn(false);
  144. $valuesExpected = array(
  145. array(false, array('bürger.de', 'hãllo.de', 'hållo.se'))
  146. );
  147. foreach ($valuesExpected as $element) {
  148. foreach ($element[1] as $input) {
  149. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  150. }
  151. }
  152. // Check setting no IDN matching via constructor
  153. unset($validator);
  154. $validator = new Hostname\Hostname(Hostname\Hostname::ALLOW_DNS, false);
  155. $valuesExpected = array(
  156. array(false, array('bürger.de', 'hãllo.de', 'hållo.se'))
  157. );
  158. foreach ($valuesExpected as $element) {
  159. foreach ($element[1] as $input) {
  160. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  161. }
  162. }
  163. }
  164. /**
  165. * Ensure the IDN check works on ressource files as expected
  166. *
  167. */
  168. public function testRessourceIDN()
  169. {
  170. $validator = new Hostname\Hostname();
  171. // Check IDN matching
  172. $valuesExpected = array(
  173. array(true, array('bürger.com', 'hãllo.com', 'hållo.com')),
  174. array(true, array('bÜrger.com', 'hÃllo.com', 'hÅllo.com')),
  175. array(false, array('hãllo.lt', 'bürger.lt', 'hãllo.lt'))
  176. );
  177. foreach ($valuesExpected as $element) {
  178. foreach ($element[1] as $input) {
  179. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  180. }
  181. }
  182. // Check no IDN matching
  183. $validator->setValidateIdn(false);
  184. $valuesExpected = array(
  185. array(false, array('bürger.com', 'hãllo.com', 'hållo.com'))
  186. );
  187. foreach ($valuesExpected as $element) {
  188. foreach ($element[1] as $input) {
  189. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  190. }
  191. }
  192. // Check setting no IDN matching via constructor
  193. unset($validator);
  194. $validator = new Hostname\Hostname(Hostname\Hostname::ALLOW_DNS, false);
  195. $valuesExpected = array(
  196. array(false, array('bürger.com', 'hãllo.com', 'hållo.com'))
  197. );
  198. foreach ($valuesExpected as $element) {
  199. foreach ($element[1] as $input) {
  200. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  201. }
  202. }
  203. }
  204. /**
  205. * Ensure the TLD check works as expected
  206. *
  207. */
  208. public function testTLD()
  209. {
  210. $validator = new Hostname\Hostname();
  211. // Check TLD matching
  212. $valuesExpected = array(
  213. array(true, array('domain.co.uk', 'domain.uk.com', 'domain.tl', 'domain.zw')),
  214. array(false, array('domain.xx', 'domain.zz', 'domain.madeup'))
  215. );
  216. foreach ($valuesExpected as $element) {
  217. foreach ($element[1] as $input) {
  218. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  219. }
  220. }
  221. // Check no TLD matching
  222. $validator->setValidateTld(false);
  223. $valuesExpected = array(
  224. array(true, array('domain.xx', 'domain.zz', 'domain.madeup'))
  225. );
  226. foreach ($valuesExpected as $element) {
  227. foreach ($element[1] as $input) {
  228. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  229. }
  230. }
  231. // Check setting no TLD matching via constructor
  232. unset($validator);
  233. $validator = new Hostname\Hostname(Hostname\Hostname::ALLOW_DNS, true, false);
  234. $valuesExpected = array(
  235. array(true, array('domain.xx', 'domain.zz', 'domain.madeup'))
  236. );
  237. foreach ($valuesExpected as $element) {
  238. foreach ($element[1] as $input) {
  239. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  240. }
  241. }
  242. }
  243. /**
  244. * Ensures that getAllow() returns expected default value
  245. *
  246. * @return void
  247. */
  248. public function testGetAllow()
  249. {
  250. $this->assertEquals(Hostname\Hostname::ALLOW_DNS, $this->_validator->getAllow());
  251. }
  252. /**
  253. * Test changed with ZF-6676, as IP check is only involved when IP patterns match
  254. *
  255. * @see ZF-2861
  256. * @see ZF-6676
  257. */
  258. public function testValidatorMessagesShouldBeTranslated()
  259. {
  260. $translations = array(
  261. 'hostnameInvalidLocalName' => 'this is the IP error message',
  262. );
  263. $translator = new \Zend\Translator\Translator('ArrayAdapter', $translations);
  264. $this->_validator->setTranslator($translator);
  265. $this->_validator->isValid('0.239,512.777');
  266. $messages = $this->_validator->getMessages();
  267. $found = false;
  268. foreach ($messages as $code => $message) {
  269. if (array_key_exists($code, $translations)) {
  270. $found = true;
  271. break;
  272. }
  273. }
  274. $this->assertTrue($found);
  275. $this->assertEquals($translations[$code], $message);
  276. }
  277. /**
  278. * @see ZF-6033
  279. */
  280. public function testNumberNames()
  281. {
  282. $validator = new Hostname\Hostname();
  283. // Check TLD matching
  284. $valuesExpected = array(
  285. array(true, array('www.danger1.com', 'danger.com', 'www.danger.com')),
  286. array(false, array('www.danger1com', 'dangercom', 'www.dangercom'))
  287. );
  288. foreach ($valuesExpected as $element) {
  289. foreach ($element[1] as $input) {
  290. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  291. }
  292. }
  293. }
  294. /**
  295. * @see ZF-6133
  296. */
  297. public function testPunycodeDecoding()
  298. {
  299. $validator = new Hostname\Hostname();
  300. // Check TLD matching
  301. $valuesExpected = array(
  302. array(true, array('xn--brger-kva.com')),
  303. array(false, array('xn--brger-x45d2va.com', 'xn--bürger.com', 'xn--'))
  304. );
  305. foreach ($valuesExpected as $element) {
  306. foreach ($element[1] as $input) {
  307. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  308. }
  309. }
  310. }
  311. /**
  312. * @ZF-4352
  313. */
  314. public function testNonStringValidation()
  315. {
  316. $this->assertFalse($this->_validator->isValid(array(1 => 1)));
  317. }
  318. /**
  319. * @ZF-7323
  320. */
  321. public function testLatinSpecialChars()
  322. {
  323. $this->assertFalse($this->_validator->isValid('place@yah&oo.com'));
  324. $this->assertFalse($this->_validator->isValid('place@y*ahoo.com'));
  325. $this->assertFalse($this->_validator->isValid('ya#hoo'));
  326. }
  327. /**
  328. * @see ZF-7277
  329. */
  330. public function testDifferentIconvEncoding()
  331. {
  332. iconv_set_encoding('internal_encoding', 'ISO8859-1');
  333. $validator = new Hostname\Hostname();
  334. $valuesExpected = array(
  335. array(true, array('bürger.com', 'hãllo.com', 'hållo.com')),
  336. array(true, array('bÜrger.com', 'hÃllo.com', 'hÅllo.com')),
  337. array(false, array('hãllo.lt', 'bürger.lt', 'hãllo.lt'))
  338. );
  339. foreach ($valuesExpected as $element) {
  340. foreach ($element[1] as $input) {
  341. $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
  342. }
  343. }
  344. }
  345. /**
  346. * @ZF-8312
  347. */
  348. public function testInvalidDoubledIdn()
  349. {
  350. $this->assertFalse($this->_validator->isValid('test.com / http://www.test.com'));
  351. }
  352. }