From 0d477e96f74618f6689cd4a36c1e40dfbb692d22 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 21 Dec 2021 10:51:04 +0100 Subject: [PATCH 01/11] [HttpClient] fix checking for recent curl consts --- src/Symfony/Component/HttpClient/CurlHttpClient.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/HttpClient/CurlHttpClient.php b/src/Symfony/Component/HttpClient/CurlHttpClient.php index 658854626b461..2821e10df8465 100644 --- a/src/Symfony/Component/HttpClient/CurlHttpClient.php +++ b/src/Symfony/Component/HttpClient/CurlHttpClient.php @@ -439,8 +439,6 @@ private function validateExtraCurlOptions(array $options): void \CURLOPT_INFILESIZE => 'body', \CURLOPT_POSTFIELDS => 'body', \CURLOPT_UPLOAD => 'body', - \CURLOPT_PINNEDPUBLICKEY => 'peer_fingerprint', - \CURLOPT_UNIX_SOCKET_PATH => 'bindto', \CURLOPT_INTERFACE => 'bindto', \CURLOPT_TIMEOUT_MS => 'max_duration', \CURLOPT_TIMEOUT => 'max_duration', @@ -463,6 +461,14 @@ private function validateExtraCurlOptions(array $options): void \CURLOPT_PROGRESSFUNCTION => 'on_progress', ]; + if (\defined('CURLOPT_UNIX_SOCKET_PATH')) { + $curloptsToConfig[\CURLOPT_UNIX_SOCKET_PATH] = 'bindto'; + } + + if (\defined('CURLOPT_PINNEDPUBLICKEY')) { + $curloptsToConfig[\CURLOPT_PINNEDPUBLICKEY] = 'peer_fingerprint'; + } + $curloptsToCheck = [ \CURLOPT_PRIVATE, \CURLOPT_HEADERFUNCTION, From d1aa32a2a1f61125a404bb259b87ed882bdb03a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20H=C3=A9lias?= Date: Tue, 21 Dec 2021 16:03:21 +0100 Subject: [PATCH 02/11] [Security/Http] Fix cookie clearing on logout --- .../CookieClearingLogoutListener.php | 2 +- .../CookieClearingLogoutListenerTest.php | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Security/Http/Tests/EventListener/CookieClearingLogoutListenerTest.php diff --git a/src/Symfony/Component/Security/Http/EventListener/CookieClearingLogoutListener.php b/src/Symfony/Component/Security/Http/EventListener/CookieClearingLogoutListener.php index ecff5fd03078f..d178b926c3ade 100644 --- a/src/Symfony/Component/Security/Http/EventListener/CookieClearingLogoutListener.php +++ b/src/Symfony/Component/Security/Http/EventListener/CookieClearingLogoutListener.php @@ -40,7 +40,7 @@ public function onLogout(LogoutEvent $event): void } foreach ($this->cookies as $cookieName => $cookieData) { - $response->headers->clearCookie($cookieName, $cookieData['path'], $cookieData['domain']); + $response->headers->clearCookie($cookieName, $cookieData['path'], $cookieData['domain'], $cookieData['secure'] ?? false, true, $cookieData['samesite'] ?? null); } } diff --git a/src/Symfony/Component/Security/Http/Tests/EventListener/CookieClearingLogoutListenerTest.php b/src/Symfony/Component/Security/Http/Tests/EventListener/CookieClearingLogoutListenerTest.php new file mode 100644 index 0000000000000..f4c0e3d89b611 --- /dev/null +++ b/src/Symfony/Component/Security/Http/Tests/EventListener/CookieClearingLogoutListenerTest.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Security\Http\Tests\EventListener; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; +use Symfony\Component\Security\Http\Event\LogoutEvent; +use Symfony\Component\Security\Http\EventListener\CookieClearingLogoutListener; + +class CookieClearingLogoutListenerTest extends TestCase +{ + public function testLogout() + { + $response = new Response(); + $event = new LogoutEvent(new Request(), null); + $event->setResponse($response); + + $listener = new CookieClearingLogoutListener(['foo' => ['path' => '/foo', 'domain' => 'foo.foo', 'secure' => true, 'samesite' => Cookie::SAMESITE_STRICT], 'foo2' => ['path' => null, 'domain' => null]]); + + $cookies = $response->headers->getCookies(); + $this->assertCount(0, $cookies); + + $listener->onLogout($event); + + $cookies = $response->headers->getCookies(ResponseHeaderBag::COOKIES_ARRAY); + $this->assertCount(2, $cookies); + + $cookie = $cookies['foo.foo']['/foo']['foo']; + $this->assertEquals('foo', $cookie->getName()); + $this->assertEquals('/foo', $cookie->getPath()); + $this->assertEquals('foo.foo', $cookie->getDomain()); + $this->assertEquals(Cookie::SAMESITE_STRICT, $cookie->getSameSite()); + $this->assertTrue($cookie->isSecure()); + $this->assertTrue($cookie->isCleared()); + + $cookie = $cookies['']['/']['foo2']; + $this->assertStringStartsWith('foo2', $cookie->getName()); + $this->assertEquals('/', $cookie->getPath()); + $this->assertNull($cookie->getDomain()); + $this->assertNull($cookie->getSameSite()); + $this->assertFalse($cookie->isSecure()); + $this->assertTrue($cookie->isCleared()); + } +} From 6ca8e30a85e455bf348b18eeb735c897ccd00f9b Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Wed, 22 Dec 2021 14:28:19 +0100 Subject: [PATCH 03/11] Remove the unused dependency on composer/package-versions-deprecated The ProxyManagerBridge depends on friendsofphp/proxy-manager-lts which has an optional dependency on the PackageVersions class to implement the `ProxyManager\Version::getVersion` method on composer 1 (with a fallback to a less precise version number). However, the bridge has stopped using that API in favor of feature detection, so the dependency is unused. --- src/Symfony/Bridge/ProxyManager/composer.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Symfony/Bridge/ProxyManager/composer.json b/src/Symfony/Bridge/ProxyManager/composer.json index 09692b8c89d74..577138489e690 100644 --- a/src/Symfony/Bridge/ProxyManager/composer.json +++ b/src/Symfony/Bridge/ProxyManager/composer.json @@ -17,7 +17,6 @@ ], "require": { "php": ">=7.1.3", - "composer/package-versions-deprecated": "^1.8", "friendsofphp/proxy-manager-lts": "^1.0.2", "symfony/dependency-injection": "^4.0|^5.0", "symfony/polyfill-php80": "^1.16" From c106a6b0d18bb2bbb0dd4877a3c024cf5f36589f Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Wed, 22 Dec 2021 19:38:25 +0100 Subject: [PATCH 04/11] Remove direct dependency on composer/package-versions-deprecated This dependency in the doctrine-bridge was added to enforce the replacement of the ocramius/package-versions package used by the ORM, to keep support for PHP versions we needed. But as of 2.7.4, the ORM switched its dependency, so this is not necessary anymore. --- composer.json | 3 +-- src/Symfony/Bridge/Doctrine/composer.json | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 07163ed3850ce..63a91bba9930e 100644 --- a/composer.json +++ b/composer.json @@ -123,13 +123,12 @@ "async-aws/ses": "^1.0", "async-aws/sqs": "^1.0", "cache/integration-tests": "dev-master", - "composer/package-versions-deprecated": "^1.8", "doctrine/annotations": "^1.12", "doctrine/cache": "^1.6|^2.0", "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.10|^3.0", - "doctrine/orm": "^2.7.3", + "doctrine/orm": "^2.7.4", "guzzlehttp/promises": "^1.4", "masterminds/html5": "^2.6", "monolog/monolog": "^1.25.1|^2", diff --git a/src/Symfony/Bridge/Doctrine/composer.json b/src/Symfony/Bridge/Doctrine/composer.json index 1ead9f0eb4b06..087ed34e7ad52 100644 --- a/src/Symfony/Bridge/Doctrine/composer.json +++ b/src/Symfony/Bridge/Doctrine/composer.json @@ -26,7 +26,6 @@ "symfony/service-contracts": "^1.1|^2" }, "require-dev": { - "composer/package-versions-deprecated": "^1.8", "symfony/stopwatch": "^4.4|^5.0", "symfony/cache": "^5.1", "symfony/config": "^4.4|^5.0", @@ -48,12 +47,12 @@ "doctrine/collections": "~1.0", "doctrine/data-fixtures": "^1.1", "doctrine/dbal": "^2.10|^3.0", - "doctrine/orm": "^2.7.3" + "doctrine/orm": "^2.7.4" }, "conflict": { "doctrine/dbal": "<2.10", "doctrine/lexer": "<1.1", - "doctrine/orm": "<2.7.3", + "doctrine/orm": "<2.7.4", "phpunit/phpunit": "<5.4.3", "symfony/dependency-injection": "<4.4", "symfony/form": "<5.1", From 7abddd097fd7398a9974dfd8056c15ffe50bb8e3 Mon Sep 17 00:00:00 2001 From: Soner Sayakci Date: Tue, 14 Dec 2021 15:39:19 +0100 Subject: [PATCH 05/11] Fix SessionListener without session in request --- .../EventListener/AbstractSessionListener.php | 2 +- .../EventListener/SessionListenerTest.php | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php index eae5fb6bab225..91c2ebfbc1b3c 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php @@ -68,7 +68,7 @@ public function onKernelRequest(RequestEvent $event) public function onKernelResponse(ResponseEvent $event) { - if (!$event->isMainRequest()) { + if (!$event->isMainRequest() || (!$this->container->has('initialized_session') && !$event->getRequest()->hasSession())) { return; } diff --git a/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php b/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php index 853f722031503..348f643c1fbcc 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/SessionListenerTest.php @@ -142,6 +142,24 @@ public function testUninitializedSession() $this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER)); } + public function testUninitializedSessionWithoutInitializedSession() + { + $kernel = $this->createMock(HttpKernelInterface::class); + $response = new Response(); + $response->setSharedMaxAge(60); + $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true'); + + $container = new ServiceLocator([]); + + $listener = new SessionListener($container); + $listener->onKernelResponse(new ResponseEvent($kernel, new Request(), HttpKernelInterface::MASTER_REQUEST, $response)); + $this->assertFalse($response->headers->has('Expires')); + $this->assertTrue($response->headers->hasCacheControlDirective('public')); + $this->assertFalse($response->headers->hasCacheControlDirective('private')); + $this->assertFalse($response->headers->hasCacheControlDirective('must-revalidate')); + $this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage')); + } + public function testSurrogateMainRequestIsPublic() { $session = $this->createMock(Session::class); From 87edd237ee2ee9482bcd08556e1714256da9bdc2 Mon Sep 17 00:00:00 2001 From: Toon Verwerft Date: Thu, 23 Dec 2021 13:11:30 +0100 Subject: [PATCH 06/11] [Notifier] Use correct factory for the msteams transport --- src/Symfony/Component/Notifier/Transport.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Notifier/Transport.php b/src/Symfony/Component/Notifier/Transport.php index ead57b259393b..41386256d6f6f 100644 --- a/src/Symfony/Component/Notifier/Transport.php +++ b/src/Symfony/Component/Notifier/Transport.php @@ -24,7 +24,7 @@ use Symfony\Component\Notifier\Bridge\LightSms\LightSmsTransportFactory; use Symfony\Component\Notifier\Bridge\Mattermost\MattermostTransportFactory; use Symfony\Component\Notifier\Bridge\MessageBird\MessageBirdTransportFactory; -use Symfony\Component\Notifier\Bridge\MicrosoftTeams\MicrosoftTeamsTransport; +use Symfony\Component\Notifier\Bridge\MicrosoftTeams\MicrosoftTeamsTransportFactory; use Symfony\Component\Notifier\Bridge\Mobyt\MobytTransportFactory; use Symfony\Component\Notifier\Bridge\Nexmo\NexmoTransportFactory; use Symfony\Component\Notifier\Bridge\Octopush\OctopushTransportFactory; @@ -68,7 +68,7 @@ class Transport LightSmsTransportFactory::class, MattermostTransportFactory::class, MessageBirdTransportFactory::class, - MicrosoftTeamsTransport::class, + MicrosoftTeamsTransportFactory::class, MobytTransportFactory::class, NexmoTransportFactory::class, OctopushTransportFactory::class, From c7f6b348351dde620fa24982f0b8efc49bde2355 Mon Sep 17 00:00:00 2001 From: Antoine Makdessi Date: Thu, 23 Dec 2021 17:49:24 +0100 Subject: [PATCH 07/11] Update security.lb.xlf --- .../Security/Core/Resources/translations/security.lb.xlf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.lb.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.lb.xlf index 5f707535fa723..36987bc99f37f 100644 --- a/src/Symfony/Component/Security/Core/Resources/translations/security.lb.xlf +++ b/src/Symfony/Component/Security/Core/Resources/translations/security.lb.xlf @@ -1,6 +1,6 @@ - + An authentication exception occurred. From 042c60086aa0de9a785e85275a03e9e97e720762 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Fri, 24 Dec 2021 00:01:05 +0100 Subject: [PATCH 08/11] Allow package-versions-deprecated plugin --- composer.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/composer.json b/composer.json index 5388530c16c85..0b9c72332eec8 100644 --- a/composer.json +++ b/composer.json @@ -152,6 +152,11 @@ "ocramius/proxy-manager": "<2.1", "phpunit/phpunit": "<5.4.3" }, + "config": { + "allow-plugins": { + "composer/package-versions-deprecated": true + } + }, "autoload": { "psr-4": { "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", From 180248807e17afdddfbaac42537c78443406aac1 Mon Sep 17 00:00:00 2001 From: Hugo Alliaume Date: Tue, 16 Nov 2021 16:12:13 +0100 Subject: [PATCH 09/11] [Translation] Fix TranslationPullCommand with ICU translations --- .../Bridge/Loco/Tests/LocoProviderTest.php | 36 ++++++++++++-- .../Catalogue/AbstractOperation.php | 13 ++++- .../Tests/Catalogue/MergeOperationTest.php | 2 +- .../Tests/Catalogue/TargetOperationTest.php | 3 +- .../Command/TranslationPullCommandTest.php | 48 +++++++++++++++++-- 5 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php index 2a2183abf110f..5b224de8aa1be 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderTest.php @@ -426,12 +426,16 @@ public function getResponsesForManyLocalesAndManyDomains(): \Generator $expectedTranslatorBag = new TranslatorBag(); $expectedTranslatorBag->addCatalogue($arrayLoader->load([ 'index.hello' => 'Hello', - 'index.greetings' => 'Welcome, {firstname}!', ], 'en')); + $expectedTranslatorBag->addCatalogue($arrayLoader->load([ + 'index.greetings' => 'Welcome, {firstname}!', + ], 'en', 'messages+intl-icu')); $expectedTranslatorBag->addCatalogue($arrayLoader->load([ 'index.hello' => 'Bonjour', - 'index.greetings' => 'Bienvenue, {firstname} !', ], 'fr')); + $expectedTranslatorBag->addCatalogue($arrayLoader->load([ + 'index.greetings' => 'Bienvenue, {firstname} !', + ], 'fr', 'messages+intl-icu')); $expectedTranslatorBag->addCatalogue($arrayLoader->load([ 'firstname.error' => 'Firstname must contains only letters.', 'lastname.error' => 'Lastname must contains only letters.', @@ -443,7 +447,7 @@ public function getResponsesForManyLocalesAndManyDomains(): \Generator yield [ ['en', 'fr'], - ['messages', 'validators'], + ['messages', 'messages+intl-icu', 'validators'], [ 'en' => [ 'messages' => <<<'XLIFF' @@ -458,6 +462,19 @@ public function getResponsesForManyLocalesAndManyDomains(): \Generator index.hello Hello + + + +XLIFF + , + 'messages+intl-icu' => <<<'XLIFF' + + + +
+ +
+ index.greetings Welcome, {firstname}! @@ -502,6 +519,19 @@ public function getResponsesForManyLocalesAndManyDomains(): \Generator index.hello Bonjour + +
+
+XLIFF + , + 'messages+intl-icu' => <<<'XLIFF' + + + +
+ +
+ index.greetings Bienvenue, {firstname} ! diff --git a/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php b/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php index 9869fbb8bb34e..98d42e5b6e46c 100644 --- a/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php +++ b/src/Symfony/Component/Translation/Catalogue/AbstractOperation.php @@ -83,7 +83,18 @@ public function __construct(MessageCatalogueInterface $source, MessageCatalogueI public function getDomains() { if (null === $this->domains) { - $this->domains = array_values(array_unique(array_merge($this->source->getDomains(), $this->target->getDomains()))); + $domains = []; + foreach ([$this->source, $this->target] as $catalogue) { + foreach ($catalogue->getDomains() as $domain) { + $domains[$domain] = $domain; + + if ($catalogue->all($domainIcu = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX)) { + $domains[$domainIcu] = $domainIcu; + } + } + } + + $this->domains = array_values($domains); } return $this->domains; diff --git a/src/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php b/src/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php index 240c492800acc..3f21abac9dd52 100644 --- a/src/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php +++ b/src/Symfony/Component/Translation/Tests/Catalogue/MergeOperationTest.php @@ -58,7 +58,7 @@ public function testGetResultFromIntlDomain() $this->assertEquals( new MessageCatalogue('en', [ 'messages' => ['a' => 'old_a', 'b' => 'old_b'], - 'messages+intl-icu' => ['d' => 'old_d', 'c' => 'new_c'], + 'messages+intl-icu' => ['d' => 'old_d', 'c' => 'new_c', 'a' => 'new_a'], ]), $this->createOperation( new MessageCatalogue('en', ['messages' => ['a' => 'old_a', 'b' => 'old_b'], 'messages+intl-icu' => ['d' => 'old_d']]), diff --git a/src/Symfony/Component/Translation/Tests/Catalogue/TargetOperationTest.php b/src/Symfony/Component/Translation/Tests/Catalogue/TargetOperationTest.php index d5441f3bee4ef..2b63cd4166464 100644 --- a/src/Symfony/Component/Translation/Tests/Catalogue/TargetOperationTest.php +++ b/src/Symfony/Component/Translation/Tests/Catalogue/TargetOperationTest.php @@ -72,6 +72,7 @@ public function testGetResultWithMixedDomains() $this->assertEquals( new MessageCatalogue('en', [ 'messages' => ['a' => 'old_a'], + 'messages+intl-icu' => ['a' => 'new_a'], ]), $this->createOperation( new MessageCatalogue('en', ['messages' => ['a' => 'old_a']]), @@ -103,7 +104,7 @@ public function testGetResultWithMixedDomains() $this->assertEquals( new MessageCatalogue('en', [ 'messages' => ['a' => 'old_a'], - 'messages+intl-icu' => ['b' => 'new_b'], + 'messages+intl-icu' => ['b' => 'new_b', 'a' => 'new_a'], ]), $this->createOperation( new MessageCatalogue('en', ['messages' => ['a' => 'old_a']]), diff --git a/src/Symfony/Component/Translation/Tests/Command/TranslationPullCommandTest.php b/src/Symfony/Component/Translation/Tests/Command/TranslationPullCommandTest.php index 7494a1c84c8fc..ecb6e834104e4 100644 --- a/src/Symfony/Component/Translation/Tests/Command/TranslationPullCommandTest.php +++ b/src/Symfony/Component/Translation/Tests/Command/TranslationPullCommandTest.php @@ -46,19 +46,27 @@ public function testPullNewXlf12Messages() { $arrayLoader = new ArrayLoader(); $filenameEn = $this->createFile(); + $filenameEnIcu = $this->createFile(['say_hello' => 'Welcome, {firstname}!'], 'en', 'messages+intl-icu.%locale%.xlf'); $filenameFr = $this->createFile(['note' => 'NOTE'], 'fr'); + $filenameFrIcu = $this->createFile(['say_hello' => 'Bonjour, {firstname}!'], 'fr', 'messages+intl-icu.%locale%.xlf'); $locales = ['en', 'fr']; - $domains = ['messages']; + $domains = ['messages', 'messages+intl-icu']; $providerReadTranslatorBag = new TranslatorBag(); $providerReadTranslatorBag->addCatalogue($arrayLoader->load([ 'note' => 'NOTE', 'new.foo' => 'newFoo', ], 'en')); + $providerReadTranslatorBag->addCatalogue($arrayLoader->load([ + 'say_hello' => 'Welcome, {firstname}!', + ], 'en', 'messages+intl-icu')); $providerReadTranslatorBag->addCatalogue($arrayLoader->load([ 'note' => 'NOTE', 'new.foo' => 'nouveauFoo', ], 'fr')); + $providerReadTranslatorBag->addCatalogue($arrayLoader->load([ + 'say_hello' => 'Bonjour, {firstname}!', + ], 'fr', 'messages+intl-icu')); $provider = $this->createMock(ProviderInterface::class); $provider->expects($this->once()) @@ -71,9 +79,9 @@ public function testPullNewXlf12Messages() ->willReturn('null://default'); $tester = $this->createCommandTester($provider, $locales, $domains); - $tester->execute(['--locales' => ['en', 'fr'], '--domains' => ['messages']]); + $tester->execute(['--locales' => ['en', 'fr'], '--domains' => ['messages', 'messages+intl-icu']]); - $this->assertStringContainsString('[OK] New translations from "null" has been written locally (for "en, fr" locale(s), and "messages" domain(s)).', trim($tester->getDisplay())); + $this->assertStringContainsString('[OK] New translations from "null" has been written locally (for "en, fr" locale(s), and "messages, messages+intl-icu"', trim($tester->getDisplay())); $this->assertXmlStringEqualsXmlString(<< @@ -97,6 +105,23 @@ public function testPullNewXlf12Messages() , file_get_contents($filenameEn)); $this->assertXmlStringEqualsXmlString(<< + + +
+ +
+ + + say_hello + Welcome, {firstname}! + + +
+
+XLIFF + , file_get_contents($filenameEnIcu)); + $this->assertXmlStringEqualsXmlString(<<
@@ -116,6 +141,23 @@ public function testPullNewXlf12Messages() XLIFF , file_get_contents($filenameFr)); + $this->assertXmlStringEqualsXmlString(<< + + +
+ +
+ + + say_hello + Bonjour, {firstname}! + + +
+
+XLIFF + , file_get_contents($filenameFrIcu)); } public function testPullNewXlf20Messages() From 5f69e86af0ada3d1794109e2eea53c8b21c20425 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sat, 25 Dec 2021 20:39:39 +0100 Subject: [PATCH 10/11] [Mime] Fix test --- src/Symfony/Component/Mime/Tests/Header/HeadersTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php index 5da27293310e8..168d0bcbbe0d9 100644 --- a/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php +++ b/src/Symfony/Component/Mime/Tests/Header/HeadersTest.php @@ -247,14 +247,14 @@ public function testToArray() public function testInReplyToAcceptsNonIdentifierValues() { $headers = new Headers(); - $headers->addHeader('In-Reply-To', 'foobar'); + $headers->addTextHeader('In-Reply-To', 'foobar'); $this->assertEquals('foobar', $headers->get('In-Reply-To')->getBody()); } public function testReferencesAcceptsNonIdentifierValues() { $headers = new Headers(); - $headers->addHeader('References' , 'foobar'); + $headers->addTextHeader('References' , 'foobar'); $this->assertEquals('foobar', $headers->get('References')->getBody()); } } From 4d95be0a2e76ed80684f1f82f2c8e6fc3fc9484c Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sat, 25 Dec 2021 20:42:09 +0100 Subject: [PATCH 11/11] [HttpClient] mark test transient --- src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php b/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php index 36e76ee83b9a1..e5b86a3be96cc 100644 --- a/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php +++ b/src/Symfony/Component/HttpClient/Tests/HttpClientTestCase.php @@ -19,6 +19,9 @@ abstract class HttpClientTestCase extends BaseHttpClientTestCase { + /** + * @group transient-on-macos + */ public function testTimeoutOnDestruct() { if (!method_exists(parent::class, 'testTimeoutOnDestruct')) {