summaryrefslogtreecommitdiff
path: root/scripts/run-tests.sh
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2008-06-09 07:37:05 +0000
committerDries Buytaert <dries@buytaert.net>2008-06-09 07:37:05 +0000
commit5a9b7c5b713bdd009846d80b3f24caf9948d6fc9 (patch)
treed6f03e65b860a2ee235093bf59fdd80b5924f472 /scripts/run-tests.sh
parent9a432420dc7374b7e0495559765d002164f9060c (diff)
downloadbrdo-5a9b7c5b713bdd009846d80b3f24caf9948d6fc9.tar.gz
brdo-5a9b7c5b713bdd009846d80b3f24caf9948d6fc9.tar.bz2
- Renaming the test script from run-functional-tests.php to run-tests.php.
Diffstat (limited to 'scripts/run-tests.sh')
-rwxr-xr-xscripts/run-tests.sh225
1 files changed, 225 insertions, 0 deletions
diff --git a/scripts/run-tests.sh b/scripts/run-tests.sh
new file mode 100755
index 000000000..245f3b395
--- /dev/null
+++ b/scripts/run-tests.sh
@@ -0,0 +1,225 @@
+#!/usr/bin/php
+<?php
+// $Id$
+
+/**
+ * @file
+ * This script runs Drupal tests from command line.
+ * You can provide groups or class names of the tests you wish to run.
+ * For example: php scripts/run-functional-tests.sh Profile
+ * If no arguments are provided, the help text will print.
+ */
+
+$reporter = 'text';
+$test_names = array();
+$host = 'localhost';
+$path = '';
+$script = basename(array_shift($_SERVER['argv']));
+
+if (in_array('--help', $_SERVER['argv']) || empty($_SERVER['argv'])) {
+ echo <<<EOF
+
+Run Drupal tests from the shell.
+
+Usage: {$script} [OPTIONS] <tests>
+Example: {$script} Profile
+
+All arguments are long options.
+
+ --help Print this page.
+
+ --list Display all available test groups.
+
+ --clean Cleans up database tables or directories from previous, failed,
+ tests and then exits (no tests are run).
+
+ --url Immediately preceeds a URL to set the host and path. You will
+ need this parameter if Drupal is in a subdirectory on your
+ localhost and you have not set \$base_url in settings.php.
+
+ --reporter Immediatly preceeds the name of the output reporter to use. This
+ Defaults to "text", while other options include "xml" and "html".
+
+ --all Run all available tests.
+
+ --class Run tests identified by speficic class names.
+
+ <test1>[,<test2>[,<test3> ...]]
+
+ One or more tests to be run. By default, these are interpreted
+ as the names of test groups as shown at ?q=admin/build/testing.
+ These group names typically correspond to module names like "User"
+ or "Profile" or "System", but there is also a group "XML-RPC".
+ If --class is specified then these are interpreted as the names of
+ specific test classes whose test methods will be run. Tests must
+ be separated by commas. Ignored if --all is specified.
+
+To run this script you will normally invoke it from the root directory of your
+Drupal installation as
+
+php ./scripts/{$script}
+\n
+EOF;
+ exit;
+}
+
+$list = FALSE;
+$clean = FALSE;
+$all = FALSE;
+$class_names = FALSE;
+$test_names = array();
+
+while ($param = array_shift($_SERVER['argv'])) {
+ switch ($param) {
+ case '--list':
+ $list = TRUE;
+ break;
+ case '--url':
+ $url = array_shift($_SERVER['argv']);
+ $parsed = parse_url($url);
+ $host = $parsed['host'];
+ $path = $parsed['path'];
+ break;
+ case '--all':
+ $all = TRUE;
+ break;
+ case '--class':
+ $class_names = TRUE;
+ break;
+ case '--clean':
+ $clean = TRUE;
+ break;
+ case '--reporter':
+ $reporter = array_shift($_SERVER['argv']);
+ if (!in_array($reporter, array("text", "xml", "html"))) {
+ $reporter = "text";
+ }
+ break;
+ default:
+ $test_names += explode(',', $param);
+ break;
+ }
+}
+
+$_SERVER['HTTP_HOST'] = $host;
+$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+$_SERVER['SERVER_ADDR'] = '127.0.0.1';
+$_SERVER['SERVER_SOFTWARE'] = 'Apache';
+$_SERVER['SERVER_NAME'] = 'localhost';
+$_SERVER['REQUEST_URI'] = $path .'/';
+$_SERVER['SCRIPT_NAME'] = $path .'/index.php';
+$_SERVER['PHP_SELF'] = $path .'/index.php';
+$_SERVER['HTTP_USER_AGENT'] = 'Drupal command line';
+
+chdir(realpath(dirname(__FILE__) . '/..'));
+require_once './includes/bootstrap.inc';
+drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
+
+if (!module_exists('simpletest')) {
+ echo("ERROR: The simpletest module must be enabled before this script can run.\n");
+ exit;
+}
+
+if ($clean) {
+ // Clean up left-over times and directories.
+ simpletest_clean_environment();
+ // Get the status messages and print them.
+ $messages = array_pop(drupal_get_messages('status'));
+ foreach($messages as $text) {
+ echo("- " . $text . "\n");
+ }
+ exit;
+}
+
+// Run tests as user #1.
+$GLOBALS['user'] = user_load(1);
+
+//Load simpletest files
+$total_test = &simpletest_get_total_test();
+
+$test_instances = $total_test->getTestInstances();
+
+if ($list) {
+ // Display all availabe tests.
+ echo("Available test groups:\n----------------------\n");
+ foreach ($test_instances as $group_test) {
+ echo($group_test->getLabel() . "\n");
+ }
+ exit;
+}
+
+if ($all) {
+ $test_list = NULL;
+}
+else {
+ if ($class_names) {
+ $test_list = _run_tests_check_classes($test_names, $test_instances);
+ }
+ else {
+ $test_list = _run_tests_find_classes($test_names, $test_instances);
+ }
+}
+if (empty($test_list) && !$all) {
+ echo("ERROR: No valid tests were specified.\n");
+ exit;
+}
+
+
+// If not in 'safe mode', increase the maximum execution time:
+if (!ini_get('safe_mode')) {
+ set_time_limit(360);
+}
+
+// Tell the user about what tests are to be run.
+if (!$all && $reporter == 'text') {
+ echo("Tests to be run:\n");
+ foreach ($test_list as $name) {
+ echo("- " . $name . "\n");
+ }
+ echo("\n");
+}
+
+simpletest_run_tests(array_keys($test_list), $reporter);
+
+// Utility functions:
+/**
+ * Check that each class name exists as a test, return the list of valid ones.
+ */
+function _run_tests_check_classes($test_names, $test_instances) {
+ $test_list = array();
+ $test_names = array_flip($test_names);
+
+ foreach ($test_instances as $group_test) {
+ $tests = $group_test->getTestInstances();
+ foreach ($tests as $test) {
+ $class = get_class($test);
+ $info = $test->getInfo();
+ if (isset($test_names[$class])) {
+ $test_list[$class] = $info['name'];
+ }
+ }
+ }
+ return $test_list;
+}
+
+/**
+ * Check that each group name exists, return the list of class in valid groups.
+ */
+function _run_tests_find_classes($test_names, &$test_instances) {
+ $test_list = array();
+ $test_names = array_flip($test_names);
+
+ uasort($test_instances, 'simpletest_compare_instances');
+ foreach ($test_instances as $group_test) {
+ $group = $group_test->getLabel();
+ if (isset($test_names[$group])) {
+ $tests = $group_test->getTestInstances();
+ foreach ($tests as $test) {
+ $info = $test->getInfo();
+ $test_list[get_class($test)] = $info['name'];
+ }
+ }
+ }
+ return $test_list;
+}
+