1a8cea7ab44180c7dbe50e56307e4adc62116327
[moodle.git] / admin / tool / phpunit / cli / util.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  * PHPUnit related utilities.
19  *
20  * Exit codes: {@see phpunit_bootstrap_error()}
21  *
22  * @package    tool_phpunit
23  * @copyright  2012 Petr Skoda {@link http://skodak.org}
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 if (isset($_SERVER['REMOTE_ADDR'])) {
28     die; // no access from web!
29 }
31 require_once(__DIR__.'/../../../../lib/clilib.php');
32 require_once(__DIR__.'/../../../../lib/phpunit/bootstraplib.php');
34 // now get cli options
35 list($options, $unrecognized) = cli_get_params(
36     array(
37         'drop'                  => false,
38         'install'               => false,
39         'buildconfig'           => false,
40         'buildcomponentconfigs' => false,
41         'diag'                  => false,
42         'phpunitdir'            => false,
43         'run'                   => false,
44         'help'                  => false,
45     ),
46     array(
47         'h' => 'help'
48     )
49 );
51 if ($options['phpunitdir']) {
52     // nasty skodak's hack for testing of future PHPUnit versions - intentionally not documented
53     if (!file_exists($options['phpunitdir'])) {
54         cli_error('Invalid custom PHPUnit lib location');
55     }
56     $files = scandir($options['phpunitdir']);
57     foreach ($files as $file) {
58         $path = $options['phpunitdir'].'/'.$file;
59         if (!is_dir($path) or strpos($file, '.') === 0) {
60             continue;
61         }
62         ini_set('include_path', $path . PATH_SEPARATOR . ini_get('include_path'));
63     }
64     unset($files);
65     unset($file);
66 }
68 // verify PHPUnit libs are loaded
69 if (!include_once('PHPUnit/Autoload.php')) {
70     phpunit_bootstrap_error(PHPUNIT_EXITCODE_PHPUNITMISSING);
71 }
73 if ($options['run']) {
74     unset($options);
75     unset($unrecognized);
77     foreach ($_SERVER['argv'] as $k=>$v) {
78         if (strpos($v, '--run') === 0 or strpos($v, '--phpunitdir') === 0) {
79             unset($_SERVER['argv'][$k]);
80             $_SERVER['argc'] = $_SERVER['argc'] - 1;
81         }
82     }
83     $_SERVER['argv'] = array_values($_SERVER['argv']);
84     PHPUnit_TextUI_Command::main();
85     exit(0);
86 }
88 define('PHPUNIT_UTIL', true);
90 require(__DIR__ . '/../../../../lib/phpunit/bootstrap.php');
92 // from now on this is a regular moodle CLI_SCRIPT
94 require_once($CFG->libdir.'/adminlib.php');
95 require_once($CFG->libdir.'/upgradelib.php');
96 require_once($CFG->libdir.'/clilib.php');
97 require_once($CFG->libdir.'/pluginlib.php');
98 require_once($CFG->libdir.'/installlib.php');
100 if ($unrecognized) {
101     $unrecognized = implode("\n  ", $unrecognized);
102     cli_error(get_string('cliunknowoption', 'admin', $unrecognized));
105 $diag = $options['diag'];
106 $drop = $options['drop'];
107 $install = $options['install'];
108 $buildconfig = $options['buildconfig'];
109 $buildcomponentconfigs = $options['buildcomponentconfigs'];
111 if ($options['help'] or (!$drop and !$install and !$buildconfig and !$buildcomponentconfigs and !$diag)) {
112     $help = "Various PHPUnit utility functions
114 Options:
115 --drop         Drop database and dataroot
116 --install      Install database
117 --diag         Diagnose installation and return error code only
118 --run          Execute PHPUnit tests (alternative for standard phpunit binary)
119 --buildconfig  Build /phpunit.xml from /phpunit.xml.dist that runs all tests
120 --buildcomponentconfigs
121                Build distributed phpunit.xml files for each component
123 -h, --help     Print out this help
125 Example:
126 \$/usr/bin/php lib/phpunit/tool.php --install
127 ";
128     echo $help;
129     exit(0);
132 if ($diag) {
133     list($errorcode, $message) = phpunit_util::testing_ready_problem();
134     if ($errorcode) {
135         phpunit_bootstrap_error($errorcode, $message);
136     }
137     exit(0);
139 } else if ($buildconfig) {
140     if (phpunit_util::build_config_file()) {
141         exit(0);
142     } else {
143         phpunit_bootstrap_error(PHPUNIT_EXITCODE_CONFIGWARNING, 'Can not create main /phpunit.xml configuration file, verify dirroot permissions');
144     }
146 } else if ($buildcomponentconfigs) {
147     phpunit_util::build_component_config_files();
148     exit(0);
150 } else if ($drop) {
151     // make sure tests do not run in parallel
152     phpunit_util::acquire_test_lock();
153     phpunit_util::drop_site();
154     // note: we must stop here because $CFG is messed up and we can not reinstall, sorry
155     exit(0);
157 } else if ($install) {
158     phpunit_util::install_site();
159     exit(0);