From 9ac7e4223cdc3b94d31040a04b4c2925edcad960 Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Thu, 25 Jul 2019 16:32:05 +0200 Subject: [PATCH] [Messenger][Profiler] Attempt to give more useful source info when using HandleTrait --- .../TestTracesWithHandleTraitAction.php | 33 +++++++++++++++++++ .../Tests/TraceableMessageBusTest.php | 25 ++++++++++++++ .../Messenger/TraceableMessageBus.php | 14 +++++++- 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Messenger/Tests/Fixtures/TestTracesWithHandleTraitAction.php diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/TestTracesWithHandleTraitAction.php b/src/Symfony/Component/Messenger/Tests/Fixtures/TestTracesWithHandleTraitAction.php new file mode 100644 index 0000000000..d0fbb20bb9 --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/TestTracesWithHandleTraitAction.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Tests\Fixtures; + +use Symfony\Component\Messenger\HandleTrait; +use Symfony\Component\Messenger\MessageBusInterface; + +/** + * @see \Symfony\Component\Messenger\Tests\TraceableMessageBusTest::testItTracesDispatchWhenHandleTraitIsUsed + */ +class TestTracesWithHandleTraitAction +{ + use HandleTrait; + + public function __construct(MessageBusInterface $messageBus) + { + $this->messageBus = $messageBus; + } + + public function __invoke($message) + { + $this->handle($message); + } +} diff --git a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php index 13bf06b012..770dddb0b8 100644 --- a/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php +++ b/src/Symfony/Component/Messenger/Tests/TraceableMessageBusTest.php @@ -15,8 +15,10 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Stamp\DelayStamp; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Messenger\Tests\Fixtures\AnEnvelopeStamp; use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; +use Symfony\Component\Messenger\Tests\Fixtures\TestTracesWithHandleTraitAction; use Symfony\Component\Messenger\TraceableMessageBus; class TraceableMessageBusTest extends TestCase @@ -46,6 +48,29 @@ class TraceableMessageBusTest extends TestCase ], $actualTracedMessage); } + public function testItTracesDispatchWhenHandleTraitIsUsed() + { + $message = new DummyMessage('Hello'); + + $bus = $this->getMockBuilder(MessageBusInterface::class)->getMock(); + $bus->expects($this->once())->method('dispatch')->with($message)->willReturn((new Envelope($message))->with(new HandledStamp('result', 'handlerName'))); + + $traceableBus = new TraceableMessageBus($bus); + (new TestTracesWithHandleTraitAction($traceableBus))($message); + $this->assertCount(1, $tracedMessages = $traceableBus->getDispatchedMessages()); + $actualTracedMessage = $tracedMessages[0]; + unset($actualTracedMessage['callTime']); // don't check, too variable + $this->assertEquals([ + 'message' => $message, + 'stamps' => [], + 'caller' => [ + 'name' => 'TestTracesWithHandleTraitAction.php', + 'file' => (new \ReflectionClass(TestTracesWithHandleTraitAction::class))->getFileName(), + 'line' => (new \ReflectionMethod(TestTracesWithHandleTraitAction::class, '__invoke'))->getStartLine() + 2, + ], + ], $actualTracedMessage); + } + public function testItTracesDispatchWithEnvelope() { $message = new DummyMessage('Hello'); diff --git a/src/Symfony/Component/Messenger/TraceableMessageBus.php b/src/Symfony/Component/Messenger/TraceableMessageBus.php index a83ddee08a..fe0552571a 100644 --- a/src/Symfony/Component/Messenger/TraceableMessageBus.php +++ b/src/Symfony/Component/Messenger/TraceableMessageBus.php @@ -65,7 +65,19 @@ class TraceableMessageBus implements MessageBusInterface $file = $trace[1]['file']; $line = $trace[1]['line']; - for ($i = 2; $i < 8; ++$i) { + $handleTraitFile = (new \ReflectionClass(HandleTrait::class))->getFileName(); + $found = false; + for ($i = 1; $i < 8; ++$i) { + if (isset($trace[$i]['file'], $trace[$i + 1]['file'], $trace[$i + 1]['line']) && $trace[$i]['file'] === $handleTraitFile) { + $file = $trace[$i + 1]['file']; + $line = $trace[$i + 1]['line']; + $found = true; + + break; + } + } + + for ($i = 2; $i < 8 && !$found; ++$i) { if (isset($trace[$i]['class'], $trace[$i]['function']) && 'dispatch' === $trace[$i]['function'] && is_a($trace[$i]['class'], MessageBusInterface::class, true)