2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
22 * @copyright 2012 David Monllaó
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 defined('MOODLE_INTERNAL') || die();
28 require_once(__DIR__ . '/../lib.php');
31 * Behat command related utils
35 * @copyright 2013 David Monllaó
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43 const DOCS_URL = 'http://docs.moodle.org/dev/Acceptance_testing';
46 * Ensures the behat dir exists in moodledata
47 * @return string Full path
49 public static function get_behat_dir() {
52 $behatdir = $CFG->behat_dataroot . '/behat';
54 if (!is_dir($behatdir)) {
55 if (!mkdir($behatdir, $CFG->directorypermissions, true)) {
56 behat_error(BEHAT_EXITCODE_PERMISSIONS, 'Directory ' . $behatdir . ' can not be created');
60 if (!is_writable($behatdir)) {
61 behat_error(BEHAT_EXITCODE_PERMISSIONS, 'Directory ' . $behatdir . ' is not writable');
68 * Returns the executable path
71 public final static function get_behat_command() {
72 return 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'behat';
76 * Runs behat command with provided options
78 * Execution continues when the process finishes
80 * @param string $options Defaults to '' so tests would be executed
81 * @return array CLI command outputs [0] => string, [1] => integer
83 public final static function run($options = '') {
86 $currentcwd = getcwd();
88 exec(self::get_behat_command() . ' ' . $options, $output, $code);
91 return array($output, $code);
95 * Checks if behat is set up and working
97 * Uses notice() instead of behat_error() because is
98 * also called from web interface
100 * It checks behat dependencies have been installed and runs
101 * the behat help command to ensure it works as expected
103 * @param bool $checkphp Extra check for the PHP version
104 * @return int Error code or 0 if all ok
106 public static function behat_setup_problem($checkphp = false) {
109 // We don't check the PHP version if $CFG->behat_switchcompletely has been enabled.
110 // Here we are in CLI.
111 if (empty($CFG->behat_switchcompletely) && $checkphp && version_compare(PHP_VERSION, '5.4.0', '<')) {
112 behat_error(BEHAT_EXITCODE_REQUIREMENT, 'PHP 5.4 is required. See config-dist.php for possible alternatives');
115 $clibehaterrorstr = "Behat dependencies not installed. Ensure you ran the composer installer. " . self::DOCS_URL . "#Installation\n";
118 if (!self::are_behat_dependencies_installed()) {
124 $msg = get_string('wrongbehatsetup', 'tool_behat');
125 $docslink = self::DOCS_URL . '#Installation';
126 $docslink = html_writer::tag('a', $docslink, array('href' => $docslink, 'target' => '_blank'));
127 $msg .= get_string('moreinfoin', 'tool_behat', $docslink);
129 $msg = $clibehaterrorstr;
132 self::output_msg($msg);
133 return BEHAT_EXITCODE_COMPOSER;
136 // Behat test command.
137 list($output, $code) = self::run(' --help');
140 // Returning composer error code to avoid conflicts with behat and moodle error codes.
142 $msg = get_string('wrongbehatsetup', 'tool_behat');
144 $msg = $clibehaterrorstr;
146 self::output_msg($msg);
147 return BEHAT_EXITCODE_COMPOSER;
150 // Checking behat dataroot existence otherwise echo about admin/tool/behat/cli/init.php.
151 if (empty($CFG->behat_dataroot) || !is_dir($CFG->behat_dataroot) || !is_writable($CFG->behat_dataroot)) {
152 self::output_msg(get_string('runclitool', 'tool_behat', 'php admin/tool/behat/cli/init.php'));
153 return BEHAT_EXITCODE_CONFIG;
160 * Has the site installed composer with --dev option
163 public static function are_behat_dependencies_installed() {
164 if (!is_dir(__DIR__ . '/../../../vendor/behat')) {
173 * Used in CLI + web UI methods. Stops the
179 protected static function output_msg($msg) {
182 // General info about the tool purpose.
183 $msg = get_string('aim', 'tool_behat') . '<br /><br />' . $msg;