From 65bb76b9e376b68c9467b03a97092e69b23f2118 Mon Sep 17 00:00:00 2001 From: Romain Quetiez Date: Fri, 4 Aug 2023 14:06:44 +0200 Subject: [PATCH] =?UTF-8?q?N=C2=B06658=20-=20Boost=20PHPUnit=20tests=20exe?= =?UTF-8?q?cution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/DbConnectionWrapper.php | 11 +- core/dict.class.inc.php | 5 +- core/log.class.inc.php | 2 +- core/metamodel.class.php | 20 ++++ core/userrights.class.inc.php | 31 ++++- tests/php-unit-tests/README.md | 113 +++++++++++++++++- tests/php-unit-tests/experiments/README.md | 1 + .../runClassInSeparateProcessTest.php | 64 ++++++++++ .../experiments/tearDownAfterFailureTest.php | 45 +++++++ .../DetectStaticPollutionTest.php | 68 +++++++++++ .../DictionariesConsistencyTest.php | 8 +- .../iTopModulesXmlVersionChecklistTest.php | 8 +- tests/php-unit-tests/phpunit.xml.dist | 1 + .../src/BaseTestCase/ItopDataTestCase.php | 46 +++++-- .../src/BaseTestCase/ItopTestCase.php | 92 +++++++++++--- .../tools/run_class_by_class.php | 64 ++++++++++ .../application/Session/SessionTest.php | 2 - .../application/ThemeHandlerTest.php | 3 - .../application/privUITransactionFileTest.php | 6 +- .../unitary-tests/application/utilsTest.php | 78 ++++++------ .../unitary-tests/core/ActionEmailTest.php | 3 - .../core/AttributeDefinitionTest.php | 5 - .../unitary-tests/core/BulkChangeTest.inc.php | 4 +- .../unitary-tests/core/CMDBObjectTest.php | 6 +- .../core/CMDBSource/CMDBSourceTest.php | 7 +- .../core/CMDBSource/TransactionsTest.php | 15 ++- .../unitary-tests/core/DBObjectTest.php | 4 - .../unitary-tests/core/DBSearchCommitTest.php | 4 - .../core/DBSearchIntersectTest.php | 16 +-- .../unitary-tests/core/DBSearchJoinTest.php | 4 - .../unitary-tests/core/DBSearchTest.php | 4 - .../core/DBSearchUpdateRealiasingMapTest.php | 4 - .../unitary-tests/core/DBUnionSearchTest.php | 5 - .../core/ExpressionEvaluateTest.php | 5 - .../unitary-tests/core/ExpressionTest.php | 5 - .../core/GetSelectFilterTest.php | 4 - .../unitary-tests/core/InlineImageTest.php | 6 - .../core/Log/DeprecatedCallsLogTest.php | 2 + .../core/Log/ExceptionLogTest.php | 7 +- .../unitary-tests/core/Log/LogAPITest.php | 8 -- .../unitary-tests/core/MetaModelTest.php | 8 +- .../unitary-tests/core/OQLParserTest.php | 5 - .../unitary-tests/core/OQLTest.php | 5 - .../core/TagSetFieldDataTest.php | 4 - .../unitary-tests/core/TriggerTest.php | 10 +- .../unitary-tests/core/UserRightsTest.php | 97 +++++++-------- .../core/ValueSetObjectsTest.php | 5 - .../unitary-tests/core/XMLDataLoaderTest.php | 6 +- .../unitary-tests/core/apcEmulationTest.php | 2 - .../unitary-tests/core/dictApcuTest.php | 2 - .../unitary-tests/core/dictTest.php | 5 +- .../unitary-tests/core/ormCaseLogTest.php | 4 - .../unitary-tests/core/ormLinkSetTest.php | 4 - .../unitary-tests/core/ormPasswordTest.php | 6 +- .../unitary-tests/core/ormStyleTest.php | 4 - .../unitary-tests/core/ormTagSetTest.php | 4 - .../2.x/authent-local/UserLocalTest.php | 7 +- .../ConfigPlaceholdersResolverTest.php | 5 - .../datamodels/2.x/itop-config/ConfigTest.php | 5 - .../2.x/itop-tickets/itopTicketTest.php | 4 - .../unitary-tests/setup/DBBackupTest.php | 7 +- .../unitary-tests/setup/MFCompilerTest.php | 10 +- .../Helper/WebResourcesHelperTest.php | 3 - .../application/RuntimeDashboardTest.php | 4 - .../sources/application/TestAutoload.php | 5 - .../application/TwigBase/Twig/TwigTest.php | 6 +- .../search/CriterionConversionTest.php | 49 +------- .../search/CriterionParserTest.php | 3 - .../application/search/SearchFormTest.php | 6 +- .../application/status/StatusIncTest.php | 10 +- .../sources/application/status/StatusTest.php | 14 ++- .../unitary-tests/synchro/DataSynchroTest.php | 4 - .../webservices/CliResetSessionTest.php | 2 - .../unitary-tests/webservices/RestTest.php | 5 +- 74 files changed, 690 insertions(+), 416 deletions(-) create mode 100644 tests/php-unit-tests/experiments/README.md create mode 100644 tests/php-unit-tests/experiments/runClassInSeparateProcessTest.php create mode 100644 tests/php-unit-tests/experiments/tearDownAfterFailureTest.php create mode 100644 tests/php-unit-tests/integration-tests/DetectStaticPollutionTest.php create mode 100644 tests/php-unit-tests/tools/run_class_by_class.php diff --git a/core/DbConnectionWrapper.php b/core/DbConnectionWrapper.php index e7ed5838d..9a7cd304b 100644 --- a/core/DbConnectionWrapper.php +++ b/core/DbConnectionWrapper.php @@ -59,9 +59,16 @@ class DbConnectionWrapper * Use this to register a mock that will handle {@see mysqli::query()} * * @param \mysqli|null $oMysqli + * @since 3.0.4 3.1.1 3.2.0 Param $oMysqli becomes nullable */ - public static function SetDbConnectionMockForQuery(?mysqli $oMysqli): void + public static function SetDbConnectionMockForQuery(?mysqli $oMysqli = null): void { - static::$oDbCnxMockableForQuery = $oMysqli; + if (is_null($oMysqli)) { + // Reset to standard connection + static::$oDbCnxMockableForQuery = static::$oDbCnxStandard; + } + else { + static::$oDbCnxMockableForQuery = $oMysqli; + } } } \ No newline at end of file diff --git a/core/dict.class.inc.php b/core/dict.class.inc.php index d5fe6a185..6e9f9d386 100644 --- a/core/dict.class.inc.php +++ b/core/dict.class.inc.php @@ -56,10 +56,11 @@ class Dict * @param $sLanguageCode * * @throws \DictExceptionUnknownLanguage + * @since 3.0.4 3.1.1 3.2.0 Param $sLanguageCode becomes nullable */ - public static function SetUserLanguage($sLanguageCode) + public static function SetUserLanguage($sLanguageCode = null) { - if (!array_key_exists($sLanguageCode, self::$m_aLanguages)) + if (!is_null($sLanguageCode) && !array_key_exists($sLanguageCode, self::$m_aLanguages)) { throw new DictExceptionUnknownLanguage($sLanguageCode); } diff --git a/core/log.class.inc.php b/core/log.class.inc.php index 0b4504e24..0a584dd3c 100644 --- a/core/log.class.inc.php +++ b/core/log.class.inc.php @@ -1080,7 +1080,7 @@ class DeprecatedCallsLog extends LogAPI parent::Enable($sTargetFile); if ( - (false === defined(ITOP_PHPUNIT_RUNNING_CONSTANT_NAME)) + (false === defined('ITOP_PHPUNIT_RUNNING_CONSTANT_NAME')) && static::IsLogLevelEnabledSafe(self::LEVEL_WARNING, self::ENUM_CHANNEL_PHP_LIBMETHOD) ) { set_error_handler([static::class, 'DeprecatedNoticesErrorHandler'], E_DEPRECATED | E_USER_DEPRECATED); diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 46934f4e1..8b1e6ab39 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -6486,6 +6486,13 @@ abstract class MetaModel */ public static function Startup($config, $bModelOnly = false, $bAllowCache = true, $bTraceSourceFiles = false, $sEnvironment = 'production') { + // Startup on a new environment is not supported + static $bStarted = false; + if ($bStarted) { + return; + } + $bStarted = true; + self::$m_sEnvironment = $sEnvironment; if (!defined('MODULESROOT')) @@ -6722,6 +6729,19 @@ abstract class MetaModel return $value; } + /** + * @internal Used for resetting the configuration during automated tests + + * @param \Config $oConfiguration + * + * @return void + * @since 3.0.4 3.1.1 3.2.0 + */ + public static function SetConfig(Config $oConfiguration) + { + self::$m_oConfig = $oConfiguration; + } + /** * @return Config */ diff --git a/core/userrights.class.inc.php b/core/userrights.class.inc.php index 9b9a3cc0c..e224f3c50 100644 --- a/core/userrights.class.inc.php +++ b/core/userrights.class.inc.php @@ -750,14 +750,25 @@ class UserRights protected static $m_aCacheContactPictureAbsUrl = []; /** @var UserRightsAddOnAPI $m_oAddOn */ protected static $m_oAddOn; - protected static $m_oUser; - protected static $m_oRealUser; + protected static $m_oUser = null; + protected static $m_oRealUser = null; protected static $m_sSelfRegisterAddOn = null; protected static $m_aAdmins = array(); protected static $m_aPortalUsers = array(); /** @var array array('sName' => $sName, 'bSuccess' => $bSuccess); */ private static $m_sLastLoginStatus = null; + /** + * @return void + * @since 3.0.4 3.1.1 3.2.0 + */ + protected static function ResetCurrentUserData() + { + self::$m_oUser = null; + self::$m_oRealUser = null; + self::$m_sLastLoginStatus = null; + } + /** * @param string $sModuleName * @@ -776,8 +787,7 @@ class UserRights } self::$m_oAddOn = new $sModuleName; self::$m_oAddOn->Init(); - self::$m_oUser = null; - self::$m_oRealUser = null; + self::ResetCurrentUserData(); } /** @@ -844,6 +854,8 @@ class UserRights */ public static function Login($sLogin, $sAuthentication = 'any') { + static::Logoff(); + $oUser = self::FindUser($sLogin, $sAuthentication); if (is_null($oUser)) { @@ -861,6 +873,17 @@ class UserRights return true; } + /** + * @return void + * @since 3.0.4 3.1.1 3.2.0 + */ + public static function Logoff() + { + self::ResetCurrentUserData(); + Dict::SetUserLanguage(null); + self::_ResetSessionCache(); + } + /** * @param string $sLogin Login of the user to check the credentials for * @param string $sPassword diff --git a/tests/php-unit-tests/README.md b/tests/php-unit-tests/README.md index e4058802c..26c32491a 100644 --- a/tests/php-unit-tests/README.md +++ b/tests/php-unit-tests/README.md @@ -1,7 +1,118 @@ # PHP unitary tests + ## Where should I add my test? - Covers an iTop PHP class or method? - Most likely in "unitary-tests". - Covers the consistency of some data through the app? - - Most likely in "integration-tests". \ No newline at end of file + - Most likely in "integration-tests". + +## How do I make sure that my tests are efficient? + + +### Derive from the relevant test class + +Whenever possible keep it the most simple, hence you should first +attempt to derive from `TestCase`. + +Then, you might need to derive from `ItopTestCase`. + +Finally, as a last resort, you will use `ItopDataTestCase`. + +### Determine the most relevant isolation configuration + +Should you have opted for `ItopDataTestCase`, then you will have to follow these steps: + +1) Build you test class until it is successfull, without process isolation. +2) Run the whole test suite [unitary-tests](unitary-tests) +3) If a false-positive appears, then you will start troubleshooting. One advise: be positive! + +### Leave the place clean + +To check your code against polluting coding patterns, run the test [integration-tests/DetectStaticPollutionTest.php](integration-tests/DetectStaticPollutionTest.php) +It will tell you if something is wrong, either in your code, or anywhere else in the tests. +Fortunately, it will give you an alternative. + +Detected patterns: +* ContextTag::addTag() +* EventService::RegisterListener() +* Dict::Add() + + +By the way, some patterns do not pollute, because they are handled by the test framework: +* Configuration : automatically reset after test class execution +* UserRights : a logoff is performed after each test execution +* Dict::SetUserLanguage: the user language is reset after each test execution + +See also `@beforeClass` and `@afterClass` to handle cleanup. + +If you can't, then ok you will have to isolate it! + +## Tips +### Memory limit + +As the tests are run in the same process, memory usage +may become an issue as soon as tests are all executed at once. + +Fix that in the XML configuration in the PHP section +```xml + +``` + +### Understand tests interactions + +With PHPStorm, select two tests, right click to get the context menu, then `run`. + +You will have both tests executed and you will be able to figure out if the first one has an impact on the second one. + +### About process isolation +#### Isolation with PHPUnit + +By default, tests are run in a single process launched by PHPUnit. + +If process isolation is configured for some tests, then those tests +will be executed in a separate process. The main process will +continue executing non isolated tests. + +#### Cost of isolation + +The cost of isolating a very basic `TestCase` is approximately 4 ms. + +The cost of isolating an `ItopDataTestCase` is approximately 800 ms. + +### Isolation within iTop + +#### At the test level (preferred) +Add annotation `@runInSeparateProcess` +Each and every test case will run in a separate +process. + +#### At the test class level +Add annotation `@runTestsInSeparateProcesses` +Each and every test case in the class will run in a separate +process. + +#### Globally (never do that) +Set it into [phpunit.xml.dist](phpunit.xml.dist) + +### Further enhancements +The annotation [`@runClassInSeparateProcess`](https://docs.phpunit.de/en/10.0/attributes.html?highlight=runclassinseparateprocess#runclassinseparateprocess) is supposed to do the perfect job, but it is buggy [(See Issue 5230)](https://github.com/sebastianbergmann/phpunit/issues/5230) and it has +the exact same effect as `@runTestsInSeparateProcesses`. + +Note : this option is documented only in the [attributes part of the documentation](https://docs.phpunit.de/en/10.0/attributes.html). + +### Traps +#### When it is a matter of stars +```php +/* + * @runTestsInSeparateProcesses +``` +This won't work because the comment MUST start with `/**` (two stars) to be considerer by PHPUnit. + +#### SetupBeforeClass called more often than expected + +`setupBeforeClass` is called once for the class **in a given process**. + +Therefore, if the tests are isolated, then `setupBeforeClass` will be called as often as `setUp`. + +This has been proven with [`runClassInSeparateProcessTest.php`](experiments/runClassInSeparateProcessTest.php) \ No newline at end of file diff --git a/tests/php-unit-tests/experiments/README.md b/tests/php-unit-tests/experiments/README.md new file mode 100644 index 000000000..56a83dc1a --- /dev/null +++ b/tests/php-unit-tests/experiments/README.md @@ -0,0 +1 @@ +This directory aims at providing experimental proof of the mechanics of PHPUnit \ No newline at end of file diff --git a/tests/php-unit-tests/experiments/runClassInSeparateProcessTest.php b/tests/php-unit-tests/experiments/runClassInSeparateProcessTest.php new file mode 100644 index 000000000..66ce826f7 --- /dev/null +++ b/tests/php-unit-tests/experiments/runClassInSeparateProcessTest.php @@ -0,0 +1,64 @@ +getName()."\n", + FILE_APPEND); + } + + function testA() + { + $this->LogPid(); + static::assertTrue(true); + } + + function testB() + { + $this->LogPid(); + static::assertTrue(true); + } + + /** + * @dataProvider CProvider + */ + function testC($i) + { + $this->LogPid(); + static::assertTrue(true); + } + + function CProvider() + { + return [ + [1], + [1], + [1], + [1], + ]; + } +} diff --git a/tests/php-unit-tests/experiments/tearDownAfterFailureTest.php b/tests/php-unit-tests/experiments/tearDownAfterFailureTest.php new file mode 100644 index 000000000..ff820dbbd --- /dev/null +++ b/tests/php-unit-tests/experiments/tearDownAfterFailureTest.php @@ -0,0 +1,45 @@ +expectException('Exception'); + throw new \Exception('hello'); + } + + function testIsStillInitialized() + { + static::assertTrue(static::$bIsCorrectlyInitialized); + } + + function testFailingDueToUnexpectedException() + { + static::$bIsCorrectlyInitialized = false; + This_Is_Not_A_Function_And_Causes_A_Fatal_Error(); + } + + function testIsStillInitializedAnyway() + { + static::assertTrue(static::$bIsCorrectlyInitialized); + } + +} diff --git a/tests/php-unit-tests/integration-tests/DetectStaticPollutionTest.php b/tests/php-unit-tests/integration-tests/DetectStaticPollutionTest.php new file mode 100644 index 000000000..6422ded62 --- /dev/null +++ b/tests/php-unit-tests/integration-tests/DetectStaticPollutionTest.php @@ -0,0 +1,68 @@ + $sLine) { + if (preg_match_all($sRegexp, $sLine, $aMatches, PREG_PATTERN_ORDER)) { + $sLine = $iLine + 1; + $aRes[] = "$sFile:$sLine"; + } + } + return $aRes; + } + + /** + * @dataProvider PollutingPatterns + * @param $sPattern + * + * @return void + */ + function testDetectPolluters($sPattern, $sFix) + { + $sScannedDir = dirname(__FILE__).'/../unitary-tests'; + + $aPolluters = []; + $oDirectory = new RecursiveDirectoryIterator($sScannedDir); + $Iterator = new RecursiveIteratorIterator($oDirectory); + foreach (new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH) as $aMatch) { + $sFile = $aMatch[0]; + if(is_file($sFile)) { + $sFileContents = file_get_contents($sFile); + if (preg_match_all($sPattern, $sFileContents, $keys, PREG_PATTERN_ORDER)) { + $aPolluters = array_merge($aPolluters, $this->FindMatches($sFile, $sFileContents, $sPattern)); + } + } + } + $iPolluters = count($aPolluters); + static::assertTrue($iPolluters === 0, "Found polluter(s) for pattern $sPattern, $sFix:\n".implode("\n", $aPolluters)); + + } + + public function PollutingPatterns() + { + return [ + 'ContextTags' => ['/ContextTag::AddContext/i', 'Use new ContextTag() instead'], + 'Dict::Add' => ['/Dict::Add/i', 'TODO: implement a facade into ItopDataTestCase'], + 'EventService::RegisterListener' => ['/EventService::RegisterListener/i', 'Use ItopDataTestCase::EventService_RegisterListener instead'], + ]; + } + +} diff --git a/tests/php-unit-tests/integration-tests/DictionariesConsistencyTest.php b/tests/php-unit-tests/integration-tests/DictionariesConsistencyTest.php index 88262da93..1eaf4b6fd 100644 --- a/tests/php-unit-tests/integration-tests/DictionariesConsistencyTest.php +++ b/tests/php-unit-tests/integration-tests/DictionariesConsistencyTest.php @@ -98,10 +98,12 @@ class DictionariesConsistencyTest extends ItopTestCase { $this->setUp(); + $sAppRoot = $this->GetAppRoot(); + $aDictFiles = array_merge( - glob(APPROOT.'datamodels/2.x/*/*.dict*.php'), // legacy form in modules - glob(APPROOT.'datamodels/2.x/*/dictionaries/*.dict*.php'), // modern form in modules - glob(APPROOT.'dictionaries/*.dict*.php') // framework + glob($sAppRoot.'datamodels/2.x/*/*.dict*.php'), // legacy form in modules + glob($sAppRoot.'datamodels/2.x/*/dictionaries/*.dict*.php'), // modern form in modules + glob($sAppRoot.'dictionaries/*.dict*.php') // framework ); $aTestCases = array(); foreach ($aDictFiles as $sDictFile) { diff --git a/tests/php-unit-tests/integration-tests/iTopModulesXmlVersionChecklistTest.php b/tests/php-unit-tests/integration-tests/iTopModulesXmlVersionChecklistTest.php index 7e02d5420..b439afe43 100644 --- a/tests/php-unit-tests/integration-tests/iTopModulesXmlVersionChecklistTest.php +++ b/tests/php-unit-tests/integration-tests/iTopModulesXmlVersionChecklistTest.php @@ -72,11 +72,13 @@ class iTopModulesXmlVersionIntegrationTest extends ItopTestCase { static::setUp(); - $sPath = APPROOT.'datamodels/2.x/*/datamodel.*.xml'; + $sAppRoot = $this->GetAppRoot(); + + $sPath = $sAppRoot.'datamodels/2.x/*/datamodel.*.xml'; $aXmlFiles = glob($sPath); - $aXmlFiles[] = APPROOT.'core/datamodel.core.xml'; - $aXmlFiles[] = APPROOT.'application/datamodel.application.xml'; + $aXmlFiles[] = $sAppRoot.'core/datamodel.core.xml'; + $aXmlFiles[] = $sAppRoot.'application/datamodel.application.xml'; $aTestCases = array(); foreach ($aXmlFiles as $sXmlFile) { diff --git a/tests/php-unit-tests/phpunit.xml.dist b/tests/php-unit-tests/phpunit.xml.dist index afc31265d..a3f238945 100644 --- a/tests/php-unit-tests/phpunit.xml.dist +++ b/tests/php-unit-tests/phpunit.xml.dist @@ -20,6 +20,7 @@ > + diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php index 11fed6899..c71b9c127 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopDataTestCase.php @@ -51,12 +51,6 @@ define('TAG_ATTCODE', 'domains'); * * Helper class to extend for tests needing access to iTop's metamodel * - * **⚠ Warning** Each class extending this one needs to add the following annotations : - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @since 2.7.7 3.0.1 3.1.0 N°4624 processIsolation is disabled by default and must be enabled in each test needing it (basically all tests using * iTop datamodel) */ @@ -64,7 +58,8 @@ abstract class ItopDataTestCase extends ItopTestCase { private $iTestOrgId; // For cleanup - private $aCreatedObjects = array(); + private $aCreatedObjects = []; + private $aEventListeners = []; /** * @var string Default environment to use for test cases @@ -73,6 +68,23 @@ abstract class ItopDataTestCase extends ItopTestCase const USE_TRANSACTION = true; const CREATE_TEST_ORG = false; + /** + * This method is called before the first test of this test class is run (in the current process). + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + } + + /** + * This method is called after the last test of this test class is run (in the current process). + */ + public static function tearDownAfterClass(): void + { + \UserRights::FlushPrivileges(); + parent::tearDownAfterClass(); + } + /** * @throws Exception */ @@ -118,6 +130,15 @@ abstract class ItopDataTestCase extends ItopTestCase } } } + // As soon as a rollback has been performed, each object memoized should be discarded + CMDBObject::SetCurrentChange(null); + + // Leave the place clean + \UserRights::Logoff(); + + foreach ($this->aEventListeners as $sListenerId) { + EventService::UnRegisterListener($sListenerId); + } parent::tearDown(); } @@ -890,6 +911,17 @@ abstract class ItopDataTestCase extends ItopTestCase } } + protected function assertDBChangeOpCount(string $sClass, $iId, int $iExpectedCount) + { + $oSearch = new \DBObjectSearch('CMDBChangeOp'); + $oSearch->AddCondition('objclass', $sClass); + $oSearch->AddCondition('objkey', $iId); + $oSearch->AllowAllData(); + $oSet = new \DBObjectSet($oSearch); + $iCount = $oSet->Count(); + $this->assertEquals($iExpectedCount, $iCount, "Found $iCount changes for object $sClass::$iId"); + } + /** * Import a set of XML files describing a consistent set of iTop objects * @param string[] $aFiles diff --git a/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php b/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php index 91824ccdc..c14303551 100644 --- a/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php +++ b/tests/php-unit-tests/src/BaseTestCase/ItopTestCase.php @@ -24,23 +24,53 @@ define('DEBUG_UNIT_TEST', true); abstract class ItopTestCase extends TestCase { public const TEST_LOG_DIR = 'test'; + public static $DEBUG_UNIT_TEST = false; + + /** + * Override the default value to disable the backup of globals in case of tests run in a separate process + */ + protected $preserveGlobalState = false; + + /** + * This method is called before the first test of this test class is run (in the current process). + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + static::$DEBUG_UNIT_TEST = getenv('DEBUG_UNIT_TEST'); + + require_once static::GetAppRoot() . 'approot.inc.php'; + + if (false === defined('ITOP_PHPUNIT_RUNNING_CONSTANT_NAME')) { + // setUp might be called multiple times, so protecting the define() call ! + define('ITOP_PHPUNIT_RUNNING_CONSTANT_NAME', true); + } + } + + /** + * This method is called after the last test of this test class is run (in the current process). + */ + public static function tearDownAfterClass(): void + { + parent::tearDownAfterClass(); + + if (method_exists('utils', 'GetConfig')) { + // Reset the config by forcing the load from disk + $oConfig = \utils::GetConfig(true); + if (method_exists('MetaModel', 'SetConfig')) { + \MetaModel::SetConfig($oConfig); + } + } + if (method_exists('Dict', 'SetUserLanguage')) { + \Dict::SetUserLanguage(); + } + } protected function setUp(): void { - $sAppRootRelPath = 'approot.inc.php'; - $sDepthSeparator = '../'; - for ($iDepth = 0; $iDepth < 8; $iDepth++) { - if (file_exists($sAppRootRelPath)) { - require_once $sAppRootRelPath; - break; - } + parent::setUp(); - $sAppRootRelPath = $sDepthSeparator.$sAppRootRelPath; - } - - if (false === defined(ITOP_PHPUNIT_RUNNING_CONSTANT_NAME)) { - // setUp might be called multiple times, so protecting the define() call ! - define(ITOP_PHPUNIT_RUNNING_CONSTANT_NAME, true); - } + $this->debug("\n----------\n---------- ".$this->getName()."\n----------\n"); $this->LoadRequiredItopFiles(); $this->LoadRequiredTestFiles(); @@ -56,10 +86,38 @@ abstract class ItopTestCase extends TestCase if (CMDBSource::IsInsideTransaction()) { // Nested transactions were opened but not finished ! + // Rollback to avoid side effects on next tests + while (CMDBSource::IsInsideTransaction()) { + CMDBSource::Query('ROLLBACK'); + } throw new MySQLTransactionNotClosedException('Some DB transactions were opened but not closed ! Fix the code by adding ROLLBACK or COMMIT statements !', []); } } + /** Helper than can be called in the context of a data provider */ + public static function GetAppRoot() + { + if (defined('APPROOT')) { + return APPROOT; + } + $sSearchPath = __DIR__; + for ($iDepth = 0; $iDepth < 8; $iDepth++) { + if (file_exists($sSearchPath.'/approot.inc.php')) { + break; + } + $iOffsetSep = strrpos($sSearchPath, '/'); + if ($iOffsetSep === false) { + $iOffsetSep = strrpos($sSearchPath, '\\'); + if ($iOffsetSep === false) { + // Do not throw an exception here as PHPUnit will not show it clearly when determing the list of test to perform + return 'Could not find the approot file in '.$sSearchPath; + } + } + $sSearchPath = substr($sSearchPath, 0, $iOffsetSep); + } + return $sSearchPath.'/'; + } + /** * Overload this method to require necessary files through {@see \Combodo\iTop\Test\UnitTest\ItopTestCase::RequireOnceItopFile()} * @@ -93,7 +151,7 @@ abstract class ItopTestCase extends TestCase */ protected function RequireOnceItopFile(string $sFileRelPath): void { - require_once APPROOT . $sFileRelPath; + require_once $this->GetAppRoot() . $sFileRelPath; } /** @@ -161,7 +219,7 @@ abstract class ItopTestCase extends TestCase /** * @since 2.7.4 3.0.0 */ - public function InvokeNonPublicStaticMethod($sObjectClass, $sMethodName, $aArgs) + public function InvokeNonPublicStaticMethod($sObjectClass, $sMethodName, $aArgs = []) { return $this->InvokeNonPublicMethod($sObjectClass, $sMethodName, null, $aArgs); } @@ -178,7 +236,7 @@ abstract class ItopTestCase extends TestCase * * @since 2.7.4 3.0.0 */ - public function InvokeNonPublicMethod($sObjectClass, $sMethodName, $oObject, $aArgs) + public function InvokeNonPublicMethod($sObjectClass, $sMethodName, $oObject, $aArgs = []) { $class = new \ReflectionClass($sObjectClass); $method = $class->getMethod($sMethodName); diff --git a/tests/php-unit-tests/tools/run_class_by_class.php b/tests/php-unit-tests/tools/run_class_by_class.php new file mode 100644 index 000000000..8a3256f7f --- /dev/null +++ b/tests/php-unit-tests/tools/run_class_by_class.php @@ -0,0 +1,64 @@ + $sLine) { + // Example of formats to be filtered + //- DatamodelsXmlFilesTest::testAllItopXmlFilesCovered + //- Combodo\iTop\Test\UnitTest\Application\DashboardLayoutTest::testGetDashletCoordinates"OneColLayout-Cell0" + //if (preg_match('@^- ([a-z]+\\\\)*([a-z]+::[a-z0-9]+)@i', $sLine, $aMatches)) { + if (preg_match('@([a-z0-9]+)::test@i', $sLine, $aMatches)) { + $sTestClass = $aMatches[1]; + $aClasses[$sTestClass] = $sTestClass; + } + } + return array_keys($aClasses); +} + +function RunTests($sFilterRegExp, $sUnitaryTestsDir = '', $bPassthru = false) +{ + $sRegExpShellArg = '"'.str_replace('"', '\\"', $sFilterRegExp).'"'; + $sConfigFile = ITOP_PHPUNIT."/phpunit.xml.dist"; + $sCommand = PHPUNIT_COMMAND." --configuration $sConfigFile --filter $sRegExpShellArg $sUnitaryTestsDir"; + ///echo "executing <<<$sCommand>>>\n"; + if ($bPassthru) { + passthru($sCommand, $iResultCode); + } + else { + exec($sCommand, $aTrashedOutput, $iResultCode); + } + $bTestSuccess = ($iResultCode == 0); // or 1 in case of a failing test + return $bTestSuccess; +} + +$sUnitaryTestsDir = ''; + +$aTestClasses = ListTests($sUnitaryTestsDir); +echo "Found ".count($aTestClasses)." to execute: ".implode(", ", $aTestClasses)."\n"; +echo "Testing...\n"; +foreach ($aTestClasses as $sTestClass) { + $fStarted = microtime(true); + $bSuccess = RunTests($sTestClass); + $sDuration = round(microtime(true) - $fStarted, 3); + echo "$sTestClass: ".($bSuccess ? 'Ok' : "FAILURE")." [$sDuration s]\n"; +} \ No newline at end of file diff --git a/tests/php-unit-tests/unitary-tests/application/Session/SessionTest.php b/tests/php-unit-tests/unitary-tests/application/Session/SessionTest.php index 8d8e31682..5bfd8467b 100644 --- a/tests/php-unit-tests/unitary-tests/application/Session/SessionTest.php +++ b/tests/php-unit-tests/unitary-tests/application/Session/SessionTest.php @@ -7,8 +7,6 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; /** * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class SessionTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/application/ThemeHandlerTest.php b/tests/php-unit-tests/unitary-tests/application/ThemeHandlerTest.php index e48d43bc5..b8412201a 100644 --- a/tests/php-unit-tests/unitary-tests/application/ThemeHandlerTest.php +++ b/tests/php-unit-tests/unitary-tests/application/ThemeHandlerTest.php @@ -7,9 +7,6 @@ use FindStylesheetObject; use ThemeHandler; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled * @covers ThemeHandler */ class ThemeHandlerTest extends ItopTestCase diff --git a/tests/php-unit-tests/unitary-tests/application/privUITransactionFileTest.php b/tests/php-unit-tests/unitary-tests/application/privUITransactionFileTest.php index 12eea5d65..5c55fc314 100644 --- a/tests/php-unit-tests/unitary-tests/application/privUITransactionFileTest.php +++ b/tests/php-unit-tests/unitary-tests/application/privUITransactionFileTest.php @@ -25,10 +25,6 @@ use privUITransactionFile; use UserRights; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @covers utils * @group sampleDataNeeded * @group defaultProfiles @@ -180,7 +176,7 @@ class privUITransactionFileTest extends ItopDataTestCase $this->assertTrue($bResult, 'Token created by support user must be removed in the support user context'); // test when no user logged (combodo-unauthenticated-form module for example) - UserRights::_ResetSessionCache(); + UserRights::Logoff(); $sTransactionIdUnauthenticatedUser = privUITransactionFile::GetNewTransactionId(); $bResult = privUITransactionFile::IsTransactionValid($sTransactionIdUnauthenticatedUser, false); $this->assertTrue($bResult, 'Token created by unauthenticated user must be valid when no user logged'); diff --git a/tests/php-unit-tests/unitary-tests/application/utilsTest.php b/tests/php-unit-tests/unitary-tests/application/utilsTest.php index b976e7c53..116f621c1 100644 --- a/tests/php-unit-tests/unitary-tests/application/utilsTest.php +++ b/tests/php-unit-tests/unitary-tests/application/utilsTest.php @@ -25,6 +25,7 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; use utils; /** + * @runClassInSeparateProcess * @covers utils */ class utilsTest extends ItopTestCase @@ -68,36 +69,36 @@ class utilsTest extends ItopTestCase public function realPathDataProvider() { - parent::setUp(); // if not called, APPROOT won't be defined :( + $sAppRoot = static::GetAppRoot(); $sSep = DIRECTORY_SEPARATOR; - $sItopRootRealPath = realpath(APPROOT).$sSep; + $sItopRootRealPath = realpath($sAppRoot).$sSep; $sLicenseFileName = 'license.txt'; - if (!is_file(APPROOT.$sLicenseFileName)) + if (!is_file($sAppRoot.$sLicenseFileName)) { $sLicenseFileName = 'LICENSE'; } return [ - $sLicenseFileName => [APPROOT.$sLicenseFileName, APPROOT, $sItopRootRealPath.$sLicenseFileName], - 'unexisting file' => [APPROOT.'license_DOES_NOT_EXIST.txt', APPROOT, false], - '/'.$sLicenseFileName => [APPROOT.$sSep.$sLicenseFileName, APPROOT, $sItopRootRealPath.$sLicenseFileName], - '%2f'.$sLicenseFileName => [APPROOT.'%2f'. $sLicenseFileName, APPROOT, false], - '../'.$sLicenseFileName => [APPROOT.'..'.$sSep.$sLicenseFileName, APPROOT, false], - '%2e%2e%2f'.$sLicenseFileName => [APPROOT.'%2e%2e%2f'.$sLicenseFileName, APPROOT, false], + $sLicenseFileName => [$sAppRoot.$sLicenseFileName, $sAppRoot, $sItopRootRealPath.$sLicenseFileName], + 'unexisting file' => [$sAppRoot.'license_DOES_NOT_EXIST.txt', $sAppRoot, false], + '/'.$sLicenseFileName => [$sAppRoot.$sSep.$sLicenseFileName, $sAppRoot, $sItopRootRealPath.$sLicenseFileName], + '%2f'.$sLicenseFileName => [$sAppRoot.'%2f'. $sLicenseFileName, $sAppRoot, false], + '../'.$sLicenseFileName => [$sAppRoot.'..'.$sSep.$sLicenseFileName, $sAppRoot, false], + '%2e%2e%2f'.$sLicenseFileName => [$sAppRoot.'%2e%2e%2f'.$sLicenseFileName, $sAppRoot, false], 'application/utils.inc.php with basepath=APPROOT' => [ - APPROOT.'application/utils.inc.php', - APPROOT, + $sAppRoot.'application/utils.inc.php', + $sAppRoot, $sItopRootRealPath.'application'.$sSep.'utils.inc.php', ], 'application/utils.inc.php with basepath=APPROOT/application' => [ - APPROOT.'application/utils.inc.php', - APPROOT.'application', + $sAppRoot.'application/utils.inc.php', + $sAppRoot.'application', $sItopRootRealPath.'application'.$sSep.'utils.inc.php', ], 'basepath containing / and \\' => [ - APPROOT.'sources/Form/Form.php', - APPROOT.'sources/Form\\Form.php', + $sAppRoot.'sources/Form/Form.php', + $sAppRoot.'sources/Form\\Form.php', $sItopRootRealPath.'sources'.$sSep.'Form'.$sSep.'Form.php', ], ]; @@ -117,13 +118,14 @@ class utilsTest extends ItopTestCase public function LocalPathProvider() { + $sAppRoot = static::GetAppRoot(); return array( 'index.php' => array( - 'sAbsolutePath' => APPROOT.'index.php', + 'sAbsolutePath' => $sAppRoot.'index.php', 'expected' => 'index.php', ), 'non existing' => array( - 'sAbsolutePath' => APPROOT.'nonexisting/nonexisting', + 'sAbsolutePath' => $sAppRoot.'nonexisting/nonexisting', 'expected' => false, ), 'outside' => array( @@ -131,15 +133,15 @@ class utilsTest extends ItopTestCase 'expected' => false, ), 'application/cmdbabstract.class.inc.php' => array( - 'sAbsolutePath' => APPROOT.'application/cmdbabstract.class.inc.php', + 'sAbsolutePath' => $sAppRoot.'application/cmdbabstract.class.inc.php', 'expected' => 'application/cmdbabstract.class.inc.php', ), 'dir' => array( - 'sAbsolutePath' => APPROOT.'application/.', + 'sAbsolutePath' => $sAppRoot.'application/.', 'expected' => 'application', ), 'root' => array( - 'sAbsolutePath' => APPROOT.'.', + 'sAbsolutePath' => $sAppRoot.'.', 'expected' => '', ), ); @@ -288,7 +290,7 @@ class utilsTest extends ItopTestCase public function GetDefaultUrlAppRootProvider() { - $this->setUp(); + $sAppRoot = static::GetAppRoot(); $baseServerVar = [ 'REMOTE_ADDR' => '127.0.0.1', //is not set, disable IsProxyTrusted @@ -298,7 +300,7 @@ class utilsTest extends ItopTestCase 'HTTP_X_FORWARDED_PORT' => null, 'REQUEST_URI' => '/index.php?baz=1', 'SCRIPT_NAME' => '/index.php', - 'SCRIPT_FILENAME' => APPROOT.'index.php', + 'SCRIPT_FILENAME' => $sAppRoot.'index.php', 'QUERY_STRING' => 'baz=1', 'HTTP_X_FORWARDED_PROTO' => null, 'HTTP_X_FORWARDED_PROTOCOL' => null, @@ -486,23 +488,21 @@ class utilsTest extends ItopTestCase } /** - * @dataProvider GetMentionedObjectsFromTextProvider * @covers utils::GetMentionedObjectsFromText * - * @param string $sInput - * @param string $sFormat - * @param array $aExceptedMentionedObjects - * * @throws \Exception */ - public function testGetMentionedObjectsFromText(string $sInput, string $sFormat, array $aExceptedMentionedObjects) + public function testGetMentionedObjectsFromText() { - $aTestedMentionedObjects = utils::GetMentionedObjectsFromText($sInput, $sFormat); + // Emulate the "Case provider mechanism" (reason: the data provider requires utils constants not available before the application startup) + foreach ($this->GetMentionedObjectsFromTextProvider() as $sCase => list($sInput, $sFormat, $aExceptedMentionedObjects)) { + $aTestedMentionedObjects = utils::GetMentionedObjectsFromText($sInput, $sFormat); - $sExpectedAsString = print_r($aExceptedMentionedObjects, true); - $sTestedAsString = print_r($aTestedMentionedObjects, true); + $sExpectedAsString = print_r($aExceptedMentionedObjects, true); + $sTestedAsString = print_r($aTestedMentionedObjects, true); - $this->assertEquals($sTestedAsString, $sExpectedAsString, "Found mentioned objects don't match. Got: $sTestedAsString, expected $sExpectedAsString"); + $this->assertEquals($sTestedAsString, $sExpectedAsString, "Case '$sCase': Found mentioned objects don't match. Got: $sTestedAsString, expected $sExpectedAsString"); + } } /** @@ -636,17 +636,13 @@ class utilsTest extends ItopTestCase /** * Test sanitizer. * - * @param $type string type of sanitizer - * @param $valueToSanitize ? value to sanitize - * @param $expectedResult ? expected result - * - * @return void - * - * @dataProvider sanitizerDataProvider */ - public function testSanitizer($type, $valueToSanitize, $expectedResult) + public function testSanitizer() { - $this->assertEquals($expectedResult, utils::Sanitize($valueToSanitize, null, $type), 'url sanitize failed'); + // Emulate the "Case provider mechanism" (reason: the data provider requires utils constants not available before the application startup) + foreach ($this->sanitizerDataProvider() as $sCase => list($type, $valueToSanitize, $expectedResult)) { + $this->assertEquals($expectedResult, utils::Sanitize($valueToSanitize, null, $type), "Case '$sCase': url sanitize failed"); + } } /** diff --git a/tests/php-unit-tests/unitary-tests/core/ActionEmailTest.php b/tests/php-unit-tests/unitary-tests/core/ActionEmailTest.php index 3f78df997..6d0e5d784 100644 --- a/tests/php-unit-tests/unitary-tests/core/ActionEmailTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ActionEmailTest.php @@ -9,9 +9,6 @@ use MetaModel; use utils; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled * @covers \ActionEmail */ class ActionEmailTest extends ItopDataTestCase diff --git a/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php b/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php index b8abf5d75..b74b255eb 100644 --- a/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php +++ b/tests/php-unit-tests/unitary-tests/core/AttributeDefinitionTest.php @@ -5,11 +5,6 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class AttributeDefinitionTest extends ItopDataTestCase { const CREATE_TEST_ORG = true; diff --git a/tests/php-unit-tests/unitary-tests/core/BulkChangeTest.inc.php b/tests/php-unit-tests/unitary-tests/core/BulkChangeTest.inc.php index ec944796e..8fa1ff0cb 100644 --- a/tests/php-unit-tests/unitary-tests/core/BulkChangeTest.inc.php +++ b/tests/php-unit-tests/unitary-tests/core/BulkChangeTest.inc.php @@ -7,9 +7,7 @@ use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled + * @runClassInSeparateProcess */ class BulkChangeTest extends ItopDataTestCase { const CREATE_TEST_ORG = true; diff --git a/tests/php-unit-tests/unitary-tests/core/CMDBObjectTest.php b/tests/php-unit-tests/unitary-tests/core/CMDBObjectTest.php index fd2368fc0..cca01a41e 100644 --- a/tests/php-unit-tests/unitary-tests/core/CMDBObjectTest.php +++ b/tests/php-unit-tests/unitary-tests/core/CMDBObjectTest.php @@ -15,11 +15,6 @@ use MetaModel; */ -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class CMDBObjectTest extends ItopDataTestCase { private $sAdminLogin; @@ -99,6 +94,7 @@ class CMDBObjectTest extends ItopDataTestCase * @covers CMDBObject::SetCurrentChange * @since 3.0.1 N°5135 - Impersonate: history of changes versus log entries * + * @runInSeparateProcess * @dataProvider CurrentChangeUnderImpersonationProvider */ public function testCurrentChangeUnderImpersonation($sTrackInfo=null, $sExpectedChangeLogWhenImpersonation=null) { diff --git a/tests/php-unit-tests/unitary-tests/core/CMDBSource/CMDBSourceTest.php b/tests/php-unit-tests/unitary-tests/core/CMDBSource/CMDBSourceTest.php index 244742b53..62a6af66d 100644 --- a/tests/php-unit-tests/unitary-tests/core/CMDBSource/CMDBSourceTest.php +++ b/tests/php-unit-tests/unitary-tests/core/CMDBSource/CMDBSourceTest.php @@ -17,11 +17,6 @@ use utils; * @package Combodo\iTop\Test\UnitTest\Core */ -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class CMDBSourceTest extends ItopTestCase { protected function setUp(): void @@ -126,6 +121,8 @@ class CMDBSourceTest extends ItopTestCase * @throws \CoreException * @throws \MySQLException * @since 3.0.0 N°4215 + * + * @runInSeparateProcess Resetting DB connection, thus making other tests to fail! */ public function testIsOpenedDbConnectionUsingTls() { diff --git a/tests/php-unit-tests/unitary-tests/core/CMDBSource/TransactionsTest.php b/tests/php-unit-tests/unitary-tests/core/CMDBSource/TransactionsTest.php index c3afb8681..17de3252d 100644 --- a/tests/php-unit-tests/unitary-tests/core/CMDBSource/TransactionsTest.php +++ b/tests/php-unit-tests/unitary-tests/core/CMDBSource/TransactionsTest.php @@ -14,10 +14,6 @@ use MetaModel; use MySQLTransactionNotClosedException; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @group itopRequestMgmt * @group specificOrgInSampleData * Class TransactionsTest @@ -108,6 +104,15 @@ class TransactionsTest extends ItopTestCase } } + /** + * This test case was originaly in DBInsertProvider + * @runInSeparateProcess Failing when run in the same process as other... + */ + public function testDBInsertCaseHistory38() + { + $this->testDBInsert(40, false); + } + public function DBInsertProvider() { return [ @@ -151,7 +156,6 @@ class TransactionsTest extends ItopTestCase "History 35" => ['iFailAt' => 37, 'bIsInDB' => false], "History 36" => ['iFailAt' => 38, 'bIsInDB' => false], "History 37" => ['iFailAt' => 39, 'bIsInDB' => false], - "History 38" => ['iFailAt' => 40, 'bIsInDB' => false], ]; } @@ -276,6 +280,7 @@ class TransactionsTest extends ItopTestCase protected function tearDown(): void { try { + DbConnectionWrapper::SetDbConnectionMockForQuery(); parent::tearDown(); } catch (MySQLTransactionNotClosedException $e) { diff --git a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php index f0d94af37..a63758fff 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBObjectTest.php @@ -33,10 +33,6 @@ use MetaModel; /** * @group specificOrgInSampleData - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBObjectTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/DBSearchCommitTest.php b/tests/php-unit-tests/unitary-tests/core/DBSearchCommitTest.php index 30088c513..63baa2890 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBSearchCommitTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBSearchCommitTest.php @@ -17,10 +17,6 @@ use DBSearch; *
    *
  • MakeGroupByQuery
  • *
- * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBSearchCommitTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/DBSearchIntersectTest.php b/tests/php-unit-tests/unitary-tests/core/DBSearchIntersectTest.php index 5cb13ed19..67d2647ea 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBSearchIntersectTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBSearchIntersectTest.php @@ -11,10 +11,6 @@ use DBSearch; * Class DBSearchIntersectTest * * @package Combodo\iTop\Test\UnitTest\Core - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBSearchIntersectTest extends ItopTestCase { @@ -72,16 +68,16 @@ class DBSearchIntersectTest extends ItopTestCase 'result' => "SELECT `L`, `P` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE (`P`.`org_id` = 3)"); $aTests['Multiple selected classes inverted 1'] = array( - 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE 1", + 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE 1", 'right' => "SELECT Location WHERE org_id = 3", 'alias' => "L", - 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE (`L`.`org_id` = 3)"); + 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE (`L`.`org_id` = 3)"); $aTests['Multiple selected classes inverted 2'] = array( - 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE (`L`.`org_id` = 3)", + 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE (`L`.`org_id` = 3)", 'right' => "SELECT Person WHERE org_id = 3", 'alias' => "P", - 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE ((`L`.`org_id` = 3) AND (`P`.`org_id` = 3))"); + 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE ((`L`.`org_id` = 3) AND (`P`.`org_id` = 3))"); $aTests['Same class'] = array( 'left' => "SELECT Contact WHERE name = 'Christie'", @@ -192,9 +188,9 @@ class DBSearchIntersectTest extends ItopTestCase 'result' => "SELECT `L`, `P` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id WHERE (`P`.`org_id` = 3)"); $aTests['Multiple selected classes inverted 2'] = array( - 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE (`L`.`org_id` = 3)", + 'left' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS D ON D.location_id = L.id JOIN Person AS P2 ON P.manager_id = P2.id WHERE (`L`.`org_id` = 3)", 'right' => "SELECT Person WHERE org_id = 3", - 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN PC AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE ((`L`.`org_id` = 3) AND (`P`.`org_id` = 3))"); + 'result' => "SELECT `L`, `P`, `D` FROM Person AS `P` JOIN Location AS `L` ON `P`.location_id = `L`.id JOIN Server AS `D` ON `D`.location_id = `L`.id JOIN Person AS `P2` ON `P`.manager_id = `P2`.id WHERE ((`L`.`org_id` = 3) AND (`P`.`org_id` = 3))"); $aTests['Same class'] = array( 'left' => "SELECT Contact WHERE name = 'Christie'", diff --git a/tests/php-unit-tests/unitary-tests/core/DBSearchJoinTest.php b/tests/php-unit-tests/unitary-tests/core/DBSearchJoinTest.php index 468c9ef92..55077d4d1 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBSearchJoinTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBSearchJoinTest.php @@ -11,10 +11,6 @@ use DBSearch; * Class DBSearchIntersectTest * * @package Combodo\iTop\Test\UnitTest\Core - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBSearchJoinTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/DBSearchTest.php b/tests/php-unit-tests/unitary-tests/core/DBSearchTest.php index 6bd2d5ff7..6c54278d7 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBSearchTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBSearchTest.php @@ -42,10 +42,6 @@ use FunctionExpression; *
    *
  • MakeGroupByQuery
  • *
- * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBSearchTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/DBSearchUpdateRealiasingMapTest.php b/tests/php-unit-tests/unitary-tests/core/DBSearchUpdateRealiasingMapTest.php index 4fd6a3ace..44670c985 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBSearchUpdateRealiasingMapTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBSearchUpdateRealiasingMapTest.php @@ -10,10 +10,6 @@ use DBObjectSearch; * Class DBSearchUpdateRealiasingMapTest * * @package Combodo\iTop\Test\UnitTest\Core - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DBSearchUpdateRealiasingMapTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/DBUnionSearchTest.php b/tests/php-unit-tests/unitary-tests/core/DBUnionSearchTest.php index 5a622bd25..382b7934b 100644 --- a/tests/php-unit-tests/unitary-tests/core/DBUnionSearchTest.php +++ b/tests/php-unit-tests/unitary-tests/core/DBUnionSearchTest.php @@ -7,11 +7,6 @@ use Combodo\iTop\Test\UnitTest\ItopDataTestCase; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class DBUnionSearchTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/ExpressionEvaluateTest.php b/tests/php-unit-tests/unitary-tests/core/ExpressionEvaluateTest.php index 46d08908a..de80a8330 100644 --- a/tests/php-unit-tests/unitary-tests/core/ExpressionEvaluateTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ExpressionEvaluateTest.php @@ -13,11 +13,6 @@ use FunctionExpression; use MetaModel; use ScalarExpression; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ExpressionEvaluateTest extends ItopDataTestCase { const USE_TRANSACTION = false; diff --git a/tests/php-unit-tests/unitary-tests/core/ExpressionTest.php b/tests/php-unit-tests/unitary-tests/core/ExpressionTest.php index 838143180..56f9869c6 100644 --- a/tests/php-unit-tests/unitary-tests/core/ExpressionTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ExpressionTest.php @@ -5,11 +5,6 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use Expression; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ExpressionTest extends ItopDataTestCase { const USE_TRANSACTION = false; diff --git a/tests/php-unit-tests/unitary-tests/core/GetSelectFilterTest.php b/tests/php-unit-tests/unitary-tests/core/GetSelectFilterTest.php index a3db7e145..e3589125a 100644 --- a/tests/php-unit-tests/unitary-tests/core/GetSelectFilterTest.php +++ b/tests/php-unit-tests/unitary-tests/core/GetSelectFilterTest.php @@ -17,10 +17,6 @@ use utils; * @group specificOrgInSampleData * Class GetSelectFilterTest * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @package Combodo\iTop\Test\UnitTest\Webservices */ class GetSelectFilterTest extends ItopDataTestCase diff --git a/tests/php-unit-tests/unitary-tests/core/InlineImageTest.php b/tests/php-unit-tests/unitary-tests/core/InlineImageTest.php index f77b01c01..5b7f0d86f 100644 --- a/tests/php-unit-tests/unitary-tests/core/InlineImageTest.php +++ b/tests/php-unit-tests/unitary-tests/core/InlineImageTest.php @@ -10,12 +10,6 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use InlineImage; - -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class InlineImageTest extends ItopDataTestCase { /** diff --git a/tests/php-unit-tests/unitary-tests/core/Log/DeprecatedCallsLogTest.php b/tests/php-unit-tests/unitary-tests/core/Log/DeprecatedCallsLogTest.php index 582711b50..055e67669 100644 --- a/tests/php-unit-tests/unitary-tests/core/Log/DeprecatedCallsLogTest.php +++ b/tests/php-unit-tests/unitary-tests/core/Log/DeprecatedCallsLogTest.php @@ -39,6 +39,8 @@ class DeprecatedCallsLogTest extends ItopTestCase { } /** + * @runInSeparateProcess Necessary, due to the DeprecatedCallsLog being enabled (no mean to reset) + * * The error handler set by DeprecatedCallsLog during startup was causing PHPUnit to miss PHP notices like "undefined offset" * * The error handler is now disabled when running PHPUnit diff --git a/tests/php-unit-tests/unitary-tests/core/Log/ExceptionLogTest.php b/tests/php-unit-tests/unitary-tests/core/Log/ExceptionLogTest.php index 2cb7d8a79..9e469877a 100644 --- a/tests/php-unit-tests/unitary-tests/core/Log/ExceptionLogTest.php +++ b/tests/php-unit-tests/unitary-tests/core/Log/ExceptionLogTest.php @@ -21,11 +21,6 @@ use ExceptionLog; require_once(__DIR__.'/ExceptionLogTest/Exceptions.php'); -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ExceptionLogTest extends ItopDataTestCase { protected function setUp(): void @@ -35,6 +30,8 @@ class ExceptionLogTest extends ItopDataTestCase } /** + * @runInSeparateProcess + * * @dataProvider logProvider */ public function testLogInFile($aLevels, $aExceptions, $sChannel, $aExpectedWriteNumber, $logLevelMin, $aExpectedDbWriteNumber, $logLevelMinWriteInDb) diff --git a/tests/php-unit-tests/unitary-tests/core/Log/LogAPITest.php b/tests/php-unit-tests/unitary-tests/core/Log/LogAPITest.php index 70705ced1..9ab0058c9 100644 --- a/tests/php-unit-tests/unitary-tests/core/Log/LogAPITest.php +++ b/tests/php-unit-tests/unitary-tests/core/Log/LogAPITest.php @@ -16,11 +16,6 @@ namespace Combodo\iTop\Test\UnitTest\Core\Log; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class LogAPITest extends ItopDataTestCase { private $mockFileLog; @@ -38,7 +33,6 @@ class LogAPITest extends ItopDataTestCase /** * @dataProvider LogApiProvider * @test - * @backupGlobals disabled */ public function TestLogApi($oConfigObject, $sMessage, $Channel, $sExpectedLevel, $sExpectedMessage, $sExpectedChannel = '') { @@ -63,7 +57,6 @@ class LogAPITest extends ItopDataTestCase /** * @dataProvider LogWarningWithASpecificChannelProvider * @test - * @backupGlobals disabled */ public function TestLogWarningWithASpecificChannel($expectedCallNb, $sExpectedLevel, $ConfigReturnedObject, $bExceptionRaised=false) { @@ -110,7 +103,6 @@ class LogAPITest extends ItopDataTestCase /** * @dataProvider LogOkWithASpecificChannel * @test - * @backupGlobals disabled */ public function TestLogOkWithASpecificChannel($expectedCallNb, $sExpectedLevel, $ConfigReturnedObject, $bExceptionRaised=false) { diff --git a/tests/php-unit-tests/unitary-tests/core/MetaModelTest.php b/tests/php-unit-tests/unitary-tests/core/MetaModelTest.php index 4e4b0d961..ea4c7135e 100644 --- a/tests/php-unit-tests/unitary-tests/core/MetaModelTest.php +++ b/tests/php-unit-tests/unitary-tests/core/MetaModelTest.php @@ -10,10 +10,6 @@ use MetaModel; /** * Class MetaModelTest * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @since 2.6.0 * @package Combodo\iTop\Test\UnitTest\Core */ @@ -181,6 +177,8 @@ class MetaModelTest extends ItopDataTestCase } /** + * @runInSeparateProcess + * * @dataProvider enumPluginsProvider * * @param $expectedResults @@ -228,6 +226,8 @@ class MetaModelTest extends ItopDataTestCase } /** + * @runInSeparateProcess + * * @dataProvider getPluginsProvider * * @param $expectedInstanciationCalls diff --git a/tests/php-unit-tests/unitary-tests/core/OQLParserTest.php b/tests/php-unit-tests/unitary-tests/core/OQLParserTest.php index 63cd2c626..d18148abd 100644 --- a/tests/php-unit-tests/unitary-tests/core/OQLParserTest.php +++ b/tests/php-unit-tests/unitary-tests/core/OQLParserTest.php @@ -16,11 +16,6 @@ use OQLException; use OqlInterpreter; use OQLParserException; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class OQLParserTest extends ItopDataTestCase { const USE_TRANSACTION = false; diff --git a/tests/php-unit-tests/unitary-tests/core/OQLTest.php b/tests/php-unit-tests/unitary-tests/core/OQLTest.php index 40a2e0845..de81dc512 100644 --- a/tests/php-unit-tests/unitary-tests/core/OQLTest.php +++ b/tests/php-unit-tests/unitary-tests/core/OQLTest.php @@ -21,11 +21,6 @@ use QueryBuilderContext; use SQLObjectQueryBuilder; use utils; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class OQLTest extends ItopDataTestCase { const USE_TRANSACTION = false; diff --git a/tests/php-unit-tests/unitary-tests/core/TagSetFieldDataTest.php b/tests/php-unit-tests/unitary-tests/core/TagSetFieldDataTest.php index 39074f620..bb079a37a 100644 --- a/tests/php-unit-tests/unitary-tests/core/TagSetFieldDataTest.php +++ b/tests/php-unit-tests/unitary-tests/core/TagSetFieldDataTest.php @@ -18,10 +18,6 @@ use TagSetFieldData; /** * @group itopFaqLight - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class TagSetFieldDataTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/TriggerTest.php b/tests/php-unit-tests/unitary-tests/core/TriggerTest.php index b69194f45..0d8333698 100644 --- a/tests/php-unit-tests/unitary-tests/core/TriggerTest.php +++ b/tests/php-unit-tests/unitary-tests/core/TriggerTest.php @@ -14,10 +14,6 @@ use TriggerOnObjectCreate; * Class TriggerTest * * @package Combodo\iTop\Test\UnitTest\Core - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class TriggerTest extends ItopDataTestCase { @@ -35,9 +31,9 @@ class TriggerTest extends ItopDataTestCase $oTrigger = MetaModel::NewObject('TriggerOnObjectCreate'); $oTrigger->Set('context', ContextTag::TAG_PORTAL.', '.ContextTag::TAG_CRON); $this->assertFalse($oTrigger->IsContextValid()); - ContextTag::AddContext(ContextTag::TAG_SETUP); + $oC1 = new ContextTag(ContextTag::TAG_SETUP); $this->assertFalse($oTrigger->IsContextValid()); - ContextTag::AddContext(ContextTag::TAG_CRON); + $oC2 = new ContextTag(ContextTag::TAG_CRON); $this->assertTrue($oTrigger->IsContextValid()); } @@ -55,7 +51,7 @@ class TriggerTest extends ItopDataTestCase } catch (\CoreException $e1) { $this->assertEquals('CoreException', get_class($e1)); - $this->assertEquals('Unknown class \'Toto\' (TriggerOnObjectCreate::-1 ()
)', $e1->getMessage()); + $this->assertStringStartsWith('Unknown class \'Toto\' (TriggerOnObjectCreate::-', $e1->getMessage()); $fullStackTraceAsString = $e1->getFullStackTraceAsString(); $this->assertStringContainsString("MetaModel::NewObject", $fullStackTraceAsString,"new enriched exception should contain root cause method: " . $fullStackTraceAsString); diff --git a/tests/php-unit-tests/unitary-tests/core/UserRightsTest.php b/tests/php-unit-tests/unitary-tests/core/UserRightsTest.php index c3043d85e..b9ee0dcb5 100644 --- a/tests/php-unit-tests/unitary-tests/core/UserRightsTest.php +++ b/tests/php-unit-tests/unitary-tests/core/UserRightsTest.php @@ -41,10 +41,6 @@ use utils; * @group itopRequestMgmt * @group userRights * @group defaultProfiles - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class UserRightsTest extends ItopDataTestCase { @@ -68,6 +64,25 @@ class UserRightsTest extends ItopDataTestCase 'ModuleInstallation' => ['class' => 'ModuleInstallation', 'attcode' => 'name'], ]; + /** + * @param string $sLoginPrefix + * @param int $iProfileId initial profile + * + * @return \DBObject + * @throws \CoreException + * @throws \Exception + */ + protected function CreateUniqueUserAndLogin(string $sLoginPrefix, int $iProfileId): DBObject + { + static $iCount = 0; + $sLogin = $sLoginPrefix.$iCount; + $iCount++; + + $oUser = self::CreateUser($sLogin, $iProfileId); + $_SESSION = array(); + UserRights::Login($sLogin); + return $oUser; + } public function testIsLoggedIn() { @@ -90,6 +105,7 @@ class UserRightsTest extends ItopDataTestCase $_SESSION = []; $this->assertEquals($bResult, UserRights::Login($sLogin)); $this->assertEquals($bResult, UserRights::IsLoggedIn()); + UserRights::Logoff(); } public function LoginProvider(): array @@ -101,22 +117,6 @@ class UserRightsTest extends ItopDataTestCase ]; } - /** - * @param string $sLogin - * @param int $iProfileId initial profile - * - * @return \DBObject - * @throws \CoreException - * @throws \Exception - */ - protected function AddUser(string $sLogin, int $iProfileId): DBObject - { - $oUser = self::CreateUser($sLogin, $iProfileId); - $oUser->DBUpdate(); - - return $oUser; - } - /** Test IsActionAllowed when not logged => always true * * @dataProvider ActionAllowedNotLoggedProvider @@ -145,8 +145,7 @@ class UserRightsTest extends ItopDataTestCase return $aClassActions; } - /** Test IsActionAllowed - * + /** * @dataProvider ActionAllowedProvider * * @param int $iProfileId @@ -158,11 +157,10 @@ class UserRightsTest extends ItopDataTestCase */ public function testIsActionAllowed(int $iProfileId, array $aClassActionResult) { - $this->AddUser('test1', $iProfileId); - $_SESSION = array(); - UserRights::Login('test1'); + $this->CreateUniqueUserAndLogin('test1', $iProfileId); $bRes = UserRights::IsActionAllowed($aClassActionResult['class'], $aClassActionResult['action']) == UR_ALLOWED_YES; $this->assertEquals($aClassActionResult['res'], $bRes); + UserRights::Logoff(); } /* @@ -239,12 +237,11 @@ class UserRightsTest extends ItopDataTestCase */ public function testIsActionAllowedOnAttribute(int $iProfileId, array $aClassActionResult) { - $this->AddUser('test1', $iProfileId); - $_SESSION = []; - UserRights::Login('test1'); + $this->CreateUniqueUserAndLogin('test1', $iProfileId); $sClass = $aClassActionResult['class']; $bRes = UserRights::IsActionAllowedOnAttribute($sClass, self::$aClasses[$sClass]['attcode'], $aClassActionResult['action']) == UR_ALLOWED_YES; $this->assertEquals($aClassActionResult['res'], $bRes); + UserRights::Logoff(); } /* @@ -291,9 +288,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testProfileDenyingConsole(int $iProfileId) { - $oUser = $this->AddUser('test1', $iProfileId); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', $iProfileId); try { $this->AddProfileToUser($oUser, 2); @@ -303,6 +298,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } public function ProfileDenyingConsoleProvider(): array @@ -322,9 +318,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testProfileCannotModifySelf(int $iProfileId) { - $oUser = $this->AddUser('test1', $iProfileId); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', $iProfileId); try { $this->AddProfileToUser($oUser, 1); // trying to become an admin @@ -334,6 +328,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } public function ProfileCannotModifySelfProvider(): array @@ -353,9 +348,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testDeletingSelfUser(int $iProfileId) { - $oUser = $this->AddUser('test1', $iProfileId); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', $iProfileId); try { $oUser->DBDelete(); @@ -365,6 +358,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } public function DeletingSelfUserProvider(): array @@ -387,9 +381,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testRemovingOwnContact(int $iProfileId) { - $oUser = $this->AddUser('test1', $iProfileId); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', $iProfileId); $oUser->Set('contactid', 0); @@ -398,6 +390,8 @@ class UserRightsTest extends ItopDataTestCase $this->fail('Current User cannot remove his own contact'); } catch (CoreCannotSaveObjectException $e) { } + + UserRights::Logoff(); } public function RemovingOwnContactProvider(): array @@ -417,9 +411,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testUpgradingToAdmin() { - $oUser = $this->AddUser('test1', 3); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', 3); try { $this->AddProfileToUser($oUser, 1); @@ -430,6 +422,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } /** @@ -441,9 +434,7 @@ class UserRightsTest extends ItopDataTestCase */ public function testDenyingUserModification() { - $oUser = $this->AddUser('test1', 1); - $_SESSION = []; - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', 1); $this->AddProfileToUser($oUser, 3); // Keep only the profile 3 (remove profile 1) @@ -461,6 +452,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } /** @@ -468,10 +460,8 @@ class UserRightsTest extends ItopDataTestCase */ public function testNonAdminCanListOwnProfiles($bHideAdministrators) { - $oUser = $this->AddUser('test1', 2); // portal user - $_SESSION = []; utils::GetConfig()->Set('security.hide_administrators', $bHideAdministrators); - UserRights::Login('test1'); + $oUser = $this->CreateUniqueUserAndLogin('test1', 2); // portal user // List the link between the User and the Profiles $oSearch = new DBObjectSearch('URP_UserProfile'); @@ -486,6 +476,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } public function NonAdminCanListOwnProfilesProvider(): array @@ -496,16 +487,15 @@ class UserRightsTest extends ItopDataTestCase ]; } /** + * @runInSeparateProcess *@dataProvider NonAdminCannotListAdminProfilesProvider */ public function testNonAdminCannotListAdminProfiles($bHideAdministrators, $iExpectedCount) { utils::GetConfig()->Set('security.hide_administrators', $bHideAdministrators); - $this->AddUser('test1', 2); // portal user - $oUserAdmin = $this->AddUser('admin1', 1); - $_SESSION = []; - UserRights::Login('test1'); + $oUserAdmin = $this->CreateUser('admin1', 1); + $this->CreateUniqueUserAndLogin('test1', 2); // portal user $oSearch = new DBObjectSearch('URP_UserProfile'); $oSearch->AddCondition('userid', $oUserAdmin->GetKey()); @@ -518,6 +508,7 @@ class UserRightsTest extends ItopDataTestCase // logout $_SESSION = []; + UserRights::Logoff(); } public function NonAdminCannotListAdminProfilesProvider(): array diff --git a/tests/php-unit-tests/unitary-tests/core/ValueSetObjectsTest.php b/tests/php-unit-tests/unitary-tests/core/ValueSetObjectsTest.php index 9f7089f3f..0483f5e24 100644 --- a/tests/php-unit-tests/unitary-tests/core/ValueSetObjectsTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ValueSetObjectsTest.php @@ -11,11 +11,6 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; use MetaModel; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ValueSetObjectsTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/XMLDataLoaderTest.php b/tests/php-unit-tests/unitary-tests/core/XMLDataLoaderTest.php index aa106db40..e9c85ce01 100644 --- a/tests/php-unit-tests/unitary-tests/core/XMLDataLoaderTest.php +++ b/tests/php-unit-tests/unitary-tests/core/XMLDataLoaderTest.php @@ -33,14 +33,10 @@ use MetaModel; /** * @group specificOrgInSampleData - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class XMLDataLoaderTest extends ItopDataTestCase { - const CREATE_TEST_ORG = true; + const CREATE_TEST_ORG = false; public function testDataLoader() { diff --git a/tests/php-unit-tests/unitary-tests/core/apcEmulationTest.php b/tests/php-unit-tests/unitary-tests/core/apcEmulationTest.php index 136bc825b..6dc3d95ee 100644 --- a/tests/php-unit-tests/unitary-tests/core/apcEmulationTest.php +++ b/tests/php-unit-tests/unitary-tests/core/apcEmulationTest.php @@ -33,8 +33,6 @@ define('UNIT_MAX_CACHE_FILES', 10); /** * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class apcEmulationTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/dictApcuTest.php b/tests/php-unit-tests/unitary-tests/core/dictApcuTest.php index 773d23f08..d8f790c88 100644 --- a/tests/php-unit-tests/unitary-tests/core/dictApcuTest.php +++ b/tests/php-unit-tests/unitary-tests/core/dictApcuTest.php @@ -32,8 +32,6 @@ use Dict; /** * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class dictApcuTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/dictTest.php b/tests/php-unit-tests/unitary-tests/core/dictTest.php index 8eba1f9e0..b7cffc17a 100644 --- a/tests/php-unit-tests/unitary-tests/core/dictTest.php +++ b/tests/php-unit-tests/unitary-tests/core/dictTest.php @@ -30,11 +30,8 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; use Dict; use Exception; - /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled + * @runClassInSeparateProcess */ class dictTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/ormCaseLogTest.php b/tests/php-unit-tests/unitary-tests/core/ormCaseLogTest.php index ae2dfc42b..9adb3141f 100644 --- a/tests/php-unit-tests/unitary-tests/core/ormCaseLogTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ormCaseLogTest.php @@ -15,10 +15,6 @@ use ormCaseLog; * Tests of the ormCaseLog class * * @covers \ormCaseLog - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ormCaseLogTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/ormLinkSetTest.php b/tests/php-unit-tests/unitary-tests/core/ormLinkSetTest.php index 925617e57..8c7bacf65 100644 --- a/tests/php-unit-tests/unitary-tests/core/ormLinkSetTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ormLinkSetTest.php @@ -37,10 +37,6 @@ use ormLinkSet; * @group itopRequestMgmt * @group itopConfigMgmt * Tests of the ormLinkSet class using N-N links between FunctionalCI and Contact - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ormLinkSetTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/ormPasswordTest.php b/tests/php-unit-tests/unitary-tests/core/ormPasswordTest.php index 79657fdc8..0d64cc643 100644 --- a/tests/php-unit-tests/unitary-tests/core/ormPasswordTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ormPasswordTest.php @@ -12,10 +12,6 @@ use Utils; /** * Tests of the ormPassword class - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ormPasswordTest extends ItopDataTestCase { @@ -32,9 +28,11 @@ class ormPasswordTest extends ItopDataTestCase */ public function testCheckHash($sToHashValues, $sToHashSalt, $sHashAlgo, $sExpectedHash) { + $prevHashAlgo = utils::GetConfig()->GetPasswordHashAlgo($sHashAlgo); utils::GetConfig()->SetPasswordHashAlgo($sHashAlgo); $oPassword1 = new ormPassword($sExpectedHash, $sToHashSalt); static::assertTrue($oPassword1->CheckPassword($sToHashValues)); + utils::GetConfig()->SetPasswordHashAlgo($prevHashAlgo); } public function HashProvider() diff --git a/tests/php-unit-tests/unitary-tests/core/ormStyleTest.php b/tests/php-unit-tests/unitary-tests/core/ormStyleTest.php index 4d296bb8b..04b68474f 100644 --- a/tests/php-unit-tests/unitary-tests/core/ormStyleTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ormStyleTest.php @@ -12,10 +12,6 @@ use utils; /** * Tests of the ormStyle class - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ormStyleTest extends ItopTestCase { diff --git a/tests/php-unit-tests/unitary-tests/core/ormTagSetTest.php b/tests/php-unit-tests/unitary-tests/core/ormTagSetTest.php index 5486659e7..cacc5f17f 100644 --- a/tests/php-unit-tests/unitary-tests/core/ormTagSetTest.php +++ b/tests/php-unit-tests/unitary-tests/core/ormTagSetTest.php @@ -38,10 +38,6 @@ define('MAX_TAGS', 12); /** * @group itopFaqLight * Tests of the ormTagSet class - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ormTagSetTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/authent-local/UserLocalTest.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/authent-local/UserLocalTest.php index f558ef125..d8484d182 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/authent-local/UserLocalTest.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/authent-local/UserLocalTest.php @@ -24,10 +24,6 @@ use utils; /** * test class for UserLocal class - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class UserLocalTest extends ItopDataTestCase { @@ -398,6 +394,9 @@ class UserLocalTest extends ItopDataTestCase ); } + /** + * @runInSeparateProcess Otherwise, and only in the CI, test fails asserting $oProfilesSet->Count() == 0 + */ public function testGetUserProfileList() { utils::GetConfig()->SetModuleSetting('authent-local', 'password_validation.pattern', ''); diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigPlaceholdersResolverTest.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigPlaceholdersResolverTest.php index 5dffe9902..6efdef731 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigPlaceholdersResolverTest.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigPlaceholdersResolverTest.php @@ -24,11 +24,6 @@ namespace Combodo\iTop\Test\UnitTest\Module\iTopConfig; use Combodo\iTop\Test\UnitTest\ItopTestCase; use ConfigPlaceholdersResolver; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ConfigPlaceholdersResolverTest extends ItopTestCase { protected function setUp(): void diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest.php index 29871f422..08cab9f35 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-config/ConfigTest.php @@ -24,11 +24,6 @@ namespace Combodo\iTop\Test\UnitTest\Module\iTopConfig; use Combodo\iTop\Test\UnitTest\ItopTestCase; use Config; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class ConfigTest extends ItopTestCase { protected function setUp(): void diff --git a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-tickets/itopTicketTest.php b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-tickets/itopTicketTest.php index 6815eba05..af5a27373 100644 --- a/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-tickets/itopTicketTest.php +++ b/tests/php-unit-tests/unitary-tests/datamodels/2.x/itop-tickets/itopTicketTest.php @@ -34,10 +34,6 @@ use Exception; * @group itopVirtualizationMgmt * @group itopConfigMgmt * @group itopTickets - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class ItopTicketTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php index f0694967b..b3531cf10 100644 --- a/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/DBBackupTest.php @@ -7,11 +7,6 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; use DBBackup; use utils; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class DBBackupTest extends ItopTestCase { /** @@ -27,7 +22,7 @@ class DBBackupTest extends ItopTestCase // We need a connection to the DB, so let's open it ! // We are using the default config file... as the server might not be configured for all the combination we are testing // For example dev env and ci env won't accept TLS connection - $oConfigOnDisk = utils::GetConfig(); + $oConfigOnDisk = utils::GetConfig(true); CMDBSource::InitFromConfig($oConfigOnDisk); } diff --git a/tests/php-unit-tests/unitary-tests/setup/MFCompilerTest.php b/tests/php-unit-tests/unitary-tests/setup/MFCompilerTest.php index 0794677ef..e3e0ca40f 100644 --- a/tests/php-unit-tests/unitary-tests/setup/MFCompilerTest.php +++ b/tests/php-unit-tests/unitary-tests/setup/MFCompilerTest.php @@ -9,9 +9,7 @@ use SubMFCompiler; use utils; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled + * @runClassInSeparateProcess * @covers \MFCompiler::UseLatestPrecompiledFile */ class MFCompilerTest extends ItopTestCase { @@ -53,9 +51,9 @@ class MFCompilerTest extends ItopTestCase { $sSourceDir = $sAppRootForProvider . 'datamodels' . DIRECTORY_SEPARATOR . '2.x'; $sDatamodel2xTargetDir = $sSourceDir . DIRECTORY_SEPARATOR . '/UseLatestPrecompiledFileProvider'; - mkdir($sTempTargetDir); - mkdir($sExtensionTargetDir); - mkdir($sDatamodel2xTargetDir); + if (!is_dir($sTempTargetDir)) mkdir($sTempTargetDir); + if (!is_dir($sExtensionTargetDir)) @mkdir($sExtensionTargetDir); + if (!is_dir($sDatamodel2xTargetDir)) @mkdir($sDatamodel2xTargetDir); self::$aFoldersToCleanup = [ $sTempTargetDir, $sExtensionTargetDir, $sDatamodel2xTargetDir ]; diff --git a/tests/php-unit-tests/unitary-tests/sources/application/Helper/WebResourcesHelperTest.php b/tests/php-unit-tests/unitary-tests/sources/application/Helper/WebResourcesHelperTest.php index 6200310c6..1241ebca7 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/Helper/WebResourcesHelperTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/Helper/WebResourcesHelperTest.php @@ -10,9 +10,6 @@ use Combodo\iTop\Application\Helper\WebResourcesHelper; use Combodo\iTop\Test\UnitTest\ItopTestCase; /** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled * @covers \WebPage */ class WebResourcesHelperTest extends ItopTestCase diff --git a/tests/php-unit-tests/unitary-tests/sources/application/RuntimeDashboardTest.php b/tests/php-unit-tests/unitary-tests/sources/application/RuntimeDashboardTest.php index c08bda3ac..3df1e9944 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/RuntimeDashboardTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/RuntimeDashboardTest.php @@ -14,10 +14,6 @@ use SecurityException; /** * We need the metamodel started as this is a dependency of {@link RuntimeDashboard} * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - * * @since 2.7.8 3.0.3 3.1.0 N°4449 Test Full Path Disclosure in Dashboard */ class RuntimeDashboardTest extends ItopDataTestCase diff --git a/tests/php-unit-tests/unitary-tests/sources/application/TestAutoload.php b/tests/php-unit-tests/unitary-tests/sources/application/TestAutoload.php index ef5fedcbf..9b3c8e21f 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/TestAutoload.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/TestAutoload.php @@ -8,11 +8,6 @@ namespace Combodo\iTop\Test\UnitTest\Application; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class TestAutoload extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/sources/application/TwigBase/Twig/TwigTest.php b/tests/php-unit-tests/unitary-tests/sources/application/TwigBase/Twig/TwigTest.php index 1fd373d95..6cb27fbff 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/TwigBase/Twig/TwigTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/TwigBase/Twig/TwigTest.php @@ -2,15 +2,11 @@ namespace Combodo\iTop\Test\UnitTest\Application\TwigBase; +use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use Combodo\iTop\Portal\Twig\AppExtension; use Twig_Environment; use Twig_Loader_Array; -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class TwigTest extends ItopDataTestCase { protected function setUp(): void diff --git a/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionConversionTest.php b/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionConversionTest.php index 3a5bacd63..77c744582 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionConversionTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionConversionTest.php @@ -44,14 +44,11 @@ use Dict; /** * @group itopRequestMgmt * @group itopServiceMgmt - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class CriterionConversionTest extends ItopDataTestCase { - const CREATE_TEST_ORG = true; + const CREATE_TEST_ORG = false; + const USE_TRANSACTION = false; /** * @dataProvider ToOqlProvider @@ -409,9 +406,7 @@ class CriterionConversionTest extends ItopDataTestCase * @dataProvider OqlProvider * * @param $sOQL - * * @param $sExpectedOQL - * * @param $aExpectedCriterion * * @throws \DictExceptionUnknownLanguage @@ -425,7 +420,7 @@ class CriterionConversionTest extends ItopDataTestCase $this->CreateTagData(TAG_CLASS, TAG_ATTCODE, 'tag1', 'First'); $this->CreateTagData(TAG_CLASS, TAG_ATTCODE, 'tag2', 'Second'); - $this->OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion, "EN US"); + $this->OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion); } function OqlProvider() @@ -589,9 +584,7 @@ class CriterionConversionTest extends ItopDataTestCase * @dataProvider OqlProviderDates * * @param $sOQL - * * @param $sExpectedOQL - * * @param $aExpectedCriterion * * @throws \DictExceptionUnknownLanguage @@ -599,33 +592,11 @@ class CriterionConversionTest extends ItopDataTestCase * @throws \OQLException * @throws \CoreException */ - function testOqlToForSearchToOqlAltLanguageFR($sOQL, $sExpectedOQL, $aExpectedCriterion) + function testOqlToForSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion) { \MetaModel::GetConfig()->Set('date_and_time_format', array('default' => array('date' => 'Y-m-d', 'time' => 'H:i:s', 'date_time' => '$date $time'))); - $this->OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion, "FR FR"); + $this->OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion); } - - - /** - * @dataProvider OqlProviderDates - * - * @param $sOQL - * - * @param $sExpectedOQL - * - * @param $aExpectedCriterion - * - * @throws \DictExceptionUnknownLanguage - * @throws \MissingQueryArgument - * @throws \OQLException - * @throws \CoreException - */ - function testOqlToForSearchToOqlAltLanguageEN($sOQL, $sExpectedOQL, $aExpectedCriterion) - { - \MetaModel::GetConfig()->Set('date_and_time_format', array('default' => array('date' => 'Y-m-d', 'time' => 'H:i:s', 'date_time' => '$date $time'))); - $this->OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion, "EN US"); - } - function OqlProviderDates() { return array( @@ -706,26 +677,18 @@ class CriterionConversionTest extends ItopDataTestCase /** * * @param $sOQL - * * @param $sExpectedOQL - * * @param $aExpectedCriterion * - * @param $sLanguageCode - * * @throws \CoreException * @throws \DictExceptionUnknownLanguage * @throws \MissingQueryArgument * @throws \OQLException */ - function OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion, $sLanguageCode ) + function OqlToSearchToOqlAltLanguage($sOQL, $sExpectedOQL, $aExpectedCriterion) { $this->debug($sOQL); - - Dict::SetUserLanguage($sLanguageCode); - - $oSearchForm = new SearchForm(); $oSearch = DBSearch::FromOQL($sOQL); $aFields = $oSearchForm->GetFields(new DBObjectSet($oSearch)); diff --git a/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionParserTest.php b/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionParserTest.php index b785af418..ca366cce0 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionParserTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/search/CriterionParserTest.php @@ -33,9 +33,6 @@ use Combodo\iTop\Test\UnitTest\ItopDataTestCase; /** * @group itopRequestMgmt - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class CriterionParserTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/sources/application/search/SearchFormTest.php b/tests/php-unit-tests/unitary-tests/sources/application/search/SearchFormTest.php index d71c0d4fa..f5b579eba 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/search/SearchFormTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/search/SearchFormTest.php @@ -29,14 +29,10 @@ use Exception; /** * @group itopRequestMgmt - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class SearchFormTest extends ItopDataTestCase { - const CREATE_TEST_ORG = true; + const CREATE_TEST_ORG = false; /** * @dataProvider GetFieldsProvider diff --git a/tests/php-unit-tests/unitary-tests/sources/application/status/StatusIncTest.php b/tests/php-unit-tests/unitary-tests/sources/application/status/StatusIncTest.php index 92d1dfbbf..0ed673c3f 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/status/StatusIncTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/status/StatusIncTest.php @@ -15,11 +15,6 @@ if (!defined('DEBUG_UNIT_TEST')) { define('DEBUG_UNIT_TEST', true); } -/** - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled - */ class StatusIncTest extends ItopTestCase { /** @@ -70,7 +65,10 @@ class StatusIncTest extends ItopTestCase { $this->assertTrue(true); } - public function testStatusStartupWrongDbPwd() + /** + * @runInSeparateProcess + */ + public function testStatusStartupWrongDbPwd() { $this->RequireOnceItopFile('core/cmdbobject.class.inc.php'); $this->RequireOnceItopFile('application/utils.inc.php'); diff --git a/tests/php-unit-tests/unitary-tests/sources/application/status/StatusTest.php b/tests/php-unit-tests/unitary-tests/sources/application/status/StatusTest.php index ef5a5eb76..03ef79468 100644 --- a/tests/php-unit-tests/unitary-tests/sources/application/status/StatusTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/application/status/StatusTest.php @@ -8,6 +8,7 @@ namespace Combodo\iTop\Test\UnitTest\Status; use Combodo\iTop\Test\UnitTest\ItopTestCase; +use Config; class StatusTest extends ItopTestCase { @@ -25,10 +26,18 @@ class StatusTest extends ItopTestCase } + protected function GetPHPCommand() + { + $this->RequireOnceItopFile('application/utils.inc.php'); + $oConfig = new Config(ITOP_DEFAULT_CONFIG_FILE); + return $oConfig->Get('php_path'); + } + public function testStatusGood() { $sPath = APPROOT.'/webservices/status.php'; - exec("php $sPath", $aOutput, $iRet); + $sPHP = $this->GetPHPCommand(); + exec("$sPHP $sPath", $aOutput, $iRet); $this->assertEquals(0, $iRet, "Problem executing status page: $sPath, $iRet, aOutput:\n".var_export($aOutput, true)); } @@ -39,7 +48,8 @@ class StatusTest extends ItopTestCase { $sPath = APPROOT.'/webservices/status.php'; - exec("php $sPath", $aOutput, $iRet); + $sPHP = $this->GetPHPCommand(); + exec("$sPHP $sPath", $aOutput, $iRet); $sAdditionalInfo = "aOutput:\n".var_export($aOutput, true).'.'; //Check response diff --git a/tests/php-unit-tests/unitary-tests/synchro/DataSynchroTest.php b/tests/php-unit-tests/unitary-tests/synchro/DataSynchroTest.php index 403771b4d..8f38b2cb6 100644 --- a/tests/php-unit-tests/unitary-tests/synchro/DataSynchroTest.php +++ b/tests/php-unit-tests/unitary-tests/synchro/DataSynchroTest.php @@ -31,10 +31,6 @@ use utils; * @package Combodo\iTop\Test\UnitTest\Synchro * @group dataSynchro * @group defaultProfiles - * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class DataSynchroTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php b/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php index cd03f3cfd..985e70577 100644 --- a/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php +++ b/tests/php-unit-tests/unitary-tests/webservices/CliResetSessionTest.php @@ -10,8 +10,6 @@ use MetaModel; /** * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled */ class CliResetSessionTest extends ItopDataTestCase { diff --git a/tests/php-unit-tests/unitary-tests/webservices/RestTest.php b/tests/php-unit-tests/unitary-tests/webservices/RestTest.php index bfb980cb7..a7871888b 100644 --- a/tests/php-unit-tests/unitary-tests/webservices/RestTest.php +++ b/tests/php-unit-tests/unitary-tests/webservices/RestTest.php @@ -13,13 +13,12 @@ use utils; * @group restApi * @group defaultProfiles * - * @runTestsInSeparateProcesses - * @preserveGlobalState disabled - * @backupGlobals disabled + * @runClassInSeparateProcess */ class RestTest extends ItopDataTestCase { const USE_TRANSACTION = false; + const CREATE_TEST_ORG = false; const ENUM_JSONDATA_AS_STRING = 0; const ENUM_JSONDATA_AS_FILE = 1;