aFilesToRemove as $sTmpFile){ @unlink($sTmpFile); } iTopModulesDependencyValidationService::SetInstance(null); } /** * Module dependency validation: make sure dependencies are correct toward classes/interfaces coming from PHP/Xml datamodel files */ public function testReadModuleFileData() { iTopModulesDependencyValidationService::GetInstance()->FetchAllDependenciesViaModulesFiles(); $this->testModulesBasedOnDMFilesOnly(); } /** * Module dependency validation: make sure dependencies are correct toward classes/interfaces coming from Xml datamodel files */ public function testModulesBasedOnDMFilesOnly() { iTopModulesDependencyValidationService::GetInstance()->FetchAllDependenciesViaDM(); $aErrors=[]; /** @var XmlModule $oXmlModule */ foreach (iTopModulesDependencyValidationService::GetInstance()->aModules as $sModuleName => $oXmlModule) { $aCurrentDeps = iTopModulesDependencyValidationService::GetInstance()::$aModulesDataByModuleName[$sModuleName][2]['dependencies'] ?? []; $aModuleErrors=[]; foreach ($oXmlModule->aDependencyModulesNames as $sDepModuleName => $oXmlModule2){ $sXmlUIDs = implode('|', $oXmlModule->aXMlMetaInfosByModuleNames[$sDepModuleName]); $bResolved=false; foreach ($aCurrentDeps as $sDepString){ $oModuleDependency = new \iTopCoreModuleDependency($sDepString); if (in_array($sDepModuleName, $oModuleDependency->GetPotentialPrerequisiteModuleNames())) { $bResolved=true; break; } foreach ($oModuleDependency->GetPotentialPrerequisiteModuleNames() as $sPotentialDepModuleName){ /** @var XmlModule $oXmlModule2 */ $oXmlModule2 = iTopModulesDependencyValidationService::GetInstance()->aModules[$sPotentialDepModuleName]??null; if (! is_null($oXmlModule2) && $oXmlModule2->Depends($sDepModuleName)){ $bResolved=true; break; } } if ($bResolved) { break; } } if (! $bResolved){ $aModuleErrors []= "$sModuleName depends on $sDepModuleName but missing in module dependencies: " . implode(' & ', $aCurrentDeps) . ". ($sXmlUIDs)"; } } if (count($aModuleErrors)){ $aErrors[$sModuleName]=$aModuleErrors; } } $this->assertEquals(0, count($aErrors), var_export($aErrors, true)); } public function testListDeclaredFullnameClassesFromPhpFile() { $aExpected = [ 'CMDBChangeOp', 'CMDBChangeOpCreate', 'CMDBChangeOpDelete', 'CMDBChangeOpSetAttribute', 'CMDBChangeOpSetAttributeScalar', 'CMDBChangeOpSetAttributeTagSet', 'CMDBChangeOpSetAttributeURL', 'CMDBChangeOpSetAttributeBlob', 'CMDBChangeOpSetAttributeOneWayPassword', 'CMDBChangeOpSetAttributeEncrypted', 'CMDBChangeOpSetAttributeText', 'CMDBChangeOpSetAttributeLongText', 'CMDBChangeOpSetAttributeHTML', 'CMDBChangeOpSetAttributeCaseLog', 'CMDBChangeOpPlugin', 'CMDBChangeOpSetAttributeLinksAddRemove', 'CMDBChangeOpSetAttributeLinksTune', 'CMDBChangeOpSetAttributeCustomFields', 'iCMDBChangeOp', ]; $this->assertEquals($aExpected, iTopModulesDependencyValidationService::GetInstance()->ListDeclaredFullnameClassesFromPhpFile(APPROOT . 'core/cmdbchangeop.class.inc.php')); } public function testListDeclaredFullnameClassesFromAutoloadFile() { $aExpected = [ 'Combodo\iTop\OAuthClient\Controller\AjaxOauthClientController', 'Combodo\iTop\OAuthClient\Controller\OAuthClientController', 'Combodo\iTop\OAuthClient\Service\ApplicationUIExtension', 'Combodo\iTop\OAuthClient\Service\PopupMenuExtension', ]; $this->assertEquals($aExpected, iTopModulesDependencyValidationService::GetInstance()->ListDeclaredFullnameClassesFromPhpFile(APPROOT . 'datamodels/2.x/itop-oauth-client/vendor/autoload.php')); } public function testReadModuleMetaInfo() { $this->markTestSkipped(); $aExpected = [ '/var/www/html/iTop/datamodels/2.x/itop-portal-base/module.itop-portal-base.php', 'itop-portal-base/3.2.1', [ 'label' => 'Portal Development Library', 'category' => 'Portal', 'dependencies' => [ 'itop-attachments/3.2.1' ], 'mandatory' => true, 'visible' => false, 'datamodel' => [ 'portal/vendor/autoload.php' ], 'webservice' => [], 'dictionary' => [], 'data.struct' => [], 'data.sample' => [], 'doc.manual_setup' => '', 'doc.more_information' => '', 'settings' => [], ], ]; $this->assertEquals($aExpected, iTopModulesDependencyValidationService::GetInstance()->GetModuleMetainfo('itop-portal-base')); } public function testGetFirstFoundDepsUID() { $sOutput=<<assertEquals('Combodo\iTop\MyAccount\Hook\iMyAccountTabContentExtension', iTopModulesDependencyValidationService::GetInstance()->GetFirstFoundDepsUID($sOutput)); $sOutput=<<assertEquals('Combodo\iTop\MyAccount\Hook\iMyAccountTabContentExtension', iTopModulesDependencyValidationService::GetInstance()->GetFirstFoundDepsUID($sOutput)); } }