[Console] Fix infinite loop on missing input
[Console] Use console exception for missing input Backport Console RuntimeException in 2.7
This commit is contained in:
parent
4eb003b653
commit
e64de1eac6
19
src/Symfony/Component/Console/Exception/RuntimeException.php
Normal file
19
src/Symfony/Component/Console/Exception/RuntimeException.php
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Console\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Jérôme Tamarelle <jerome@tamarelle.net>
|
||||||
|
*/
|
||||||
|
class RuntimeException extends \RuntimeException
|
||||||
|
{
|
||||||
|
}
|
@ -17,6 +17,7 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||||||
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
use Symfony\Component\Console\Formatter\OutputFormatterStyle;
|
||||||
use Symfony\Component\Console\Question\Question;
|
use Symfony\Component\Console\Question\Question;
|
||||||
use Symfony\Component\Console\Question\ChoiceQuestion;
|
use Symfony\Component\Console\Question\ChoiceQuestion;
|
||||||
|
use Symfony\Component\Console\Exception\RuntimeException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The QuestionHelper class provides helpers to interact with the user.
|
* The QuestionHelper class provides helpers to interact with the user.
|
||||||
@ -134,7 +135,7 @@ class QuestionHelper extends Helper
|
|||||||
if (false === $ret) {
|
if (false === $ret) {
|
||||||
$ret = fgets($inputStream, 4096);
|
$ret = fgets($inputStream, 4096);
|
||||||
if (false === $ret) {
|
if (false === $ret) {
|
||||||
throw new \RuntimeException('Aborted');
|
throw new RuntimeException('Aborted');
|
||||||
}
|
}
|
||||||
$ret = trim($ret);
|
$ret = trim($ret);
|
||||||
}
|
}
|
||||||
@ -354,7 +355,7 @@ class QuestionHelper extends Helper
|
|||||||
shell_exec(sprintf('stty %s', $sttyMode));
|
shell_exec(sprintf('stty %s', $sttyMode));
|
||||||
|
|
||||||
if (false === $value) {
|
if (false === $value) {
|
||||||
throw new \RuntimeException('Aborted');
|
throw new RuntimeException('Aborted');
|
||||||
}
|
}
|
||||||
|
|
||||||
$value = trim($value);
|
$value = trim($value);
|
||||||
@ -372,7 +373,7 @@ class QuestionHelper extends Helper
|
|||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new \RuntimeException('Unable to hide the response.');
|
throw new RuntimeException('Unable to hide the response.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -397,6 +398,8 @@ class QuestionHelper extends Helper
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
return call_user_func($question->getValidator(), $interviewer());
|
return call_user_func($question->getValidator(), $interviewer());
|
||||||
|
} catch (RuntimeException $e) {
|
||||||
|
throw $e;
|
||||||
} catch (\Exception $error) {
|
} catch (\Exception $error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -402,6 +402,37 @@ class QuestionHelperTest extends \PHPUnit_Framework_TestCase
|
|||||||
$dialog->ask($this->createInputInterfaceMock(), $output, $question);
|
$dialog->ask($this->createInputInterfaceMock(), $output, $question);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Console\Exception\RuntimeException
|
||||||
|
* @expectedExceptionMessage Aborted
|
||||||
|
*/
|
||||||
|
public function testAskThrowsExceptionOnMissingInput()
|
||||||
|
{
|
||||||
|
$dialog = new QuestionHelper();
|
||||||
|
$dialog->setInputStream($this->getInputStream(''));
|
||||||
|
|
||||||
|
$dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), new Question('What\'s your name?'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Console\Exception\RuntimeException
|
||||||
|
* @expectedExceptionMessage Aborted
|
||||||
|
*/
|
||||||
|
public function testAskThrowsExceptionOnMissingInputWithValidator()
|
||||||
|
{
|
||||||
|
$dialog = new QuestionHelper();
|
||||||
|
$dialog->setInputStream($this->getInputStream(''));
|
||||||
|
|
||||||
|
$question = new Question('What\'s your name?');
|
||||||
|
$question->setValidator(function () {
|
||||||
|
if (!$value) {
|
||||||
|
throw new \Exception('A value is required.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), $question);
|
||||||
|
}
|
||||||
|
|
||||||
protected function getInputStream($input)
|
protected function getInputStream($input)
|
||||||
{
|
{
|
||||||
$stream = fopen('php://memory', 'r+', false);
|
$stream = fopen('php://memory', 'r+', false);
|
||||||
|
@ -101,6 +101,18 @@ class SymfonyQuestionHelperTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertOutputContains('Do you want a \?', $output);
|
$this->assertOutputContains('Do you want a \?', $output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Console\Exception\RuntimeException
|
||||||
|
* @expectedExceptionMessage Aborted
|
||||||
|
*/
|
||||||
|
public function testAskThrowsExceptionOnMissingInput()
|
||||||
|
{
|
||||||
|
$dialog = new SymfonyQuestionHelper();
|
||||||
|
|
||||||
|
$dialog->setInputStream($this->getInputStream(''));
|
||||||
|
$dialog->ask($this->createInputInterfaceMock(), $this->createOutputInterface(), new Question('What\'s your name?'));
|
||||||
|
}
|
||||||
|
|
||||||
protected function getInputStream($input)
|
protected function getInputStream($input)
|
||||||
{
|
{
|
||||||
$stream = fopen('php://memory', 'r+', false);
|
$stream = fopen('php://memory', 'r+', false);
|
||||||
|
Reference in New Issue
Block a user