Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit dff5394

Browse filesBrowse files
committed
[PhpUnitBridge] Fix qualification of deprecations triggered by the debug class loader
1 parent fd910eb commit dff5394
Copy full SHA for dff5394

File tree

9 files changed

+115
-3
lines changed
Filter options

9 files changed

+115
-3
lines changed

‎src/Symfony/Bridge/PhpUnit/.gitignore

Copy file name to clipboard
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
vendor/
22
composer.lock
33
phpunit.xml
4+
Tests/DeprecationErrorHandler/fake_vendor/symfony/error-handler/DebugClassLoader.php

‎src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler/Deprecation.php
+14Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
use PHPUnit\Util\Test;
1515
use Symfony\Bridge\PhpUnit\Legacy\SymfonyTestsListenerFor;
16+
use Symfony\Component\Debug\DebugClassLoader as LegacyDebugClassLoader;
17+
use Symfony\Component\ErrorHandler\DebugClassLoader;
1618

1719
/**
1820
* @internal
@@ -53,6 +55,18 @@ class Deprecation
5355
public function __construct($message, array $trace, $file)
5456
{
5557
$this->trace = $trace;
58+
59+
if ('trigger_error' === ($trace[1]['function'] ?? null)
60+
&& (DebugClassLoader::class === ($class = $trace[2]['class'] ?? null) || LegacyDebugClassLoader::class === $class)
61+
&& 'checkClass' === ($trace[2]['function'] ?? null)
62+
&& null !== ($extraFile = $trace[2]['args'][1] ?? null)
63+
&& '' !== $extraFile
64+
&& false !== $extraFile = realpath($extraFile)
65+
) {
66+
$this->getOriginalFilesStack();
67+
array_splice($this->originalFilesStack, 2, 1, $extraFile);
68+
}
69+
5670
$this->message = $message;
5771
$i = \count($trace);
5872
while (1 < $i && $this->lineShouldBeSkipped($trace[--$i])) {
+51Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
--TEST--
2+
Test that a deprecation from the DebugClassLoader on a vendor class autoload triggered by an app class is considered indirect.
3+
--FILE--
4+
<?php
5+
6+
$k = 'SYMFONY_DEPRECATIONS_HELPER';
7+
putenv($k.'='.$_SERVER[$k] = $_ENV[$k] = 'max[total]=0');
8+
putenv('ANSICON');
9+
putenv('ConEmuANSI');
10+
putenv('TERM');
11+
12+
$vendor = __DIR__;
13+
while (!file_exists($vendor.'/vendor')) {
14+
$vendor = dirname($vendor);
15+
}
16+
define('PHPUNIT_COMPOSER_INSTALL', $vendor.'/vendor/autoload.php');
17+
require PHPUNIT_COMPOSER_INSTALL;
18+
require_once __DIR__.'/../../bootstrap.php';
19+
eval(<<<'EOPHP'
20+
namespace PHPUnit\Util;
21+
22+
class Test
23+
{
24+
public static function getGroups()
25+
{
26+
return array();
27+
}
28+
}
29+
EOPHP
30+
);
31+
require __DIR__.'/fake_vendor/autoload.php';
32+
33+
// We need the real DebugClassLoader FQCN but in a vendor path.
34+
if (!file_exists($errorHandlerRootDir = __DIR__.'/../../../../Component/ErrorHandler')) {
35+
if (!file_exists($errorHandlerRootDir = __DIR__.'/../../vendor/symfony/error-handler')) {
36+
die('Could not find the ErrorHandler component root directory.');
37+
}
38+
}
39+
40+
file_put_contents($fakeDebugClassLoadPath = __DIR__.'/fake_vendor/symfony/error-handler/DebugClassLoader.php', file_get_contents($errorHandlerRootDir.'/DebugClassLoader.php'));
41+
require $fakeDebugClassLoadPath;
42+
43+
\Symfony\Component\ErrorHandler\DebugClassLoader::enable();
44+
new \App\Services\BarService();
45+
46+
?>
47+
--EXPECTF--
48+
Remaining indirect deprecation notices (1)
49+
50+
1x: The "acme\lib\ExtendsDeprecatedClassFromOtherVendor" class extends "fcy\lib\DeprecatedClass" that is deprecated.
51+
1x in BarService::__construct from App\Services
+13Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace App\Services;
4+
5+
use acme\lib\ExtendsDeprecatedClassFromOtherVendor;
6+
7+
final class BarService
8+
{
9+
public function __construct()
10+
{
11+
ExtendsDeprecatedClassFromOtherVendor::FOO;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace acme\lib;
4+
5+
use fcy\lib\DeprecatedClass;
6+
7+
final class ExtendsDeprecatedClassFromOtherVendor extends DeprecatedClass
8+
{
9+
public const FOO = 'bar';
10+
}

‎src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/composer/autoload_real.php
+13-3Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,33 @@ public function getPrefixesPsr4()
1212
return [
1313
'App\\Services\\' => [__DIR__.'/../../fake_app/'],
1414
'acme\\lib\\' => [__DIR__.'/../acme/lib/'],
15+
'fcy\\lib\\' => [__DIR__.'/../fcy/lib/'],
1516
];
1617
}
1718

1819
public function loadClass($className)
20+
{
21+
if ($file = $this->findFile($className)) {
22+
require $file;
23+
}
24+
}
25+
26+
public function findFile($class)
1927
{
2028
foreach ($this->getPrefixesPsr4() as $prefix => $baseDirs) {
21-
if (strpos($className, $prefix) !== 0) {
29+
if (strpos($class, $prefix) !== 0) {
2230
continue;
2331
}
2432

2533
foreach ($baseDirs as $baseDir) {
26-
$file = str_replace([$prefix, '\\'], [$baseDir, '/'], $className.'.php');
34+
$file = str_replace([$prefix, '\\'], [$baseDir, '/'], $class.'.php');
2735
if (file_exists($file)) {
28-
require $file;
36+
return $file;
2937
}
3038
}
3139
}
40+
41+
return false;
3242
}
3343
}
3444

+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace fcy\lib;
4+
5+
/**
6+
* @deprecated
7+
*/
8+
class DeprecatedClass
9+
{
10+
}

‎src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/symfony/error-handler/.gitkeep

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/fake_vendor/symfony/error-handler/.gitkeep
Whitespace-only changes.

‎src/Symfony/Bridge/PhpUnit/composer.json

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/PhpUnit/composer.json
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
"php": "THIS BRIDGE WHEN TESTING LOWEST SYMFONY VERSIONS.",
2121
"php": ">=5.5.9"
2222
},
23+
"require-dev": {
24+
"symfony/error-handler": "^4.4|^5.0"
25+
},
2326
"suggest": {
2427
"symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader"
2528
},

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.