Failed Conditions
Push — master ( 1e7115...0e6238 )
by Mark
25:51
created

XmlScannerTest::testNewInstanceCreationDoesntChangeLibxmlSettings()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 4
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 7
rs 10
1
<?php
2
3
namespace PhpOffice\PhpSpreadsheetTests\Reader\Security;
4
5
use PhpOffice\PhpSpreadsheet\Reader\Security\XmlScanner;
6
use PhpOffice\PhpSpreadsheet\Reader\Xls;
7
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
8
use PHPUnit\Framework\TestCase;
9
10
class XmlScannerTest extends TestCase
11
{
12
    /**
13
     * @dataProvider providerValidXML
14
     *
15
     * @param mixed $filename
16
     * @param mixed $expectedResult
17
     * @param $libxmlDisableEntityLoader
18
     */
19
    public function testValidXML($filename, $expectedResult, $libxmlDisableEntityLoader)
20
    {
21
        $oldDisableEntityLoaderState = libxml_disable_entity_loader($libxmlDisableEntityLoader);
22
23
        $reader = XmlScanner::getInstance(new \PhpOffice\PhpSpreadsheet\Reader\Xml());
24
        $result = $reader->scanFile($filename);
25
        self::assertEquals($expectedResult, $result);
26
27
        libxml_disable_entity_loader($oldDisableEntityLoaderState);
28
    }
29
30
    public function providerValidXML()
31
    {
32
        $tests = [];
33
        foreach (glob(__DIR__ . '/../../../data/Reader/Xml/XEETestValid*.xml') as $file) {
34
            $filename = realpath($file);
35
            $expectedResult = file_get_contents($file);
36
            $tests[basename($file) . '_libxml_entity_loader_disabled'] = [$filename, $expectedResult, true];
37
            $tests[basename($file) . '_libxml_entity_loader_enabled'] = [$filename, $expectedResult, false];
38
        }
39
40
        return $tests;
41
    }
42
43
    /**
44
     * @dataProvider providerInvalidXML
45
     *
46
     * @param mixed $filename
47
     * @param $libxmlDisableEntityLoader
48
     */
49
    public function testInvalidXML($filename, $libxmlDisableEntityLoader)
50
    {
51
        $this->expectException(\PhpOffice\PhpSpreadsheet\Reader\Exception::class);
52
53
        libxml_disable_entity_loader($libxmlDisableEntityLoader);
54
55
        $reader = XmlScanner::getInstance(new \PhpOffice\PhpSpreadsheet\Reader\Xml());
56
        $expectedResult = 'FAILURE: Should throw an Exception rather than return a value';
57
        $result = $reader->scanFile($filename);
58
        self::assertEquals($expectedResult, $result);
59
        self::assertEquals($libxmlDisableEntityLoader, libxml_disable_entity_loader());
60
    }
61
62
    public function providerInvalidXML()
63
    {
64
        $tests = [];
65
        foreach (glob(__DIR__ . '/../../../data/Reader/Xml/XEETestInvalidUTF*.xml') as $file) {
66
            $filename = realpath($file);
67
            $tests[basename($file) . '_libxml_entity_loader_disabled'] = [$filename, true];
68
            $tests[basename($file) . '_libxml_entity_loader_enabled'] = [$filename, false];
69
        }
70
71
        return $tests;
72
    }
73
74
    public function testGetSecurityScannerForXmlBasedReader()
75
    {
76
        $fileReader = new Xlsx();
77
        $scanner = $fileReader->getSecuritySCanner();
78
79
        //    Must return an object...
80
        $this->assertInternalType('object', $scanner);
81
        //    ... of the correct type
82
        $this->assertInstanceOf(XmlScanner::class, $scanner);
83
    }
84
85
    public function testGetSecurityScannerForNonXmlBasedReader()
86
    {
87
        $fileReader = new Xls();
88
        $scanner = $fileReader->getSecuritySCanner();
89
        //    Must return a null...
90
        $this->assertNull($scanner);
91
    }
92
93
    /**
94
     * @dataProvider providerValidXMLForCallback
95
     *
96
     * @param mixed $filename
97
     * @param mixed $expectedResult
98
     */
99
    public function testSecurityScanWithCallback($filename, $expectedResult)
100
    {
101
        $fileReader = new Xlsx();
102
        $scanner = $fileReader->getSecuritySCanner();
103
        $scanner->setAdditionalCallback('strrev');
104
        $xml = $scanner->scanFile($filename);
105
106
        $this->assertEquals(strrev($expectedResult), $xml);
107
    }
108
109
    public function providerValidXMLForCallback()
110
    {
111
        $tests = [];
112
        foreach (glob(__DIR__ . '/../../../data/Reader/Xml/SecurityScannerWithCallback*.xml') as $file) {
113
            $tests[basename($file)] = [realpath($file), file_get_contents($file)];
114
        }
115
116
        return $tests;
117
    }
118
}
119