Merge branch 'w18_MDL-32587_m23_phpunitindividual' of git://github.com/skodak/moodle

This commit is contained in:
Sam Hemelryk
2012-05-01 13:41:37 +12:00
3 changed files with 188 additions and 16 deletions
+1 -1
View File
@@ -25,4 +25,4 @@ CVS
/.project
/.buildpath
/.cache
/phpunit.xml
phpunit.xml
+23 -15
View File
@@ -34,13 +34,14 @@ require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
// now get cli options
list($options, $unrecognized) = cli_get_params(
array(
'drop' => false,
'install' => false,
'buildconfig' => false,
'diag' => false,
'phpunitdir' => false,
'run' => false,
'help' => false,
'drop' => false,
'install' => false,
'buildconfig' => false,
'buildcomponentconfigs' => false,
'diag' => false,
'phpunitdir' => false,
'run' => false,
'help' => false,
),
array(
'h' => 'help'
@@ -105,18 +106,21 @@ $diag = $options['diag'];
$drop = $options['drop'];
$install = $options['install'];
$buildconfig = $options['buildconfig'];
$buildcomponentconfigs = $options['buildcomponentconfigs'];
if ($options['help'] or (!$drop and !$install and !$buildconfig and !$diag)) {
if ($options['help'] or (!$drop and !$install and !$buildconfig and !$buildcomponentconfigs and !$diag)) {
$help = "Various PHPUnit utility functions
Options:
--drop Drop database and dataroot
--install Install database
--buildconfig Build /phpunit.xml from /phpunit.xml.dist that includes suites for all plugins and core
--diag Diagnose installation and return error code only
--run Execute PHPUnit tests (alternative for standard phpunit binary)
--drop Drop database and dataroot
--install Install database
--diag Diagnose installation and return error code only
--run Execute PHPUnit tests (alternative for standard phpunit binary)
--buildconfig Build /phpunit.xml from /phpunit.xml.dist that runs all tests
--buildcomponentconfigs
Build distributed phpunit.xml files for each component
-h, --help Print out this help
-h, --help Print out this help
Example:
\$/usr/bin/php lib/phpunit/tool.php --install
@@ -136,9 +140,13 @@ if ($diag) {
if (phpunit_util::build_config_file()) {
exit(0);
} else {
phpunit_bootstrap_error(PHPUNIT_EXITCODE_CONFIGWARNING, 'Can not create phpunit.xml configuration file, verify dirroot permissions');
phpunit_bootstrap_error(PHPUNIT_EXITCODE_CONFIGWARNING, 'Can not create main /phpunit.xml configuration file, verify dirroot permissions');
}
} else if ($buildcomponentconfigs) {
phpunit_util::build_component_config_files();
exit(0);
} else if ($drop) {
// make sure tests do not run in parallel
phpunit_util::acquire_test_lock();
+164
View File
@@ -886,6 +886,170 @@ class phpunit_util {
return (bool)$result;
}
/**
* Builds phpunit.xml files for all components using defaults from /phpunit.xml.dist
*
* @static
* @return void, stops if can not write files
*/
public static function build_component_config_files() {
global $CFG;
$template = '
<testsuites>
<testsuite name="@component@">
<directory suffix="_test.php">.</directory>
</testsuite>
</testsuites>';
// Use the upstream file as source for the distributed configurations
$ftemplate = file_get_contents("$CFG->dirroot/phpunit.xml.dist");
$ftemplate = preg_replace('|<!--All core suites.*</testsuites>|s', '<!--@component_suite@-->', $ftemplate);
// Get all the components
$components = self::get_all_plugins_with_tests() + self::get_all_subsystems_with_tests();
// Get all the directories having tests
$directories = self::get_all_directories_with_tests();
// Find any directory not covered by proper components
$remaining = array_diff($directories, $components);
// Add them to the list of components
$components += $remaining;
// Create the corresponding phpunit.xml file for each component
foreach ($components as $cname => $cpath) {
// Calculate the component suite
$ctemplate = $template;
$ctemplate = str_replace('@component@', $cname, $ctemplate);
// Apply it to the file template
$fcontents = str_replace('<!--@component_suite@-->', $ctemplate, $ftemplate);
// fix link to schema
$level = substr_count(str_replace('\\', '/', $cpath), '/') - substr_count(str_replace('\\', '/', $CFG->dirroot), '/');
$fcontents = str_replace('lib/phpunit/phpunit.xsd', str_repeat('../', $level).'lib/phpunit/phpunit.xsd', $fcontents);
$fcontents = str_replace('lib/phpunit/bootstrap.php', str_repeat('../', $level).'lib/phpunit/bootstrap.php', $fcontents);
// Write the file
$result = false;
if (is_writable($cpath)) {
if ($result = (bool)file_put_contents("$cpath/phpunit.xml", $fcontents)) {
phpunit_boostrap_fix_file_permissions("$cpath/phpunit.xml");
}
}
// Problems writing file, throw error
if (!$result) {
phpunit_bootstrap_error(PHPUNIT_EXITCODE_CONFIGWARNING, "Can not create $cpath/phpunit.xml configuration file, verify dir permissions");
}
}
}
/**
* Returns all the plugins having PHPUnit tests
*
* @return array all the plugins having PHPUnit tests
*
*/
private static function get_all_plugins_with_tests() {
$pluginswithtests = array();
$plugintypes = get_plugin_types();
ksort($plugintypes);
foreach ($plugintypes as $type => $unused) {
$plugs = get_plugin_list($type);
ksort($plugs);
foreach ($plugs as $plug => $fullplug) {
// Look for tests recursively
if (self::directory_has_tests($fullplug)) {
$pluginswithtests[$type . '_' . $plug] = $fullplug;
}
}
}
return $pluginswithtests;
}
/**
* Returns all the subsystems having PHPUnit tests
*
* Note we are hacking here the list of subsystems
* to cover some well-known subsystems that are not properly
* returned by the {@link get_core_subsystems()} function.
*
* @return array all the subsystems having PHPUnit tests
*/
private static function get_all_subsystems_with_tests() {
global $CFG;
$subsystemswithtests = array();
$subsystems = get_core_subsystems();
// Hack the list a bit to cover some well-known ones
$subsystems['backup'] = 'backup';
$subsystems['db-dml'] = 'lib/dml';
$subsystems['db-ddl'] = 'lib/ddl';
ksort($subsystems);
foreach ($subsystems as $subsys => $relsubsys) {
if ($relsubsys === null) {
continue;
}
$fullsubsys = $CFG->dirroot . '/' . $relsubsys;
if (!is_dir($fullsubsys)) {
continue;
}
// Look for tests recursively
if (self::directory_has_tests($fullsubsys)) {
$subsystemswithtests['core_' . $subsys] = $fullsubsys;
}
}
return $subsystemswithtests;
}
/**
* Returns all the directories having tests
*
* @return array all directories having tests
*/
private static function get_all_directories_with_tests() {
global $CFG;
$dirs = array();
$dirite = new RecursiveDirectoryIterator($CFG->dirroot);
$iteite = new RecursiveIteratorIterator($dirite);
$regite = new RegexIterator($iteite, '|/tests/.*_test\.php$|');
foreach ($regite as $path => $element) {
$key = dirname(dirname($path));
$value = trim(str_replace('/', '_', str_replace($CFG->dirroot, '', $key)), '_');
$dirs[$key] = $value;
}
ksort($dirs);
return array_flip($dirs);
}
/**
* Returns if a given directory has tests (recursively)
*
* @param $dir string full path to the directory to look for phpunit tests
* @return bool if a given directory has tests (true) or no (false)
*/
private static function directory_has_tests($dir) {
if (!is_dir($dir)) {
return false;
}
$dirite = new RecursiveDirectoryIterator($dir);
$iteite = new RecursiveIteratorIterator($dirite);
$regite = new RegexIterator($iteite, '|/tests/.*_test\.php$|');
$regite->rewind();
if ($regite->valid()) {
return true;
}
return false;
}
}