diff --git a/.jenkins/bin/archive/gather_external_files.sh b/.jenkins/bin/archive/gather_external_files.sh deleted file mode 100755 index e69de29bb..000000000 diff --git a/.jenkins/bin/init/append_files.sh b/.jenkins/bin/init/append_files.sh deleted file mode 100755 index 2e383001e..000000000 --- a/.jenkins/bin/init/append_files.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -set -x - -# create target dirs -mkdir -p var -mkdir -p toolkit - -# cleanup target dirs -rm -rf toolkit/* - -# fill target dirs -curl http://www.combodo.com/documentation/iTopDataModelToolkit-2.3.zip | tar xvz --directory toolkit -cp -r .jenkins/configuration/default-environment/unattended_install/* toolkit diff --git a/.jenkins/bin/init/composer_install.sh b/.jenkins/bin/init/composer_install.sh deleted file mode 100755 index cfea9704f..000000000 --- a/.jenkins/bin/init/composer_install.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -x - -# on the root dir -composer install - - -# under the test dir -cd test -composer install diff --git a/.jenkins/bin/init/debug.sh b/.jenkins/bin/init/debug.sh deleted file mode 100755 index 8f9ea404a..000000000 --- a/.jenkins/bin/init/debug.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -x - -whoami -pwd -ls - -echo "$BRANCH_NAME:${BRANCH_NAME}" - -echo "printenv :" -printenv - diff --git a/.jenkins/bin/tests/phpunit.sh b/.jenkins/bin/tests/phpunit.sh deleted file mode 100755 index 3c327f6c9..000000000 --- a/.jenkins/bin/tests/phpunit.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -x - -cd test - -export DEBUG_UNIT_TEST="0" - -php vendor/bin/phpunit --log-junit ../var/test/phpunit-log.junit.xml --teamcity \ No newline at end of file diff --git a/.jenkins/bin/unattended_install/default_env.sh b/.jenkins/bin/unattended_install/default_env.sh deleted file mode 100755 index e4a9e8c98..000000000 --- a/.jenkins/bin/unattended_install/default_env.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -set -x - -cd toolkit -php unattended_install.php default-params.xml \ No newline at end of file diff --git a/.jenkins/configuration/default-environment/unattended_install/default-config-itop.php b/.jenkins/configuration/default-environment/unattended_install/default-config-itop.php deleted file mode 100644 index adb939864..000000000 --- a/.jenkins/configuration/default-environment/unattended_install/default-config-itop.php +++ /dev/null @@ -1,285 +0,0 @@ - 'iTop is temporarily frozen, please wait... (the admin team)', - - // access_mode: Access mode: ACCESS_READONLY = 0, ACCESS_ADMIN_WRITE = 2, ACCESS_FULL = 3 - // default: 3 - 'access_mode' => 3, - - 'allowed_login_types' => 'form|basic|external', - - // apc_cache.enabled: If set, the APC cache is allowed (the PHP extension must also be active) - // default: true - 'apc_cache.enabled' => true, - - // apc_cache.query_ttl: Time to live set in APC for the prepared queries (seconds - 0 means no timeout) - // default: 3600 - 'apc_cache.query_ttl' => 3600, - - // app_root_url: Root URL used for navigating within the application, or from an email to the application (you can put $SERVER_NAME$ as a placeholder for the server's name) - // default: '' - 'app_root_url' => 'http://127.0.0.1/itop/svn/trunk/', - - // buttons_position: Position of the forms buttons: bottom | top | both - // default: 'both' - 'buttons_position' => 'both', - - // cas_include_path: The path where to find the phpCAS library - // default: '/usr/share/php' - 'cas_include_path' => '/usr/share/php', - - // cron_max_execution_time: Duration (seconds) of the page cron.php, must be shorter than php setting max_execution_time and shorter than the web server response timeout - // default: 600 - 'cron_max_execution_time' => 600, - - // csv_file_default_charset: Character set used by default for downloading and uploading data as a CSV file. Warning: it is case sensitive (uppercase is preferable). - // default: 'ISO-8859-1' - 'csv_file_default_charset' => 'ISO-8859-1', - - 'csv_import_charsets' => array ( - ), - - // csv_import_history_display: Display the history tab in the import wizard - // default: false - 'csv_import_history_display' => false, - - // date_and_time_format: Format for date and time display (per language) - // default: array ( - // 'default' => - // array ( - // 'date' => 'Y-m-d', - // 'time' => 'H:i:s', - // 'date_time' => '$date $time', - // ), - // ) - 'date_and_time_format' => array ( - 'default' => - array ( - 'date' => 'Y-m-d', - 'time' => 'H:i:s', - 'date_time' => '$date $time', - ), - 'FR FR' => - array ( - 'date' => 'd/m/Y', - 'time' => 'H:i:s', - 'date_time' => '$date $time', - ), - ), - - 'db_host' => '', - - 'db_name' => 'itop_ci_main', - - 'db_pwd' => 'IKnowYouSeeMeInJenkinsConf', - - 'db_subname' => '', - - 'db_user' => 'jenkins_itop', - - // deadline_format: The format used for displaying "deadline" attributes: any string with the following placeholders: $date$, $difference$ - // default: '$difference$' - 'deadline_format' => '$difference$', - - 'default_language' => 'EN US', - - // disable_attachments_download_legacy_portal: Disable attachments download from legacy portal - // default: true - 'disable_attachments_download_legacy_portal' => true, - - // draft_attachments_lifetime: Lifetime (in seconds) of drafts' attachments and inline images: after this duration, the garbage collector will delete them. - // default: 3600 - 'draft_attachments_lifetime' => 3600, - - // email_asynchronous: If set, the emails are sent off line, which requires cron.php to be activated. Exception: some features like the email test utility will force the serialized mode - // default: false - 'email_asynchronous' => false, - - // email_default_sender_address: Default address provided in the email from header field. - // default: '' - 'email_default_sender_address' => '', - - // email_default_sender_label: Default label provided in the email from header field. - // default: '' - 'email_default_sender_label' => '', - - // email_transport: Mean to send emails: PHPMail (uses the function mail()) or SMTP (implements the client protocole) - // default: 'PHPMail' - 'email_transport' => 'SMTP', - - // email_transport_smtp.host: host name or IP address (optional) - // default: 'localhost' - 'email_transport_smtp.host' => 'smtp.combodo.com', - - // email_transport_smtp.password: Authentication password (optional) - // default: '' - 'email_transport_smtp.password' => 'IDoNotWork', - - // email_transport_smtp.port: port number (optional) - // default: 25 - 'email_transport_smtp.port' => 25, - - // email_transport_smtp.username: Authentication user (optional) - // default: '' - 'email_transport_smtp.username' => 'test2@combodo.com', - - // email_validation_pattern: Regular expression to validate/detect the format of an eMail address - // default: '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,}' - 'email_validation_pattern' => '[a-zA-Z0-9._&\'-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,}', - - 'encryption_key' => '@iT0pEncr1pti0n!', - - 'ext_auth_variable' => '$_SERVER[\'REMOTE_USER\']', - - 'fast_reload_interval' => '60', - - // graphviz_path: Path to the Graphviz "dot" executable for graphing objects lifecycle - // default: '/usr/bin/dot' - 'graphviz_path' => '/usr/bin/dot', - - // inline_image_max_display_width: The maximum width (in pixels) when displaying images inside an HTML formatted attribute. Images will be displayed using this this maximum width. - // default: '250' - 'inline_image_max_display_width' => 250, - - // inline_image_max_storage_width: The maximum width (in pixels) when uploading images to be used inside an HTML formatted attribute. Images larger than the given size will be downsampled before storing them in the database. - // default: '1600' - 'inline_image_max_storage_width' => 1600, - - // link_set_attribute_qualifier: Link set from string: attribute qualifier (encloses both the attcode and the value) - // default: '\'' - 'link_set_attribute_qualifier' => '\'', - - // link_set_attribute_separator: Link set from string: attribute separator - // default: ';' - 'link_set_attribute_separator' => ';', - - // link_set_item_separator: Link set from string: line separator - // default: '|' - 'link_set_item_separator' => '|', - - // link_set_value_separator: Link set from string: value separator (between the attcode and the value itself - // default: ':' - 'link_set_value_separator' => ':', - - 'log_global' => true, - - 'log_issue' => true, - - 'log_notification' => true, - - 'log_web_service' => true, - - // max_combo_length: The maximum number of elements in a drop-down list. If more then an autocomplete will be used - // default: 50 - 'max_combo_length' => 50, - - 'max_display_limit' => '15', - - // max_linkset_output: Maximum number of items shown when getting a list of related items in an email, using the form $this->some_list$. 0 means no limit. - // default: 100 - 'max_linkset_output' => 100, - - 'min_display_limit' => '10', - - // online_help: Hyperlink to the online-help web page - // default: 'http://www.combodo.com/itop-help' - 'online_help' => 'http://www.combodo.com/itop-help', - - // php_path: Path to the php executable in CLI mode - // default: 'php' - 'php_path' => 'php', - - // portal_tickets: CSV list of classes supported in the portal - // default: 'UserRequest' - 'portal_tickets' => 'UserRequest', - - 'query_cache_enabled' => true, - - // search_manual_submit: Force manual submit of search requests (class => true) - // default: false - 'search_manual_submit' => array ( - 'Person' => true, - ), - - 'secure_connection_required' => false, - - // session_name: The name of the cookie used to store the PHP session id - // default: 'iTop' - 'session_name' => 'iTop', - - // shortcut_actions: Actions that are available as direct buttons next to the "Actions" menu - // default: 'UI:Menu:Modify,UI:Menu:New' - 'shortcut_actions' => 'UI:Menu:Modify,UI:Menu:New', - - // source_dir: Source directory for the datamodel files. (which gets compiled to env-production). - // default: '' - 'source_dir' => 'datamodels/2.x/', - - 'standard_reload_interval' => '300', - - // synchro_trace: Synchronization details: none, display, save (includes 'display') - // default: 'none' - 'synchro_trace' => 'none', - - // timezone: Timezone (reference: http://php.net/manual/en/timezones.php). If empty, it will be left unchanged and MUST be explicitely configured in PHP - // default: 'Europe/Paris' - 'timezone' => 'Europe/Paris', - - // tracking_level_linked_set_default: Default tracking level if not explicitely set at the attribute level, for AttributeLinkedSet (defaults to NONE in case of a fresh install, LIST otherwise - this to preserve backward compatibility while upgrading from a version older than 2.0.3 - see TRAC #936) - // default: 1 - 'tracking_level_linked_set_default' => 0, - - // url_validation_pattern: Regular expression to validate/detect the format of an URL (URL attributes and Wiki formatting for Text attributes) - // default: '(https?|ftp)\\://([a-zA-Z0-9+!*(),;?&=\\$_.-]+(\\:[a-zA-Z0-9+!*(),;?&=\\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\\:[0-9]{2,5})?(/([a-zA-Z0-9%+\\$_-]\\.?)+)*/?(\\?[a-zA-Z+&\\$_.-][a-zA-Z0-9;:[\\]@&%=+/\\$_.-]*)?(#[a-zA-Z_.-][a-zA-Z0-9+\\$_.-]*)?' - 'url_validation_pattern' => '(https?|ftp)\\://([a-zA-Z0-9+!*(),;?&=\\$_.-]+(\\:[a-zA-Z0-9+!*(),;?&=\\$_.-]+)?@)?([a-zA-Z0-9-.]{3,})(\\:[0-9]{2,5})?(/([a-zA-Z0-9%+\\$_-]\\.?)+)*/?(\\?[a-zA-Z+&\\$_.-][a-zA-Z0-9;:[\\]@&%=+/\\$_.-]*)?(#[a-zA-Z_.-][a-zA-Z0-9+\\$_.-]*)?', -); - -/** - * - * Modules specific settings - * - */ -$MyModuleSettings = array( - 'itop-attachments' => array ( - 'allowed_classes' => array ( - 0 => 'Ticket', - ), - 'position' => 'relations', - 'preview_max_width' => 290, - ), - 'itop-backup' => array ( - 'mysql_bindir' => '', - 'week_days' => 'monday, tuesday, wednesday, thursday, friday', - 'time' => '23:30', - 'retention_count' => 5, - 'enabled' => true, - 'debug' => false, - ), - 'molkobain-console-tooltips' => array ( - 'decoration_class' => 'fas fa-question', - 'enabled' => true, - ), -); - -/** - * - * Data model modules to be loaded. Names are specified as relative paths - * - */ -$MyModules = array( - 'addons' => array ( - 'user rights' => 'addons/userrights/userrightsprofile.class.inc.php', - ), -); -?> diff --git a/.jenkins/configuration/default-environment/unattended_install/unattended_install.php b/.jenkins/configuration/default-environment/unattended_install/unattended_install.php deleted file mode 100644 index 7f67bee85..000000000 --- a/.jenkins/configuration/default-environment/unattended_install/unattended_install.php +++ /dev/null @@ -1,190 +0,0 @@ -Get('mode'); - -if ($sMode == 'install') -{ - echo "Installation mode detected.\n"; - $bClean = utils::ReadParam('clean', false, true /* CLI allowed */); - if ($bClean) - { - echo "Cleanup mode detected.\n"; - $sTargetEnvironment = $oParams->Get('target_env', ''); - if ($sTargetEnvironment == '') - { - $sTargetEnvironment = 'production'; - } - $sTargetDir = APPROOT.'env-'.$sTargetEnvironment; - - // Configuration file - $sConfigFile = APPCONF.$sTargetEnvironment.'/'.ITOP_CONFIG_FILE; - if (file_exists($sConfigFile)) - { - echo "Trying to delete the configuration file: '$sConfigFile'.\n"; - @chmod($sConfigFile, 0770); // RWX for owner and group, nothing for others - unlink($sConfigFile); - } - else - { - echo "No config file to delete ($sConfigFile does not exist).\n"; - } - - // env-xxx directory - if (file_exists($sTargetDir)) - { - if (is_dir($sTargetDir)) - { - echo "Emptying the target directory '$sTargetDir'.\n"; - SetupUtils::tidydir($sTargetDir); - } - else - { - die("ERROR the target dir '$sTargetDir' exists, but is NOT a directory !!!\nExiting.\n"); - } - } - else - { - echo "No target directory to delete ($sTargetDir does not exist).\n"; - } - - // Database - $aDBSettings = $oParams->Get('database', array()); - $sDBServer = $aDBSettings['server']; - $sDBUser = $aDBSettings['user']; - $sDBPwd = $aDBSettings['pwd']; - $sDBName = $aDBSettings['name']; - $sDBPrefix = $aDBSettings['prefix']; - - if ($sDBPrefix != '') - { - die("Cleanup not implemented for a partial database (prefix= '$sDBPrefix')\nExiting."); - } - - $oMysqli = new mysqli($sDBServer, $sDBUser, $sDBPwd); - if ($oMysqli->connect_errno) - { - die("Cannot connect to the MySQL server (".$mysqli->connect_errno . ") ".$mysqli->connect_error."\nExiting"); - } - else - { - if ($oMysqli->select_db($sDBName)) - { - echo "Deleting database '$sDBName'\n"; - $oMysqli->query("DROP DATABASE `$sDBName`"); - } - else - { - echo "The database '$sDBName' does not seem to exist. Nothing to cleanup.\n"; - } - } - } -} - -$bHasErrors = false; -$aChecks = SetupUtils::CheckBackupPrerequisites(APPROOT.'data'); // mmm should be the backup destination dir - -$aSelectedModules = $oParams->Get('selected_modules'); -$sSourceDir = $oParams->Get('source_dir', 'datamodels/latest'); -$sExtensionDir = $oParams->Get('extensions_dir', 'extensions'); -$aChecks = array_merge($aChecks, SetupUtils::CheckSelectedModules($sSourceDir, $sExtensionDir, $aSelectedModules)); - - -foreach($aChecks as $oCheckResult) -{ - switch($oCheckResult->iSeverity) - { - case CheckResult::ERROR: - $bHasErrors = true; - $sHeader = "Error"; - break; - - case CheckResult::WARNING: - $sHeader = "Warning"; - break; - - case CheckResult::INFO: - default: - $sHeader = "Info"; - break; - } - echo $sHeader.": ".$oCheckResult->sLabel; - if (strlen($oCheckResult->sDescription)) - { - echo ' - '.$oCheckResult->sDescription; - } - echo "\n"; -} - -if ($bHasErrors) -{ - echo "Encountered stopper issues. Aborting...\n"; - die; -} - -$bFoundIssues = false; - -$bInstall = utils::ReadParam('install', true, true /* CLI allowed */); -if ($bInstall) -{ - echo "Starting the unattended installation...\n"; - $oWizard = new ApplicationInstaller($oParams); - $bRes = $oWizard->ExecuteAllSteps(); - if (!$bRes) - { - echo "\nencountered installation issues!"; - $bFoundIssues = true; - } -} -else -{ - echo "No installation requested.\n"; -} -if (!$bFoundIssues && $bCheckConsistency) -{ - echo "Checking data model consistency.\n"; - ob_start(); - $sCheckRes = ''; - try - { - MetaModel::CheckDefinitions(false); - $sCheckRes = ob_get_clean(); - } - catch(Exception $e) - { - $sCheckRes = ob_get_clean()."\nException: ".$e->getMessage(); - } - if (strlen($sCheckRes) > 0) - { - echo $sCheckRes; - echo "\nfound consistency issues!"; - $bFoundIssues = true; - } -} - -if (!$bFoundIssues) -{ - // last line: used to check the install - // the only way to track issues in case of Fatal error or even parsing error! - echo "\ninstalled!"; - exit; -} diff --git a/Jenkinsfile b/Jenkinsfile index 94ac751e6..56f298717 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,65 +1,11 @@ -pipeline { - agent any - stages { +def infra - stage('init') { - parallel { - stage('debug') { - steps { - sh './.jenkins/bin/init/debug.sh' - } - } - stage('append files to project') { - steps { - sh './.jenkins/bin/init/append_files.sh' - } - } - stage('composer install') { - steps { - sh './.jenkins/bin/init/composer_install.sh' - } - } - } - } +node(){ + checkout scm - stage('unattended_install') { - parallel { - stage('unattended_install default env') { - steps { - sh './.jenkins/bin/unattended_install/default_env.sh' - } - } - } - } - - stage('test') { - parallel { - stage('phpunit') { - steps { - sh './.jenkins/bin/tests/phpunit.sh' - } - } - } - } - - } - - post { - always { - junit 'var/test/phpunit-log.junit.xml' - } - failure { - slackSend(channel: "#jenkins-itop", color: '#FF0000', message: "Ho no! Build failed! (${currentBuild.result}), Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})") - } - fixed { - slackSend(channel: "#jenkins-itop", color: '#FFa500', message: "Yes! Build repaired! (${currentBuild.result}), Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})") - } - } - - environment { - DEBUG_UNIT_TEST = '0' - } - options { - timeout(time: 20, unit: 'MINUTES') - } + infra = load '/var/lib/jenkins/workspace/itop-test-infra_master/src/Infra.groovy' } + + +infra.call() + diff --git a/test/backups/backup-itop.tar.gz b/test/backups/backup-itop.tar.gz new file mode 100644 index 000000000..ed2f4e380 Binary files /dev/null and b/test/backups/backup-itop.tar.gz differ diff --git a/test/ci_description.ini b/test/ci_description.ini new file mode 100644 index 000000000..dfa005287 --- /dev/null +++ b/test/ci_description.ini @@ -0,0 +1,8 @@ +[itop] +itop_setup=test/setup_params/default-params.xml +itop_backup=test/backups/backup-itop.tar.gz + +[phpunit] +; when empty phpunit_xml => no phpunit test performed +; phpunit xml file description. required for phpunit testing +phpunit_xml=test/phpunit.xml.dist diff --git a/test/core/UserRightsTest.php b/test/core/UserRightsTest.php index d6741ac96..3f681ffd1 100644 --- a/test/core/UserRightsTest.php +++ b/test/core/UserRightsTest.php @@ -27,11 +27,26 @@ namespace Combodo\iTop\Test\UnitTest\Core; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; -use PHPUnit\Framework\TestCase; use UserRights; +/** + * @runTestsInSeparateProcesses + * @preserveGlobalState disabled + * @backupGlobals disabled + */ class UserRightsTest extends ItopDataTestCase { + public function setUp() + { + parent::setUp(); // TODO: Change the autogenerated stub + + try{ + self::CreateUser('admin', 1); + } + catch(\CoreCannotSaveObjectException $e) + { + } + } public static $aClasses = array( 'FunctionalCI' => array('class' => 'FunctionalCI', 'attcode' => 'name'), diff --git a/.jenkins/configuration/default-environment/unattended_install/default-params.xml b/test/setup_params/default-params.xml similarity index 91% rename from .jenkins/configuration/default-environment/unattended_install/default-params.xml rename to test/setup_params/default-params.xml index 83bc798d3..a4c34e769 100644 --- a/.jenkins/configuration/default-environment/unattended_install/default-params.xml +++ b/test/setup_params/default-params.xml @@ -1,13 +1,13 @@ - upgrade + install datamodels/2.x/ 2.5.0 - /var/lib/jenkins/workspace/iTop-CI/unattended_install/default-config-itop.php + default-config-itop.php extensions production @@ -20,7 +20,7 @@ - http://127.0.0.1/itop/svn/trunk/ + http://localhost/iTop/ /usr/bin/dot admin diff --git a/test/setup_params/setup.xml b/test/setup_params/setup.xml new file mode 100644 index 000000000..a7c9db554 --- /dev/null +++ b/test/setup_params/setup.xml @@ -0,0 +1,79 @@ + + + install + + + + /var/www/html/iTop/data/backups/manual/setup-2020-07-15_15_52 + /var/www/html/iTop//conf/production/config-itop.php + + + datamodels/2.x/ + 2.7.1 + + extensions + production + + + localhost + iTop + **removed** + toto + + + + + http://localhost/iTop/ + /usr/bin/dot + + admin + **removed** + EN US + + EN US + + authent-cas + authent-external + authent-ldap + authent-local + itop-backup + itop-config + itop-files-information + itop-portal-base + itop-profiles-itil + itop-sla-computation + itop-tickets + itop-welcome-itil + itop-config-mgmt + itop-attachments + combodo-db-tools + itop-core-update + itop-hub-connector + itop-datacenter-mgmt + itop-endusers-devices + itop-storage-mgmt + itop-virtualization-mgmt + itop-bridge-virtualization-storage + itop-service-mgmt + itop-request-mgmt + itop-portal + itop-change-mgmt + itop-knownerror-mgmt + + + itop-config-mgmt-core + itop-config-mgmt-datacenter + itop-config-mgmt-end-user + itop-config-mgmt-storage + itop-config-mgmt-virtualization + itop-service-mgmt-enterprise + itop-ticket-mgmt-simple-ticket + itop-ticket-mgmt-simple-ticket-enhanced-portal + itop-change-mgmt-simple + itop-kown-error-mgmt + + 1 + + + +