|
18 | 18 | use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
|
19 | 19 | use Symfony\Component\Messenger\Event\WorkerMessageRetriedEvent;
|
20 | 20 | use Symfony\Component\Messenger\EventListener\SendFailedMessageForRetryListener;
|
| 21 | +use Symfony\Component\Messenger\Exception\HandlerFailedException; |
21 | 22 | use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException;
|
22 | 23 | use Symfony\Component\Messenger\Retry\RetryStrategyInterface;
|
23 | 24 | use Symfony\Component\Messenger\Stamp\DelayStamp;
|
@@ -108,6 +109,62 @@ public function testRecoverableExceptionRetryDelayOverridesStrategy()
|
108 | 109 | $listener->onMessageFailed($event);
|
109 | 110 | }
|
110 | 111 |
|
| 112 | + /** |
| 113 | + * @dataProvider provideRetryDelays |
| 114 | + */ |
| 115 | + public function testWrappedRecoverableExceptionRetryDelayOverridesStrategy(array $retries, int $expectedDelay) |
| 116 | + { |
| 117 | + $sender = $this->createMock(SenderInterface::class); |
| 118 | + $sender->expects($this->once())->method('send')->willReturnCallback(function (Envelope $envelope) use ($expectedDelay) { |
| 119 | + $delayStamp = $envelope->last(DelayStamp::class); |
| 120 | + $redeliveryStamp = $envelope->last(RedeliveryStamp::class); |
| 121 | + |
| 122 | + $this->assertInstanceOf(DelayStamp::class, $delayStamp); |
| 123 | + $this->assertSame($expectedDelay, $delayStamp->getDelay()); |
| 124 | + |
| 125 | + $this->assertInstanceOf(RedeliveryStamp::class, $redeliveryStamp); |
| 126 | + $this->assertSame(1, $redeliveryStamp->getRetryCount()); |
| 127 | + |
| 128 | + return $envelope; |
| 129 | + }); |
| 130 | + $senderLocator = new Container(); |
| 131 | + $senderLocator->set('my_receiver', $sender); |
| 132 | + $retryStrategy = $this->createMock(RetryStrategyInterface::class); |
| 133 | + $retryStrategy->expects($this->never())->method('isRetryable'); |
| 134 | + $retryStrategy->expects($this->never())->method('getWaitingTime'); |
| 135 | + $retryStrategyLocator = new Container(); |
| 136 | + $retryStrategyLocator->set('my_receiver', $retryStrategy); |
| 137 | + |
| 138 | + $listener = new SendFailedMessageForRetryListener($senderLocator, $retryStrategyLocator); |
| 139 | + |
| 140 | + $envelope = new Envelope(new \stdClass()); |
| 141 | + $exception = new HandlerFailedException( |
| 142 | + $envelope, |
| 143 | + array_map(fn (int $retry) => new RecoverableMessageHandlingException('retry', retryDelay: $retry), $retries) |
| 144 | + ); |
| 145 | + $event = new WorkerMessageFailedEvent($envelope, 'my_receiver', $exception); |
| 146 | + |
| 147 | + $listener->onMessageFailed($event); |
| 148 | + } |
| 149 | + |
| 150 | + public static function provideRetryDelays(): iterable |
| 151 | + { |
| 152 | + yield 'one_exception' => [ |
| 153 | + [1235], |
| 154 | + 1235, |
| 155 | + ]; |
| 156 | + |
| 157 | + yield 'multiple_exceptions' => [ |
| 158 | + [1235, 2000, 1000], |
| 159 | + 1000, |
| 160 | + ]; |
| 161 | + |
| 162 | + yield 'zero_delay' => [ |
| 163 | + [0, 2000, 1000], |
| 164 | + 0, |
| 165 | + ]; |
| 166 | + } |
| 167 | + |
111 | 168 | public function testEnvelopeIsSentToTransportOnRetry()
|
112 | 169 | {
|
113 | 170 | $exception = new \Exception('no!');
|
|
0 commit comments