diff --git a/admin/tool/behat/cli/run.php b/admin/tool/behat/cli/run.php index 6e196598ff3..6808ebdf09a 100644 --- a/admin/tool/behat/cli/run.php +++ b/admin/tool/behat/cli/run.php @@ -120,8 +120,8 @@ $tags = ''; if ($options['profile']) { $profile = $options['profile']; - if (!isset($CFG->behat_config[$profile])) { - echo "Invalid profile passed: " . $profile; + if (!isset($CFG->behat_config[$profile]) && !isset($CFG->behat_profiles[$profile])) { + echo "Invalid profile passed: " . $profile . PHP_EOL; exit(1); } $extraopts[] = '--profile="' . $profile . '"'; diff --git a/admin/tool/behat/cli/util_single_run.php b/admin/tool/behat/cli/util_single_run.php index d523569375f..19917072233 100644 --- a/admin/tool/behat/cli/util_single_run.php +++ b/admin/tool/behat/cli/util_single_run.php @@ -173,6 +173,11 @@ if ($options['install']) { // This is only displayed once for parallel install. if (empty($options['run'])) { + // Notify user that 2.5 profile has been converted to 3.5. + if (behat_config_manager::$autoprofileconversion) { + mtrace("2.5 behat profile detected, automatically converted to current 3.x format"); + } + $runtestscommand = behat_command::get_behat_command(true, !empty($options['run'])); $runtestscommand .= ' --config ' . behat_config_manager::get_behat_cli_config_filepath(); diff --git a/config-dist.php b/config-dist.php index bb1bc60562c..cdf3de959cf 100644 --- a/config-dist.php +++ b/config-dist.php @@ -673,15 +673,6 @@ $CFG->admin = 'admin'; // params hierarchy. More info: http://docs.behat.org/guides/7.config.html // Example: // $CFG->behat_config = array( -// 'default' => array( -// 'formatter' => array( -// 'name' => 'pretty', -// 'parameters' => array( -// 'decorated' => true, -// 'verbose' => false -// ) -// ) -// ), // 'Mac-Firefox' => array( // 'suites' => array ( // 'default' => array( @@ -716,6 +707,20 @@ $CFG->admin = 'admin'; // ) // ) // ); +// You can also use the following config to override default Moodle configuration for Behat. +// This config is limited to default suite and will be supported in later versions. +// It will have precedence over $CFG->behat_config. +// $CFG->behat_profiles = array( +// 'phantomjs' => array( +// 'browser' => 'phantomjs', +// 'tags' => '~@_file_upload&&~@_alert&&~@_bug_phantomjs', +// 'wd_host' => 'http://127.0.0.1:4443/wd/hub', +// 'capabilities' => array( +// 'platform' => 'Linux', +// 'version' => 2.1 +// ) +// ), +// ); // // You can force the browser session (not user's sessions) to restart after N seconds. This could // be useful if you are using a cloud-based service with time restrictions in the browser side. diff --git a/lib/behat/classes/behat_config_manager.php b/lib/behat/classes/behat_config_manager.php index a0e2c886024..54049f5aeb2 100644 --- a/lib/behat/classes/behat_config_manager.php +++ b/lib/behat/classes/behat_config_manager.php @@ -42,6 +42,11 @@ require_once(__DIR__ . '/../../testing/classes/tests_finder.php'); */ class behat_config_manager { + /** + * @var bool Keep track of the automatic profile conversion. So we can notify user. + */ + public static $autoprofileconversion = false; + /** * Updates a config file * @@ -429,12 +434,128 @@ class behat_config_manager { // In case user defined overrides respect them over our default ones. if (!empty($CFG->behat_config)) { - $config = self::merge_config($config, $CFG->behat_config); + foreach ($CFG->behat_config as $profile => $values) { + $config = self::merge_config($config, self::merge_behat_config($profile, $values)); + } + } + // Check for Moodle custom ones. + if (!empty($CFG->behat_profiles) && is_array($CFG->behat_profiles)) { + foreach ($CFG->behat_profiles as $profile => $values) { + $config = self::merge_config($config, self::get_behat_profile($profile, $values)); + } } return Symfony\Component\Yaml\Yaml::dump($config, 10, 2); } + /** + * Parse $CFG->behat_config and return the array with required config structure for behat.yml + * + * @param string $profile profile name + * @param array $values values for profile + * @return array + */ + protected static function merge_behat_config($profile, $values) { + // Only add profile which are compatible with Behat 3.x + // Just check if any of Bheat 2.5 config is set. Not checking for 3.x as it might have some other configs + // Like : rerun_cache etc. + if (!isset($values['filters']['tags']) && !isset($values['extensions']['Behat\MinkExtension\Extension'])) { + return array($profile => $values); + } + + // Parse 2.5 format and get related values. + $oldconfigvalues = array(); + if (isset($values['extensions']['Behat\MinkExtension\Extension'])) { + $extensionvalues = $values['extensions']['Behat\MinkExtension\Extension']; + if (isset($extensionvalues['selenium2']['browser'])) { + $oldconfigvalues['browser'] = $extensionvalues['selenium2']['browser']; + } + if (isset($extensionvalues['selenium2']['wd_host'])) { + $oldconfigvalues['wd_host'] = $extensionvalues['selenium2']['wd_host']; + } + if (isset($extensionvalues['capabilities'])) { + $oldconfigvalues['capabilities'] = $extensionvalues['capabilities']; + } + } + + if (isset($values['filters']['tags'])) { + $oldconfigvalues['tags'] = $values['filters']['tags']; + } + + if (!empty($oldconfigvalues)) { + self::$autoprofileconversion = true; + return self::get_behat_profile($profile, $oldconfigvalues); + } + + // If nothing set above then return empty array. + return array(); + } + + /** + * Parse $CFG->behat_profile and return the array with required config structure for behat.yml. + * + * $CFG->behat_profiles = array( + * 'profile' = array( + * 'browser' => 'firefox', + * 'tags' => '@javascript', + * 'wd_host' => 'http://127.0.0.1:4444/wd/hub', + * 'capabilities' => array( + * 'platform' => 'Linux', + * 'version' => 44 + * ) + * ) + * ); + * + * @param string $profile profile name + * @param array $values values for profile. + * @return array + */ + protected static function get_behat_profile($profile, $values) { + // Values should be an array. + if (!is_array($values)) { + return array(); + } + + // Check suite values. + $behatprofilesuites = array(); + // Fill tags information. + if (isset($values['tags'])) { + $behatprofilesuites = array( + 'suites' => array( + 'default' => array( + 'filters' => array( + 'tags' => $values['tags'], + ) + ) + ) + ); + } + + // Selenium2 config values. + $behatprofileextension = array(); + $seleniumconfig = array(); + if (isset($values['browser'])) { + $seleniumconfig['browser'] = $values['browser']; + } + if (isset($values['wd_host'])) { + $seleniumconfig['wd_host'] = $values['wd_host']; + } + if (isset($values['capabilities'])) { + $seleniumconfig['capabilities'] = $values['capabilities']; + } + if (!empty($seleniumconfig)) { + $behatprofileextension = array( + 'extensions' => array( + 'Behat\MinkExtension' => array( + 'selenium2' => $seleniumconfig, + ) + ) + ); + } + + return array($profile => array_merge($behatprofilesuites, $behatprofileextension)); + } + /** * Attempt to split feature list into fairish buckets using timing information, if available. * Simply add each one to lightest buckets until all files allocated.