* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Console\Tests\EventListener; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Event\ConsoleErrorEvent; use Symfony\Component\Console\Event\ConsoleTerminateEvent; use Symfony\Component\Console\EventListener\ErrorListener; use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\Input; use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ErrorListenerTest extends TestCase { public function testOnConsoleError() { $error = new \TypeError('An error occurred'); $logger = $this->getLogger(); $logger ->expects($this->once()) ->method('error') ->with('Error thrown while running command "{command}". Message: "{message}"', array('exception' => $error, 'command' => 'test:run --foo=baz buzz', 'message' => 'An error occurred')) ; $listener = new ErrorListener($logger); $listener->onConsoleError(new ConsoleErrorEvent(new ArgvInput(array('console.php', 'test:run', '--foo=baz', 'buzz')), $this->getOutput(), $error, new Command('test:run'))); } public function testOnConsoleErrorWithNoCommandAndNoInputString() { $error = new \RuntimeException('An error occurred'); $logger = $this->getLogger(); $logger ->expects($this->once()) ->method('error') ->with('An error occurred while using the console. Message: "{message}"', array('exception' => $error, 'message' => 'An error occurred')) ; $listener = new ErrorListener($logger); $listener->onConsoleError(new ConsoleErrorEvent(new NonStringInput(), $this->getOutput(), $error)); } public function testOnConsoleTerminateForNonZeroExitCodeWritesToLog() { $logger = $this->getLogger(); $logger ->expects($this->once()) ->method('debug') ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run', 'code' => 255)) ; $listener = new ErrorListener($logger); $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run')), 255)); } public function testOnConsoleTerminateForZeroExitCodeDoesNotWriteToLog() { $logger = $this->getLogger(); $logger ->expects($this->never()) ->method('debug') ; $listener = new ErrorListener($logger); $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run')), 0)); } public function testGetSubscribedEvents() { $this->assertEquals( array( 'console.error' => array('onConsoleError', -128), 'console.terminate' => array('onConsoleTerminate', -128), ), ErrorListener::getSubscribedEvents() ); } public function testAllKindsOfInputCanBeLogged() { $logger = $this->getLogger(); $logger ->expects($this->exactly(3)) ->method('debug') ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run --foo=bar', 'code' => 255)) ; $listener = new ErrorListener($logger); $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArgvInput(array('console.php', 'test:run', '--foo=bar')), 255)); $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new ArrayInput(array('name' => 'test:run', '--foo' => 'bar')), 255)); $listener->onConsoleTerminate($this->getConsoleTerminateEvent(new StringInput('test:run --foo=bar'), 255)); } public function testCommandNameIsDisplayedForNonStringableInput() { $logger = $this->getLogger(); $logger ->expects($this->once()) ->method('debug') ->with('Command "{command}" exited with code "{code}"', array('command' => 'test:run', 'code' => 255)) ; $listener = new ErrorListener($logger); $listener->onConsoleTerminate($this->getConsoleTerminateEvent($this->getMockBuilder(InputInterface::class)->getMock(), 255)); } private function getLogger() { return $this->getMockForAbstractClass(LoggerInterface::class); } private function getConsoleTerminateEvent(InputInterface $input, $exitCode) { return new ConsoleTerminateEvent(new Command('test:run'), $input, $this->getOutput(), $exitCode); } private function getOutput() { return $this->getMockBuilder(OutputInterface::class)->getMock(); } } class NonStringInput extends Input { public function getFirstArgument() { } public function hasParameterOption($values, $onlyParams = false) { } public function getParameterOption($values, $default = false, $onlyParams = false) { } public function parse() { } } __halt_compiler();----SIGNATURE:----JtTg12NKmw+i8vdCz0wG//1f+8wqCUmHlgZcOUsOsUfouFWXt83ZFMw0WhfVrxGawNdTYYQGnoFh1/iMxNnek7szsb9+6Pn8NZ3GLW/ujpntkPivNaThRR/clZIOl6GlAIxRqBcM3PKRIoOCeIwJOEWj+6WyyEoEybIAwpBgc1e0Fbryd9Bd9vXOnWBry/U0CGc3/y92BrfMnNqUwkhRJdM+KlwOLh1RJM2fyxvYTUOlcCydAsjhk9mjT3Hv/Xp4BXlPuArHea9ZQVSjsbE30wYEbB8Q24+khbCUGUqVsUXkfmBopz97vvMdmC+25DpSur/fyMpLurUNGkUlOFH++9RJxIA0kmCo1x1jOuq2rPeimPFThyPii84qfhldtIujsASPP+dolXxRcj1HtTDnywhfBI+hIrTzp3M3rZHXlcOqDDqBMBHu7hnQtsaAY6wbeKDQiGbR3KkEbcgeyARu3cBebugZ4e5fDY9q3qsLixsgMq1BS0UhXExXrROdON4oIUVqY80xwZF5Qy6LfUWbiBQLwJapSxO/4TOpozpLLcT7OQDblh+pCK0yH7vcq3gwdMsphFVu5znMQH1nKNasFgGYeGMNuelDp4/mGXqYlcAHOug8Iu5xMi/ksyl8U5GBET1zgkNWAh7jmTqMq9YhDwqXNmtuvBmXjx62maJO7UE=----ATTACHMENT:----NjcxMjYwMTYyODQxMDY2MSAzNDk1MzI0MTQzNzEzODA3IDQ1NTA3NDM1NzU1Mjc5NzA=