summaryrefslogtreecommitdiff
path: root/vendor/phpunit/phpunit/src/Util/FileLoader.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phpunit/phpunit/src/Util/FileLoader.php')
-rw-r--r--vendor/phpunit/phpunit/src/Util/FileLoader.php83
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/phpunit/phpunit/src/Util/FileLoader.php b/vendor/phpunit/phpunit/src/Util/FileLoader.php
new file mode 100644
index 000000000..732870723
--- /dev/null
+++ b/vendor/phpunit/phpunit/src/Util/FileLoader.php
@@ -0,0 +1,83 @@
+<?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 const DIRECTORY_SEPARATOR;
+use function array_diff;
+use function array_keys;
+use function fopen;
+use function get_defined_vars;
+use function sprintf;
+use function stream_resolve_include_path;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for PHPUnit
+ */
+final class FileLoader
+{
+ /**
+ * Checks if a PHP sourcecode file is readable. The sourcecode file is loaded through the load() method.
+ *
+ * As a fallback, PHP looks in the directory of the file executing the stream_resolve_include_path function.
+ * We do not want to load the Test.php file here, so skip it if it found that.
+ * PHP prioritizes the include_path setting, so if the current directory is in there, it will first look in the
+ * current working directory.
+ *
+ * @throws Exception
+ */
+ public static function checkAndLoad(string $filename): string
+ {
+ $includePathFilename = stream_resolve_include_path($filename);
+
+ $localFile = __DIR__ . DIRECTORY_SEPARATOR . $filename;
+
+ if (!$includePathFilename ||
+ $includePathFilename === $localFile ||
+ !self::isReadable($includePathFilename)) {
+ throw new Exception(
+ sprintf('Cannot open file "%s".' . "\n", $filename)
+ );
+ }
+
+ self::load($includePathFilename);
+
+ return $includePathFilename;
+ }
+
+ /**
+ * Loads a PHP sourcefile.
+ */
+ public static function load(string $filename): void
+ {
+ $oldVariableNames = array_keys(get_defined_vars());
+
+ /**
+ * @noinspection PhpIncludeInspection
+ * @psalm-suppress UnresolvableInclude
+ */
+ include_once $filename;
+
+ $newVariables = get_defined_vars();
+
+ foreach (array_diff(array_keys($newVariables), $oldVariableNames) as $variableName) {
+ if ($variableName !== 'oldVariableNames') {
+ $GLOBALS[$variableName] = $newVariables[$variableName];
+ }
+ }
+ }
+
+ /**
+ * @see https://github.com/sebastianbergmann/phpunit/pull/2751
+ */
+ private static function isReadable(string $filename): bool
+ {
+ return @fopen($filename, 'r') !== false;
+ }
+}