From cca8bcd4dd1c613d96cbfae0f6564f2cef02d59e Mon Sep 17 00:00:00 2001 From: MatTheCat Date: Wed, 2 Nov 2022 18:15:44 +0100 Subject: [PATCH] Tell about messenger:consume invalid limit options --- .../Exception/InvalidOptionException.php | 2 +- .../Command/ConsumeMessagesCommand.php | 11 +++++- .../StopWorkerOnTimeLimitListener.php | 5 +++ .../Command/ConsumeMessagesCommandTest.php | 34 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Console/Exception/InvalidOptionException.php b/src/Symfony/Component/Console/Exception/InvalidOptionException.php index b2eec61658d33..5cf62792e43c8 100644 --- a/src/Symfony/Component/Console/Exception/InvalidOptionException.php +++ b/src/Symfony/Component/Console/Exception/InvalidOptionException.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Console\Exception; /** - * Represents an incorrect option name typed in the console. + * Represents an incorrect option name or value typed in the console. * * @author Jérôme Tamarelle */ diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index defa1a4385b64..43babe5f96a3a 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -14,6 +14,7 @@ use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Exception\InvalidOptionException; use Symfony\Component\Console\Exception\RuntimeException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -163,7 +164,11 @@ protected function execute(InputInterface $input, OutputInterface $output) } $stopsWhen = []; - if ($limit = $input->getOption('limit')) { + if (null !== ($limit = $input->getOption('limit'))) { + if (!is_numeric($limit) || 0 >= $limit) { + throw new InvalidOptionException(sprintf('Option "limit" must be a positive integer, "%s" passed.', $limit)); + } + $stopsWhen[] = "processed {$limit} messages"; $this->eventDispatcher->addSubscriber(new StopWorkerOnMessageLimitListener($limit, $this->logger)); } @@ -174,6 +179,10 @@ protected function execute(InputInterface $input, OutputInterface $output) } if (null !== ($timeLimit = $input->getOption('time-limit'))) { + if (!is_numeric($timeLimit) || 0 >= $limit) { + throw new InvalidOptionException(sprintf('Option "time-limit" must be a positive integer, "%s" passed.', $timeLimit)); + } + $stopsWhen[] = "been running for {$timeLimit}s"; $this->eventDispatcher->addSubscriber(new StopWorkerOnTimeLimitListener($timeLimit, $this->logger)); } diff --git a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnTimeLimitListener.php b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnTimeLimitListener.php index a3f982dff88d3..247982f8a8865 100644 --- a/src/Symfony/Component/Messenger/EventListener/StopWorkerOnTimeLimitListener.php +++ b/src/Symfony/Component/Messenger/EventListener/StopWorkerOnTimeLimitListener.php @@ -15,6 +15,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Messenger\Event\WorkerRunningEvent; use Symfony\Component\Messenger\Event\WorkerStartedEvent; +use Symfony\Component\Messenger\Exception\InvalidArgumentException; /** * @author Simon Delicata @@ -30,6 +31,10 @@ public function __construct(int $timeLimitInSeconds, LoggerInterface $logger = n { $this->timeLimitInSeconds = $timeLimitInSeconds; $this->logger = $logger; + + if ($timeLimitInSeconds <= 0) { + throw new InvalidArgumentException('Time limit must be greater than zero.'); + } } public function onWorkerStarted(): void diff --git a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php index 7b56e74fb2984..a7b10edde3e3f 100644 --- a/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php +++ b/src/Symfony/Component/Messenger/Tests/Command/ConsumeMessagesCommandTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Application; +use Symfony\Component\Console\Exception\InvalidOptionException; use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\ServiceLocator; @@ -172,4 +173,37 @@ public function testRunWithBusOptionAndBusLocator() $this->assertSame(0, $tester->getStatusCode()); $this->assertStringContainsString('[OK] Consuming messages from transports "dummy-receiver"', $tester->getDisplay()); } + + /** + * @dataProvider getInvalidOptions + */ + public function testRunWithInvalidOption(string $option, string $value, string $expectedMessage) + { + $receiverLocator = $this->createMock(ContainerInterface::class); + $receiverLocator->expects($this->once())->method('has')->with('dummy-receiver')->willReturn(true); + + $busLocator = $this->createMock(ContainerInterface::class); + + $command = new ConsumeMessagesCommand(new RoutableMessageBus($busLocator), $receiverLocator, new EventDispatcher()); + + $application = new Application(); + $application->add($command); + $tester = new CommandTester($application->get('messenger:consume')); + + $this->expectException(InvalidOptionException::class); + $this->expectExceptionMessage($expectedMessage); + $tester->execute([ + 'receivers' => ['dummy-receiver'], + $option => $value, + ]); + } + + public function getInvalidOptions() + { + yield 'Zero message limit' => ['--limit', '0', 'Option "limit" must be a positive integer, "0" passed.']; + yield 'Non-numeric message limit' => ['--limit', 'whatever', 'Option "limit" must be a positive integer, "whatever" passed.']; + + yield 'Zero second time limit' => ['--time-limit', '0', 'Option "time-limit" must be a positive integer, "0" passed.']; + yield 'Non-numeric time limit' => ['--time-limit', 'whatever', 'Option "time-limit" must be a positive integer, "whatever" passed.']; + } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy