132 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Magento\Test\Integrity\Xml;
 | 
						|
 | 
						|
use Magento\Framework\Component\ComponentRegistrar;
 | 
						|
 | 
						|
class SchemaTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    public function testXmlFiles()
 | 
						|
    {
 | 
						|
        $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
 | 
						|
        $invoker(
 | 
						|
            /**
 | 
						|
             * @param string $filename
 | 
						|
             */
 | 
						|
            function ($filename) {
 | 
						|
                $dom = new \DOMDocument();
 | 
						|
                $xmlFile = file_get_contents($filename);
 | 
						|
                $dom->loadXML($xmlFile);
 | 
						|
                $errors = libxml_get_errors();
 | 
						|
                libxml_clear_errors();
 | 
						|
                $this->assertEmpty($errors, print_r($errors, true));
 | 
						|
 | 
						|
                $schemaLocations = [];
 | 
						|
                preg_match('/xsi:noNamespaceSchemaLocation=\s*"(urn:[^"]+)"/s', $xmlFile, $schemaLocations);
 | 
						|
                $this->assertCount(
 | 
						|
                    2,
 | 
						|
                    $schemaLocations,
 | 
						|
                    'The XML file at ' . $filename . ' does not have a schema properly defined.  It should '
 | 
						|
                    . 'have a xsi:noNamespaceSchemaLocation attribute defined with a URN path.  E.g. '
 | 
						|
                    . 'xsi:noNamespaceSchemaLocation="urn:magento:framework:Relative_Path/something.xsd"'
 | 
						|
                );
 | 
						|
 | 
						|
                try {
 | 
						|
                    $errors = \Magento\Framework\Config\Dom::validateDomDocument($dom, $schemaLocations[1]);
 | 
						|
                } catch (\Exception $exception) {
 | 
						|
                    $errors = [$exception->getMessage()];
 | 
						|
                }
 | 
						|
                $this->assertEmpty(
 | 
						|
                    $errors,
 | 
						|
                    "Error validating $filename against {$schemaLocations[1]}\n" . print_r($errors, true)
 | 
						|
                );
 | 
						|
            },
 | 
						|
            $this->getXmlFiles()
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function getSchemas()
 | 
						|
    {
 | 
						|
        $componentRegistrar = new ComponentRegistrar();
 | 
						|
        $codeSchemas = [];
 | 
						|
        foreach ($componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $modulePath) {
 | 
						|
            $codeSchemas = array_merge($codeSchemas, $this->_getFiles($modulePath, '*.xsd'));
 | 
						|
        }
 | 
						|
        $libSchemas = [];
 | 
						|
        foreach ($componentRegistrar->getPaths(ComponentRegistrar::LIBRARY) as $libraryPath) {
 | 
						|
            $libSchemas = array_merge($libSchemas, $this->_getFiles($libraryPath, '*.xsd'));
 | 
						|
        }
 | 
						|
        return $this->_dataSet(array_merge($codeSchemas, $libSchemas));
 | 
						|
    }
 | 
						|
 | 
						|
    public function getXmlFiles()
 | 
						|
    {
 | 
						|
        $componentRegistrar = new ComponentRegistrar();
 | 
						|
        $codeXml = [];
 | 
						|
        foreach ($componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $modulePath) {
 | 
						|
            $codeXml = array_merge($codeXml, $this->_getFiles($modulePath, '*.xml', '/.\/Test\/./'));
 | 
						|
        }
 | 
						|
        $this->_filterSpecialCases($codeXml);
 | 
						|
        $designXml = [];
 | 
						|
        foreach ($componentRegistrar->getPaths(ComponentRegistrar::THEME) as $themePath) {
 | 
						|
            $designXml = array_merge($designXml, $this->_getFiles($themePath, '*.xml'));
 | 
						|
        }
 | 
						|
        $libXml = [];
 | 
						|
        foreach ($componentRegistrar->getPaths(ComponentRegistrar::LIBRARY) as $libraryPath) {
 | 
						|
            $libXml = array_merge($libXml, $this->_getFiles($libraryPath, '*.xml', '/.\/Test\/./'));
 | 
						|
        }
 | 
						|
        return $this->_dataSet(array_merge($codeXml, $designXml, $libXml));
 | 
						|
    }
 | 
						|
 | 
						|
    protected function _getFiles($dir, $pattern, $skipDirPattern = '')
 | 
						|
    {
 | 
						|
        $files = glob($dir . '/' . $pattern, GLOB_NOSORT);
 | 
						|
 | 
						|
        if (empty($skipDirPattern) || !preg_match($skipDirPattern, $dir)) {
 | 
						|
            foreach (glob($dir . '/*', GLOB_ONLYDIR | GLOB_NOSORT) as $newDir) {
 | 
						|
                $files = array_merge($files, $this->_getFiles($newDir, $pattern, $skipDirPattern));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $files;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Files that are exempt from validation
 | 
						|
     *
 | 
						|
     * @param array &$files
 | 
						|
     */
 | 
						|
    private function _filterSpecialCases(&$files)
 | 
						|
    {
 | 
						|
        $list = [
 | 
						|
            '#etc/countries.xml$#',
 | 
						|
            '#conf/schema.xml$#',
 | 
						|
            '#layout/swagger_index_index.xml$#',
 | 
						|
            '#Doc/etc/doc/vars.xml$#',
 | 
						|
            '#phpunit.xml$#',
 | 
						|
            '#etc/db_schema.xml$#',
 | 
						|
            '#Test/Mftf#',
 | 
						|
        ];
 | 
						|
        foreach ($list as $pattern) {
 | 
						|
            foreach ($files as $key => $value) {
 | 
						|
                if (preg_match($pattern, $value)) {
 | 
						|
                    unset($files[$key]);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    protected function _dataSet($files)
 | 
						|
    {
 | 
						|
        $data = [];
 | 
						|
        foreach ($files as $file) {
 | 
						|
            $data[substr($file, strlen(BP))] = [$file];
 | 
						|
        }
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
}
 |