diff --git a/admin/tool/behat/cli/util.php b/admin/tool/behat/cli/util.php index 28c933a0e2f..b4047579d9e 100644 --- a/admin/tool/behat/cli/util.php +++ b/admin/tool/behat/cli/util.php @@ -183,8 +183,8 @@ if ($options['install']) { 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'; + $runtestscommand = behat_command::get_behat_command(true) . + ' --config ' . behat_config_manager::get_behat_cli_config_filepath(); mtrace("Acceptance tests environment enabled, to run the tests use:\n " . $runtestscommand); } else if ($options['disable']) { behat_util::stop_test_mode(); diff --git a/lib/behat/classes/behat_command.php b/lib/behat/classes/behat_command.php index bda2b3547c2..48a9e1f0b91 100644 --- a/lib/behat/classes/behat_command.php +++ b/lib/behat/classes/behat_command.php @@ -66,10 +66,30 @@ class behat_command { /** * Returns the executable path + * + * Allows returning a customized command for cygwin when the + * command is just displayed, when using exec(), system() and + * friends we stay with DIRECTORY_SEPARATOR as they use the + * normal cmd.exe (in Windows). + * + * @param bool $custombyterm If the provided command should depend on the terminal where it runs * @return string */ - public final static function get_behat_command() { - return 'vendor' . DIRECTORY_SEPARATOR . 'bin' . DIRECTORY_SEPARATOR . 'behat'; + public final static function get_behat_command($custombyterm = false) { + + $separator = DIRECTORY_SEPARATOR; + $exec = 'behat'; + + // Cygwin uses linux-style directory separators. + if ($custombyterm && testing_is_cygwin()) { + $separator = '/'; + + // MinGW can not execute .bat scripts. + if (!testing_is_mingw()) { + $exec = 'behat.bat'; + } + } + return 'vendor' . $separator . 'bin' . $separator . $exec; } /** diff --git a/lib/behat/classes/behat_config_manager.php b/lib/behat/classes/behat_config_manager.php index a1f9977bc9f..26746a55215 100644 --- a/lib/behat/classes/behat_config_manager.php +++ b/lib/behat/classes/behat_config_manager.php @@ -144,21 +144,36 @@ class behat_config_manager { /** * Returns the behat config file path used by the steps definition list * - * Note this can only be called from web-based scripts so it will return the - * production dataroot not behat_dataroot. With this the steps definitions - * list is accessible without having to install the behat test site. - * * @return string */ public static function get_steps_list_config_filepath() { global $USER; + // We don't cygwin-it as it is called using exec() which uses cmd.exe. $userdir = behat_command::get_behat_dir() . '/users/' . $USER->id; make_writable_directory($userdir); return $userdir . '/behat.yml'; } + /** + * Returns the behat config file path used by the behat cli command. + * + * @return string + */ + public static function get_behat_cli_config_filepath() { + global $CFG; + + $command = $CFG->behat_dataroot . DIRECTORY_SEPARATOR . 'behat' . DIRECTORY_SEPARATOR . 'behat.yml'; + + // Cygwin uses linux-style directory separators. + if (testing_is_cygwin()) { + $command = str_replace('\\', '/', $command); + } + + return $command; + } + /** * Behat config file specifing the main context class, * the required Behat extensions and Moodle test wwwroot. diff --git a/lib/phpunit/classes/hint_resultprinter.php b/lib/phpunit/classes/hint_resultprinter.php index a04b32628d2..2d5dfe79b6c 100644 --- a/lib/phpunit/classes/hint_resultprinter.php +++ b/lib/phpunit/classes/hint_resultprinter.php @@ -108,7 +108,9 @@ class Hint_ResultPrinter extends PHPUnit_TextUI_ResultPrinter { $executable = 'phpunit'; if (testing_is_cygwin()) { $file = str_replace('\\', '/', $file); - $executable = 'phpunit.bat'; + if (!testing_is_mingw()) { + $executable = 'phpunit.bat'; + } } } diff --git a/lib/testing/lib.php b/lib/testing/lib.php index 4cee9b1b61c..c916367cc66 100644 --- a/lib/testing/lib.php +++ b/lib/testing/lib.php @@ -91,6 +91,30 @@ function testing_is_cygwin() { } } +/** + * Returns whether a mingw CLI is running. + * + * MinGW sets $_SERVER['TERM'] to cygwin, but it + * can not run .bat files; this function may be useful + * when we need to output proposed commands to users + * using Windows CLI interfaces. + * + * @link http://sourceforge.net/p/mingw/bugs/1902 + * @return bool + */ +function testing_is_mingw() { + + if (!testing_is_cygwin()) { + return false; + } + + if (!empty($_SERVER['MSYSTEM'])) { + return true; + } + + return false; +} + /** * Mark empty dataroot to be used for testing. * @param string $dataroot The dataroot directory