1 | <?php |
||
31 | class HTML5ModuleTestCritical extends \PHPUnit_Framework_TestCase{ |
||
32 | |||
33 | /** |
||
34 | * @var \chillerlan\bbcode\Parser |
||
35 | */ |
||
36 | protected $parser; |
||
37 | |||
38 | protected function setUp(){ |
||
39 | $options = new ParserOptions; |
||
40 | $options->allow_all = true; |
||
41 | $this->parser = new Parser($options); |
||
42 | } |
||
43 | |||
44 | public function bbcodeDataProvider(){ |
||
45 | return [ |
||
46 | // basics |
||
47 | ['', ''], // empty string test (coverage) |
||
48 | ['no bbcode at all', 'no bbcode at all'], |
||
49 | ['[somebbcode]invalid bbcodes will be eaten :P[/somebbcode]', 'invalid bbcodes will be eaten :P'], |
||
50 | // XSS |
||
51 | ['<script>alert(\'Hello, i am an XSS attempt!\')</script>', '<script>alert(\'Hello, i am an XSS attempt!\')</script>'], |
||
52 | ['<img src="javascript:alert(\'XSS\');" />', '<img src="javascript:alert(\'XSS\');" />'], |
||
53 | ['[img]JaVaScRiPt:alert(\'XSS\');[/img]', ''], |
||
54 | ['[img]""><SCRIPT>alert("XSS")</SCRIPT>"[/img]', ''], |
||
55 | ['[img]javascript:alert('XSS')[/img]', ''], |
||
56 | ['[img]¼script¾alert(¢XSS¢)¼/script¾[/img]', ''], |
||
57 | ['[img]vbscript:msgbox("XSS")[/img]', ''], |
||
58 | ['[img]javascript:alert('XSS')[/img]', ''], |
||
59 | ['[img alt=Privateinvestocat]https://octodex.github.com/images/privateinvestocat.jpg[/img]', '<img src="https://octodex.github.com/images/privateinvestocat.jpg" alt="Privateinvestocat" class="bb-image" />'], |
||
60 | // noparse |
||
61 | ['[noparse][u][b]some unparsed bbcode[/b][/u][/noparse]', '<pre class="bbcode noparse">[u][b]some unparsed bbcode[/b][/u]</pre>'], |
||
62 | ]; |
||
63 | } |
||
64 | |||
65 | /** |
||
66 | * @dataProvider bbcodeDataProvider |
||
67 | */ |
||
68 | public function testParser($bbcode, $expected){ |
||
69 | $this->assertEquals($expected, $this->parser->parse($bbcode)); |
||
70 | } |
||
71 | |||
72 | public function nestingDataProvider(){ |
||
73 | return [ |
||
74 | [0, 'bbcode_nesting.txt'], |
||
75 | [1, 'results/html5_nesting_1.txt'], |
||
76 | [10, 'results/html5_nesting_10.txt'], |
||
77 | [100, 'results/html5_nesting_100.txt'], |
||
78 | ]; |
||
79 | } |
||
80 | |||
81 | /** |
||
82 | * @dataProvider nestingDataProvider |
||
83 | */ |
||
84 | public function testNesting($limit, $resultfile){ |
||
85 | $options = new ParserOptions; |
||
86 | $options->allow_all = true; |
||
87 | $options->nesting_limit = $limit; |
||
88 | $this->parser->setOptions($options); |
||
89 | |||
90 | $bbcode = file_get_contents(dirname(__FILE__).'/../../bbcode_samples/bbcode_nesting.txt'); |
||
91 | $expected = file_get_contents(dirname(__FILE__).'/../../bbcode_samples/'.$resultfile); |
||
92 | |||
93 | $parsed = $this->parser->parse($bbcode); |
||
94 | // replace the random IDs with something more testable |
||
95 | $parsed = preg_replace('/\"([a-f\d]{8})\"/i', '"abcdef12"', $parsed); |
||
96 | |||
97 | $this->assertEquals($expected, $parsed); |
||
98 | } |
||
99 | |||
100 | public function testCodeModule(){ |
||
101 | foreach(array_keys($this->parser->getTagmap(), Code::class) as $lang){ |
||
102 | $bbcode = file_get_contents(dirname(__FILE__).'/../../bbcode_samples/bbcode_code_'.$lang.'.txt'); |
||
103 | $expected = file_get_contents(dirname(__FILE__).'/../../bbcode_samples/results/html5_code_'.$lang.'.txt'); |
||
104 | $parsed = $this->parser->parse($bbcode); |
||
105 | $parsed = preg_replace('/\"([a-f\d]{8})\"/i', '"abcdef12"', $parsed); |
||
106 | |||
107 | $this->assertEquals($expected, $parsed); |
||
108 | } |
||
109 | } |
||
110 | |||
111 | } |
||
112 |