MDL-37046 behat: Quick fix
[moodle.git] / lib / behat / classes / behat_command.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
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.
8 //
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.
13 //
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/>.
17 /**
18  * Behat command utils
19  *
20  * @package    core
21  * @category   test
22  * @copyright  2012 David MonllaĆ³
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 require_once(__DIR__ . '/../lib.php');
30 /**
31  * Behat command related utils
32  *
33  * @package    core
34  * @category   test
35  * @copyright  2013 David MonllaĆ³
36  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37  */
38 class behat_command {
40     /**
41      * Docs url
42      */
43     const DOCS_URL = 'http://docs.moodle.org/dev/Acceptance_testing';
45     /**
46      * Ensures the behat dir exists in moodledata
47      * @return string Full path
48      */
49     public static function get_behat_dir() {
50         global $CFG;
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');
57             }
58         }
60         if (!is_writable($behatdir)) {
61             behat_error(BEHAT_EXITCODE_PERMISSIONS, 'Directory ' . $behatdir . ' is not writable');
62         }
64         return $behatdir;
65     }
67     /**
68      * Returns the executable path
69      * @return string
70      */
71     public final static function get_behat_command() {
72         return 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'behat';
73     }
75     /**
76      * Runs behat command with provided options
77      *
78      * Execution continues when the process finishes
79      *
80      * @param  string $options  Defaults to '' so tests would be executed
81      * @return array            CLI command outputs [0] => string, [1] => integer
82      */
83     public final static function run($options = '') {
84         global $CFG;
86         $currentcwd = getcwd();
87         chdir($CFG->dirroot);
88         exec(self::get_behat_command() . ' ' . $options, $output, $code);
89         chdir($currentcwd);
91         return array($output, $code);
92     }
94     /**
95      * Checks if behat is set up and working
96      *
97      * Uses notice() instead of behat_error() because is
98      * also called from web interface
99      *
100      * It checks behat dependencies have been installed and runs
101      * the behat help command to ensure it works as expected
102      *
103      * @param  bool $checkphp Extra check for the PHP version
104      * @return void
105      */
106     public static function check_behat_setup($checkphp = false) {
107         global $CFG;
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');
113         }
115         // Moodle setting.
116         if (!self::are_behat_dependencies_installed()) {
118             $msg = get_string('wrongbehatsetup', 'tool_behat');
120             // With HTML.
121             $docslink = self::DOCS_URL . '#Installation';
122             if (!CLI_SCRIPT) {
123                 $docslink = html_writer::tag('a', $docslink, array('href' => $docslink, 'target' => '_blank'));
124             }
125             $msg .= '. ' . get_string('moreinfoin', 'tool_behat', $docslink);
126             notice($msg);
127         }
129         // Behat test command.
130         list($output, $code) = self::run(' --help');
132         if ($code != 0) {
133             notice(get_string('wrongbehatsetup', 'tool_behat'));
134         }
136         // Checking behat dataroot existence otherwise notice about admin/tool/behat/cli/util.php.
137         if (empty($CFG->behat_dataroot) || !is_dir($CFG->behat_dataroot) || !is_writable($CFG->behat_dataroot)) {
138             notice(get_string('runclitool', 'tool_behat', 'php admin/tool/behat/cli/util.php'));
139         }
140     }
142     /**
143      * Has the site installed composer with --dev option
144      * @return bool
145      */
146     public static function are_behat_dependencies_installed() {
147         if (!is_dir(__DIR__ . '/../../../vendor/behat')) {
148             return false;
149         }
150         return true;
151     }