diff --git a/tests/php-static-analysis/config/php-includes/set-php-version-from-process.php b/tests/php-static-analysis/config/php-includes/set-php-version-from-process.php index 4a618628a5..921b907cef 100644 --- a/tests/php-static-analysis/config/php-includes/set-php-version-from-process.php +++ b/tests/php-static-analysis/config/php-includes/set-php-version-from-process.php @@ -1,10 +1,11 @@ CallItopUrl( - "/pages/exec.php?exec_module=itop-hub-connector&exec_page=ajax.php", + $sOutput = $this->CallItopUri( + "pages/exec.php?exec_module=itop-hub-connector&exec_page=ajax.php", [ 'auth_user' => $sLogin, 'auth_pwd' => self::AUTHENTICATION_PASSWORD, 'operation' => "compile", 'authent' => self::AUTHENTICATION_TOKEN, - ] + ], ); // Then @@ -53,26 +53,4 @@ public function testCompileOperation() clearstatcache(); $this->assertGreaterThan($iLastCompilation, filemtime(APPROOT.'env-production'), 'The env-production directory should have been rebuilt'); } - - protected function CallItopUrl($sUri, ?array $aPostFields = null, bool $bXDebugEnabled = false) - { - $ch = curl_init(); - if ($bXDebugEnabled) { - curl_setopt($ch, CURLOPT_COOKIE, 'XDEBUG_SESSION=phpstorm'); - } - - $sUrl = \MetaModel::GetConfig()->Get('app_root_url')."/$sUri"; - var_dump($sUrl); - curl_setopt($ch, CURLOPT_URL, $sUrl); - curl_setopt($ch, CURLOPT_POST, 1);// set post data to true - curl_setopt($ch, CURLOPT_POSTFIELDS, $aPostFields); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - $sOutput = curl_exec($ch); - //echo "$sUrl error code:".curl_error($ch); - curl_close($ch); - - return $sOutput; - } } diff --git a/tests/php-unit-tests/legacy-tests/display_cache_content.php b/tests/php-unit-tests/legacy-tests/display_cache_content.php index bbb370f085..76b2f18618 100644 --- a/tests/php-unit-tests/legacy-tests/display_cache_content.php +++ b/tests/php-unit-tests/legacy-tests/display_cache_content.php @@ -1,4 +1,5 @@ $aEntry) - { + foreach ($aCacheUserData['cache_list'] as $i => $aEntry) { $sEntryKey = array_key_exists('info', $aEntry) ? $aEntry['info'] : $aEntry['key']; - if (strpos($sEntryKey, $sPrefix) === 0) - { + if (strpos($sEntryKey, $sPrefix) === 0) { $aEntries[] = $sEntryKey; } } @@ -44,52 +41,39 @@ echo "
";
 
-if (empty($aEntries))
-{
+if (empty($aEntries)) {
 	echo "No Data";
 	return;
 }
 
 $sKey = $aEntries[0];
 $result = apc_fetch($sKey);
-if (!is_object($result))
-{
+if (!is_object($result)) {
 	return;
 }
 $oSQLQuery = $result;
 
 echo "NB Tables before;NB Tables after;";
-foreach($oSQLQuery->m_aContextData as $sField => $oValue)
-{
+foreach ($oSQLQuery->m_aContextData as $sField => $oValue) {
 	echo $sField.';';
 }
 echo "\n";
 
 sort($aEntries);
 
-foreach($aEntries as $sKey)
-{
+foreach ($aEntries as $sKey) {
 	$result = apc_fetch($sKey);
-	if (is_object($result))
-	{
+	if (is_object($result)) {
 		$oSQLQuery = $result;
-		if (isset($oSQLQuery->m_aContextData))
-		{
+		if (isset($oSQLQuery->m_aContextData)) {
 			echo $oSQLQuery->m_iOriginalTableCount.";".$oSQLQuery->CountTables().';';
-			foreach($oSQLQuery->m_aContextData as $oValue)
-			{
-				if (is_array($oValue))
-				{
+			foreach ($oSQLQuery->m_aContextData as $oValue) {
+				if (is_array($oValue)) {
 					$sVal = json_encode($oValue);
-				}
-				else
-				{
-					if (empty($oValue))
-					{
+				} else {
+					if (empty($oValue)) {
 						$sVal = '';
-					}
-					else
-					{
+					} else {
 						$sVal = $oValue;
 					}
 				}
@@ -101,4 +85,3 @@
 }
 
 echo "
"; - diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php index 9d4d0a45a0..c660a6d13f 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php @@ -18,6 +18,7 @@ use CMDBObject; use CMDBSource; use Combodo\iTop\Service\Events\EventService; +use Config; use Contact; use DBObject; use DBObjectSet; @@ -65,6 +66,9 @@ abstract class ItopDataTestCase extends ItopTestCase private $aCreatedObjects = []; private $aEventListeners = []; + protected ?string $sConfigTmpBackupFile = null; + protected ?Config $oiTopConfig = null; + /** * @var bool When testing with silo, there are some cache we need to update on tearDown. Doing it all the time will cost too much, so it's opt-in ! * @see tearDown @@ -119,6 +123,8 @@ protected function setUp(): void { parent::setUp(); + \IssueLog::Error($this->getName()); + $this->PrepareEnvironment(); if (static::USE_TRANSACTION) { @@ -185,6 +191,8 @@ protected function tearDown(): void CMDBObject::SetCurrentChange(null); + $this->RestoreConfiguration(); + parent::tearDown(); } @@ -1434,4 +1442,35 @@ protected static function StopStopwatchInTheFuture(DBObject $oObject, string $sS $oObject->Set($sStopwatchAttCode, $oStopwatch); } + protected function BackupConfiguration(): void + { + $sConfigPath = MetaModel::GetConfig()->GetLoadedFile(); + clearstatcache(); + echo sprintf("rights via ls on %s:\n %s \n", $sConfigPath, exec("ls -al $sConfigPath")); + $sFilePermOutput = substr(sprintf('%o', fileperms('/etc/passwd')), -4); + echo sprintf("rights via fileperms on %s:\n %s \n", $sConfigPath, $sFilePermOutput); + + $this->sConfigTmpBackupFile = tempnam(sys_get_temp_dir(), "config_"); + MetaModel::GetConfig()->WriteToFile($this->sConfigTmpBackupFile); + $this->oiTopConfig = new Config($sConfigPath); + } + + protected function RestoreConfiguration(): void + { + if (is_null($this->sConfigTmpBackupFile) || ! is_file($this->sConfigTmpBackupFile)) { + return; + } + + if (is_null($this->oiTopConfig)) { + return; + } + + //put config back + $sConfigPath = $this->oiTopConfig->GetLoadedFile(); + @chmod($sConfigPath, 0770); + $oConfig = new Config($this->sConfigTmpBackupFile); + $oConfig->WriteToFile($sConfigPath); + @chmod($sConfigPath, 0440); + @unlink($this->sConfigTmpBackupFile); + } } diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php index ab1eaa1b12..fda6aa523c 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php @@ -10,9 +10,9 @@ use CMDBSource; use DeprecatedCallsLog; use MySQLTransactionNotClosedException; -use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use ReflectionMethod; use SetupUtils; +use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Symfony\Component\HttpKernel\KernelInterface; use const DEBUG_BACKTRACE_IGNORE_ARGS; @@ -28,6 +28,7 @@ abstract class ItopTestCase extends KernelTestCase { public const TEST_LOG_DIR = 'test'; + protected array $aFileToClean = []; /** * @var bool @@ -36,7 +37,7 @@ abstract class ItopTestCase extends KernelTestCase public const DISABLE_DEPRECATEDCALLSLOG_ERRORHANDLER = true; public static $DEBUG_UNIT_TEST = false; protected static $aBackupStaticProperties = []; - + public ?array $aLastCurlGetInfo = null; /** * @link https://docs.phpunit.de/en/9.6/annotations.html#preserveglobalstate PHPUnit `preserveGlobalState` annotation documentation * @@ -174,6 +175,15 @@ protected function tearDown(): void } throw new MySQLTransactionNotClosedException('Some DB transactions were opened but not closed ! Fix the code by adding ROLLBACK or COMMIT statements !', []); } + + foreach ($this->aFileToClean as $sPath) { + if (is_file($sPath)) { + @unlink($sPath); + continue; + } + + SetupUtils::tidydir($sPath); + } } /** @@ -631,4 +641,52 @@ protected static function ReadTail($sFilename, $iLines = 1) fclose($handle); return array_reverse($aLines); } + + /** + * @param $sUrl + * @param array|null $aPostFields + * @param array|null $aCurlOptions + * @param $bXDebugEnabled + * @return string + */ + protected function CallItopUrl($sUrl, ?array $aPostFields = [], ?array $aCurlOptions = [], $bXDebugEnabled = false): string + { + $ch = curl_init(); + if ($bXDebugEnabled) { + curl_setopt($ch, CURLOPT_COOKIE, "XDEBUG_SESSION=phpstorm"); + } + + curl_setopt($ch, CURLOPT_URL, $sUrl); + curl_setopt($ch, CURLOPT_POST, 1);// set post data to true + if (!is_array($aPostFields)) { + var_dump($aPostFields); + } + curl_setopt($ch, CURLOPT_POSTFIELDS, $aPostFields); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + // Force disable of certificate check as most of dev / test env have a self-signed certificate + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + + var_dump($aCurlOptions); + curl_setopt_array($ch, $aCurlOptions); + + $sOutput = curl_exec($ch); + //\IssueLog::Info("$sUrl error code:", null, ['error' => curl_error($ch)]); + + $info = curl_getinfo($ch); + $this->aLastCurlGetInfo = $info; + $sErrorMsg = curl_error($ch); + $iErrorCode = curl_errno($ch); + curl_close($ch); + + \IssueLog::Info(__METHOD__, null, ['url' => $sUrl, 'error' => $sErrorMsg, 'error_code' => $iErrorCode, 'post_fields' => $aPostFields, 'info' => $info]); + + return $sOutput; + } + + protected function CallItopUri(string $sUri, ?array $aPostFields = [], ?array $aCurlOptions = [], $bXDebugEnabled = false): string + { + $sUrl = \MetaModel::GetConfig()->Get('app_root_url')."/$sUri"; + return $this->CallItopUrl($sUrl, $aPostFields, $aCurlOptions, $bXDebugEnabled); + } } diff --git a/tests/php-unit-tests/unitary-tests/application/LoginTest.php b/tests/php-unit-tests/unitary-tests/application/LoginTest.php index 1f28ded993..cea8785c7e 100644 --- a/tests/php-unit-tests/unitary-tests/application/LoginTest.php +++ b/tests/php-unit-tests/unitary-tests/application/LoginTest.php @@ -7,7 +7,6 @@ class LoginTest extends ItopDataTestCase { - protected $sConfigTmpBackupFile; protected $sConfigPath; protected $sLoginMode; diff --git a/tests/php-unit-tests/unitary-tests/application/query/QueryTest.php b/tests/php-unit-tests/unitary-tests/application/query/QueryTest.php index 97114d5b4b..b8cc38bcaf 100644 --- a/tests/php-unit-tests/unitary-tests/application/query/QueryTest.php +++ b/tests/php-unit-tests/unitary-tests/application/query/QueryTest.php @@ -172,34 +172,11 @@ private function CallExportService(Query $oQuery) { // compute request url $url = $oQuery->GetExportUrl(); - - // open curl - $curl = curl_init(); - - // curl options - curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($curl, CURLOPT_USERPWD, self::USER.':'.self::PASSWORD); - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - // Force disable of certificate check as most of dev / test env have a self-signed certificate - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); - - // execute curl - $result = curl_exec($curl); - if (curl_errno($curl)) { - $info = curl_getinfo($curl); - var_export($info); - var_dump([ - 'url' => $url, - 'app_root_url:' => MetaModel::GetConfig()->Get('app_root_url'), - 'GetAbsoluteUrlAppRoot:' => \utils::GetAbsoluteUrlAppRoot(), - ]); - } - // close curl - curl_close($curl); - - return $result; + $aCurlOptions = [ + CURLOPT_HTTPAUTH => CURLAUTH_BASIC, + CURLOPT_USERPWD => self::USER.':'.self::PASSWORD, + ]; + return $this->CallItopUrl($url, [], $aCurlOptions); } /** @inheritDoc */ diff --git a/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php b/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php index ecdbc1158a..0cc764c840 100644 --- a/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php +++ b/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php @@ -12,10 +12,8 @@ class CliResetSessionTest extends ItopDataTestCase public const USE_TRANSACTION = false; private $sCookieFile = ""; - private $sUrl; private $sLogin; private $sPassword = "Iuytrez9876543ç_è-("; - protected $sConfigTmpBackupFile; /** * @throws Exception @@ -24,16 +22,13 @@ protected function setUp(): void { parent::setUp(); - $this->sConfigTmpBackupFile = tempnam(sys_get_temp_dir(), "config_"); - MetaModel::GetConfig()->WriteToFile($this->sConfigTmpBackupFile); + $this->BackupConfiguration(); $this->sLogin = "rest-user-".date('dmYHis'); $this->CreateTestOrganization(); $this->sCookieFile = tempnam(sys_get_temp_dir(), 'jsondata_'); - $this->sUrl = \MetaModel::GetConfig()->Get('app_root_url'); - $oRestProfile = \MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", ['name' => 'REST Services User'], true); $oAdminProfile = \MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", ['name' => 'Administrator'], true); @@ -47,16 +42,6 @@ protected function tearDown(): void { parent::tearDown(); - if (! is_null($this->sConfigTmpBackupFile) && is_file($this->sConfigTmpBackupFile)) { - //put config back - $sConfigPath = MetaModel::GetConfig()->GetLoadedFile(); - @chmod($sConfigPath, 0770); - $oConfig = new Config($this->sConfigTmpBackupFile); - $oConfig->WriteToFile($sConfigPath); - @chmod($sConfigPath, 0444); - unlink($this->sConfigTmpBackupFile); - } - if (!empty($this->sCookieFile)) { unlink($this->sCookieFile); } @@ -150,26 +135,18 @@ public function testVariousWebServices($sUri) */ private function SendHTTPRequestWithCookies($sUri, $aPostFields, $sForcedLoginMode = null): string { - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_COOKIEJAR, $this->sCookieFile); - curl_setopt($ch, CURLOPT_COOKIEFILE, $this->sCookieFile); - - $sUrl = "$this->sUrl/$sUri"; if (!is_null($sForcedLoginMode)) { - $sUrl .= "?login_mode=$sForcedLoginMode"; + $sUri .= "?login_mode=$sForcedLoginMode"; } - curl_setopt($ch, CURLOPT_URL, $sUrl); - curl_setopt($ch, CURLOPT_POST, 1);// set post data to true - curl_setopt($ch, CURLOPT_POSTFIELDS, $aPostFields); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_HEADER, 1); - // Force disable of certificate check as most of dev / test env have a self-signed certificate - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - - $sResponse = curl_exec($ch); + + $aCurlOptions = [ + CURLOPT_COOKIEJAR => $this->sCookieFile, + CURLOPT_COOKIEFILE => $this->sCookieFile, + CURLOPT_HEADER => 1, + ]; + + $sResponse = $this->CallItopUri($sUri, $aPostFields, $aCurlOptions); + var_dump($this->aLastCurlGetInfo); /** $sResponse example * "HTTP/1.1 200 OK Date: Wed, 07 Jun 2023 05:00:40 GMT @@ -177,16 +154,15 @@ private function SendHTTPRequestWithCookies($sUri, $aPostFields, $sForcedLoginMo Set-Cookie: itop-2e83d2e9b00e354fdc528621cac532ac=q7ldcjq0rvbn33ccr9q8u8e953; path=/ */ //var_dump($sResponse); - $iHeaderSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); + $iHeaderSize = $this->aLastCurlGetInfo['header_size'] ?? 0; $sBody = substr($sResponse, $iHeaderSize); //$iHttpCode = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); if (preg_match('/HTTP.* (\d*) /', $sResponse, $aMatches)) { $sHttpCode = $aMatches[1]; } else { - $sHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $sHttpCode = $this->aLastCurlGetInfo['http_code'] ?? -1; } - curl_close($ch); $this->assertEquals(200, $sHttpCode, "The test logic assumes that the HTTP request is correctly handled"); return $sBody; diff --git a/tests/php-unit-tests/unitary-tests/webservices/RestTest.php b/tests/php-unit-tests/unitary-tests/webservices/RestTest.php index e13035b367..57d323c926 100644 --- a/tests/php-unit-tests/unitary-tests/webservices/RestTest.php +++ b/tests/php-unit-tests/unitary-tests/webservices/RestTest.php @@ -17,7 +17,6 @@ class RestTest extends ItopDataTestCase public const USE_TRANSACTION = false; public const CREATE_TEST_ORG = false; - private static $sUrl; private static $sLogin; private static $sPassword = "Iuytrez9876543ç_è-("; @@ -44,7 +43,6 @@ protected function setUp(): void { parent::setUp(); - static::$sUrl = MetaModel::GetConfig()->Get('app_root_url'); static::$sLogin = "rest-user-".date('dmYHis'); $this->CreateTestOrganization(); @@ -297,16 +295,7 @@ private function CallRestApi_HTTP(string $sJsonDataContent = null, string $sCall $aPostFields['callback'] = $sCallbackName; } - curl_setopt($ch, CURLOPT_URL, static::$sUrl."/webservices/rest.php"); - curl_setopt($ch, CURLOPT_POST, 1);// set post data to true - curl_setopt($ch, CURLOPT_POSTFIELDS, $aPostFields); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - // Force disable of certificate check as most of dev / test env have a self-signed certificate - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - - $sJson = curl_exec($ch); - curl_close($ch); + $sJson = $this->CallItopUri('webservices/rest.php', $aPostFields); if (!is_null($sTmpFile)) { unlink($sTmpFile);