From 69e7755a24a842e5adca80cd19bd56f49783866b Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Wed, 13 Feb 2019 18:20:17 +0200 Subject: [PATCH 1/6] add exit status flow --- pkg/enqueue/Consumption/Context/End.php | 20 +++++++++++++++++-- .../Consumption/Context/PostConsume.php | 13 +++++++++++- .../Context/PostMessageReceived.php | 13 +++++++++++- .../Consumption/Context/PreConsume.php | 13 +++++++++++- pkg/enqueue/Consumption/Context/Start.php | 13 +++++++++++- pkg/enqueue/Consumption/QueueConsumer.php | 11 +++++----- 6 files changed, 72 insertions(+), 11 deletions(-) diff --git a/pkg/enqueue/Consumption/Context/End.php b/pkg/enqueue/Consumption/Context/End.php index 467f6d38c..ec8c1f7df 100644 --- a/pkg/enqueue/Consumption/Context/End.php +++ b/pkg/enqueue/Consumption/Context/End.php @@ -27,12 +27,23 @@ final class End */ private $logger; - public function __construct(Context $context, int $startTime, int $endTime, LoggerInterface $logger) - { + /** + * @var int + */ + private $exitStatus; + + public function __construct( + Context $context, + int $startTime, + int $endTime, + LoggerInterface $logger, + ?int $exitStatus = null + ) { $this->context = $context; $this->logger = $logger; $this->startTime = $startTime; $this->endTime = $endTime; + $this->exitStatus = $exitStatus; } public function getContext(): Context @@ -60,4 +71,9 @@ public function getEndTime(): int { return $this->startTime; } + + public function getExitStatus(): ?int + { + return $this->exitStatus; + } } diff --git a/pkg/enqueue/Consumption/Context/PostConsume.php b/pkg/enqueue/Consumption/Context/PostConsume.php index 0add00336..a6f1d8375 100644 --- a/pkg/enqueue/Consumption/Context/PostConsume.php +++ b/pkg/enqueue/Consumption/Context/PostConsume.php @@ -43,6 +43,11 @@ final class PostConsume */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct(Context $context, SubscriptionConsumer $subscriptionConsumer, int $receivedMessagesCount, int $cycle, int $startTime, LoggerInterface $logger) { $this->context = $context; @@ -85,13 +90,19 @@ public function getLogger(): LoggerInterface return $this->logger; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/PostMessageReceived.php b/pkg/enqueue/Consumption/Context/PostMessageReceived.php index 423830e3d..1e312da10 100644 --- a/pkg/enqueue/Consumption/Context/PostMessageReceived.php +++ b/pkg/enqueue/Consumption/Context/PostMessageReceived.php @@ -45,6 +45,11 @@ final class PostMessageReceived */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct( Context $context, Consumer $consumer, @@ -96,13 +101,19 @@ public function getResult() return $this->result; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/PreConsume.php b/pkg/enqueue/Consumption/Context/PreConsume.php index a6d83d534..77cc7d030 100644 --- a/pkg/enqueue/Consumption/Context/PreConsume.php +++ b/pkg/enqueue/Consumption/Context/PreConsume.php @@ -43,6 +43,11 @@ final class PreConsume */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + public function __construct(Context $context, SubscriptionConsumer $subscriptionConsumer, LoggerInterface $logger, int $cycle, int $receiveTimeout, int $startTime) { $this->context = $context; @@ -85,13 +90,19 @@ public function getStartTime(): int return $this->startTime; } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/Context/Start.php b/pkg/enqueue/Consumption/Context/Start.php index cd9f2108e..84db29c44 100644 --- a/pkg/enqueue/Consumption/Context/Start.php +++ b/pkg/enqueue/Consumption/Context/Start.php @@ -38,6 +38,11 @@ final class Start */ private $executionInterrupted; + /** + * @var int + */ + private $exitStatus; + /** * @param BoundProcessor[] $processors */ @@ -105,13 +110,19 @@ public function changeBoundProcessors(array $processors): void }); } + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + public function isExecutionInterrupted(): bool { return $this->executionInterrupted; } - public function interruptExecution(): void + public function interruptExecution(?int $exitStatus = null): void { + $this->exitStatus = $exitStatus; $this->executionInterrupted = true; } } diff --git a/pkg/enqueue/Consumption/QueueConsumer.php b/pkg/enqueue/Consumption/QueueConsumer.php index 3454b302d..58b8fa06c 100644 --- a/pkg/enqueue/Consumption/QueueConsumer.php +++ b/pkg/enqueue/Consumption/QueueConsumer.php @@ -147,7 +147,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onStart($start); if ($start->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime); + $this->onEnd($extension, $startTime, $start->getExitStatus()); return; } @@ -256,7 +256,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onPreConsume($preConsume); if ($preConsume->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime, $subscriptionConsumer); + $this->onEnd($extension, $startTime, $preConsume->getExitStatus(), $subscriptionConsumer); return; } @@ -267,7 +267,7 @@ public function consume(ExtensionInterface $runtimeExtension = null): void $extension->onPostConsume($postConsume); if ($interruptExecution || $postConsume->isExecutionInterrupted()) { - $this->onEnd($extension, $startTime, $subscriptionConsumer); + $this->onEnd($extension, $startTime, $postConsume->getExitStatus(), $subscriptionConsumer); return; } @@ -286,11 +286,12 @@ public function setFallbackSubscriptionConsumer(SubscriptionConsumer $fallbackSu $this->fallbackSubscriptionConsumer = $fallbackSubscriptionConsumer; } - private function onEnd(ExtensionInterface $extension, int $startTime, SubscriptionConsumer $subscriptionConsumer = null): void + private function onEnd(ExtensionInterface $extension, int $startTime, ?int $exitStatus = null, SubscriptionConsumer $subscriptionConsumer = null): void { $endTime = (int) (microtime(true) * 1000); - $extension->onEnd(new End($this->interopContext, $startTime, $endTime, $this->logger)); + $endContext = new End($this->interopContext, $startTime, $endTime, $this->logger, $exitStatus); + $extension->onEnd($endContext); if ($subscriptionConsumer) { $subscriptionConsumer->unsubscribeAll(); From d1960a2fe47161611d74f0a00fc447051a5cf7a5 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Wed, 13 Feb 2019 19:11:00 +0200 Subject: [PATCH 2/6] capture exit status extension --- .../Extension/CaptureExitStatusExtension.php | 35 +++++++++++++++++++ .../Symfony/Consumption/ConsumeCommand.php | 6 +++- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php new file mode 100644 index 000000000..49d8981bb --- /dev/null +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -0,0 +1,35 @@ +exitStatus = $context->getExitStatus(); + $this->isExitStatusCaptured = true; + } + + public function getExitStatus(): ?int + { + return $this->exitStatus; + } + + public function isExitStatusCaptured(): bool + { + return $this->isExitStatusCaptured; + } +} diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index e65acc314..22187a15d 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -3,6 +3,7 @@ namespace Enqueue\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Extension\CaptureExitStatusExtension; use Enqueue\Consumption\QueueConsumerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -75,9 +76,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int array_unshift($extensions, $loggerExtension); } + $captureExitStatusExtension = new CaptureExitStatusExtension(); + array_unshift($extensions, $captureExitStatusExtension); + $consumer->consume(new ChainExtension($extensions)); - return null; + return $captureExitStatusExtension->getExitStatus(); } private function getQueueConsumer(string $name): QueueConsumerInterface From b8c5901e8c17cc45b0db13d2aaf2ceefeb5fe0c3 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 11:24:18 +0200 Subject: [PATCH 3/6] test capture exit status --- .../Extension/CaptureExitStatusExtension.php | 40 ++++++++++++++++++- .../Tests/Consumption/QueueConsumerTest.php | 25 ++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php index 49d8981bb..f4d967ee6 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -3,9 +3,9 @@ namespace Enqueue\Consumption\Extension; use Enqueue\Consumption\Context\End; -use Enqueue\Consumption\EndExtensionInterface; +use Enqueue\Consumption\ExtensionInterface; -class CaptureExitStatusExtension implements EndExtensionInterface +class CaptureExitStatusExtension implements ExtensionInterface { /** * @var int @@ -32,4 +32,40 @@ public function isExitStatusCaptured(): bool { return $this->isExitStatusCaptured; } + + public function onInitLogger(\Enqueue\Consumption\Context\InitLogger $context): void + { + } + + public function onMessageReceived(\Enqueue\Consumption\Context\MessageReceived $context): void + { + } + + public function onPostConsume(\Enqueue\Consumption\Context\PostConsume $context): void + { + } + + public function onPostMessageReceived(\Enqueue\Consumption\Context\PostMessageReceived $context): void + { + } + + public function onPreConsume(\Enqueue\Consumption\Context\PreConsume $context): void + { + } + + public function onPreSubscribe(\Enqueue\Consumption\Context\PreSubscribe $context): void + { + } + + public function onProcessorException(\Enqueue\Consumption\Context\ProcessorException $context): void + { + } + + public function onResult(\Enqueue\Consumption\Context\MessageResult $context): void + { + } + + public function onStart(\Enqueue\Consumption\Context\Start $context): void + { + } } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 9b0111fda..94361b522 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -16,6 +16,7 @@ use Enqueue\Consumption\Context\ProcessorException; use Enqueue\Consumption\Context\Start; use Enqueue\Consumption\Exception\InvalidArgumentException; +use Enqueue\Consumption\Extension\CaptureExitStatusExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\Result; @@ -1429,6 +1430,30 @@ public function testShouldCallProcessorAsMessageComeAlong() $this->assertSame($fooConsumerStub, $actualContexts[2]->getConsumer()); } + public function testCaptureExitStatus() + { + $testExitCode = 5; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $exitExtension = new CaptureExitStatusExtension(); + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + $consumer->consume($exitExtension); + + $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); + $this->assertTrue($exitExtension->isExitStatusCaptured()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject */ From 954450a2f28961caf71c6ca59815660f1c558596 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 11:38:51 +0200 Subject: [PATCH 4/6] revert to end extension --- .../Extension/CaptureExitStatusExtension.php | 40 +------------------ .../Tests/Consumption/QueueConsumerTest.php | 2 +- 2 files changed, 3 insertions(+), 39 deletions(-) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php index f4d967ee6..49d8981bb 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php @@ -3,9 +3,9 @@ namespace Enqueue\Consumption\Extension; use Enqueue\Consumption\Context\End; -use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\EndExtensionInterface; -class CaptureExitStatusExtension implements ExtensionInterface +class CaptureExitStatusExtension implements EndExtensionInterface { /** * @var int @@ -32,40 +32,4 @@ public function isExitStatusCaptured(): bool { return $this->isExitStatusCaptured; } - - public function onInitLogger(\Enqueue\Consumption\Context\InitLogger $context): void - { - } - - public function onMessageReceived(\Enqueue\Consumption\Context\MessageReceived $context): void - { - } - - public function onPostConsume(\Enqueue\Consumption\Context\PostConsume $context): void - { - } - - public function onPostMessageReceived(\Enqueue\Consumption\Context\PostMessageReceived $context): void - { - } - - public function onPreConsume(\Enqueue\Consumption\Context\PreConsume $context): void - { - } - - public function onPreSubscribe(\Enqueue\Consumption\Context\PreSubscribe $context): void - { - } - - public function onProcessorException(\Enqueue\Consumption\Context\ProcessorException $context): void - { - } - - public function onResult(\Enqueue\Consumption\Context\MessageResult $context): void - { - } - - public function onStart(\Enqueue\Consumption\Context\Start $context): void - { - } } diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 94361b522..5e4564496 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1448,7 +1448,7 @@ public function testCaptureExitStatus() $exitExtension = new CaptureExitStatusExtension(); $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); - $consumer->consume($exitExtension); + $consumer->consume(new ChainExtension([$exitExtension])); $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); $this->assertTrue($exitExtension->isExitStatusCaptured()); From 342127cae2e2c3949c5ef0b8095cb28d9e230735 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 14:40:44 +0200 Subject: [PATCH 5/6] refactoring and consume command tests --- ...sExtension.php => ExitStatusExtension.php} | 13 +- pkg/enqueue/Symfony/Client/ConsumeCommand.php | 8 +- .../Symfony/Consumption/ConsumeCommand.php | 8 +- .../Tests/Consumption/QueueConsumerTest.php | 5 +- .../Symfony/Client/ConsumeCommandTest.php | 118 ++++++++++++++++++ .../Consumption/ConsumeCommandTest.php | 104 +++++++++++++++ 6 files changed, 235 insertions(+), 21 deletions(-) rename pkg/enqueue/Consumption/Extension/{CaptureExitStatusExtension.php => ExitStatusExtension.php} (57%) diff --git a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php b/pkg/enqueue/Consumption/Extension/ExitStatusExtension.php similarity index 57% rename from pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php rename to pkg/enqueue/Consumption/Extension/ExitStatusExtension.php index 49d8981bb..a43071241 100644 --- a/pkg/enqueue/Consumption/Extension/CaptureExitStatusExtension.php +++ b/pkg/enqueue/Consumption/Extension/ExitStatusExtension.php @@ -5,31 +5,20 @@ use Enqueue\Consumption\Context\End; use Enqueue\Consumption\EndExtensionInterface; -class CaptureExitStatusExtension implements EndExtensionInterface +class ExitStatusExtension implements EndExtensionInterface { /** * @var int */ private $exitStatus; - /** - * @var bool - */ - private $isExitStatusCaptured = false; - public function onEnd(End $context): void { $this->exitStatus = $context->getExitStatus(); - $this->isExitStatusCaptured = true; } public function getExitStatus(): ?int { return $this->exitStatus; } - - public function isExitStatusCaptured(): bool - { - return $this->isExitStatusCaptured; - } } diff --git a/pkg/enqueue/Symfony/Client/ConsumeCommand.php b/pkg/enqueue/Symfony/Client/ConsumeCommand.php index e6b25fc4f..ee8b394f6 100644 --- a/pkg/enqueue/Symfony/Client/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Client/ConsumeCommand.php @@ -4,6 +4,7 @@ use Enqueue\Client\DriverInterface; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\Extension\LoggerExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumerInterface; @@ -143,9 +144,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int $consumer->bind($queue, $processor); } - $consumer->consume($this->getRuntimeExtensions($input, $output)); + $runtimeExtensionChain = $this->getRuntimeExtensions($input, $output); + $exitStatusExtension = new ExitStatusExtension(); - return null; + $consumer->consume(new ChainExtension([$runtimeExtensionChain, $exitStatusExtension])); + + return $exitStatusExtension->getExitStatus(); } protected function getRuntimeExtensions(InputInterface $input, OutputInterface $output): ExtensionInterface diff --git a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php index 22187a15d..b10d19f68 100644 --- a/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php +++ b/pkg/enqueue/Symfony/Consumption/ConsumeCommand.php @@ -3,7 +3,7 @@ namespace Enqueue\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; -use Enqueue\Consumption\Extension\CaptureExitStatusExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\QueueConsumerInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; @@ -76,12 +76,12 @@ protected function execute(InputInterface $input, OutputInterface $output): ?int array_unshift($extensions, $loggerExtension); } - $captureExitStatusExtension = new CaptureExitStatusExtension(); - array_unshift($extensions, $captureExitStatusExtension); + $exitStatusExtension = new ExitStatusExtension(); + array_unshift($extensions, $exitStatusExtension); $consumer->consume(new ChainExtension($extensions)); - return $captureExitStatusExtension->getExitStatus(); + return $exitStatusExtension->getExitStatus(); } private function getQueueConsumer(string $name): QueueConsumerInterface diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index 5e4564496..f466c19cd 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -16,7 +16,7 @@ use Enqueue\Consumption\Context\ProcessorException; use Enqueue\Consumption\Context\Start; use Enqueue\Consumption\Exception\InvalidArgumentException; -use Enqueue\Consumption\Extension\CaptureExitStatusExtension; +use Enqueue\Consumption\Extension\ExitStatusExtension; use Enqueue\Consumption\ExtensionInterface; use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\Result; @@ -1445,13 +1445,12 @@ public function testCaptureExitStatus() }) ; - $exitExtension = new CaptureExitStatusExtension(); + $exitExtension = new ExitStatusExtension(); $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); $consumer->consume(new ChainExtension([$exitExtension])); $this->assertEquals($testExitCode, $exitExtension->getExitStatus()); - $this->assertTrue($exitExtension->isExitStatusCaptured()); } /** diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 9a45d424d..6f50844e6 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -8,11 +8,18 @@ use Enqueue\Client\Route; use Enqueue\Client\RouteCollection; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Context\Start; +use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Container\Container; use Enqueue\Null\NullQueue; use Enqueue\Symfony\Client\ConsumeCommand; use Enqueue\Test\ClassExtensionTrait; +use Interop\Queue\Consumer; +use Interop\Queue\Context as InteropContext; +use Interop\Queue\Exception\SubscriptionConsumerNotSupportedException; +use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Symfony\Component\Console\Command\Command; @@ -536,6 +543,49 @@ public function testShouldSkipQueueConsumptionAndUseCustomClientDestinationName( ]); } + public function testShouldReturnExitStatusIfSet() + { + $testExitCode = 678; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $defaultQueue = new NullQueue('default'); + + $routeCollection = new RouteCollection([]); + + $processor = $this->createDelegateProcessorMock(); + + $driver = $this->createDriverStub($routeCollection); + $driver + ->expects($this->exactly(1)) + ->method('createQueue') + ->with('default', true) + ->willReturn($defaultQueue) + ; + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + + $command = new ConsumeCommand(new Container([ + 'enqueue.client.default.queue_consumer' => $consumer, + 'enqueue.client.default.driver' => $driver, + 'enqueue.client.default.delegate_processor' => $processor, + ]), 'default'); + + $tester = new CommandTester($command); + $tester->execute([]); + + $this->assertEquals($testExitCode, $tester->getStatusCode()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|DelegateProcessor */ @@ -572,4 +622,72 @@ private function createDriverStub(RouteCollection $routeCollection = null): Driv return $driverMock; } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createContextWithoutSubscriptionConsumerMock(): InteropContext + { + $contextMock = $this->createMock(InteropContext::class); + $contextMock + ->expects($this->any()) + ->method('createSubscriptionConsumer') + ->willThrowException(SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt()) + ; + + return $contextMock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + */ + private function createContextStub(Consumer $consumer = null): InteropContext + { + $context = $this->createContextWithoutSubscriptionConsumerMock(); + $context + ->expects($this->any()) + ->method('createQueue') + ->willReturnCallback(function (string $queueName) { + return new NullQueue($queueName); + }) + ; + $context + ->expects($this->any()) + ->method('createConsumer') + ->willReturnCallback(function (Queue $queue) use ($consumer) { + return $consumer ?: $this->createConsumerStub($queue); + }) + ; + + return $context; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + */ + private function createExtension() + { + return $this->createMock(ExtensionInterface::class); + } + + /** + * @param null|mixed $queue + * + * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + */ + private function createConsumerStub($queue = null): Consumer + { + if (is_string($queue)) { + $queue = new NullQueue($queue); + } + + $consumerMock = $this->createMock(Consumer::class); + $consumerMock + ->expects($this->any()) + ->method('getQueue') + ->willReturn($queue) + ; + + return $consumerMock; + } } diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 6396568cb..37ca32fd5 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -3,10 +3,18 @@ namespace Enqueue\Tests\Symfony\Consumption; use Enqueue\Consumption\ChainExtension; +use Enqueue\Consumption\Context\Start; +use Enqueue\Consumption\ExtensionInterface; +use Enqueue\Consumption\QueueConsumer; use Enqueue\Consumption\QueueConsumerInterface; use Enqueue\Container\Container; +use Enqueue\Null\NullQueue; use Enqueue\Symfony\Consumption\ConsumeCommand; use Enqueue\Test\ClassExtensionTrait; +use Interop\Queue\Consumer; +use Interop\Queue\Context as InteropContext; +use Interop\Queue\Exception\SubscriptionConsumerNotSupportedException; +use Interop\Queue\Queue; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface; use Symfony\Component\Console\Command\Command; @@ -123,6 +131,34 @@ public function testThrowIfNotDefinedTransportRequested() $tester->execute(['--transport' => 'not-defined']); } + public function testShouldReturnExitStatusIfSet() + { + $testExitCode = 678; + + $stubExtension = $this->createExtension(); + + $stubExtension + ->expects($this->once()) + ->method('onStart') + ->with($this->isInstanceOf(Start::class)) + ->willReturnCallback(function (Start $context) use ($testExitCode) { + $context->interruptExecution($testExitCode); + }) + ; + + $consumer = new QueueConsumer($this->createContextStub(), $stubExtension); + + $command = new ConsumeCommand(new Container([ + 'enqueue.transport.default.queue_consumer' => $consumer, + ]), 'default'); + + $tester = new CommandTester($command); + + $tester->execute([]); + + $this->assertEquals($testExitCode, $tester->getStatusCode()); + } + /** * @return \PHPUnit_Framework_MockObject_MockObject|QueueConsumerInterface */ @@ -130,4 +166,72 @@ private function createQueueConsumerMock() { return $this->createMock(QueueConsumerInterface::class); } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function createContextWithoutSubscriptionConsumerMock(): InteropContext + { + $contextMock = $this->createMock(InteropContext::class); + $contextMock + ->expects($this->any()) + ->method('createSubscriptionConsumer') + ->willThrowException(SubscriptionConsumerNotSupportedException::providerDoestNotSupportIt()) + ; + + return $contextMock; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|InteropContext + */ + private function createContextStub(Consumer $consumer = null): InteropContext + { + $context = $this->createContextWithoutSubscriptionConsumerMock(); + $context + ->expects($this->any()) + ->method('createQueue') + ->willReturnCallback(function (string $queueName) { + return new NullQueue($queueName); + }) + ; + $context + ->expects($this->any()) + ->method('createConsumer') + ->willReturnCallback(function (Queue $queue) use ($consumer) { + return $consumer ?: $this->createConsumerStub($queue); + }) + ; + + return $context; + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject|ExtensionInterface + */ + private function createExtension() + { + return $this->createMock(ExtensionInterface::class); + } + + /** + * @param null|mixed $queue + * + * @return \PHPUnit_Framework_MockObject_MockObject|Consumer + */ + private function createConsumerStub($queue = null): Consumer + { + if (is_string($queue)) { + $queue = new NullQueue($queue); + } + + $consumerMock = $this->createMock(Consumer::class); + $consumerMock + ->expects($this->any()) + ->method('getQueue') + ->willReturn($queue) + ; + + return $consumerMock; + } } From cd1ac762c4775f264375310a1992bb81b8ad4342 Mon Sep 17 00:00:00 2001 From: Andriy Volberg Date: Thu, 14 Feb 2019 15:05:46 +0200 Subject: [PATCH 6/6] manual cs fix --- pkg/enqueue/Consumption/Context/PostMessageReceived.php | 2 +- pkg/enqueue/Tests/Consumption/QueueConsumerTest.php | 2 +- pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php | 2 +- pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/enqueue/Consumption/Context/PostMessageReceived.php b/pkg/enqueue/Consumption/Context/PostMessageReceived.php index 1e312da10..91b532656 100644 --- a/pkg/enqueue/Consumption/Context/PostMessageReceived.php +++ b/pkg/enqueue/Consumption/Context/PostMessageReceived.php @@ -94,7 +94,7 @@ public function getReceivedAt(): int } /** - * @return Result|null|object|string + * @return Result|object|string|null */ public function getResult() { diff --git a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php index f466c19cd..b10339304 100644 --- a/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php +++ b/pkg/enqueue/Tests/Consumption/QueueConsumerTest.php @@ -1532,7 +1532,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */ diff --git a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php index 6f50844e6..52bcd9a1e 100644 --- a/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Client/ConsumeCommandTest.php @@ -671,7 +671,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */ diff --git a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php index 37ca32fd5..88b826725 100644 --- a/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php +++ b/pkg/enqueue/Tests/Symfony/Consumption/ConsumeCommandTest.php @@ -215,7 +215,7 @@ private function createExtension() } /** - * @param null|mixed $queue + * @param mixed|null $queue * * @return \PHPUnit_Framework_MockObject_MockObject|Consumer */