From dede158e8a395a187815a1640e864e152d2ea654 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 30 Aug 2019 15:50:48 +0200 Subject: [PATCH 1/7] Fix #33395 PHP 5.3 compatibility --- src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php index 39676baf3e..a0271cf3da 100644 --- a/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php +++ b/src/Symfony/Bridge/PhpUnit/DeprecationErrorHandler.php @@ -308,7 +308,7 @@ class DeprecationErrorHandler public static function getPhpUnitErrorHandler() { if (!isset(self::$isAtLeastPhpUnit83)) { - self::$isAtLeastPhpUnit83 = class_exists(ErrorHandler::class) && method_exists(ErrorHandler::class, '__invoke'); + self::$isAtLeastPhpUnit83 = class_exists('PHPUnit\Util\ErrorHandler') && method_exists('PHPUnit\Util\ErrorHandler', '__invoke'); } if (!self::$isAtLeastPhpUnit83) { return (class_exists('PHPUnit_Util_ErrorHandler', false) ? 'PHPUnit_Util_' : 'PHPUnit\Util\\').'ErrorHandler::handleError'; From 55d6a65df9c1af1329faef10dea102c0469a3f7b Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Thu, 29 Aug 2019 09:16:18 +0200 Subject: [PATCH 2/7] [Mailer] Remove the default dispatcher in AbstractTransport --- .../Mailer/Transport/AbstractTransport.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php index 2b1fd87b74..d74e2855ff 100644 --- a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php +++ b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php @@ -13,7 +13,6 @@ namespace Symfony\Component\Mailer\Transport; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; -use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Mailer\DelayedSmtpEnvelope; use Symfony\Component\Mailer\Event\MessageEvent; @@ -37,7 +36,7 @@ abstract class AbstractTransport implements TransportInterface public function __construct(EventDispatcherInterface $dispatcher = null, LoggerInterface $logger = null) { - $this->dispatcher = $dispatcher ?: new EventDispatcher(); + $this->dispatcher = $dispatcher; $this->logger = $logger ?: new NullLogger(); } @@ -69,14 +68,18 @@ abstract class AbstractTransport implements TransportInterface } } - $event = new MessageEvent($message, $envelope); - $this->dispatcher->dispatch($event); - $envelope = $event->getEnvelope(); + if (null !== $this->dispatcher) { + $event = new MessageEvent($message, $envelope); + $this->dispatcher->dispatch($event); + $envelope = $event->getEnvelope(); + $message = $event->getMessage(); + } + if (!$envelope->getRecipients()) { return null; } - $message = new SentMessage($event->getMessage(), $envelope); + $message = new SentMessage($message, $envelope); $this->doSend($message); $this->checkThrottling(); From 162bfc3cade0b63d55b4aa6ce209d63be6d0d7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Dunglas?= Date: Wed, 21 Aug 2019 21:34:00 +0200 Subject: [PATCH 3/7] [DomCrawler] Fix FileFormField PHPDoc --- src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php | 2 +- src/Symfony/Component/DomCrawler/Field/FileFormField.php | 2 +- src/Symfony/Component/DomCrawler/Field/FormField.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php index 5ebf47464a..db1b9de2bf 100644 --- a/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php +++ b/src/Symfony/Component/DomCrawler/Field/ChoiceFormField.php @@ -113,7 +113,7 @@ class ChoiceFormField extends FormField /** * Sets the value of the field. * - * @param string|array $value The value of the field + * @param string|array|bool $value The value of the field * * @throws \InvalidArgumentException When value type provided is not correct */ diff --git a/src/Symfony/Component/DomCrawler/Field/FileFormField.php b/src/Symfony/Component/DomCrawler/Field/FileFormField.php index 9e21c9c4b9..9abdca8827 100644 --- a/src/Symfony/Component/DomCrawler/Field/FileFormField.php +++ b/src/Symfony/Component/DomCrawler/Field/FileFormField.php @@ -48,7 +48,7 @@ class FileFormField extends FormField /** * Sets the value of the field. * - * @param string $value The value of the field + * @param string|null $value The value of the field */ public function setValue($value) { diff --git a/src/Symfony/Component/DomCrawler/Field/FormField.php b/src/Symfony/Component/DomCrawler/Field/FormField.php index 51d875514c..0bc4f54479 100644 --- a/src/Symfony/Component/DomCrawler/Field/FormField.php +++ b/src/Symfony/Component/DomCrawler/Field/FormField.php @@ -99,7 +99,7 @@ abstract class FormField /** * Sets the value of the field. * - * @param string $value The value of the field + * @param string|array|bool|null $value The value of the field */ public function setValue($value) { From f48f19db9184f59744c8ca60543d9924b3bed2c1 Mon Sep 17 00:00:00 2001 From: Bohan Yang Date: Tue, 27 Aug 2019 17:44:31 +0800 Subject: [PATCH 4/7] [FrameworkBundle] Fix about command not showing .env vars --- src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php index 3c5b15fb7e..89a3eb20d8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php @@ -130,9 +130,9 @@ EOT private static function getDotenvVars(): array { $vars = []; - foreach (explode(',', getenv('SYMFONY_DOTENV_VARS')) as $name) { - if ('' !== $name && false !== $value = getenv($name)) { - $vars[$name] = $value; + foreach (explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? $_ENV['SYMFONY_DOTENV_VARS'] ?? '') as $name) { + if ('' !== $name && isset($_ENV[$name])) { + $vars[$name] = $_ENV[$name]; } } From 997cc5c3f0b73d6a2cda5e815dea4550674bf917 Mon Sep 17 00:00:00 2001 From: Joe Springe <518362+jspringe@users.noreply.github.com> Date: Fri, 30 Aug 2019 15:02:11 -0400 Subject: [PATCH 5/7] [Finder] Prevent unintentional file locks in Windows --- .../Component/Finder/Iterator/SortableIterator.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Finder/Iterator/SortableIterator.php b/src/Symfony/Component/Finder/Iterator/SortableIterator.php index 3c7157adb9..e67997d117 100644 --- a/src/Symfony/Component/Finder/Iterator/SortableIterator.php +++ b/src/Symfony/Component/Finder/Iterator/SortableIterator.php @@ -38,11 +38,11 @@ class SortableIterator implements \IteratorAggregate $this->iterator = $iterator; if (self::SORT_BY_NAME === $sort) { - $this->sort = function ($a, $b) { + $this->sort = static function ($a, $b) { return strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_TYPE === $sort) { - $this->sort = function ($a, $b) { + $this->sort = static function ($a, $b) { if ($a->isDir() && $b->isFile()) { return -1; } elseif ($a->isFile() && $b->isDir()) { @@ -52,15 +52,15 @@ class SortableIterator implements \IteratorAggregate return strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = function ($a, $b) { + $this->sort = static function ($a, $b) { return $a->getATime() - $b->getATime(); }; } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = function ($a, $b) { + $this->sort = static function ($a, $b) { return $a->getCTime() - $b->getCTime(); }; } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = function ($a, $b) { + $this->sort = static function ($a, $b) { return $a->getMTime() - $b->getMTime(); }; } elseif (\is_callable($sort)) { From a461943345e5f97819d4cd1a3e55cc5e1e325fca Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 2 Sep 2019 16:10:40 +0200 Subject: [PATCH 6/7] Cleanup tests --- src/Symfony/Component/HttpKernel/Kernel.php | 7 ++++- .../Tests/Fixtures/KernelForTest.php | 5 ++++ .../Component/HttpKernel/Tests/KernelTest.php | 23 +++++++++------ .../Tests/Store/BlockingStoreTestTrait.php | 4 +++ .../Tests/Encoder/ChainEncoderTest.php | 29 ------------------- 5 files changed, 29 insertions(+), 39 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component/HttpKernel/Kernel.php index 981b500b00..a01558377f 100644 --- a/src/Symfony/Component/HttpKernel/Kernel.php +++ b/src/Symfony/Component/HttpKernel/Kernel.php @@ -354,7 +354,12 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl { if (null === $this->projectDir) { $r = new \ReflectionObject($this); - $dir = $rootDir = \dirname($r->getFileName()); + + if (!file_exists($dir = $r->getFileName())) { + throw new \LogicException(sprintf('Cannot auto-detect project dir for kernel of class "%s".', $r->name)); + } + + $dir = $rootDir = \dirname($dir); while (!file_exists($dir.'/composer.json')) { if ($dir === \dirname($dir)) { return $this->projectDir = $rootDir; diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php index 88c34b0231..8c35712815 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php @@ -34,4 +34,9 @@ class KernelForTest extends Kernel { return $this->booted; } + + public function getProjectDir() + { + return __DIR__; + } } diff --git a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php index 10acb00a96..e4e2e0727b 100644 --- a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php @@ -22,7 +22,6 @@ use Symfony\Component\HttpKernel\Bundle\BundleInterface; use Symfony\Component\HttpKernel\Config\EnvParametersResource; use Symfony\Component\HttpKernel\DependencyInjection\ResettableServicePass; use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter; -use Symfony\Component\HttpKernel\HttpKernel; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\HttpKernel\Tests\Fixtures\KernelForOverrideName; @@ -119,7 +118,7 @@ class KernelTest extends TestCase public function testBootSetsTheBootedFlagToTrue() { // use test kernel to access isBooted() - $kernel = $this->getKernelForTest(['initializeBundles', 'initializeContainer']); + $kernel = $this->getKernel(['initializeBundles', 'initializeContainer']); $kernel->boot(); $this->assertTrue($kernel->isBooted()); @@ -899,7 +898,7 @@ EOF; */ public function testKernelStartTimeIsResetWhileBootingAlreadyBootedKernel() { - $kernel = $this->getKernelForTest(['initializeBundles'], true); + $kernel = $this->getKernel(['initializeBundles'], [], true); $kernel->boot(); $preReBoot = $kernel->getStartTime(); @@ -957,15 +956,15 @@ EOF; * * @return Kernel */ - protected function getKernel(array $methods = [], array $bundles = []) + protected function getKernel(array $methods = [], array $bundles = [], $debug = false) { $methods[] = 'registerBundles'; $kernel = $this - ->getMockBuilder('Symfony\Component\HttpKernel\Kernel') + ->getMockBuilder(KernelForTest::class) ->setMethods($methods) - ->setConstructorArgs(['test', false]) - ->getMockForAbstractClass() + ->setConstructorArgs(['test', $debug]) + ->getMock() ; $kernel->expects($this->any()) ->method('registerBundles') @@ -980,10 +979,11 @@ EOF; protected function getKernelForTest(array $methods = [], $debug = false) { - $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\Tests\Fixtures\KernelForTest') + $kernel = $this->getMockBuilder(KernelForTest::class) ->setConstructorArgs(['test', $debug]) ->setMethods($methods) - ->getMock(); + ->getMock() + ; $p = new \ReflectionProperty($kernel, 'rootDir'); $p->setAccessible(true); $p->setValue($kernel, __DIR__.'/Fixtures'); @@ -1004,6 +1004,11 @@ class TestKernel implements HttpKernelInterface public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = true) { } + + public function getProjectDir() + { + return __DIR__.'/Fixtures'; + } } class CustomProjectDirKernel extends Kernel diff --git a/src/Symfony/Component/Lock/Tests/Store/BlockingStoreTestTrait.php b/src/Symfony/Component/Lock/Tests/Store/BlockingStoreTestTrait.php index 3fafcb98e4..361b45b71a 100644 --- a/src/Symfony/Component/Lock/Tests/Store/BlockingStoreTestTrait.php +++ b/src/Symfony/Component/Lock/Tests/Store/BlockingStoreTestTrait.php @@ -30,6 +30,10 @@ trait BlockingStoreTestTrait * * This test is time sensible: the $clockDelay could be adjust. * + * It also fails when run with the global ./phpunit test suite. + * + * @group transient + * * @requires extension pcntl * @requires extension posix * @requires function pcntl_sigwaitinfo diff --git a/src/Symfony/Component/Serializer/Tests/Encoder/ChainEncoderTest.php b/src/Symfony/Component/Serializer/Tests/Encoder/ChainEncoderTest.php index 9f674e0308..14a3c687fc 100644 --- a/src/Symfony/Component/Serializer/Tests/Encoder/ChainEncoderTest.php +++ b/src/Symfony/Component/Serializer/Tests/Encoder/ChainEncoderTest.php @@ -84,23 +84,6 @@ class ChainEncoderTest extends TestCase $this->assertTrue($this->chainEncoder->needsNormalization(self::FORMAT_2)); } - /** - * @dataProvider booleanProvider - */ - public function testNeedsNormalizationChainNormalizationAware($bool) - { - $chainEncoder = $this - ->getMockBuilder('Symfony\Component\Serializer\Tests\Encoder\ChainNormalizationAwareEncoder') - ->getMock(); - - $chainEncoder->method('supportsEncoding')->willReturn(true); - $chainEncoder->method('needsNormalization')->willReturn($bool); - - $sut = new ChainEncoder([$chainEncoder]); - - $this->assertEquals($bool, $sut->needsNormalization(self::FORMAT_1)); - } - public function testNeedsNormalizationNormalizationAware() { $encoder = new NormalizationAwareEncoder(); @@ -108,18 +91,6 @@ class ChainEncoderTest extends TestCase $this->assertFalse($sut->needsNormalization(self::FORMAT_1)); } - - public function booleanProvider() - { - return [ - [true], - [false], - ]; - } -} - -class ChainNormalizationAwareEncoder extends ChainEncoder implements NormalizationAwareInterface -{ } class NormalizationAwareEncoder implements EncoderInterface, NormalizationAwareInterface From d05e49797c843809ef525b824e115ec8da32cb4f Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 2 Sep 2019 16:45:56 +0200 Subject: [PATCH 7/7] [4.3] Cleanup tests --- src/Symfony/Component/BrowserKit/HttpBrowser.php | 4 +--- .../HttpKernel/Tests/Fixtures/KernelForTest.php | 2 +- .../Component/HttpKernel/Tests/KernelTest.php | 7 ++----- .../Tests/Transport/RedisExt/ConnectionTest.php | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/BrowserKit/HttpBrowser.php b/src/Symfony/Component/BrowserKit/HttpBrowser.php index 7492e58907..fe40911552 100644 --- a/src/Symfony/Component/BrowserKit/HttpBrowser.php +++ b/src/Symfony/Component/BrowserKit/HttpBrowser.php @@ -23,8 +23,6 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; * to make real HTTP requests. * * @author Fabien Potencier - * - * @final */ class HttpBrowser extends AbstractBrowser { @@ -32,7 +30,7 @@ class HttpBrowser extends AbstractBrowser public function __construct(HttpClientInterface $client = null, History $history = null, CookieJar $cookieJar = null) { - if (!class_exists(HttpClient::class)) { + if (!$client && !class_exists(HttpClient::class)) { throw new \LogicException(sprintf('You cannot use "%s" as the HttpClient component is not installed. Try running "composer require symfony/http-client".', __CLASS__)); } diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php index 8c35712815..7b870250cc 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/KernelForTest.php @@ -35,7 +35,7 @@ class KernelForTest extends Kernel return $this->booted; } - public function getProjectDir() + public function getProjectDir(): string { return __DIR__; } diff --git a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php index b4319c0b4d..26bf7d8aff 100644 --- a/src/Symfony/Component/HttpKernel/Tests/KernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/KernelTest.php @@ -654,7 +654,7 @@ EOF; * * @return Kernel */ - protected function getKernel(array $methods = [], array $bundles = [], $debug = false) + protected function getKernel(array $methods = [], array $bundles = [], bool $debug = false): Kernel { $methods[] = 'registerBundles'; @@ -668,9 +668,6 @@ EOF; ->method('registerBundles') ->willReturn($bundles) ; - $p = new \ReflectionProperty($kernel, 'rootDir'); - $p->setAccessible(true); - $p->setValue($kernel, __DIR__.'/Fixtures'); return $kernel; } @@ -689,7 +686,7 @@ class TestKernel implements HttpKernelInterface { } - public function getProjectDir() + public function getProjectDir(): string { return __DIR__.'/Fixtures'; } diff --git a/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php b/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php index 066b4c1788..e2622a1b86 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/RedisExt/ConnectionTest.php @@ -20,6 +20,21 @@ use Symfony\Component\Messenger\Transport\RedisExt\Connection; */ class ConnectionTest extends TestCase { + public static function setUpBeforeClass() + { + $redis = Connection::fromDsn('redis://localhost/queue'); + + try { + $redis->get(); + } catch (TransportException $e) { + if (0 === strpos($e->getMessage(), 'ERR unknown command \'X')) { + self::markTestSkipped('Redis server >= 5 is required'); + } + + throw $e; + } + } + public function testFromInvalidDsn() { $this->expectException(\InvalidArgumentException::class);