b7c9fde28a60762f68774589cec6b07847ba52af
[moodle.git] / lib / phpunit / bootstraplib.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 bootstrap function
19  *
20  * Note: these functions must be self contained and must not rely on any library or include
21  *
22  * @package    core
23  * @category   phpunit
24  * @copyright  2012 Petr Skoda {@link http://skodak.org}
25  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
28 define('PHPUNIT_EXITCODE_PHPUNITMISSING', 129);
29 define('PHPUNIT_EXITCODE_PHPUNITWRONG', 130);
30 define('PHPUNIT_EXITCODE_PHPUNITEXTMISSING', 131);
31 define('PHPUNIT_EXITCODE_CONFIGERROR', 135);
32 define('PHPUNIT_EXITCODE_CONFIGWARNING', 136);
33 define('PHPUNIT_EXITCODE_INSTALL', 140);
34 define('PHPUNIT_EXITCODE_REINSTALL', 141);
36 /**
37  * Print error and stop execution
38  * @param int $errorcode The exit error code
39  * @param string $text An error message to display
40  * @return void stops code execution with error code
41  */
42 function phpunit_bootstrap_error($errorcode, $text = '') {
43     switch ($errorcode) {
44         case 0:
45             // this is not an error, just print information and exit
46             break;
47         case 1:
48             $text = 'Error: '.$text;
49             break;
50         case PHPUNIT_EXITCODE_PHPUNITMISSING:
51             $text = "Moodle can not find PHPUnit PEAR library";
52             break;
53         case PHPUNIT_EXITCODE_PHPUNITWRONG:
54             $text = 'Moodle requires PHPUnit 3.6.x, '.$text.' is not compatible';
55             break;
56         case PHPUNIT_EXITCODE_PHPUNITEXTMISSING:
57             $text = 'Moodle can not find required PHPUnit extension '.$text;
58             break;
59         case PHPUNIT_EXITCODE_CONFIGERROR:
60             $text = "Moodle PHPUnit environment configuration error:\n".$text;
61             break;
62         case PHPUNIT_EXITCODE_CONFIGWARNING:
63             $text = "Moodle PHPUnit environment configuration warning:\n".$text;
64             break;
65         case PHPUNIT_EXITCODE_INSTALL:
66             $path = phpunit_bootstrap_cli_argument_path('/admin/tool/phpunit/cli/init.php');
67             $text = "Moodle PHPUnit environment is not initialised, please use:\n php $path";
68             break;
69         case PHPUNIT_EXITCODE_REINSTALL:
70             $path = phpunit_bootstrap_cli_argument_path('/admin/tool/phpunit/cli/init.php');
71             $text = "Moodle PHPUnit environment was initialised for different version, please use:\n php $path";
72             break;
73         default:
74             $text = empty($text) ? '' : ': '.$text;
75             $text = 'Unknown error '.$errorcode.$text;
76             break;
77     }
79     // do not write to error stream because we need the error message in PHP exec result from web ui
80     echo($text."\n");
81     exit($errorcode);
82 }
84 /**
85  * Returns relative path against current working directory,
86  * to be used for shell execution hints.
87  * @param string $moodlepath starting with "/", ex: "/admin/tool/cli/init.php"
88  * @return string path relative to current directory or absolute path
89  */
90 function phpunit_bootstrap_cli_argument_path($moodlepath) {
91     global $CFG;
93     if (isset($CFG->admin) and $CFG->admin !== 'admin') {
94         $moodlepath = preg_replace('|^/admin/|', "/$CFG->admin/", $moodlepath);
95     }
97     $cwd = getcwd();
98     if (substr($cwd, -1) !== DIRECTORY_SEPARATOR) {
99         $cwd .= DIRECTORY_SEPARATOR;
100     }
101     $path = realpath($CFG->dirroot.$moodlepath);
103     if (strpos($path, $cwd) === 0) {
104         $path = substr($path, strlen($cwd));
105     }
107     if (phpunit_bootstrap_is_cygwin()) {
108         $path = str_replace('\\', '/', $path);
109     }
111     return $path;
114 /**
115  * Mark empty dataroot to be used for testing.
116  * @param string $dataroot The dataroot directory
117  * @return void
118  */
119 function phpunit_bootstrap_initdataroot($dataroot) {
120     global $CFG;
121     umask(0);
122     if (!file_exists("$dataroot/phpunittestdir.txt")) {
123         file_put_contents("$dataroot/phpunittestdir.txt", 'Contents of this directory are used during tests only, do not delete this file!');
124     }
125     phpunit_boostrap_fix_file_permissions("$dataroot/phpunittestdir.txt");
126     if (!file_exists("$CFG->phpunit_dataroot/phpunit")) {
127         mkdir("$CFG->phpunit_dataroot/phpunit", $CFG->directorypermissions);
128     }
131 /**
132  * Try to change permissions to $CFG->dirroot or $CFG->dataroot if possible
133  * @param string $file
134  * @return bool success
135  */
136 function phpunit_boostrap_fix_file_permissions($file) {
137     global $CFG;
139     $permissions = fileperms($file);
140     if ($permissions & $CFG->filepermissions != $CFG->filepermissions) {
141         $permissions = $permissions | $CFG->filepermissions;
142         return chmod($file, $permissions);
143     }
145     return true;
148 /**
149  * Find out if running under Cygwin on Windows.
150  * @return bool
151  */
152 function phpunit_bootstrap_is_cygwin() {
153     if (empty($_SERVER['OS']) or $_SERVER['OS'] !== 'Windows_NT') {
154         return false;
156     } else if (!empty($_SERVER['SHELL']) and $_SERVER['SHELL'] === '/bin/bash') {
157         return true;
159     } else if (!empty($_SERVER['TERM']) and $_SERVER['TERM'] === 'cygwin') {
160         return true;
162     } else {
163         return false;
164     }