forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			301 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Alchemy\Tests\BinaryDriver;
 | 
						|
 | 
						|
use Alchemy\BinaryDriver\AbstractBinary;
 | 
						|
use Alchemy\BinaryDriver\BinaryDriverTestCase;
 | 
						|
use Alchemy\BinaryDriver\Configuration;
 | 
						|
use Alchemy\BinaryDriver\Exception\ExecutableNotFoundException;
 | 
						|
use Alchemy\BinaryDriver\Listeners\ListenerInterface;
 | 
						|
use Symfony\Component\Process\ExecutableFinder;
 | 
						|
 | 
						|
class AbstractBinaryTest extends BinaryDriverTestCase
 | 
						|
{
 | 
						|
    protected function getPhpBinary()
 | 
						|
    {
 | 
						|
        $finder = new ExecutableFinder();
 | 
						|
        $php = $finder->find('php');
 | 
						|
 | 
						|
        if (null === $php) {
 | 
						|
            $this->markTestSkipped('Unable to find a php binary');
 | 
						|
        }
 | 
						|
 | 
						|
        return $php;
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSimpleLoadWithBinaryPath()
 | 
						|
    {
 | 
						|
        $php = $this->getPhpBinary();
 | 
						|
        $imp = Implementation::load($php);
 | 
						|
        $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp);
 | 
						|
 | 
						|
        $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMultipleLoadWithBinaryPath()
 | 
						|
    {
 | 
						|
        $php = $this->getPhpBinary();
 | 
						|
        $imp = Implementation::load(array('/zz/path/to/unexisting/command', $php));
 | 
						|
        $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp);
 | 
						|
 | 
						|
        $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testSimpleLoadWithBinaryName()
 | 
						|
    {
 | 
						|
        $php = $this->getPhpBinary();
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
        $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp);
 | 
						|
 | 
						|
        $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testMultipleLoadWithBinaryName()
 | 
						|
    {
 | 
						|
        $php = $this->getPhpBinary();
 | 
						|
        $imp = Implementation::load(array('bachibouzouk', 'php'));
 | 
						|
        $this->assertInstanceOf('Alchemy\Tests\BinaryDriver\Implementation', $imp);
 | 
						|
 | 
						|
        $this->assertEquals($php, $imp->getProcessBuilderFactory()->getBinary());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadWithMultiplePathExpectingAFailure()
 | 
						|
    {
 | 
						|
        $this->setExpectedException(ExecutableNotFoundException::class);
 | 
						|
 | 
						|
        Implementation::load(array('bachibouzouk', 'moribon'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadWithUniquePathExpectingAFailure()
 | 
						|
    {
 | 
						|
        $this->setExpectedException(ExecutableNotFoundException::class);
 | 
						|
 | 
						|
        Implementation::load('bachibouzouk');
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadWithCustomLogger()
 | 
						|
    {
 | 
						|
        $logger = $this->getMock('Psr\Log\LoggerInterface');
 | 
						|
        $imp = Implementation::load('php', $logger);
 | 
						|
 | 
						|
        $this->assertEquals($logger, $imp->getProcessRunner()->getLogger());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadWithCustomConfigurationAsArray()
 | 
						|
    {
 | 
						|
        $conf = array('timeout' => 200);
 | 
						|
        $imp = Implementation::load('php', null, $conf);
 | 
						|
 | 
						|
        $this->assertEquals($conf, $imp->getConfiguration()->all());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testLoadWithCustomConfigurationAsObject()
 | 
						|
    {
 | 
						|
        $conf = $this->getMock('Alchemy\BinaryDriver\ConfigurationInterface');
 | 
						|
        $imp = Implementation::load('php', null, $conf);
 | 
						|
 | 
						|
        $this->assertEquals($conf, $imp->getConfiguration());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testProcessBuilderFactoryGetterAndSetters()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
        $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface');
 | 
						|
 | 
						|
        $imp->setProcessBuilderFactory($factory);
 | 
						|
        $this->assertEquals($factory, $imp->getProcessBuilderFactory());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testConfigurationGetterAndSetters()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
        $conf = $this->getMock('Alchemy\BinaryDriver\ConfigurationInterface');
 | 
						|
 | 
						|
        $imp->setConfiguration($conf);
 | 
						|
        $this->assertEquals($conf, $imp->getConfiguration());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testTimeoutIsSetOnConstruction()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php', null, array('timeout' => 42));
 | 
						|
        $this->assertEquals(42, $imp->getProcessBuilderFactory()->getTimeout());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testTimeoutIsSetOnConfigurationSetting()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php', null);
 | 
						|
        $imp->setConfiguration(new Configuration(array('timeout' => 42)));
 | 
						|
        $this->assertEquals(42, $imp->getProcessBuilderFactory()->getTimeout());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testTimeoutIsSetOnProcessBuilderSetting()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php', null, array('timeout' => 42));
 | 
						|
 | 
						|
        $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface');
 | 
						|
        $factory->expects($this->once())
 | 
						|
            ->method('setTimeout')
 | 
						|
            ->with(42);
 | 
						|
 | 
						|
        $imp->setProcessBuilderFactory($factory);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testListenRegistersAListener()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
 | 
						|
        $listeners = $this->getMockBuilder('Alchemy\BinaryDriver\Listeners\Listeners')
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $listener = $this->getMock('Alchemy\BinaryDriver\Listeners\ListenerInterface');
 | 
						|
 | 
						|
        $listeners->expects($this->once())
 | 
						|
            ->method('register')
 | 
						|
            ->with($this->equalTo($listener), $this->equalTo($imp));
 | 
						|
 | 
						|
        $reflexion = new \ReflectionClass('Alchemy\BinaryDriver\AbstractBinary');
 | 
						|
        $prop = $reflexion->getProperty('listenersManager');
 | 
						|
        $prop->setAccessible(true);
 | 
						|
        $prop->setValue($imp, $listeners);
 | 
						|
 | 
						|
        $imp->listen($listener);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider provideCommandParameters
 | 
						|
     */
 | 
						|
    public function testCommandRunsAProcess($parameters, $bypassErrors, $expectedParameters, $output)
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
        $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface');
 | 
						|
        $processRunner = $this->getMock('Alchemy\BinaryDriver\ProcessRunnerInterface');
 | 
						|
 | 
						|
        $process = $this->getMockBuilder('Symfony\Component\Process\Process')
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $processRunner->expects($this->once())
 | 
						|
            ->method('run')
 | 
						|
            ->with($this->equalTo($process), $this->isInstanceOf('SplObjectStorage'), $this->equalTo($bypassErrors))
 | 
						|
            ->will($this->returnValue($output));
 | 
						|
 | 
						|
        $factory->expects($this->once())
 | 
						|
            ->method('create')
 | 
						|
            ->with($expectedParameters)
 | 
						|
            ->will($this->returnValue($process));
 | 
						|
 | 
						|
        $imp->setProcessBuilderFactory($factory);
 | 
						|
        $imp->setProcessRunner($processRunner);
 | 
						|
 | 
						|
        $this->assertEquals($output, $imp->command($parameters, $bypassErrors));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider provideCommandWithListenersParameters
 | 
						|
     */
 | 
						|
    public function testCommandWithTemporaryListeners($parameters, $bypassErrors, $expectedParameters, $output, $count, $listeners)
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
        $factory = $this->getMock('Alchemy\BinaryDriver\ProcessBuilderFactoryInterface');
 | 
						|
        $processRunner = $this->getMock('Alchemy\BinaryDriver\ProcessRunnerInterface');
 | 
						|
 | 
						|
        $process = $this->getMockBuilder('Symfony\Component\Process\Process')
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $firstStorage = $secondStorage = null;
 | 
						|
 | 
						|
        $processRunner->expects($this->exactly(2))
 | 
						|
            ->method('run')
 | 
						|
            ->with($this->equalTo($process), $this->isInstanceOf('SplObjectStorage'), $this->equalTo($bypassErrors))
 | 
						|
            ->will($this->returnCallback(function ($process, $storage, $errors) use ($output, &$firstStorage, &$secondStorage) {
 | 
						|
                if (null === $firstStorage) {
 | 
						|
                    $firstStorage = $storage;
 | 
						|
                } else {
 | 
						|
                    $secondStorage = $storage;
 | 
						|
                }
 | 
						|
 | 
						|
                return $output;
 | 
						|
            }));
 | 
						|
 | 
						|
        $factory->expects($this->exactly(2))
 | 
						|
            ->method('create')
 | 
						|
            ->with($expectedParameters)
 | 
						|
            ->will($this->returnValue($process));
 | 
						|
 | 
						|
        $imp->setProcessBuilderFactory($factory);
 | 
						|
        $imp->setProcessRunner($processRunner);
 | 
						|
 | 
						|
        $this->assertEquals($output, $imp->command($parameters, $bypassErrors, $listeners));
 | 
						|
        $this->assertCount($count, $firstStorage);
 | 
						|
        $this->assertEquals($output, $imp->command($parameters, $bypassErrors));
 | 
						|
        $this->assertCount(0, $secondStorage);
 | 
						|
    }
 | 
						|
 | 
						|
    public function provideCommandWithListenersParameters()
 | 
						|
    {
 | 
						|
        return array(
 | 
						|
            array('-a', false, array('-a'), 'loubda', 2, array($this->getMockListener(), $this->getMockListener())),
 | 
						|
            array('-a', false, array('-a'), 'loubda', 1, array($this->getMockListener())),
 | 
						|
            array('-a', false, array('-a'), 'loubda', 1, $this->getMockListener()),
 | 
						|
            array('-a', false, array('-a'), 'loubda', 0, array()),
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function provideCommandParameters()
 | 
						|
    {
 | 
						|
        return array(
 | 
						|
            array('-a', false, array('-a'), 'loubda'),
 | 
						|
            array('-a', true, array('-a'), 'loubda'),
 | 
						|
            array('-a -b', false, array('-a -b'), 'loubda'),
 | 
						|
            array(array('-a'), false, array('-a'), 'loubda'),
 | 
						|
            array(array('-a'), true, array('-a'), 'loubda'),
 | 
						|
            array(array('-a', '-b'), false, array('-a', '-b'), 'loubda'),
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testUnlistenUnregistersAListener()
 | 
						|
    {
 | 
						|
        $imp = Implementation::load('php');
 | 
						|
 | 
						|
        $listeners = $this->getMockBuilder('Alchemy\BinaryDriver\Listeners\Listeners')
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
 | 
						|
        $listener = $this->getMock('Alchemy\BinaryDriver\Listeners\ListenerInterface');
 | 
						|
 | 
						|
        $listeners->expects($this->once())
 | 
						|
            ->method('unregister')
 | 
						|
            ->with($this->equalTo($listener), $this->equalTo($imp));
 | 
						|
 | 
						|
        $reflexion = new \ReflectionClass('Alchemy\BinaryDriver\AbstractBinary');
 | 
						|
        $prop = $reflexion->getProperty('listenersManager');
 | 
						|
        $prop->setAccessible(true);
 | 
						|
        $prop->setValue($imp, $listeners);
 | 
						|
 | 
						|
        $imp->unlisten($listener);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return \PHPUnit_Framework_MockObject_MockObject
 | 
						|
     */
 | 
						|
    private function getMockListener()
 | 
						|
    {
 | 
						|
        $listener = $this->getMock(ListenerInterface::class);
 | 
						|
        $listener->expects($this->any())
 | 
						|
            ->method('forwardedEvents')
 | 
						|
            ->willReturn(array());
 | 
						|
 | 
						|
        return $listener;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class Implementation extends AbstractBinary
 | 
						|
{
 | 
						|
    public function getName()
 | 
						|
    {
 | 
						|
        return 'Implementation';
 | 
						|
    }
 | 
						|
}
 |