MDL-31857 phpunit: PHPDoc and typo fixes during integration
[moodle.git] / lib / phpunit / bootstrap.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  * Prepares PHPUnit environment, it is called automatically.
19  *
20  * Exit codes:
21  *  0   - success
22  *  1   - general error
23  *  130 - coding error
24  *  131 - configuration problem
25  *  132 - drop data, then install new test database
26  *
27  * @package    core
28  * @category   phpunit
29  * @copyright  2012 Petr Skoda {@link http://skodak.org}
30  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31  */
33 // we want to know about all problems
34 error_reporting(E_ALL | E_STRICT);
35 ini_set('display_errors', '1');
36 ini_set('log_errors', '1');
38 if (isset($_SERVER['REMOTE_ADDR'])) {
39     phpunit_bootstrap_error('Unit tests can be executed only from commandline!', 1);
40 }
42 if (defined('PHPUNITTEST')) {
43     phpunit_bootstrap_error("PHPUNITTEST constant must not be manually defined anywhere!", 130);
44 }
45 define('PHPUNITTEST', true);
47 if (defined('CLI_SCRIPT')) {
48     phpunit_bootstrap_error('CLI_SCRIPT must not be manually defined in any PHPUnit test scripts', 130);
49 }
50 define('CLI_SCRIPT', true);
52 define('NO_OUTPUT_BUFFERING', true);
54 // only load CFG from config.php
55 define('ABORT_AFTER_CONFIG', true);
56 require(__DIR__ . '/../../config.php');
58 // remove error handling overrides done in config.php
59 error_reporting(E_ALL);
60 ini_set('display_errors', '1');
61 ini_set('log_errors', '1');
63 // prepare dataroot
64 umask(0);
65 if (isset($CFG->phpunit_directorypermissions)) {
66     $CFG->directorypermissions = $CFG->phpunit_directorypermissions;
67 } else {
68     $CFG->directorypermissions = 02777;
69 }
70 $CFG->filepermissions = ($CFG->directorypermissions & 0666);
71 if (!isset($CFG->phpunit_dataroot)) {
72     phpunit_bootstrap_error('Missing $CFG->phpunit_dataroot in config.php, can not run tests!', 131);
73 }
74 if (isset($CFG->dataroot) and $CFG->phpunit_dataroot === $CFG->dataroot) {
75     phpunit_bootstrap_error('$CFG->dataroot and $CFG->phpunit_dataroot must not be identical, can not run tests!', 131);
76 }
77 if (!file_exists($CFG->phpunit_dataroot)) {
78     mkdir($CFG->phpunit_dataroot, $CFG->directorypermissions);
79 }
80 if (!is_dir($CFG->phpunit_dataroot)) {
81     phpunit_bootstrap_error('$CFG->phpunit_dataroot directory can not be created, can not run tests!', 131);
82 }
83 if (!is_writable($CFG->phpunit_dataroot)) {
84     // try to fix premissions if possible
85     if (function_exists('posix_getuid')) {
86         $chmod = fileperms($CFG->phpunit_dataroot);
87         if (fileowner($dir) == posix_getuid()) {
88             $chmod = $chmod | 0700;
89             chmod($CFG->phpunit_dataroot, $chmod);
90         }
91     }
92     if (!is_writable($CFG->phpunit_dataroot)) {
93         phpunit_bootstrap_error('$CFG->phpunit_dataroot directory is not writable, can not run tests!', 131);
94     }
95 }
96 if (!file_exists("$CFG->phpunit_dataroot/phpunittestdir.txt")) {
97     if ($dh = opendir($CFG->phpunit_dataroot)) {
98         while (($file = readdir($dh)) !== false) {
99             if ($file === 'phpunit' or $file === '.' or $file === '..' or $file === '.DS_store') {
100                 continue;
101             }
102             phpunit_bootstrap_error('$CFG->phpunit_dataroot directory is not empty, can not run tests! Is it used for anything else?', 131);
103         }
104         closedir($dh);
105         unset($dh);
106         unset($file);
107     }
109     // now we are 100% sure this dir is used only for phpunit tests
110     phpunit_bootstrap_initdataroot($CFG->phpunit_dataroot);
114 // verify db prefix
115 if (!isset($CFG->phpunit_prefix)) {
116     phpunit_bootstrap_error('Missing $CFG->phpunit_dataroot in config.php, can not run tests!', 131);
118 if (isset($CFG->prefix) and $CFG->prefix === $CFG->phpunit_prefix) {
119     phpunit_bootstrap_error('$CFG->prefix and $CFG->phpunit_prefix must not be identical, can not run tests!', 131);
122 // throw away standard CFG settings
124 $CFG->dataroot = $CFG->phpunit_dataroot;
125 $CFG->prefix = $CFG->phpunit_prefix;
127 $allowed = array('wwwroot', 'dataroot', 'dirroot', 'admin', 'directorypermissions', 'filepermissions',
128                  'dbtype', 'dblibrary', 'dbhost', 'dbname', 'dbuser', 'dbpass', 'prefix', 'dboptions');
129 $productioncfg = (array)$CFG;
130 $CFG = new stdClass();
131 foreach ($productioncfg as $key=>$value) {
132     if (!in_array($key, $allowed) and strpos($key, 'phpunit_') !== 0) {
133         // ignore
134         continue;
135     }
136     $CFG->{$key} = $value;
138 unset($key);
139 unset($value);
140 unset($allowed);
141 unset($productioncfg);
143 // force the same CFG settings in all sites
144 $CFG->debug = (E_ALL | E_STRICT | 38911); // can not use DEBUG_DEVELOPER here
145 $CFG->debugdisplay = 1;
146 error_reporting($CFG->debug);
147 ini_set('display_errors', '1');
148 ini_set('log_errors', '0');
150 $CFG->noemailever = true; // better not mail anybody from tests, override temporarily if necessary
151 $CFG->cachetext = 0; // disable this very nasty setting
153 // some ugly hacks
154 $CFG->themerev = 1;
155 $CFG->jsrev = 1;
157 // load test case stub classes and other stuff
158 require_once("$CFG->dirroot/lib/phpunit/lib.php");
160 // finish moodle init
161 define('ABORT_AFTER_CONFIG_CANCEL', true);
162 require("$CFG->dirroot/lib/setup.php");
164 raise_memory_limit(MEMORY_EXTRA);
166 if (defined('PHPUNIT_CLI_UTIL')) {
167     // all other tests are done in the CLI scripts...
168     return;
171 if (!phpunit_util::is_testing_ready()) {
172     phpunit_bootstrap_error('Database is not initialised to run unit tests, please use "php admin/tool/phpunit/cli/util.php --install"', 132);
175 // refresh data in all tables, clear caches, etc.
176 phpunit_util::reset_all_data();
178 // store fresh globals
179 phpunit_util::init_globals();
182 //=========================================================
184 /**
185  * Print error and stop execution
186  * @param string $text An error message to display
187  * @param int $errorcode The error code (see docblock for detailed list)
188  * @return void stops code execution with error code
189  */
190 function phpunit_bootstrap_error($text, $errorcode = 1) {
191     fwrite(STDERR, $text."\n");
192     exit($errorcode);
195 /**
196  * Mark empty dataroot to be used for testing.
197  * @param string $dataroot The dataroot directory
198  * @return void
199  */
200 function phpunit_bootstrap_initdataroot($dataroot) {
201     global $CFG;
203     file_put_contents("$dataroot/phpunittestdir.txt", 'Contents of this directory are used during tests only, do not delete this file!');
204     chmod("$dataroot/phpunittestdir.txt", $CFG->filepermissions);
205     if (!file_exists("$CFG->phpunit_dataroot/phpunit")) {
206         mkdir("$CFG->phpunit_dataroot/phpunit", $CFG->directorypermissions);
207     }