Skip to content

Commit 834f876

Browse files
jnoordsijfabpot
authored andcommitted
[Mailer] [Transport] Allow exception logging for RoundRobinTransport mailer
1 parent 5e9ea6e commit 834f876

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

src/Symfony/Component/Mailer/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.4
5+
---
6+
7+
* Add `logger` (constructor) property to `RoundRobinTransport`
8+
49
7.3
510
---
611

src/Symfony/Component/Mailer/Tests/Transport/RoundRobinTransportTest.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Mailer\Tests\Transport;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Psr\Log\LoggerInterface;
1516
use Symfony\Component\Mailer\Exception\TransportException;
1617
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
1718
use Symfony\Component\Mailer\Transport\RoundRobinTransport;
@@ -167,19 +168,45 @@ public function testSendOneDeadMessageAlterationsDoNotPersist()
167168
$this->assertFalse($message->getHeaders()->has('X-Transport-1'));
168169
}
169170

171+
public function testLoggerReceivesExceptions()
172+
{
173+
$t1 = $this->createMock(TransportInterface::class);
174+
$t1->expects($this->exactly(2))->method('send');
175+
176+
$ex = new TransportException();
177+
$t2 = $this->createMock(TransportInterface::class);
178+
$t2->expects($this->exactly(1))
179+
->method('send')
180+
->willReturnCallback(fn () => throw $ex);
181+
$t2->expects($this->atLeast(1))->method('__toString')->willReturn('t2');
182+
183+
$log = $this->createMock(LoggerInterface::class);
184+
$log->expects($this->exactly(1))
185+
->method('error')
186+
->with('Transport "t2" failed.', ['exception' => $ex]);
187+
188+
$t = new RoundRobinTransport([$t1, $t2], logger: $log);
189+
$p = new \ReflectionProperty($t, 'cursor');
190+
$p->setValue($t, 0);
191+
$t->send(new RawMessage(''));
192+
$this->assertTransports($t, 1, []);
193+
$t->send(new RawMessage(''));
194+
$this->assertTransports($t, 1, [$t2]);
195+
}
196+
170197
public function testFailureDebugInformation()
171198
{
172199
$t1 = $this->createMock(TransportInterface::class);
173200
$e1 = new TransportException();
174201
$e1->appendDebug('Debug message 1');
175202
$t1->expects($this->once())->method('send')->willThrowException($e1);
176-
$t1->expects($this->once())->method('__toString')->willReturn('t1');
203+
$t1->expects($this->atLeast(1))->method('__toString')->willReturn('t1');
177204

178205
$t2 = $this->createMock(TransportInterface::class);
179206
$e2 = new TransportException();
180207
$e2->appendDebug('Debug message 2');
181208
$t2->expects($this->once())->method('send')->willThrowException($e2);
182-
$t2->expects($this->once())->method('__toString')->willReturn('t2');
209+
$t2->expects($this->atLeast(1))->method('__toString')->willReturn('t2');
183210

184211
$t = new RoundRobinTransport([$t1, $t2]);
185212

src/Symfony/Component/Mailer/Transport/RoundRobinTransport.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Mailer\Transport;
1313

14+
use Psr\Log\LoggerInterface;
15+
use Psr\Log\NullLogger;
1416
use Symfony\Component\Mailer\Envelope;
1517
use Symfony\Component\Mailer\Exception\TransportException;
1618
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
@@ -36,6 +38,7 @@ class RoundRobinTransport implements TransportInterface
3638
public function __construct(
3739
private array $transports,
3840
private int $retryPeriod = 60,
41+
private LoggerInterface $logger = new NullLogger(),
3942
) {
4043
if (!$transports) {
4144
throw new TransportException(\sprintf('"%s" must have at least one transport configured.', static::class));
@@ -54,6 +57,7 @@ public function send(RawMessage $message, ?Envelope $envelope = null): ?SentMess
5457
} catch (TransportExceptionInterface $e) {
5558
$exception ??= new TransportException('All transports failed.');
5659
$exception->appendDebug(\sprintf("Transport \"%s\": %s\n", $transport, $e->getDebug()));
60+
$this->logger->error(\sprintf("Transport \"%s\" failed.", $transport), ['exception' => $e]);
5761
$this->deadTransports[$transport] = microtime(true);
5862
}
5963
}

0 commit comments

Comments
 (0)