MDL-41592 behat: Allow alt wwwroot to be set for acceptance testing
[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 int Error code or 0 if all ok
105      */
106     public static function behat_setup_problem($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) && empty($CFG->behat_wwwroot) && $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         $clibehaterrorstr = "Behat dependencies not installed. Ensure you ran the composer installer. " . self::DOCS_URL . "#Installation\n";
117         // Moodle setting.
118         if (!self::are_behat_dependencies_installed()) {
121             // With HTML.
122             if (!CLI_SCRIPT) {
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);
128             } else {
129                 $msg = $clibehaterrorstr;
130             }
132             self::output_msg($msg);
133             return BEHAT_EXITCODE_COMPOSER;
134         }
136         // Behat test command.
137         list($output, $code) = self::run(' --help');
139         if ($code != 0) {
140             // Returning composer error code to avoid conflicts with behat and moodle error codes.
141             if (!CLI_SCRIPT) {
142                 $msg = get_string('wrongbehatsetup', 'tool_behat');
143             } else {
144                 $msg = $clibehaterrorstr;
145             }
146             self::output_msg($msg);
147             return BEHAT_EXITCODE_COMPOSER;
148         }
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;
154         }
156         return 0;
157     }
159     /**
160      * Has the site installed composer with --dev option
161      * @return bool
162      */
163     public static function are_behat_dependencies_installed() {
164         if (!is_dir(__DIR__ . '/../../../vendor/behat')) {
165             return false;
166         }
167         return true;
168     }
170     /**
171      * Outputs a message.
172      *
173      * Used in CLI + web UI methods. Stops the
174      * execution in web.
175      *
176      * @param string $msg
177      * @return void
178      */
179     protected static function output_msg($msg) {
181         if (!CLI_SCRIPT) {
182             // General info about the tool purpose.
183             $msg = get_string('aim', 'tool_behat') . '<br /><br />' . $msg;
184             notice($msg);
185         } else {
186             echo $msg;
187         }
188     }