. /** * CLI tool with utilities to manage Behat integration in Moodle * * All CLI utilities uses $CFG->behat_dataroot and $CFG->prefix_dataroot as * $CFG->dataroot and $CFG->prefix * * @package tool_behat * @copyright 2012 David Monllaó * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ if (isset($_SERVER['REMOTE_ADDR'])) { die(); // No access from web!. } // Basic functions. require_once(__DIR__ . '/../../../../lib/clilib.php'); require_once(__DIR__ . '/../../../../lib/behat/lib.php'); // CLI options. list($options, $unrecognized) = cli_get_params( array( 'help' => false, 'install' => false, 'drop' => false, 'enable' => false, 'disable' => false, 'diag' => false ), array( 'h' => 'help' ) ); // Checking util.php CLI script usage. $help = " Behat utilities to manage the test environment Options: --install Installs the test environment for acceptance tests --drop Drops the database tables and the dataroot contents --enable Enables test environment and updates tests list --disable Disables test environment --diag Get behat test environment status code -h, --help Print out this help Example from Moodle root directory: \$ php admin/tool/behat/cli/util.php --enable More info in http://docs.moodle.org/dev/Acceptance_testing#Running_tests "; if (!empty($options['help'])) { echo $help; exit(0); } // Checking $CFG->behat_* vars and values. define('BEHAT_UTIL', true); define('CLI_SCRIPT', true); define('ABORT_AFTER_CONFIG', true); define('NO_OUTPUT_BUFFERING', true); error_reporting(E_ALL | E_STRICT); ini_set('display_errors', '1'); ini_set('log_errors', '1'); // Getting $CFG data. require_once(__DIR__ . '/../../../../config.php'); // CFG->behat_prefix must be set and with value different than CFG->prefix and phpunit_prefix. if (empty($CFG->behat_prefix) || ($CFG->behat_prefix == $CFG->prefix) || (!empty($CFG->phpunit_prefix) && $CFG->behat_prefix == $CFG->phpunit_prefix)) { behat_error(BEHAT_EXITCODE_CONFIG, 'Define $CFG->behat_prefix in config.php with a value different than $CFG->prefix and $CFG->phpunit_prefix'); } // CFG->behat_dataroot must be set and with value different than CFG->dataroot and phpunit_dataroot. if (empty($CFG->behat_dataroot) || ($CFG->behat_dataroot == $CFG->dataroot) || (!empty($CFG->phpunit_dataroot) && $CFG->behat_dataroot == $CFG->phpunit_dataroot)) { behat_error(BEHAT_EXITCODE_CONFIG, 'Define $CFG->behat_dataroot in config.php with a value different than $CFG->dataroot and $CFG->phpunit_dataroot'); } // Create behat_dataroot if it doesn't exists. if (!file_exists($CFG->behat_dataroot)) { if (!mkdir($CFG->behat_dataroot, $CFG->directorypermissions)) { behat_error(BEHAT_EXITCODE_PERMISSIONS, '$CFG->behat_dataroot directory can not be created'); } } if (!is_dir($CFG->behat_dataroot) || !is_writable($CFG->behat_dataroot)) { behat_error(BEHAT_EXITCODE_PERMISSIONS, '$CFG->behat_dataroot directory has no permissions or is not a directory'); } // Check that the directory does not contains other things. if (!file_exists("$CFG->behat_dataroot/behattestdir.txt")) { if ($dh = opendir($CFG->behat_dataroot)) { while (($file = readdir($dh)) !== false) { if ($file === 'behat' or $file === '.' or $file === '..' or $file === '.DS_Store') { continue; } behat_error(BEHAT_EXITCODE_CONFIG, '$CFG->behat_dataroot directory is not empty, ensure this is the directory where you want to install behat test dataroot'); } closedir($dh); unset($dh); unset($file); } // Now we create dataroot directory structure for behat tests. testing_initdataroot($CFG->behat_dataroot, 'behat'); } // Overrides vars with behat-test ones. $vars = array('wwwroot', 'prefix', 'dataroot'); foreach ($vars as $var) { $CFG->{$var} = $CFG->{'behat_' . $var}; } $CFG->noemailever = true; $CFG->passwordsaltmain = 'moodle'; // Unset cache and temp directories to reset them again with the new $CFG->dataroot. unset($CFG->cachedir); unset($CFG->tempdir); // Continues setup. define('ABORT_AFTER_CONFIG_CANCEL', true); require("$CFG->dirroot/lib/setup.php"); require_once($CFG->libdir.'/adminlib.php'); require_once($CFG->libdir.'/upgradelib.php'); require_once($CFG->libdir.'/clilib.php'); require_once($CFG->libdir.'/pluginlib.php'); require_once($CFG->libdir.'/installlib.php'); require_once($CFG->libdir.'/testing/classes/test_lock.php'); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } // Behat utilities. require_once($CFG->libdir . '/behat/classes/util.php'); require_once($CFG->libdir . '/behat/classes/behat_command.php'); // Run command (only one per time). if ($options['install']) { behat_util::install_site(); mtrace("Acceptance tests site installed"); } else if ($options['drop']) { // Ensure no tests are running. test_lock::acquire('behat'); behat_util::drop_site(); mtrace("Acceptance tests site dropped"); } else if ($options['enable']) { behat_util::start_test_mode(); $runtestscommand = behat_command::get_behat_command() . ' --config ' . $CFG->behat_dataroot . DIRECTORY_SEPARATOR . 'behat' . DIRECTORY_SEPARATOR . 'behat.yml'; mtrace("Acceptance tests environment enabled, to run the tests use:\n " . $runtestscommand); } else if ($options['disable']) { behat_util::stop_test_mode(); mtrace("Acceptance tests environment disabled"); } else if ($options['diag']) { $code = behat_util::get_behat_status(); exit($code); } else { echo $help; } exit(0);