2012-05-15 20:25:18 +00:00
< ? php
2012-05-22 11:16:56 +00:00
2012-05-15 20:25:18 +00:00
/*
* This file is part of Composer .
*
* ( c ) Nils Adermann < naderman @ naderman . de >
* Jordi Boggiano < j . boggiano @ seld . be >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2013-08-14 15:42:11 +00:00
namespace Composer\Test\EventDispatcher ;
2012-05-15 20:25:18 +00:00
2013-08-14 15:42:11 +00:00
use Composer\EventDispatcher\Event ;
2014-09-30 15:26:55 +00:00
use Composer\Installer\InstallerEvents ;
2013-09-25 08:14:42 +00:00
use Composer\TestCase ;
2016-01-28 13:41:19 +00:00
use Composer\IO\BufferIO ;
2014-09-30 15:26:55 +00:00
use Composer\Script\ScriptEvents ;
2014-12-12 16:12:32 +00:00
use Composer\Script\CommandEvent ;
2012-12-06 08:56:27 +00:00
use Composer\Util\ProcessExecutor ;
2016-01-28 13:41:19 +00:00
use Symfony\Component\Console\Output\OutputInterface ;
2012-05-15 20:25:18 +00:00
class EventDispatcherTest extends TestCase
{
/**
2012-05-22 11:16:56 +00:00
* @ expectedException RuntimeException
2012-05-15 20:25:18 +00:00
*/
2012-05-22 11:16:56 +00:00
public function testListenerExceptionsAreCaught ()
2012-05-15 20:25:18 +00:00
{
2012-05-22 11:16:56 +00:00
$io = $this -> getMock ( 'Composer\IO\IOInterface' );
2012-05-15 20:25:18 +00:00
$dispatcher = $this -> getDispatcherStubForListenersTest ( array (
2015-09-28 09:51:14 +00:00
'Composer\Test\EventDispatcher\EventDispatcherTest::call' ,
2012-05-22 11:16:56 +00:00
), $io );
2015-06-24 07:21:36 +00:00
$io -> expects ( $this -> at ( 0 ))
2015-07-04 11:22:58 +00:00
-> method ( 'isVerbose' )
-> willReturn ( 0 );
$io -> expects ( $this -> at ( 1 ))
2015-06-24 07:21:36 +00:00
-> method ( 'writeError' )
-> with ( '> Composer\Test\EventDispatcher\EventDispatcherTest::call' );
2015-07-04 11:22:58 +00:00
$io -> expects ( $this -> at ( 2 ))
2015-02-06 12:52:44 +00:00
-> method ( 'writeError' )
2013-08-14 15:42:11 +00:00
-> with ( '<error>Script Composer\Test\EventDispatcher\EventDispatcherTest::call handling the post-install-cmd event terminated with an exception</error>' );
2012-05-22 11:16:56 +00:00
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false );
2012-05-15 20:25:18 +00:00
}
2014-12-12 16:12:32 +00:00
public function testDispatcherCanConvertScriptEventToCommandEventForListener ()
{
$io = $this -> getMock ( 'Composer\IO\IOInterface' );
$dispatcher = $this -> getDispatcherStubForListenersTest ( array (
2015-09-28 09:51:14 +00:00
'Composer\Test\EventDispatcher\EventDispatcherTest::expectsCommandEvent' ,
2014-12-12 21:33:04 +00:00
), $io );
$this -> assertEquals ( 1 , $dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false ));
}
2015-02-23 15:31:54 +00:00
2014-12-12 21:33:04 +00:00
public function testDispatcherDoesNotAttemptConversionForListenerWithoutTypehint ()
{
$io = $this -> getMock ( 'Composer\IO\IOInterface' );
$dispatcher = $this -> getDispatcherStubForListenersTest ( array (
2015-09-28 09:51:14 +00:00
'Composer\Test\EventDispatcher\EventDispatcherTest::expectsVariableEvent' ,
2014-12-12 16:12:32 +00:00
), $io );
$this -> assertEquals ( 1 , $dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false ));
}
2012-10-07 02:54:52 +00:00
/**
* @ dataProvider getValidCommands
* @ param string $command
*/
public function testDispatcherCanExecuteSingleCommandLineScript ( $command )
2012-09-29 21:24:59 +00:00
{
$process = $this -> getMock ( 'Composer\Util\ProcessExecutor' );
2013-08-14 15:42:11 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2012-09-29 21:24:59 +00:00
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
$this -> getMock ( 'Composer\IO\IOInterface' ),
$process ,
))
-> setMethods ( array ( 'getListeners' ))
-> getMock ();
2012-10-07 02:54:52 +00:00
$listener = array ( $command );
2012-09-29 21:24:59 +00:00
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
2012-10-07 02:54:52 +00:00
-> will ( $this -> returnValue ( $listener ));
2012-09-29 21:24:59 +00:00
$process -> expects ( $this -> once ())
-> method ( 'execute' )
2013-05-28 17:15:22 +00:00
-> with ( $command )
-> will ( $this -> returnValue ( 0 ));
2012-09-29 21:24:59 +00:00
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false );
2012-09-29 21:24:59 +00:00
}
2012-10-07 03:37:52 +00:00
public function testDispatcherCanExecuteCliAndPhpInSameEventScriptStack ()
{
$process = $this -> getMock ( 'Composer\Util\ProcessExecutor' );
2013-08-14 15:42:11 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2012-10-07 03:37:52 +00:00
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
2016-01-28 13:41:19 +00:00
$io = new BufferIO ( '' , OutputInterface :: VERBOSITY_VERBOSE ),
2012-10-07 03:37:52 +00:00
$process ,
))
-> setMethods ( array (
'getListeners' ,
))
-> getMock ();
$process -> expects ( $this -> exactly ( 2 ))
2013-05-28 17:15:22 +00:00
-> method ( 'execute' )
-> will ( $this -> returnValue ( 0 ));
2012-10-07 03:37:52 +00:00
$listeners = array (
'echo -n foo' ,
2013-08-14 15:42:11 +00:00
'Composer\\Test\\EventDispatcher\\EventDispatcherTest::someMethod' ,
2012-10-07 03:37:52 +00:00
'echo -n bar' ,
);
2015-06-24 07:21:36 +00:00
2012-10-07 03:37:52 +00:00
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnValue ( $listeners ));
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false );
2016-01-28 13:41:19 +00:00
$expected = '> post-install-cmd: echo -n foo' . PHP_EOL .
'> post-install-cmd: Composer\Test\EventDispatcher\EventDispatcherTest::someMethod' . PHP_EOL .
'> post-install-cmd: echo -n bar' . PHP_EOL ;
$this -> assertEquals ( $expected , $io -> getOutput ());
2012-10-07 03:37:52 +00:00
}
2015-11-09 10:35:48 +00:00
public function testDispatcherCanExecuteComposerScriptGroups ()
{
$process = $this -> getMock ( 'Composer\Util\ProcessExecutor' );
2015-11-21 19:28:10 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2015-11-09 10:35:48 +00:00
-> setConstructorArgs ( array (
$composer = $this -> getMock ( 'Composer\Composer' ),
2016-01-28 13:41:19 +00:00
$io = new BufferIO ( '' , OutputInterface :: VERBOSITY_VERBOSE ),
2015-11-09 10:35:48 +00:00
$process ,
))
-> setMethods ( array (
'getListeners' ,
))
-> getMock ();
$process -> expects ( $this -> exactly ( 3 ))
-> method ( 'execute' )
-> will ( $this -> returnValue ( 0 ));
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnCallback ( function ( Event $event ) {
if ( $event -> getName () === 'root' ) {
return array ( '@group' );
} elseif ( $event -> getName () === 'group' ) {
return array ( 'echo -n foo' , '@subgroup' , 'echo -n bar' );
} elseif ( $event -> getName () === 'subgroup' ) {
return array ( 'echo -n baz' );
}
return array ();
}));
$dispatcher -> dispatch ( 'root' , new CommandEvent ( 'root' , $composer , $io ));
2016-01-28 13:41:19 +00:00
$expected = '> root: @group' . PHP_EOL .
'> group: echo -n foo' . PHP_EOL .
'> group: @subgroup' . PHP_EOL .
'> subgroup: echo -n baz' . PHP_EOL .
'> group: echo -n bar' . PHP_EOL ;
$this -> assertEquals ( $expected , $io -> getOutput ());
2015-11-09 10:35:48 +00:00
}
2015-11-09 12:05:16 +00:00
/**
* @ expectedException RuntimeException
*/
public function testDispatcherDetectInfiniteRecursion ()
{
$process = $this -> getMock ( 'Composer\Util\ProcessExecutor' );
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
-> setConstructorArgs ( array (
$composer = $this -> getMock ( 'Composer\Composer' ),
$io = $this -> getMock ( 'Composer\IO\IOInterface' ),
$process ,
))
-> setMethods ( array (
'getListeners' ,
))
-> getMock ();
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnCallback ( function ( Event $event ) {
if ( $event -> getName () === 'root' ) {
return array ( '@recurse' );
} elseif ( $event -> getName () === 'recurse' ) {
return array ( '@root' );
}
return array ();
}));
$dispatcher -> dispatch ( 'root' , new CommandEvent ( 'root' , $composer , $io ));
}
2012-05-22 11:16:56 +00:00
private function getDispatcherStubForListenersTest ( $listeners , $io )
2012-05-15 20:25:18 +00:00
{
2013-08-14 15:42:11 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2012-05-22 11:16:56 +00:00
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
$io ,
))
-> setMethods ( array ( 'getListeners' ))
-> getMock ();
2012-05-15 20:25:18 +00:00
$dispatcher -> expects ( $this -> atLeastOnce ())
2012-05-22 11:16:56 +00:00
-> method ( 'getListeners' )
-> will ( $this -> returnValue ( $listeners ));
2012-05-15 20:25:18 +00:00
return $dispatcher ;
}
2012-10-07 02:54:52 +00:00
public function getValidCommands ()
{
return array (
array ( 'phpunit' ),
array ( 'echo foo' ),
array ( 'echo -n foo' ),
);
}
2015-06-09 11:40:13 +00:00
public function testDispatcherOutputsCommand ()
2012-12-06 08:56:27 +00:00
{
2013-08-14 15:42:11 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2012-12-06 08:56:27 +00:00
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
2015-06-09 07:02:32 +00:00
$io = $this -> getMock ( 'Composer\IO\IOInterface' ),
2012-12-06 08:56:27 +00:00
new ProcessExecutor ,
))
-> setMethods ( array ( 'getListeners' ))
-> getMock ();
$listener = array ( 'echo foo' );
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnValue ( $listener ));
2015-06-09 07:02:32 +00:00
$io -> expects ( $this -> once ())
-> method ( 'writeError' )
-> with ( $this -> equalTo ( '> echo foo' ));
2012-12-06 08:56:27 +00:00
ob_start ();
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false );
2012-12-06 08:56:27 +00:00
$this -> assertEquals ( 'foo' , trim ( ob_get_clean ()));
}
public function testDispatcherOutputsErrorOnFailedCommand ()
{
2013-08-14 15:42:11 +00:00
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
2012-12-06 08:56:27 +00:00
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
$io = $this -> getMock ( 'Composer\IO\IOInterface' ),
new ProcessExecutor ,
))
-> setMethods ( array ( 'getListeners' ))
-> getMock ();
2012-12-06 09:07:57 +00:00
$code = 'exit 1' ;
2012-12-06 08:56:27 +00:00
$listener = array ( $code );
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnValue ( $listener ));
2015-06-09 11:40:13 +00:00
$io -> expects ( $this -> at ( 0 ))
2015-07-04 11:22:58 +00:00
-> method ( 'isVerbose' )
-> willReturn ( 0 );
$io -> expects ( $this -> at ( 1 ))
2015-06-09 11:40:13 +00:00
-> method ( 'writeError' )
-> willReturn ( '> exit 1' );
2015-07-04 11:22:58 +00:00
$io -> expects ( $this -> at ( 2 ))
2015-02-06 12:52:44 +00:00
-> method ( 'writeError' )
2013-05-28 17:15:22 +00:00
-> with ( $this -> equalTo ( '<error>Script ' . $code . ' handling the post-install-cmd event returned with an error</error>' ));
2012-12-06 08:56:27 +00:00
2013-05-28 17:15:22 +00:00
$this -> setExpectedException ( 'RuntimeException' );
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchScript ( ScriptEvents :: POST_INSTALL_CMD , false );
2012-12-06 08:56:27 +00:00
}
2014-07-29 13:25:16 +00:00
public function testDispatcherInstallerEvents ()
{
$process = $this -> getMock ( 'Composer\Util\ProcessExecutor' );
$dispatcher = $this -> getMockBuilder ( 'Composer\EventDispatcher\EventDispatcher' )
-> setConstructorArgs ( array (
$this -> getMock ( 'Composer\Composer' ),
$this -> getMock ( 'Composer\IO\IOInterface' ),
$process ,
))
-> setMethods ( array ( 'getListeners' ))
-> getMock ();
$dispatcher -> expects ( $this -> atLeastOnce ())
-> method ( 'getListeners' )
-> will ( $this -> returnValue ( array ()));
$policy = $this -> getMock ( 'Composer\DependencyResolver\PolicyInterface' );
$pool = $this -> getMockBuilder ( 'Composer\DependencyResolver\Pool' ) -> disableOriginalConstructor () -> getMock ();
$installedRepo = $this -> getMockBuilder ( 'Composer\Repository\CompositeRepository' ) -> disableOriginalConstructor () -> getMock ();
$request = $this -> getMockBuilder ( 'Composer\DependencyResolver\Request' ) -> disableOriginalConstructor () -> getMock ();
2015-02-23 15:31:54 +00:00
$dispatcher -> dispatchInstallerEvent ( InstallerEvents :: PRE_DEPENDENCIES_SOLVING , true , $policy , $pool , $installedRepo , $request );
$dispatcher -> dispatchInstallerEvent ( InstallerEvents :: POST_DEPENDENCIES_SOLVING , true , $policy , $pool , $installedRepo , $request , array ());
2014-07-29 13:25:16 +00:00
}
2012-05-15 20:25:18 +00:00
public static function call ()
{
2012-05-22 11:16:56 +00:00
throw new \RuntimeException ();
2012-05-15 20:25:18 +00:00
}
2012-10-07 03:37:52 +00:00
2014-12-12 21:33:04 +00:00
public static function expectsCommandEvent ( CommandEvent $event )
{
return false ;
}
public static function expectsVariableEvent ( $event )
2014-12-12 16:12:32 +00:00
{
return false ;
}
2012-10-07 03:37:52 +00:00
public static function someMethod ()
{
return true ;
}
2012-06-14 10:10:01 +00:00
}