From cc7b6c5e5adf1411ee527e5c9cc2bdfad2d568fb Mon Sep 17 00:00:00 2001 From: Laurent VOULLEMIER Date: Fri, 28 Aug 2020 21:37:16 +0200 Subject: [PATCH] [PhpunitBridge] Fix deprecation type detection When using several vendor directories --- .../DeprecationErrorHandler/Deprecation.php | 11 +++-- .../fake_app/AppService.php | 19 ++++++++ .../fake_vendor/composer/autoload_real.php | 30 +++++++++++- .../fake_vendor_bis/autoload.php | 5 ++ .../composer/autoload_real.php | 47 +++++++++++++++++++ .../fake_vendor_bis/composer/installed.json | 1 + .../foo/lib/SomeOtherService.php | 14 ++++++ .../multiple_autoloads.phpt | 45 ++++++++++++++++++ 8 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_app/AppService.php create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/autoload.php create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/composer/autoload_real.php create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/composer/installed.json create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/foo/lib/SomeOtherService.php create mode 100644 src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/multiple_autoloads.phpt diff --git a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php index 62e09c461c..7cb021aa57 100644 --- a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php +++ b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php @@ -264,7 +264,10 @@ class Deprecation if (file_exists($v.'/composer/installed.json')) { self::$vendors[] = $v; $loader = require $v.'/autoload.php'; - $paths = self::getSourcePathsFromPrefixes(array_merge($loader->getPrefixes(), $loader->getPrefixesPsr4())); + $paths = self::addSourcePathsFromPrefixes( + array_merge($loader->getPrefixes(), $loader->getPrefixesPsr4()), + $paths + ); } } } @@ -280,15 +283,17 @@ class Deprecation return self::$vendors; } - private static function getSourcePathsFromPrefixes(array $prefixesByNamespace) + private static function addSourcePathsFromPrefixes(array $prefixesByNamespace, array $paths) { foreach ($prefixesByNamespace as $prefixes) { foreach ($prefixes as $prefix) { if (false !== realpath($prefix)) { - yield realpath($prefix); + $paths[] = realpath($prefix); } } } + + return $paths; } /** diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_app/AppService.php b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_app/AppService.php new file mode 100644 index 0000000000..8baaf34d92 --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_app/AppService.php @@ -0,0 +1,19 @@ +deprecatedApi(); + + $service2 = new SomeOtherService(); + $service2->deprecatedApi(); + } +} + diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php index 0d649e4ddd..2446550e2a 100644 --- a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php @@ -9,14 +9,40 @@ class ComposerLoaderFake public function getPrefixesPsr4() { - return []; + return [ + 'App\\Services\\' => [__DIR__.'/../../fake_app/'], + 'acme\\lib\\' => [__DIR__.'/../acme/lib/'], + ]; + } + + public function loadClass($className) + { + foreach ($this->getPrefixesPsr4() as $prefix => $baseDirs) { + if (strpos($className, $prefix) !== 0) { + continue; + } + + foreach ($baseDirs as $baseDir) { + $file = str_replace([$prefix, '\\'], [$baseDir, '/'], $className.'.php'); + if (file_exists($file)) { + require $file; + } + } + } } } class ComposerAutoloaderInitFake { + private static $loader; + public static function getLoader() { - return new ComposerLoaderFake(); + if (null === self::$loader) { + self::$loader = new ComposerLoaderFake(); + spl_autoload_register([self::$loader, 'loadClass']); + } + + return self::$loader; } } diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/autoload.php b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/autoload.php new file mode 100644 index 0000000000..c1c963926b --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/autoload.php @@ -0,0 +1,5 @@ + [__DIR__.'/../foo/lib/'], + ]; + } + + public function loadClass($className) + { + foreach ($this->getPrefixesPsr4() as $prefix => $baseDirs) { + if (strpos($className, $prefix) !== 0) { + continue; + } + + foreach ($baseDirs as $baseDir) { + $file = str_replace([$prefix, '\\'], [$baseDir, '/'], $className.'.php'); + if (file_exists($file)) { + require $file; + } + } + } + } +} + +class ComposerAutoloaderInitFakeBis +{ + private static $loader; + + public static function getLoader() + { + if (null === self::$loader) { + self::$loader = new ComposerLoaderFakeBis(); + spl_autoload_register([self::$loader, 'loadClass']); + } + + return self::$loader; + } +} diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/composer/installed.json b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/composer/installed.json new file mode 100644 index 0000000000..bf4fecc9fb --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/composer/installed.json @@ -0,0 +1 @@ +{"just here": "for the detection"} diff --git a/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/foo/lib/SomeOtherService.php b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/foo/lib/SomeOtherService.php new file mode 100644 index 0000000000..b1e8fab2bd --- /dev/null +++ b/src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor_bis/foo/lib/SomeOtherService.php @@ -0,0 +1,14 @@ +directDeprecations(); +?> +--EXPECTF-- +Remaining direct deprecation notices (2) + + 1x: deprecatedApi is deprecated! You should stop relying on it! + 1x in AppService::directDeprecations from App\Services + + 1x: deprecatedApi from foo is deprecated! You should stop relying on it! + 1x in AppService::directDeprecations from App\Services