PageRenderTime 30ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/lib/tests/moodlelib_test.php

https://github.com/eduridden/totara
PHP | 2707 lines | 2005 code | 360 blank | 342 comment | 29 complexity | 0437510f5dd95af01ef5852267f167d8 MD5 | raw file
Possible License(s): GPL-3.0, Apache-2.0, BSD-3-Clause, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  4. // Moodle is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // Moodle is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  16. /**
  17. * Unit tests for (some of) ../moodlelib.php.
  18. *
  19. * @package core
  20. * @category phpunit
  21. * @copyright &copy; 2006 The Open University
  22. * @author T.J.Hunt@open.ac.uk
  23. * @author nicolas@moodle.com
  24. */
  25. defined('MOODLE_INTERNAL') || die();
  26. global $CFG;
  27. require_once($CFG->libdir . '/moodlelib.php');
  28. class moodlelib_testcase extends advanced_testcase {
  29. public static $includecoverage = array('lib/moodlelib.php');
  30. var $user_agents = array(
  31. 'MSIE' => array(
  32. '5.0' => array('Windows 98' => 'Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)'),
  33. '5.5' => array('Windows 2000' => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)'),
  34. '6.0' => array('Windows XP SP2' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)'),
  35. '7.0' => array('Windows XP SP2' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'),
  36. '8.0' => array('Windows Vista' => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)'),
  37. '9.0' => array('Windows 7' => 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'),
  38. '9.0i' => array('Windows 7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)'),
  39. '10.0' => array('Windows 8' => 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)'),
  40. '10.0i' => array('Windows 8' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)'),
  41. '11.0' => array('Windows 8.1' => 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)'),
  42. ),
  43. 'Firefox' => array(
  44. '1.0.6' => array('Windows XP' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6'),
  45. '1.5' => array('Windows XP' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8) Gecko/20051107 Firefox/1.5'),
  46. '1.5.0.1' => array('Windows XP' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1'),
  47. '2.0' => array('Windows XP' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
  48. 'Ubuntu Linux AMD64' => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)'),
  49. '3.0.6' => array('SUSE' => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-1.4 Firefox/3.0.6'),
  50. '3.6' => array('Linux' => 'Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6'),
  51. '11.0' => array('Windows' => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0'),
  52. '15.0a2' => array('Windows' => 'Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2'),
  53. '18.0' => array('Mac OS X' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0'),
  54. ),
  55. 'SeaMonkey' => array(
  56. '2.0' => array('Windows' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0'),
  57. '2.1' => array('Linux' => 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110609 Firefox/4.0.1 SeaMonkey/2.1'),
  58. '2.3' => array('FreeBSD' => 'Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0) Gecko/20110818 Firefox/6.0 SeaMonkey/2.3'),
  59. ),
  60. 'Safari' => array(
  61. '312' => array('Mac OS X' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312'),
  62. '412' => array('Mac OS X' => 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412')
  63. ),
  64. 'Safari iOS' => array(
  65. '528' => array('iPhone' => 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; cs-cz) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16'),
  66. '533' => array('iPad' => 'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5'),
  67. ),
  68. 'WebKit Android' => array(
  69. '525' => array('G1 Phone' => 'Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 – G1 Phone'),
  70. '530' => array('Nexus' => 'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus'),
  71. ),
  72. 'Chrome' => array(
  73. '8' => array('Mac OS X' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10'),
  74. ),
  75. 'Opera' => array(
  76. '8.51' => array('Windows XP' => 'Opera/8.51 (Windows NT 5.1; U; en)'),
  77. '9.0' => array('Windows XP' => 'Opera/9.0 (Windows NT 5.1; U; en)',
  78. 'Debian Linux' => 'Opera/9.01 (X11; Linux i686; U; en)')
  79. )
  80. );
  81. /**
  82. * Define a local decimal separator.
  83. *
  84. * It is not possible to directly change the result of get_string in
  85. * a unit test. Instead, we create a language pack for language 'xx' in
  86. * dataroot and make langconfig.php with the string we need to change.
  87. * The example separator used here is 'X'; on PHP 5.3 and before this
  88. * must be a single byte character due to PHP bug/limitation in
  89. * number_format, so you can't use UTF-8 characters.
  90. *
  91. * @global type $SESSION
  92. * @global type $CFG
  93. */
  94. protected function define_local_decimal_separator() {
  95. global $SESSION, $CFG;
  96. $SESSION->lang = 'xx';
  97. $langconfig = "<?php\n\$string['decsep'] = 'X';";
  98. $langfolder = $CFG->dataroot . '/lang/xx';
  99. check_dir_exists($langfolder);
  100. file_put_contents($langfolder . '/langconfig.php', $langconfig);
  101. }
  102. function test_cleanremoteaddr() {
  103. //IPv4
  104. $this->assertEquals(cleanremoteaddr('1023.121.234.1'), null);
  105. $this->assertEquals(cleanremoteaddr('123.121.234.01 '), '123.121.234.1');
  106. //IPv6
  107. $this->assertEquals(cleanremoteaddr('0:0:0:0:0:0:0:0:0'), null);
  108. $this->assertEquals(cleanremoteaddr('0:0:0:0:0:0:0:abh'), null);
  109. $this->assertEquals(cleanremoteaddr('0:0:0:::0:0:1'), null);
  110. $this->assertEquals(cleanremoteaddr('0:0:0:0:0:0:0:0', true), '::');
  111. $this->assertEquals(cleanremoteaddr('0:0:0:0:0:0:1:1', true), '::1:1');
  112. $this->assertEquals(cleanremoteaddr('abcd:00ef:0:0:0:0:0:0', true), 'abcd:ef::');
  113. $this->assertEquals(cleanremoteaddr('1:0:0:0:0:0:0:1', true), '1::1');
  114. $this->assertEquals(cleanremoteaddr('::10:1', false), '0:0:0:0:0:0:10:1');
  115. $this->assertEquals(cleanremoteaddr('01:1::', false), '1:1:0:0:0:0:0:0');
  116. $this->assertEquals(cleanremoteaddr('10::10', false), '10:0:0:0:0:0:0:10');
  117. $this->assertEquals(cleanremoteaddr('::ffff:192.168.1.1', true), '::ffff:c0a8:11');
  118. }
  119. function test_address_in_subnet() {
  120. /// 1: xxx.xxx.xxx.xxx/nn or xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/nnn (number of bits in net mask)
  121. $this->assertTrue(address_in_subnet('123.121.234.1', '123.121.234.1/32'));
  122. $this->assertFalse(address_in_subnet('123.121.23.1', '123.121.23.0/32'));
  123. $this->assertTrue(address_in_subnet('10.10.10.100', '123.121.23.45/0'));
  124. $this->assertTrue(address_in_subnet('123.121.234.1', '123.121.234.0/24'));
  125. $this->assertFalse(address_in_subnet('123.121.34.1', '123.121.234.0/24'));
  126. $this->assertTrue(address_in_subnet('123.121.234.1', '123.121.234.0/30'));
  127. $this->assertFalse(address_in_subnet('123.121.23.8', '123.121.23.0/30'));
  128. $this->assertTrue(address_in_subnet('baba:baba::baba', 'baba:baba::baba/128'));
  129. $this->assertFalse(address_in_subnet('bab:baba::baba', 'bab:baba::cece/128'));
  130. $this->assertTrue(address_in_subnet('baba:baba::baba', 'cece:cece::cece/0'));
  131. $this->assertTrue(address_in_subnet('baba:baba::baba', 'baba:baba::baba/128'));
  132. $this->assertTrue(address_in_subnet('baba:baba::00ba', 'baba:baba::/120'));
  133. $this->assertFalse(address_in_subnet('baba:baba::aba', 'baba:baba::/120'));
  134. $this->assertTrue(address_in_subnet('baba::baba:00ba', 'baba::baba:0/112'));
  135. $this->assertFalse(address_in_subnet('baba::aba:00ba', 'baba::baba:0/112'));
  136. $this->assertFalse(address_in_subnet('aba::baba:0000', 'baba::baba:0/112'));
  137. // fixed input
  138. $this->assertTrue(address_in_subnet('123.121.23.1 ', ' 123.121.23.0 / 24'));
  139. $this->assertTrue(address_in_subnet('::ffff:10.1.1.1', ' 0:0:0:000:0:ffff:a1:10 / 126'));
  140. // incorrect input
  141. $this->assertFalse(address_in_subnet('123.121.234.1', '123.121.234.1/-2'));
  142. $this->assertFalse(address_in_subnet('123.121.234.1', '123.121.234.1/64'));
  143. $this->assertFalse(address_in_subnet('123.121.234.x', '123.121.234.1/24'));
  144. $this->assertFalse(address_in_subnet('123.121.234.0', '123.121.234.xx/24'));
  145. $this->assertFalse(address_in_subnet('123.121.234.1', '123.121.234.1/xx0'));
  146. $this->assertFalse(address_in_subnet('::1', '::aa:0/xx0'));
  147. $this->assertFalse(address_in_subnet('::1', '::aa:0/-5'));
  148. $this->assertFalse(address_in_subnet('::1', '::aa:0/130'));
  149. $this->assertFalse(address_in_subnet('x:1', '::aa:0/130'));
  150. $this->assertFalse(address_in_subnet('::1', '::ax:0/130'));
  151. /// 2: xxx.xxx.xxx.xxx-yyy or xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx::xxxx-yyyy (a range of IP addresses in the last group)
  152. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121.234.12-14'));
  153. $this->assertTrue(address_in_subnet('123.121.234.13', '123.121.234.12-14'));
  154. $this->assertTrue(address_in_subnet('123.121.234.14', '123.121.234.12-14'));
  155. $this->assertFalse(address_in_subnet('123.121.234.1', '123.121.234.12-14'));
  156. $this->assertFalse(address_in_subnet('123.121.234.20', '123.121.234.12-14'));
  157. $this->assertFalse(address_in_subnet('123.121.23.12', '123.121.234.12-14'));
  158. $this->assertFalse(address_in_subnet('123.12.234.12', '123.121.234.12-14'));
  159. $this->assertTrue(address_in_subnet('baba:baba::baba', 'baba:baba::baba-babe'));
  160. $this->assertTrue(address_in_subnet('baba:baba::babc', 'baba:baba::baba-babe'));
  161. $this->assertTrue(address_in_subnet('baba:baba::babe', 'baba:baba::baba-babe'));
  162. $this->assertFalse(address_in_subnet('bab:baba::bab0', 'bab:baba::baba-babe'));
  163. $this->assertFalse(address_in_subnet('bab:baba::babf', 'bab:baba::baba-babe'));
  164. $this->assertFalse(address_in_subnet('bab:baba::bfbe', 'bab:baba::baba-babe'));
  165. $this->assertFalse(address_in_subnet('bfb:baba::babe', 'bab:baba::baba-babe'));
  166. // fixed input
  167. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121.234.12 - 14 '));
  168. $this->assertTrue(address_in_subnet('bab:baba::babe', 'bab:baba::baba - babe '));
  169. // incorrect input
  170. $this->assertFalse(address_in_subnet('123.121.234.12', '123.121.234.12-234.14'));
  171. $this->assertFalse(address_in_subnet('123.121.234.12', '123.121.234.12-256'));
  172. $this->assertFalse(address_in_subnet('123.121.234.12', '123.121.234.12--256'));
  173. /// 3: xxx.xxx or xxx.xxx. or xxx:xxx:xxxx or xxx:xxx:xxxx. (incomplete address, a bit non-technical ;-)
  174. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121.234.12'));
  175. $this->assertFalse(address_in_subnet('123.121.23.12', '123.121.23.13'));
  176. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121.234.'));
  177. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121.234'));
  178. $this->assertTrue(address_in_subnet('123.121.234.12', '123.121'));
  179. $this->assertTrue(address_in_subnet('123.121.234.12', '123'));
  180. $this->assertFalse(address_in_subnet('123.121.234.1', '12.121.234.'));
  181. $this->assertFalse(address_in_subnet('123.121.234.1', '12.121.234'));
  182. $this->assertTrue(address_in_subnet('baba:baba::bab', 'baba:baba::bab'));
  183. $this->assertFalse(address_in_subnet('baba:baba::ba', 'baba:baba::bc'));
  184. $this->assertTrue(address_in_subnet('baba:baba::bab', 'baba:baba'));
  185. $this->assertTrue(address_in_subnet('baba:baba::bab', 'baba:'));
  186. $this->assertFalse(address_in_subnet('bab:baba::bab', 'baba:'));
  187. /// multiple subnets
  188. $this->assertTrue(address_in_subnet('123.121.234.12', '::1/64, 124., 123.121.234.10-30'));
  189. $this->assertTrue(address_in_subnet('124.121.234.12', '::1/64, 124., 123.121.234.10-30'));
  190. $this->assertTrue(address_in_subnet('::2', '::1/64, 124., 123.121.234.10-30'));
  191. $this->assertFalse(address_in_subnet('12.121.234.12', '::1/64, 124., 123.121.234.10-30'));
  192. /// other incorrect input
  193. $this->assertFalse(address_in_subnet('123.123.123.123', ''));
  194. }
  195. /**
  196. * Modifies $_SERVER['HTTP_USER_AGENT'] manually to check if check_browser_version
  197. * works as expected.
  198. */
  199. function test_check_browser_version()
  200. {
  201. global $CFG;
  202. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Safari']['412']['Mac OS X'];
  203. $this->assertTrue(check_browser_version('Safari'));
  204. $this->assertTrue(check_browser_version('WebKit'));
  205. $this->assertTrue(check_browser_version('Safari', '312'));
  206. $this->assertFalse(check_browser_version('Safari', '500'));
  207. $this->assertFalse(check_browser_version('Chrome'));
  208. $this->assertFalse(check_browser_version('Safari iOS'));
  209. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Safari iOS']['528']['iPhone'];
  210. $this->assertTrue(check_browser_version('Safari iOS'));
  211. $this->assertTrue(check_browser_version('WebKit'));
  212. $this->assertTrue(check_browser_version('Safari iOS', '527'));
  213. $this->assertFalse(check_browser_version('Safari iOS', 590));
  214. $this->assertFalse(check_browser_version('Safari', '312'));
  215. $this->assertFalse(check_browser_version('Safari', '500'));
  216. $this->assertFalse(check_browser_version('Chrome'));
  217. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['WebKit Android']['530']['Nexus'];
  218. $this->assertTrue(check_browser_version('WebKit'));
  219. $this->assertTrue(check_browser_version('WebKit Android', '527'));
  220. $this->assertFalse(check_browser_version('WebKit Android', 590));
  221. $this->assertFalse(check_browser_version('Safari'));
  222. $this->assertFalse(check_browser_version('Chrome'));
  223. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Chrome']['8']['Mac OS X'];
  224. $this->assertTrue(check_browser_version('Chrome'));
  225. $this->assertTrue(check_browser_version('WebKit'));
  226. $this->assertTrue(check_browser_version('Chrome', 8));
  227. $this->assertFalse(check_browser_version('Chrome', 10));
  228. $this->assertFalse(check_browser_version('Safari', '1'));
  229. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Opera']['9.0']['Windows XP'];
  230. $this->assertTrue(check_browser_version('Opera'));
  231. $this->assertTrue(check_browser_version('Opera', '8.0'));
  232. $this->assertFalse(check_browser_version('Opera', '10.0'));
  233. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['6.0']['Windows XP SP2'];
  234. $this->assertTrue(check_browser_version('MSIE'));
  235. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  236. $this->assertFalse(check_browser_version('MSIE', '7.0'));
  237. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['5.0']['Windows 98'];
  238. $this->assertFalse(check_browser_version('MSIE'));
  239. $this->assertTrue(check_browser_version('MSIE', 0));
  240. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  241. $this->assertFalse(check_browser_version('MSIE', '7.0'));
  242. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['9.0']['Windows 7'];
  243. $this->assertTrue(check_browser_version('MSIE'));
  244. $this->assertTrue(check_browser_version('MSIE', 0));
  245. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  246. $this->assertTrue(check_browser_version('MSIE', '9.0'));
  247. $this->assertFalse(check_browser_version('MSIE', '10'));
  248. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['9.0i']['Windows 7'];
  249. $this->assertTrue(check_browser_version('MSIE'));
  250. $this->assertTrue(check_browser_version('MSIE', 0));
  251. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  252. $this->assertTrue(check_browser_version('MSIE', '9.0'));
  253. $this->assertFalse(check_browser_version('MSIE', '10'));
  254. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['10.0']['Windows 8'];
  255. $this->assertTrue(check_browser_version('MSIE'));
  256. $this->assertTrue(check_browser_version('MSIE', 0));
  257. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  258. $this->assertTrue(check_browser_version('MSIE', '9.0'));
  259. $this->assertTrue(check_browser_version('MSIE', '10'));
  260. $this->assertFalse(check_browser_version('MSIE', '11'));
  261. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['10.0i']['Windows 8'];
  262. $this->assertTrue(check_browser_version('MSIE'));
  263. $this->assertTrue(check_browser_version('MSIE', 0));
  264. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  265. $this->assertTrue(check_browser_version('MSIE', '9.0'));
  266. $this->assertTrue(check_browser_version('MSIE', '10'));
  267. $this->assertFalse(check_browser_version('MSIE', '11'));
  268. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['11.0']['Windows 8.1'];
  269. $this->assertTrue(check_browser_version('MSIE'));
  270. $this->assertTrue(check_browser_version('MSIE', 0));
  271. $this->assertTrue(check_browser_version('MSIE', '5.0'));
  272. $this->assertTrue(check_browser_version('MSIE', '9.0'));
  273. $this->assertTrue(check_browser_version('MSIE', '10'));
  274. $this->assertTrue(check_browser_version('MSIE', '11'));
  275. $this->assertFalse(check_browser_version('MSIE', '12'));
  276. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['2.0']['Windows XP'];
  277. $this->assertTrue(check_browser_version('Firefox'));
  278. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  279. $this->assertFalse(check_browser_version('Firefox', '3.0'));
  280. $this->assertTrue(check_browser_version('Gecko', '2'));
  281. $this->assertTrue(check_browser_version('Gecko', 20030516));
  282. $this->assertTrue(check_browser_version('Gecko', 20051106));
  283. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  284. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['1.0.6']['Windows XP'];
  285. $this->assertTrue(check_browser_version('Firefox'));
  286. $this->assertTrue(check_browser_version('Gecko', '1'));
  287. $this->assertFalse(check_browser_version('Gecko', 20030516));
  288. $this->assertFalse(check_browser_version('Gecko', 20051106));
  289. $this->assertFalse(check_browser_version('Gecko', 2006010100));
  290. $this->assertFalse(check_browser_version('Firefox', '1.5'));
  291. $this->assertFalse(check_browser_version('Firefox', '3.0'));
  292. $this->assertFalse(check_browser_version('Gecko', '2'));
  293. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['2.0']['Windows XP'];
  294. $this->assertTrue(check_browser_version('Firefox'));
  295. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  296. $this->assertTrue(check_browser_version('Gecko', '1'));
  297. $this->assertTrue(check_browser_version('Gecko', '2'));
  298. $this->assertTrue(check_browser_version('Gecko', 20030516));
  299. $this->assertTrue(check_browser_version('Gecko', 20051106));
  300. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  301. $this->assertFalse(check_browser_version('Firefox', '3.0'));
  302. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['3.6']['Linux'];
  303. $this->assertTrue(check_browser_version('Firefox'));
  304. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  305. $this->assertTrue(check_browser_version('Firefox', '3.0'));
  306. $this->assertTrue(check_browser_version('Gecko', '2'));
  307. $this->assertTrue(check_browser_version('Gecko', '3.6'));
  308. $this->assertTrue(check_browser_version('Gecko', 20030516));
  309. $this->assertTrue(check_browser_version('Gecko', 20051106));
  310. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  311. $this->assertFalse(check_browser_version('Firefox', '4'));
  312. $this->assertFalse(check_browser_version('Firefox', '10'));
  313. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['3.6']['Linux'];
  314. $this->assertTrue(check_browser_version('Firefox'));
  315. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  316. $this->assertTrue(check_browser_version('Firefox', '3.0'));
  317. $this->assertTrue(check_browser_version('Gecko', '2'));
  318. $this->assertTrue(check_browser_version('Gecko', '3.6'));
  319. $this->assertTrue(check_browser_version('Gecko', 20030516));
  320. $this->assertTrue(check_browser_version('Gecko', 20051106));
  321. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  322. $this->assertFalse(check_browser_version('Firefox', '4'));
  323. $this->assertFalse(check_browser_version('Firefox', '10'));
  324. $this->assertFalse(check_browser_version('Firefox', '18'));
  325. $this->assertFalse(check_browser_version('Gecko', '4'));
  326. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['15.0a2']['Windows'];
  327. $this->assertTrue(check_browser_version('Firefox'));
  328. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  329. $this->assertTrue(check_browser_version('Firefox', '3.0'));
  330. $this->assertTrue(check_browser_version('Gecko', '2'));
  331. $this->assertTrue(check_browser_version('Gecko', '3.6'));
  332. $this->assertTrue(check_browser_version('Gecko', '15.0'));
  333. $this->assertTrue(check_browser_version('Gecko', 20030516));
  334. $this->assertTrue(check_browser_version('Gecko', 20051106));
  335. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  336. $this->assertTrue(check_browser_version('Firefox', '4'));
  337. $this->assertTrue(check_browser_version('Firefox', '10'));
  338. $this->assertTrue(check_browser_version('Firefox', '15'));
  339. $this->assertFalse(check_browser_version('Firefox', '18'));
  340. $this->assertFalse(check_browser_version('Gecko', '18'));
  341. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['18.0']['Mac OS X'];
  342. $this->assertTrue(check_browser_version('Firefox'));
  343. $this->assertTrue(check_browser_version('Firefox', '1.5'));
  344. $this->assertTrue(check_browser_version('Firefox', '3.0'));
  345. $this->assertTrue(check_browser_version('Gecko', '2'));
  346. $this->assertTrue(check_browser_version('Gecko', '3.6'));
  347. $this->assertTrue(check_browser_version('Gecko', '15.0'));
  348. $this->assertTrue(check_browser_version('Gecko', '18.0'));
  349. $this->assertTrue(check_browser_version('Gecko', 20030516));
  350. $this->assertTrue(check_browser_version('Gecko', 20051106));
  351. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  352. $this->assertTrue(check_browser_version('Firefox', '4'));
  353. $this->assertTrue(check_browser_version('Firefox', '10'));
  354. $this->assertTrue(check_browser_version('Firefox', '15'));
  355. $this->assertTrue(check_browser_version('Firefox', '18'));
  356. $this->assertFalse(check_browser_version('Firefox', '19'));
  357. $this->assertFalse(check_browser_version('Gecko', '19'));
  358. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['SeaMonkey']['2.0']['Windows'];
  359. $this->assertTrue(check_browser_version('Gecko', '2'));
  360. $this->assertTrue(check_browser_version('Gecko', 20030516));
  361. $this->assertTrue(check_browser_version('Gecko', 20051106));
  362. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  363. $this->assertFalse(check_browser_version('Gecko', '3.6'));
  364. $this->assertFalse(check_browser_version('Gecko', '4.0'));
  365. $this->assertFalse(check_browser_version('Firefox'));
  366. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['SeaMonkey']['2.1']['Linux'];
  367. $this->assertTrue(check_browser_version('Gecko', '2'));
  368. $this->assertTrue(check_browser_version('Gecko', '3.6'));
  369. $this->assertTrue(check_browser_version('Gecko', '4.0'));
  370. $this->assertTrue(check_browser_version('Gecko', 20030516));
  371. $this->assertTrue(check_browser_version('Gecko', 20051106));
  372. $this->assertTrue(check_browser_version('Gecko', 2006010100));
  373. $this->assertTrue(check_browser_version('Firefox'));
  374. $this->assertTrue(check_browser_version('Firefox', 4.0));
  375. $this->assertFalse(check_browser_version('Firefox', 5));
  376. $this->assertFalse(check_browser_version('Gecko', '18.0'));
  377. }
  378. function test_get_browser_version_classes() {
  379. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Safari']['412']['Mac OS X'];
  380. $this->assertEquals(array('safari'), get_browser_version_classes());
  381. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Chrome']['8']['Mac OS X'];
  382. $this->assertEquals(array('safari'), get_browser_version_classes());
  383. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Safari iOS']['528']['iPhone'];
  384. $this->assertEquals(array('safari', 'ios'), get_browser_version_classes());
  385. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['WebKit Android']['530']['Nexus'];
  386. $this->assertEquals(array('safari', 'android'), get_browser_version_classes());
  387. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Chrome']['8']['Mac OS X'];
  388. $this->assertEquals(array('safari'), get_browser_version_classes());
  389. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Opera']['9.0']['Windows XP'];
  390. $this->assertEquals(array('opera'), get_browser_version_classes());
  391. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['6.0']['Windows XP SP2'];
  392. $this->assertEquals(array('ie', 'ie6'), get_browser_version_classes());
  393. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['7.0']['Windows XP SP2'];
  394. $this->assertEquals(array('ie', 'ie7'), get_browser_version_classes());
  395. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['8.0']['Windows Vista'];
  396. $this->assertEquals(array('ie', 'ie8'), get_browser_version_classes());
  397. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['9.0']['Windows 7'];
  398. $this->assertEquals(array('ie', 'ie9'), get_browser_version_classes());
  399. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['9.0i']['Windows 7'];
  400. $this->assertEquals(array('ie', 'ie9'), get_browser_version_classes());
  401. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['10.0']['Windows 8'];
  402. $this->assertEquals(array('ie', 'ie10'), get_browser_version_classes());
  403. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['MSIE']['10.0i']['Windows 8'];
  404. $this->assertEquals(array('ie', 'ie10'), get_browser_version_classes());
  405. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['2.0']['Windows XP'];
  406. $this->assertEquals(array('gecko', 'gecko18'), get_browser_version_classes());
  407. $_SERVER['HTTP_USER_AGENT'] = $this->user_agents['Firefox']['3.0.6']['SUSE'];
  408. $this->assertEquals(array('gecko', 'gecko19'), get_browser_version_classes());
  409. }
  410. function test_get_device_type() {
  411. // IE8 (common pattern ~1.5% of IE7/8 users have embedded IE6 agent))
  412. $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BT Openworld BB; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Hotbar 10.2.197.0; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727)';
  413. $this->assertEquals('default', get_device_type());
  414. // Genuine IE6
  415. $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/4.0 (compatible; MSIE 6.0; AOL 9.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.0.3705; Media Center PC 2.8)';
  416. $this->assertEquals('legacy', get_device_type());
  417. }
  418. function test_fix_utf8() {
  419. // make sure valid data including other types is not changed
  420. $this->assertSame(null, fix_utf8(null));
  421. $this->assertSame(1, fix_utf8(1));
  422. $this->assertSame(1.1, fix_utf8(1.1));
  423. $this->assertSame(true, fix_utf8(true));
  424. $this->assertSame('', fix_utf8(''));
  425. $this->assertSame('abc', fix_utf8('abc'));
  426. $array = array('do', 're', 'mi');
  427. $this->assertSame($array, fix_utf8($array));
  428. $object = new stdClass();
  429. $object->a = 'aa';
  430. $object->b = 'bb';
  431. $this->assertEquals($object, fix_utf8($object));
  432. // valid utf8 string
  433. $this->assertSame("žlutý koníček přeskočil potůček \n\t\r", fix_utf8("žlutý koníček přeskočil potůček \n\t\r\0"));
  434. // invalid utf8 string
  435. $this->assertSame('aš', fix_utf8('a'.chr(130).'š'), 'This fails with buggy iconv() when mbstring extenstion is not available as fallback.');
  436. }
  437. function test_optional_param() {
  438. global $CFG;
  439. $_POST['username'] = 'post_user';
  440. $_GET['username'] = 'get_user';
  441. $this->assertSame(optional_param('username', 'default_user', PARAM_RAW), $_POST['username']);
  442. unset($_POST['username']);
  443. $this->assertSame(optional_param('username', 'default_user', PARAM_RAW), $_GET['username']);
  444. unset($_GET['username']);
  445. $this->assertSame(optional_param('username', 'default_user', PARAM_RAW), 'default_user');
  446. // make sure exception is triggered when some params are missing, hide error notices here - new in 2.2
  447. $_POST['username'] = 'post_user';
  448. try {
  449. optional_param('username', 'default_user', null);
  450. $this->fail('coding_exception expected');
  451. } catch (coding_exception $ex) {
  452. $this->assertTrue(true);
  453. }
  454. try {
  455. @optional_param('username', 'default_user');
  456. $this->fail('coding_exception expected');
  457. } catch (coding_exception $ex) {
  458. $this->assertTrue(true);
  459. }
  460. try {
  461. @optional_param('username');
  462. $this->fail('coding_exception expected');
  463. } catch (coding_exception $ex) {
  464. $this->assertTrue(true);
  465. }
  466. try {
  467. optional_param('', 'default_user', PARAM_RAW);
  468. $this->fail('coding_exception expected');
  469. } catch (coding_exception $ex) {
  470. $this->assertTrue(true);
  471. }
  472. // make sure warning is displayed if array submitted - TODO: throw exception in Moodle 2.3
  473. $_POST['username'] = array('a'=>'a');
  474. $this->assertSame(optional_param('username', 'default_user', PARAM_RAW), $_POST['username']);
  475. $this->assertDebuggingCalled();
  476. }
  477. function test_optional_param_array() {
  478. global $CFG;
  479. $_POST['username'] = array('a'=>'post_user');
  480. $_GET['username'] = array('a'=>'get_user');
  481. $this->assertSame(optional_param_array('username', array('a'=>'default_user'), PARAM_RAW), $_POST['username']);
  482. unset($_POST['username']);
  483. $this->assertSame(optional_param_array('username', array('a'=>'default_user'), PARAM_RAW), $_GET['username']);
  484. unset($_GET['username']);
  485. $this->assertSame(optional_param_array('username', array('a'=>'default_user'), PARAM_RAW), array('a'=>'default_user'));
  486. // make sure exception is triggered when some params are missing, hide error notices here - new in 2.2
  487. $_POST['username'] = array('a'=>'post_user');
  488. try {
  489. optional_param_array('username', array('a'=>'default_user'), null);
  490. $this->fail('coding_exception expected');
  491. } catch (coding_exception $ex) {
  492. $this->assertTrue(true);
  493. }
  494. try {
  495. @optional_param_array('username', array('a'=>'default_user'));
  496. $this->fail('coding_exception expected');
  497. } catch (coding_exception $ex) {
  498. $this->assertTrue(true);
  499. }
  500. try {
  501. @optional_param_array('username');
  502. $this->fail('coding_exception expected');
  503. } catch (coding_exception $ex) {
  504. $this->assertTrue(true);
  505. }
  506. try {
  507. optional_param_array('', array('a'=>'default_user'), PARAM_RAW);
  508. $this->fail('coding_exception expected');
  509. } catch (coding_exception $ex) {
  510. $this->assertTrue(true);
  511. }
  512. // do not allow nested arrays
  513. try {
  514. $_POST['username'] = array('a'=>array('b'=>'post_user'));
  515. optional_param_array('username', array('a'=>'default_user'), PARAM_RAW);
  516. $this->fail('coding_exception expected');
  517. } catch (coding_exception $ex) {
  518. $this->assertTrue(true);
  519. }
  520. // do not allow non-arrays
  521. $_POST['username'] = 'post_user';
  522. $this->assertSame(optional_param_array('username', array('a'=>'default_user'), PARAM_RAW), array('a'=>'default_user'));
  523. $this->assertDebuggingCalled();
  524. // make sure array keys are sanitised
  525. $_POST['username'] = array('abc123_;-/*-+ '=>'arrggh', 'a1_-'=>'post_user');
  526. $this->assertSame(optional_param_array('username', array(), PARAM_RAW), array('a1_-'=>'post_user'));
  527. $this->assertDebuggingCalled();
  528. }
  529. function test_required_param() {
  530. global $CFG;
  531. $_POST['username'] = 'post_user';
  532. $_GET['username'] = 'get_user';
  533. $this->assertSame(required_param('username', PARAM_RAW), 'post_user');
  534. unset($_POST['username']);
  535. $this->assertSame(required_param('username', PARAM_RAW), 'get_user');
  536. unset($_GET['username']);
  537. try {
  538. $this->assertSame(required_param('username', PARAM_RAW), 'default_user');
  539. $this->fail('moodle_exception expected');
  540. } catch (moodle_exception $ex) {
  541. $this->assertTrue(true);
  542. }
  543. // make sure exception is triggered when some params are missing, hide error notices here - new in 2.2
  544. $_POST['username'] = 'post_user';
  545. try {
  546. @required_param('username');
  547. $this->fail('coding_exception expected');
  548. } catch (coding_exception $ex) {
  549. $this->assertTrue(true);
  550. }
  551. try {
  552. required_param('username', '');
  553. $this->fail('coding_exception expected');
  554. } catch (coding_exception $ex) {
  555. $this->assertTrue(true);
  556. }
  557. try {
  558. required_param('', PARAM_RAW);
  559. $this->fail('coding_exception expected');
  560. } catch (coding_exception $ex) {
  561. $this->assertTrue(true);
  562. }
  563. // make sure warning is displayed if array submitted - TODO: throw exception in Moodle 2.3
  564. $_POST['username'] = array('a'=>'a');
  565. $this->assertSame(required_param('username', PARAM_RAW), $_POST['username']);
  566. $this->assertDebuggingCalled();
  567. }
  568. function test_required_param_array() {
  569. global $CFG;
  570. $_POST['username'] = array('a'=>'post_user');
  571. $_GET['username'] = array('a'=>'get_user');
  572. $this->assertSame(required_param_array('username', PARAM_RAW), $_POST['username']);
  573. unset($_POST['username']);
  574. $this->assertSame(required_param_array('username', PARAM_RAW), $_GET['username']);
  575. // make sure exception is triggered when some params are missing, hide error notices here - new in 2.2
  576. $_POST['username'] = array('a'=>'post_user');
  577. try {
  578. required_param_array('username', null);
  579. $this->fail('coding_exception expected');
  580. } catch (coding_exception $ex) {
  581. $this->assertTrue(true);
  582. }
  583. try {
  584. @required_param_array('username');
  585. $this->fail('coding_exception expected');
  586. } catch (coding_exception $ex) {
  587. $this->assertTrue(true);
  588. }
  589. try {
  590. required_param_array('', PARAM_RAW);
  591. $this->fail('coding_exception expected');
  592. } catch (coding_exception $ex) {
  593. $this->assertTrue(true);
  594. }
  595. // do not allow nested arrays
  596. try {
  597. $_POST['username'] = array('a'=>array('b'=>'post_user'));
  598. required_param_array('username', PARAM_RAW);
  599. $this->fail('coding_exception expected');
  600. } catch (coding_exception $ex) {
  601. $this->assertTrue(true);
  602. }
  603. // do not allow non-arrays
  604. try {
  605. $_POST['username'] = 'post_user';
  606. required_param_array('username', PARAM_RAW);
  607. $this->fail('moodle_exception expected');
  608. } catch (moodle_exception $ex) {
  609. $this->assertTrue(true);
  610. }
  611. // make sure array keys are sanitised
  612. $_POST['username'] = array('abc123_;-/*-+ '=>'arrggh', 'a1_-'=>'post_user');
  613. $this->assertSame(required_param_array('username', PARAM_RAW), array('a1_-'=>'post_user'));
  614. $this->assertDebuggingCalled();
  615. }
  616. function test_clean_param() {
  617. // forbid objects and arrays
  618. try {
  619. clean_param(array('x', 'y'), PARAM_RAW);
  620. $this->fail('coding_exception expected');
  621. } catch (coding_exception $ex) {
  622. $this->assertTrue(true);
  623. }
  624. try {
  625. $param = new stdClass();
  626. $param->id = 1;
  627. clean_param($param, PARAM_RAW);
  628. $this->fail('coding_exception expected');
  629. } catch (coding_exception $ex) {
  630. $this->assertTrue(true);
  631. }
  632. // require correct type
  633. try {
  634. clean_param('x', 'xxxxxx');
  635. $this->fail('moodle_exception expected');
  636. } catch (moodle_exception $ex) {
  637. $this->assertTrue(true);
  638. }
  639. try {
  640. @clean_param('x');
  641. $this->fail('moodle_exception expected');
  642. } catch (moodle_exception $ex) {
  643. $this->assertTrue(true);
  644. }
  645. }
  646. function test_clean_param_array() {
  647. $this->assertSame(clean_param_array(null, PARAM_RAW), array());
  648. $this->assertSame(clean_param_array(array('a', 'b'), PARAM_RAW), array('a', 'b'));
  649. $this->assertSame(clean_param_array(array('a', array('b')), PARAM_RAW, true), array('a', array('b')));
  650. // require correct type
  651. try {
  652. clean_param_array(array('x'), 'xxxxxx');
  653. $this->fail('moodle_exception expected');
  654. } catch (moodle_exception $ex) {
  655. $this->assertTrue(true);
  656. }
  657. try {
  658. @clean_param_array(array('x'));
  659. $this->fail('moodle_exception expected');
  660. } catch (moodle_exception $ex) {
  661. $this->assertTrue(true);
  662. }
  663. try {
  664. clean_param_array(array('x', array('y')), PARAM_RAW);
  665. $this->fail('coding_exception expected');
  666. } catch (coding_exception $ex) {
  667. $this->assertTrue(true);
  668. }
  669. // test recursive
  670. }
  671. function test_clean_param_raw() {
  672. $this->assertEquals(clean_param('#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)', PARAM_RAW),
  673. '#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)');
  674. }
  675. function test_clean_param_trim() {
  676. $this->assertEquals(clean_param(" Frog toad \r\n ", PARAM_RAW_TRIMMED), 'Frog toad');
  677. }
  678. function test_clean_param_clean() {
  679. // PARAM_CLEAN is an ugly hack, do not use in new code (skodak)
  680. // instead use more specific type, or submit sothing that can be verified properly
  681. $this->assertEquals(clean_param('xx<script>', PARAM_CLEAN), 'xx');
  682. }
  683. function test_clean_param_alpha() {
  684. $this->assertEquals(clean_param('#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)', PARAM_ALPHA),
  685. 'DSFMOSDJ');
  686. }
  687. function test_clean_param_alphanum() {
  688. $this->assertEquals(clean_param('#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)', PARAM_ALPHANUM),
  689. '978942897DSFMOSDJ');
  690. }
  691. function test_clean_param_alphaext() {
  692. $this->assertEquals(clean_param('#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)', PARAM_ALPHAEXT),
  693. 'DSFMOSDJ');
  694. }
  695. function test_clean_param_sequence() {
  696. $this->assertEquals(clean_param('#()*#,9789\'".,<42897></?$(*DSFMO#$*)(SDJ)($*)', PARAM_SEQUENCE),
  697. ',9789,42897');
  698. }
  699. function test_clean_param_component() {
  700. // please note the cleaning of component names is very strict, no guessing here
  701. $this->assertSame(clean_param('mod_forum', PARAM_COMPONENT), 'mod_forum');
  702. $this->assertSame(clean_param('block_online_users', PARAM_COMPONENT), 'block_online_users');
  703. $this->assertSame(clean_param('block_blond_online_users', PARAM_COMPONENT), 'block_blond_online_users');
  704. $this->assertSame(clean_param('mod_something2', PARAM_COMPONENT), 'mod_something2');
  705. $this->assertSame(clean_param('forum', PARAM_COMPONENT), 'forum');
  706. $this->assertSame(clean_param('user', PARAM_COMPONENT), 'user');
  707. $this->assertSame(clean_param('rating', PARAM_COMPONENT), 'rating');
  708. $this->assertSame(clean_param('mod_2something', PARAM_COMPONENT), '');
  709. $this->assertSame(clean_param('2mod_something', PARAM_COMPONENT), '');
  710. $this->assertSame(clean_param('mod_something_xx', PARAM_COMPONENT), '');
  711. $this->assertSame(clean_param('auth_something__xx', PARAM_COMPONENT), '');
  712. $this->assertSame(clean_param('mod_Something', PARAM_COMPONENT), '');
  713. $this->assertSame(clean_param('mod_somethíng', PARAM_COMPONENT), '');
  714. $this->assertSame(clean_param('auth_xx-yy', PARAM_COMPONENT), '');
  715. $this->assertSame(clean_param('_auth_xx', PARAM_COMPONENT), '');
  716. $this->assertSame(clean_param('a2uth_xx', PARAM_COMPONENT), '');
  717. $this->assertSame(clean_param('auth_xx_', PARAM_COMPONENT), '');
  718. $this->assertSame(clean_param('auth_xx.old', PARAM_COMPONENT), '');
  719. $this->assertSame(clean_param('_user', PARAM_COMPONENT), '');
  720. $this->assertSame(clean_param('2rating', PARAM_COMPONENT), '');
  721. $this->assertSame(clean_param('user_', PARAM_COMPONENT), '');
  722. }
  723. function test_is_valid_plugin_name() {
  724. $this->assertTrue(is_valid_plugin_name('forum'));
  725. $this->assertTrue(is_valid_plugin_name('forum2'));
  726. $this->assertTrue(is_valid_plugin_name('online_users'));
  727. $this->assertTrue(is_valid_plugin_name('blond_online_users'));
  728. $this->assertFalse(is_valid_plugin_name('online__users'));
  729. $this->assertFalse(is_valid_plugin_name('forum '));
  730. $this->assertFalse(is_valid_plugin_name('forum.old'));
  731. $this->assertFalse(is_valid_plugin_name('xx-yy'));
  732. $this->assertFalse(is_valid_plugin_name('2xx'));
  733. $this->assertFalse(is_valid_plugin_name('Xx'));
  734. $this->assertFalse(is_valid_plugin_name('_xx'));
  735. $this->assertFalse(is_valid_plugin_name('xx_'));
  736. }
  737. function test_clean_param_plugin() {
  738. // please note the cleaning of plugin names is very strict, no guessing here
  739. $this->assertSame(clean_param('forum', PARAM_PLUGIN), 'forum');
  740. $this->assertSame(clean_param('forum2', PARAM_PLUGIN), 'forum2');
  741. $this->assertSame(clean_param('online_users', PARAM_PLUGIN), 'online_users');
  742. $this->assertSame(clean_param('blond_online_users', PARAM_PLUGIN), 'blond_online_users');
  743. $this->assertSame(clean_param('online__users', PARAM_PLUGIN), '');
  744. $this->assertSame(clean_param('forum ', PARAM_PLUGIN), '');
  745. $this->assertSame(clean_param('forum.old', PARAM_PLUGIN), '');
  746. $this->assertSame(clean_param('xx-yy', PARAM_PLUGIN), '');
  747. $this->assertSame(clean_param('2xx', PARAM_PLUGIN), '');
  748. $this->assertSame(clean_param('Xx', PARAM_PLUGIN), '');
  749. $this->assertSame(clean_param('_xx', PARAM_PLUGIN), '');
  750. $this->assertSame(clean_param('xx_', PARAM_PLUGIN), '');
  751. }
  752. function test_clean_param_area() {
  753. // please note the cleaning of area names is very strict, no guessing here
  754. $this->assertSame(clean_param('something', PARAM_AREA), 'something');
  755. $this->assertSame(clean_param('something2', PARAM_AREA), 'something2');
  756. $this->assertSame(clean_param('some_thing', PARAM_AREA), 'some_thing');
  757. $this->assertSame(clean_param('some_thing_xx', PARAM_AREA), 'some_thing_xx');
  758. $this->assertSame(clean_param('_something', PARAM_AREA), '');
  759. $this->assertSame(clean_param('something_', PARAM_AREA), '');
  760. $this->assertSame(clean_param('2something', PARAM_AREA), '');
  761. $this->assertSame(clean_param('Something', PARAM_AREA), '');
  762. $this->assertSame(clean_param('some-thing', PARAM_AREA), '');
  763. $this->assertSame(clean_param('somethííng', PARAM_AREA), '');
  764. $this->assertSame(clean_param('something.x', PARAM_AREA), '');
  765. }
  766. function test_clean_param_text() {
  767. $this->assertEquals(PARAM_TEXT, PARAM_MULTILANG);
  768. //standard
  769. $this->assertEquals(clean_param('xx<lang lang="en">aa</lang><lang lang="yy">pp</lang>', PARAM_TEXT), 'xx<lang lang="en">aa</lang><lang lang="yy">pp</lang>');
  770. $this->assertEquals(clean_param('<span lang="en" class="multilang">aa</span><span lang="xy" class="multilang">bb</span>', PARAM_TEXT), '<span lang="en" class="multilang">aa</span><span lang="xy" class="multilang">bb</span>');
  771. $this->assertEquals(clean_param('xx<lang lang="en">aa'."\n".'</lang><lang lang="yy">pp</lang>', PARAM_TEXT), 'xx<lang lang="en">aa'."\n".'</lang><lang lang="yy">pp</lang>');
  772. //malformed
  773. $this->assertEquals(clean_param('<span lang="en" class="multilang">aa</span>', PARAM_TEXT), '<span lang="en" class="multilang">aa</span>');
  774. $this->assertEquals(clean_param('<span lang="en" class="nothing" class="multilang">aa</span>', PARAM_TEXT), 'aa');
  775. $this->assertEquals(clean_param('<lang lang="en" class="multilang">aa</lang>', PARAM_TEXT), 'aa');
  776. $this->assertEquals(clean_param('<lang lang="en!!">aa</lang>', PARAM_TEXT), 'aa');
  777. $this->assertEquals(clean_param('<span lang="en==" class="multilang">aa</span>', PARAM_TEXT), 'aa');
  778. $this->assertEquals(clean_param('a<em>b</em>c', PARAM_TEXT), 'abc');
  779. $this->assertEquals(clean_param('a><xx >c>', PARAM_TEXT), 'a>c>'); // standard strip_tags() behaviour
  780. $this->assertEquals(clean_param('a<b', PARAM_TEXT), 'a');
  781. $this->assertEquals(clean_param('a>b', PARAM_TEXT), 'a>b');
  782. $this->assertEquals(clean_param('<lang lang="en">a>a</lang>', PARAM_TEXT), '<lang lang="en">a>a</lang>'); // standard strip_tags() behaviour
  783. $this->assertEquals(clean_param('<lang lang="en">a<a</lang>', PARAM_TEXT), 'a');
  784. $this->assertEquals(clean_param('<lang lang="en">a<br>a</lang>', PARAM_TEXT), '<lang lang="en">aa</lang>');
  785. }
  786. function test_clean_param_url() {
  787. // Test PARAM_URL and PARAM_LOCALURL a bit
  788. $this->assertEquals(clean_param('http://google.com/', PARAM_URL), 'http://google.com/');
  789. $this->assertEquals(clean_param('http://some.very.long.and.silly.domain/with/a/path/', PARAM_URL), 'http://some.very.long.and.silly.domain/with/a/path/');
  790. $this->assertEquals(clean_param('http://localhost/', PARAM_URL), 'http://localhost/');
  791. $this->assertEquals(clean_param('http://0.255.1.1/numericip.php', PARAM_URL), 'http://0.255.1.1/numericip.php');
  792. $this->assertEquals(clean_param('/just/a/path', PARAM_URL), '/just/a/path');
  793. $this->assertEquals(clean_param('funny:thing', PARAM_URL), '');
  794. }
  795. function test_clean_param_localurl() {
  796. global $CFG;
  797. $this->assertEquals(clean_param('http://google.com/', PARAM_LOCALURL), '');
  798. $this->assertEquals(clean_param('http://some.very.long.and.silly.domain/with/a/path/', PARAM_LOCALURL), '');
  799. $this->assertEquals(clean_param($CFG->wwwroot, PARAM_LOCALURL), $CFG->wwwroot);
  800. $this->assertEquals(clean_param('/just/a/path', PARAM_LOCALURL), '/just/a/path');
  801. $this->assertEquals(clean_param('funny:thing', PARAM_LOCALURL), '');
  802. $this->assertEquals(clean_param('course/view.php?id=3', PARAM_LOCALURL), 'course/view.php?id=3');
  803. }
  804. function test_clean_param_file() {
  805. $this->assertEquals(clean_param('correctfile.txt', PARAM_FILE), 'correctfile.txt');
  806. $this->assertEquals(clean_param('b\'a<d`\\/fi:l>e.t"x|t', PARAM_FILE),

Large files files are truncated, but you can click here to view the full file