209 lines
6.2 KiB
PHP
209 lines
6.2 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of Alchemy\BinaryDriver.
|
||
|
*
|
||
|
* (c) Alchemy <info@alchemy.fr>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Alchemy\Tests\BinaryDriver;
|
||
|
|
||
|
use Alchemy\BinaryDriver\ProcessRunner;
|
||
|
use Alchemy\BinaryDriver\BinaryDriverTestCase;
|
||
|
use Alchemy\BinaryDriver\Exception\ExecutionFailureException;
|
||
|
use Alchemy\BinaryDriver\Listeners\ListenerInterface;
|
||
|
use Evenement\EventEmitter;
|
||
|
use Symfony\Component\Process\Exception\RuntimeException as ProcessRuntimeException;
|
||
|
|
||
|
class ProcessRunnerTest extends BinaryDriverTestCase
|
||
|
{
|
||
|
public function getProcessRunner($logger)
|
||
|
{
|
||
|
return new ProcessRunner($logger, 'test-runner');
|
||
|
}
|
||
|
|
||
|
public function testRunSuccessFullProcess()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true);
|
||
|
|
||
|
$logger
|
||
|
->expects($this->never())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->exactly(2))
|
||
|
->method('info');
|
||
|
|
||
|
$this->assertEquals('Kikoo Romain', $runner->run($process, new \SplObjectStorage(), false));
|
||
|
}
|
||
|
|
||
|
public function testRunSuccessFullProcessBypassingErrors()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true);
|
||
|
|
||
|
$logger
|
||
|
->expects($this->never())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->exactly(2))
|
||
|
->method('info');
|
||
|
|
||
|
$this->assertEquals('Kikoo Romain', $runner->run($process, new \SplObjectStorage(), true));
|
||
|
}
|
||
|
|
||
|
public function testRunFailingProcess()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$process = $this->createProcessMock(1, false, '--helloworld--', null, null, true);
|
||
|
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('info');
|
||
|
|
||
|
try {
|
||
|
$runner->run($process, new \SplObjectStorage(), false);
|
||
|
$this->fail('An exception should have been raised');
|
||
|
} catch (ExecutionFailureException $e) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function testRunFailingProcessWithException()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$exception = new ProcessRuntimeException('Process Failed');
|
||
|
$process = $this->getMockBuilder('Symfony\Component\Process\Process')
|
||
|
->disableOriginalConstructor()
|
||
|
->getMock();
|
||
|
$process->expects($this->once())
|
||
|
->method('run')
|
||
|
->will($this->throwException($exception));
|
||
|
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('info');
|
||
|
|
||
|
try {
|
||
|
$runner->run($process, new \SplObjectStorage(), false);
|
||
|
$this->fail('An exception should have been raised');
|
||
|
} catch (ExecutionFailureException $e) {
|
||
|
$this->assertEquals($exception, $e->getPrevious());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function testRunfailingProcessBypassingErrors()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$process = $this->createProcessMock(1, false, '--helloworld--', 'Hello output', null, true);
|
||
|
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('info');
|
||
|
|
||
|
$this->assertNull($runner->run($process, new \SplObjectStorage(), true));
|
||
|
}
|
||
|
|
||
|
public function testRunFailingProcessWithExceptionBypassingErrors()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$exception = new ProcessRuntimeException('Process Failed');
|
||
|
$process = $this->getMockBuilder('Symfony\Component\Process\Process')
|
||
|
->disableOriginalConstructor()
|
||
|
->getMock();
|
||
|
$process->expects($this->once())
|
||
|
->method('run')
|
||
|
->will($this->throwException($exception));
|
||
|
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->once())
|
||
|
->method('info');
|
||
|
|
||
|
$this->assertNull($runner->run($process, new \SplObjectStorage(), true));
|
||
|
}
|
||
|
|
||
|
public function testRunSuccessFullProcessWithHandlers()
|
||
|
{
|
||
|
$logger = $this->createLoggerMock();
|
||
|
$runner = $this->getProcessRunner($logger);
|
||
|
|
||
|
$capturedCallback = null;
|
||
|
|
||
|
$process = $this->createProcessMock(1, true, '--helloworld--', "Kikoo Romain", null, true);
|
||
|
$process->expects($this->once())
|
||
|
->method('run')
|
||
|
->with($this->isInstanceOf('Closure'))
|
||
|
->will($this->returnCallback(function ($callback) use (&$capturedCallback) {
|
||
|
$capturedCallback = $callback;
|
||
|
}));
|
||
|
|
||
|
$logger
|
||
|
->expects($this->never())
|
||
|
->method('error');
|
||
|
$logger
|
||
|
->expects($this->exactly(2))
|
||
|
->method('info');
|
||
|
|
||
|
$listener = new TestListener();
|
||
|
$storage = new \SplObjectStorage();
|
||
|
$storage->attach($listener);
|
||
|
|
||
|
$capturedType = $capturedData = null;
|
||
|
|
||
|
$listener->on('received', function ($type, $data) use (&$capturedType, &$capturedData) {
|
||
|
$capturedData = $data;
|
||
|
$capturedType = $type;
|
||
|
});
|
||
|
|
||
|
$this->assertEquals('Kikoo Romain', $runner->run($process, $storage, false));
|
||
|
|
||
|
$type = 'err';
|
||
|
$data = 'data';
|
||
|
|
||
|
$capturedCallback($type, $data);
|
||
|
|
||
|
$this->assertEquals($data, $capturedData);
|
||
|
$this->assertEquals($type, $capturedType);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class TestListener extends EventEmitter implements ListenerInterface
|
||
|
{
|
||
|
public function handle($type, $data)
|
||
|
{
|
||
|
return $this->emit('received', array($type, $data));
|
||
|
}
|
||
|
|
||
|
public function forwardedEvents()
|
||
|
{
|
||
|
return array();
|
||
|
}
|
||
|
}
|