summaryrefslogtreecommitdiff
path: root/vendor/phpunit/phpunit/src/Util/GlobalState.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phpunit/phpunit/src/Util/GlobalState.php')
-rw-r--r--vendor/phpunit/phpunit/src/Util/GlobalState.php203
1 files changed, 203 insertions, 0 deletions
diff --git a/vendor/phpunit/phpunit/src/Util/GlobalState.php b/vendor/phpunit/phpunit/src/Util/GlobalState.php
new file mode 100644
index 000000000..cc5c22286
--- /dev/null
+++ b/vendor/phpunit/phpunit/src/Util/GlobalState.php
@@ -0,0 +1,203 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Util;
+
+use function array_keys;
+use function array_reverse;
+use function array_shift;
+use function defined;
+use function get_defined_constants;
+use function get_included_files;
+use function in_array;
+use function ini_get_all;
+use function is_array;
+use function is_file;
+use function is_scalar;
+use function preg_match;
+use function serialize;
+use function sprintf;
+use function strpos;
+use function strtr;
+use function substr;
+use function var_export;
+use Closure;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for PHPUnit
+ */
+final class GlobalState
+{
+ /**
+ * @var string[]
+ */
+ private const SUPER_GLOBAL_ARRAYS = [
+ '_ENV',
+ '_POST',
+ '_GET',
+ '_COOKIE',
+ '_SERVER',
+ '_FILES',
+ '_REQUEST',
+ ];
+
+ /**
+ * @throws Exception
+ */
+ public static function getIncludedFilesAsString(): string
+ {
+ return self::processIncludedFilesAsString(get_included_files());
+ }
+
+ /**
+ * @param string[] $files
+ *
+ * @throws Exception
+ */
+ public static function processIncludedFilesAsString(array $files): string
+ {
+ $excludeList = new ExcludeList;
+ $prefix = false;
+ $result = '';
+
+ if (defined('__PHPUNIT_PHAR__')) {
+ $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/';
+ }
+
+ // Do not process bootstrap script
+ array_shift($files);
+
+ // If bootstrap script was a Composer bin proxy, skip the second entry as well
+ if (substr(strtr($files[0], '\\', '/'), -24) === '/phpunit/phpunit/phpunit') {
+ array_shift($files);
+ }
+
+ foreach (array_reverse($files) as $file) {
+ if (!empty($GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST']) &&
+ in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'], true)) {
+ continue;
+ }
+
+ if ($prefix !== false && strpos($file, $prefix) === 0) {
+ continue;
+ }
+
+ // Skip virtual file system protocols
+ if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) {
+ continue;
+ }
+
+ if (!$excludeList->isExcluded($file) && is_file($file)) {
+ $result = 'require_once \'' . $file . "';\n" . $result;
+ }
+ }
+
+ return $result;
+ }
+
+ public static function getIniSettingsAsString(): string
+ {
+ $result = '';
+
+ foreach (ini_get_all(null, false) as $key => $value) {
+ $result .= sprintf(
+ '@ini_set(%s, %s);' . "\n",
+ self::exportVariable($key),
+ self::exportVariable((string) $value)
+ );
+ }
+
+ return $result;
+ }
+
+ public static function getConstantsAsString(): string
+ {
+ $constants = get_defined_constants(true);
+ $result = '';
+
+ if (isset($constants['user'])) {
+ foreach ($constants['user'] as $name => $value) {
+ $result .= sprintf(
+ 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n",
+ $name,
+ $name,
+ self::exportVariable($value)
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ public static function getGlobalsAsString(): string
+ {
+ $result = '';
+
+ foreach (self::SUPER_GLOBAL_ARRAYS as $superGlobalArray) {
+ if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) {
+ foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) {
+ if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) {
+ continue;
+ }
+
+ $result .= sprintf(
+ '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n",
+ $superGlobalArray,
+ $key,
+ self::exportVariable($GLOBALS[$superGlobalArray][$key])
+ );
+ }
+ }
+ }
+
+ $excludeList = self::SUPER_GLOBAL_ARRAYS;
+ $excludeList[] = 'GLOBALS';
+
+ foreach (array_keys($GLOBALS) as $key) {
+ if (!$GLOBALS[$key] instanceof Closure && !in_array($key, $excludeList, true)) {
+ $result .= sprintf(
+ '$GLOBALS[\'%s\'] = %s;' . "\n",
+ $key,
+ self::exportVariable($GLOBALS[$key])
+ );
+ }
+ }
+
+ return $result;
+ }
+
+ private static function exportVariable($variable): string
+ {
+ if (is_scalar($variable) || $variable === null ||
+ (is_array($variable) && self::arrayOnlyContainsScalars($variable))) {
+ return var_export($variable, true);
+ }
+
+ return 'unserialize(' . var_export(serialize($variable), true) . ')';
+ }
+
+ private static function arrayOnlyContainsScalars(array $array): bool
+ {
+ $result = true;
+
+ foreach ($array as $element) {
+ if (is_array($element)) {
+ $result = self::arrayOnlyContainsScalars($element);
+ } elseif (!is_scalar($element) && $element !== null) {
+ $result = false;
+ }
+
+ if (!$result) {
+ break;
+ }
+ }
+
+ return $result;
+ }
+}