Use MediaWikiCoversValidator for tests that don't use MediaWikiTestCase
[lhc/web/wiklou.git] / tests / phpunit / includes / libs / XmlTypeCheckTest.php
1 <?php
2 /**
3 * PHPUnit tests for XMLTypeCheck.
4 * @author physikerwelt
5 * @group Xml
6 * @covers XMLTypeCheck
7 */
8 class XmlTypeCheckTest extends PHPUnit_Framework_TestCase {
9
10 use MediaWikiCoversValidator;
11
12 const WELL_FORMED_XML = "<root><child /></root>";
13 const MAL_FORMED_XML = "<root><child /></error>";
14 // @codingStandardsIgnoreStart Generic.Files.LineLength
15 const XML_WITH_PIH = '<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/w/index.php"?><svg><child /></svg>';
16 // @codingStandardsIgnoreEnd
17
18 /**
19 * @covers XMLTypeCheck::newFromString
20 * @covers XMLTypeCheck::getRootElement
21 */
22 public function testWellFormedXML() {
23 $testXML = XmlTypeCheck::newFromString( self::WELL_FORMED_XML );
24 $this->assertTrue( $testXML->wellFormed );
25 $this->assertEquals( 'root', $testXML->getRootElement() );
26 }
27
28 /**
29 * @covers XMLTypeCheck::newFromString
30 */
31 public function testMalFormedXML() {
32 $testXML = XmlTypeCheck::newFromString( self::MAL_FORMED_XML );
33 $this->assertFalse( $testXML->wellFormed );
34 }
35
36 /**
37 * Verify we check for recursive entity DOS
38 *
39 * (If the DOS isn't properly handled, the test runner will probably go OOM...)
40 */
41 public function testRecursiveEntity() {
42 $xml = <<<'XML'
43 <?xml version="1.0" encoding="utf-8"?>
44 <!DOCTYPE foo [
45 <!ENTITY test "&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;&a;">
46 <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
47 <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
48 <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
49 <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
50 <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
51 <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
52 <!ENTITY g "-00000000000000000000000000000000000000000000000000000000000000000000000-">
53 ]>
54 <foo>
55 <bar>&test;</bar>
56 </foo>
57 XML;
58 $check = XmlTypeCheck::newFromString( $xml );
59 $this->assertFalse( $check->wellFormed );
60 }
61
62 /**
63 * @covers XMLTypeCheck::processingInstructionHandler
64 */
65 public function testProcessingInstructionHandler() {
66 $called = false;
67 $testXML = new XmlTypeCheck(
68 self::XML_WITH_PIH,
69 null,
70 false,
71 [
72 'processing_instruction_handler' => function () use ( &$called ) {
73 $called = true;
74 }
75 ]
76 );
77 $this->assertTrue( $called );
78 }
79
80 }