![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/dev/tests/static/testsuite/Magento/Test/Integrity/Xml/ |
<?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; } }