forked from sebastianbergmann/phpunit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileloader.php
More file actions
192 lines (172 loc) · 6.61 KB
/
Copy pathFileloader.php
File metadata and controls
192 lines (172 loc) · 6.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<?php
/**
* PHPUnit
*
* Copyright (c) 2002-2008, Sebastian Bergmann <[email protected]>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* * Neither the name of Sebastian Bergmann nor the names of his
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Testing
* @package PHPUnit
* @author Sebastian Bergmann <[email protected]>
* @copyright 2002-2008 Sebastian Bergmann <[email protected]>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version SVN: $Id$
* @link http://www.phpunit.de/
* @since File available since Release 2.3.0
*/
require_once 'PHPUnit/Util/Filter.php';
PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT');
/**
* Utility methods to load PHP sourcefiles.
*
* @category Testing
* @package PHPUnit
* @author Sebastian Bergmann <[email protected]>
* @copyright 2002-2008 Sebastian Bergmann <[email protected]>
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version Release: @package_version@
* @link http://www.phpunit.de/
* @since Class available since Release 2.3.0
*/
class PHPUnit_Util_Fileloader
{
/**
* Path to the PHP interpreter that is to be used.
*
* @var string $phpBinary
*/
public static $phpBinary = NULL;
/**
* Checks if a PHP sourcefile is readable and is optionally checked for
* syntax errors through the syntaxCheck() method. The sourcefile is
* loaded through the load() method.
*
* @param string $filename
* @param boolean $syntaxCheck
* @throws RuntimeException
*/
public static function checkAndLoad($filename, $syntaxCheck = TRUE)
{
if (!is_readable($filename)) {
$filename = './' . $filename;
}
if (!is_readable($filename)) {
throw new RuntimeException(
sprintf(
'File "%s" could not be found or is not readable.',
str_replace('./', '', $filename)
)
);
}
if ($syntaxCheck) {
self::syntaxCheck($filename);
}
self::load($filename);
}
/**
* Loads a PHP sourcefile.
*
* @param string $filename
* @since Method available since Release 3.0.0
*/
protected static function load($filename)
{
$oldVariableNames = array_keys(get_defined_vars());
include_once $filename;
$newVariables = get_defined_vars();
$newVariableNames = array_diff(array_keys($newVariables), $oldVariableNames);
foreach ($newVariableNames as $variableName) {
if ($variableName != 'oldVariableNames') {
$GLOBALS[$variableName] = $newVariables[$variableName];
}
}
}
/**
* Uses a separate process to perform a syntax check on a PHP sourcefile.
*
* PHPUnit_Util_Fileloader::$phpBinary contains the path to the PHP
* interpreter used for this. If unset, the following assumptions will
* be made:
*
* 1. When the PHP CLI/CGI binary configured with the PEAR Installer
* (php_bin configuration value) is readable, it will be used.
*
* 2. When PHPUnit is run using the CLI SAPI and the $_SERVER['_']
* variable does not contain the string "PHPUnit", $_SERVER['_']
* is assumed to contain the path to the current PHP interpreter
* and that will be used.
*
* 3. When PHPUnit is run using the CLI SAPI and the $_SERVER['_']
* variable contains the string "PHPUnit", the file that $_SERVER['_']
* points is assumed to be the PHPUnit TextUI CLI wrapper script
* "phpunit" and the binary set up using #! on that file's first
* line of code is assumed to contain the path to the current PHP
* interpreter and that will be used.
*
* 4. The current PHP interpreter is assumed to be in the $PATH and
* to be invokable through "php".
*
* @param string $filename
* @throws RuntimeException
* @since Method available since Release 3.0.0
*/
protected static function syntaxCheck($filename)
{
if (self::$phpBinary === NULL) {
if (is_readable('@php_bin@')) {
self::$phpBinary = '@php_bin@';
}
else if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) {
self::$phpBinary = $_SERVER['_'];
if (strpos(self::$phpBinary, 'phpunit') !== FALSE) {
$file = file(self::$phpBinary);
$tmp = explode(' ', $file[0]);
self::$phpBinary = trim($tmp[1]);
}
}
if (!is_readable(self::$phpBinary)) {
self::$phpBinary = 'php';
} else {
self::$phpBinary = escapeshellarg(self::$phpBinary);
}
}
$command = self::$phpBinary . ' -l ' . escapeshellarg($filename);
if (DIRECTORY_SEPARATOR == '\\') {
$command = '"' . $command . '"';
}
$output = shell_exec($command);
if (strpos($output, 'Errors parsing') !== FALSE) {
throw new RuntimeException($output);
}
}
}
?>