From ba02db9cacaa0d1f9eb86e46931b9d03bb7e7039 Mon Sep 17 00:00:00 2001 From: HypeMC Date: Fri, 3 Jan 2025 03:50:44 +0100 Subject: [PATCH] [Messenger] Fix `TransportMessageIdStamp` not always added --- .../Tests/Transport/BeanstalkdReceiverTest.php | 13 +++++++++++-- .../Tests/Transport/BeanstalkdSenderTest.php | 13 +++++++++++-- .../Beanstalkd/Transport/BeanstalkdReceiver.php | 8 +++++++- .../Beanstalkd/Transport/BeanstalkdSender.php | 5 +++-- .../Tests/Transport/DoctrineReceiverTest.php | 2 +- .../Redis/Tests/Transport/RedisReceiverTest.php | 11 ++++++++++- .../Bridge/Redis/Transport/RedisReceiver.php | 8 +++++++- 7 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php index ed3c7f2d7eb4e..77302090067bc 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdReceiverTest.php @@ -16,7 +16,9 @@ use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdReceivedStamp; use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdReceiver; use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\Connection; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\Serializer; use Symfony\Component\Serializer as SerializerComponent; @@ -39,14 +41,21 @@ public function testItReturnsTheDecodedMessageToTheHandler() $receiver = new BeanstalkdReceiver($connection, $serializer); $actualEnvelopes = $receiver->get(); $this->assertCount(1, $actualEnvelopes); - $this->assertEquals(new DummyMessage('Hi'), $actualEnvelopes[0]->getMessage()); + /** @var Envelope $actualEnvelope */ + $actualEnvelope = $actualEnvelopes[0]; + $this->assertEquals(new DummyMessage('Hi'), $actualEnvelope->getMessage()); /** @var BeanstalkdReceivedStamp $receivedStamp */ - $receivedStamp = $actualEnvelopes[0]->last(BeanstalkdReceivedStamp::class); + $receivedStamp = $actualEnvelope->last(BeanstalkdReceivedStamp::class); $this->assertInstanceOf(BeanstalkdReceivedStamp::class, $receivedStamp); $this->assertSame('1', $receivedStamp->getId()); $this->assertSame($tube, $receivedStamp->getTube()); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame('1', $transportMessageIdStamp->getId()); } public function testItReturnsEmptyArrayIfThereAreNoMessages() diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php index 89ac3449f3a4b..a198765d7ed70 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php @@ -17,6 +17,7 @@ use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\Connection; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\DelayStamp; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; final class BeanstalkdSenderTest extends TestCase @@ -27,13 +28,21 @@ public function testSend() $encoded = ['body' => '...', 'headers' => ['type' => DummyMessage::class]]; $connection = $this->createMock(Connection::class); - $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 0); + $connection->expects($this->once())->method('send') + ->with($encoded['body'], $encoded['headers'], 0) + ->willReturn('1') + ; $serializer = $this->createMock(SerializerInterface::class); $serializer->method('encode')->with($envelope)->willReturn($encoded); $sender = new BeanstalkdSender($connection, $serializer); - $sender->send($envelope); + $actualEnvelope = $sender->send($envelope); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame('1', $transportMessageIdStamp->getId()); } public function testSendWithDelay() diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php index c89a75a2c8735..0798966dc4772 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdReceiver.php @@ -14,6 +14,7 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; @@ -52,7 +53,12 @@ public function get(): iterable throw $exception; } - return [$envelope->with(new BeanstalkdReceivedStamp($beanstalkdEnvelope['id'], $this->connection->getTube()))]; + return [$envelope + ->withoutAll(TransportMessageIdStamp::class) + ->with( + new BeanstalkdReceivedStamp($beanstalkdEnvelope['id'], $this->connection->getTube()), + new TransportMessageIdStamp($beanstalkdEnvelope['id']), + )]; } public function ack(Envelope $envelope): void diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php index fc3f87780ebe9..907b9117089a2 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php @@ -13,6 +13,7 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\DelayStamp; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Sender\SenderInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; @@ -39,8 +40,8 @@ public function send(Envelope $envelope): Envelope $delayStamp = $envelope->last(DelayStamp::class); $delayInMs = null !== $delayStamp ? $delayStamp->getDelay() : 0; - $this->connection->send($encodedMessage['body'], $encodedMessage['headers'] ?? [], $delayInMs); + $id = $this->connection->send($encodedMessage['body'], $encodedMessage['headers'] ?? [], $delayInMs); - return $envelope; + return $envelope->with(new TransportMessageIdStamp($id)); } } diff --git a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php index 7dcb19040e790..fcf4d6748abaa 100644 --- a/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineReceiverTest.php @@ -47,7 +47,7 @@ public function testItReturnsTheDecodedMessageToTheHandler() $this->assertCount(1, $actualEnvelopes); /** @var Envelope $actualEnvelope */ $actualEnvelope = $actualEnvelopes[0]; - $this->assertEquals(new DummyMessage('Hi'), $actualEnvelopes[0]->getMessage()); + $this->assertEquals(new DummyMessage('Hi'), $actualEnvelope->getMessage()); /** @var DoctrineReceivedStamp $doctrineReceivedStamp */ $doctrineReceivedStamp = $actualEnvelope->last(DoctrineReceivedStamp::class); diff --git a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php index 903428ab3772c..831b6817ee9c8 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Tests/Transport/RedisReceiverTest.php @@ -17,7 +17,9 @@ use Symfony\Component\Messenger\Bridge\Redis\Tests\Fixtures\ExternalMessageSerializer; use Symfony\Component\Messenger\Bridge\Redis\Transport\Connection; use Symfony\Component\Messenger\Bridge\Redis\Transport\RedisReceiver; +use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; use Symfony\Component\Messenger\Transport\Serialization\Serializer; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; @@ -38,7 +40,14 @@ public function testItReturnsTheDecodedMessageToTheHandler(array $redisEnvelope, $receiver = new RedisReceiver($connection, $serializer); $actualEnvelopes = $receiver->get(); $this->assertCount(1, $actualEnvelopes); - $this->assertEquals($expectedMessage, $actualEnvelopes[0]->getMessage()); + /** @var Envelope $actualEnvelope */ + $actualEnvelope = $actualEnvelopes[0]; + $this->assertEquals($expectedMessage, $actualEnvelope->getMessage()); + + /** @var TransportMessageIdStamp $transportMessageIdStamp */ + $transportMessageIdStamp = $actualEnvelope->last(TransportMessageIdStamp::class); + $this->assertNotNull($transportMessageIdStamp); + $this->assertSame($redisEnvelope['id'], $transportMessageIdStamp->getId()); } /** diff --git a/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php b/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php index cf6be2660a5ba..0f2e88e1cbd29 100644 --- a/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php +++ b/src/Symfony/Component/Messenger/Bridge/Redis/Transport/RedisReceiver.php @@ -15,6 +15,7 @@ use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\MessageDecodingFailedException; use Symfony\Component\Messenger\Exception\TransportException; +use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Receiver\MessageCountAwareInterface; use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer; @@ -76,7 +77,12 @@ public function get(): iterable throw $exception; } - return [$envelope->with(new RedisReceivedStamp($message['id']))]; + return [$envelope + ->withoutAll(TransportMessageIdStamp::class) + ->with( + new RedisReceivedStamp($message['id']), + new TransportMessageIdStamp($message['id']) + )]; } public function ack(Envelope $envelope): void