2011-05-09 21:40:18 +01:00
< ? 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 .
*/
2012-03-28 14:43:52 +01:00
namespace Symfony\Component\Process\Tests ;
2011-05-09 21:40:18 +01:00
use Symfony\Component\Process\Process ;
/**
* @ author Robert Schönthal < seroscho @ googlemail . com >
*/
class ProcessTest extends \PHPUnit_Framework_TestCase
{
/**
* tests getter / setter
2011-06-08 18:56:59 +01:00
*
2011-05-09 21:40:18 +01:00
* @ dataProvider methodProvider
*/
public function testDefaultGetterSetter ( $fn )
{
$p = new Process ( 'php' );
2011-06-08 18:56:59 +01:00
2011-05-09 21:40:18 +01:00
$setter = 'set' . $fn ;
$getter = 'get' . $fn ;
$this -> assertNull ( $p -> $setter ( array ( 'foo' )));
$this -> assertSame ( array ( 'foo' ), $p -> $getter ( array ( 'foo' )));
}
2011-06-08 18:56:59 +01:00
2011-05-09 21:40:18 +01:00
/**
* tests results from sub processes
2011-06-08 18:56:59 +01:00
*
2011-06-22 20:47:44 +01:00
* @ dataProvider responsesCodeProvider
2011-05-09 21:40:18 +01:00
*/
2011-05-09 22:21:57 +01:00
public function testProcessResponses ( $expected , $getter , $code )
2011-05-09 21:40:18 +01:00
{
2011-07-23 17:04:56 +01:00
$p = new Process ( sprintf ( 'php -r %s' , escapeshellarg ( $code )));
2011-05-09 21:40:18 +01:00
$p -> run ();
2011-06-08 18:56:59 +01:00
2011-05-09 21:40:18 +01:00
$this -> assertSame ( $expected , $p -> $getter ());
}
2011-06-08 18:56:59 +01:00
2011-06-22 20:47:44 +01:00
/**
* tests results from sub processes
*
* @ dataProvider pipesCodeProvider
*/
public function testProcessPipes ( $expected , $code )
{
2011-10-26 09:17:31 +01:00
if ( strpos ( PHP_OS , " WIN " ) === 0 && version_compare ( phpversion (), " 5.3.9 " , " < " )) {
$this -> markTestSkipped ( 'Test hangs on Windows & PHP due to https://bugs.php.net/bug.php?id=60120 fixed in http://svn.php.net/viewvc?view=revision&revision=318366' );
2011-10-26 06:50:46 +01:00
}
2011-07-23 17:04:56 +01:00
$p = new Process ( sprintf ( 'php -r %s' , escapeshellarg ( $code )));
2011-06-22 20:47:44 +01:00
$p -> setStdin ( $expected );
$p -> run ();
$this -> assertSame ( $expected , $p -> getOutput ());
$this -> assertSame ( $expected , $p -> getErrorOutput ());
$this -> assertSame ( 0 , $p -> getExitCode ());
}
2012-02-13 06:31:37 +00:00
public function testExitCodeText ()
{
$process = new Process ( '' );
$r = new \ReflectionObject ( $process );
$p = $r -> getProperty ( 'exitcode' );
$p -> setAccessible ( true );
$p -> setValue ( $process , 2 );
$this -> assertEquals ( 'Misuse of shell builtins' , $process -> getExitCodeText ());
}
2012-03-21 16:58:02 +00:00
public function testStartIsNonBlocking ()
{
$process = new Process ( 'php -r "sleep(4);"' );
$start = microtime ( true );
$process -> start ();
$end = microtime ( true );
$this -> assertLessThan ( 1 , $end - $start );
}
2012-03-23 11:59:10 +00:00
public function testUpdateStatus ()
{
2012-03-21 16:58:02 +00:00
$process = new Process ( 'php -h' );
$process -> start ();
2012-03-23 11:59:10 +00:00
usleep ( 300000 ); // wait for output
2012-03-21 16:58:02 +00:00
$this -> assertEquals ( 0 , $process -> getExitCode ());
2012-03-23 11:59:10 +00:00
$this -> assertTrue ( strlen ( $process -> getOutput ()) > 0 );
2012-03-21 16:58:02 +00:00
}
2012-03-23 11:59:10 +00:00
public function testIsRunning ()
{
2012-03-21 16:58:02 +00:00
$process = new Process ( 'php -r "sleep(1);"' );
$this -> assertFalse ( $process -> isRunning ());
$process -> start ();
$this -> assertTrue ( $process -> isRunning ());
2012-03-23 12:02:23 +00:00
$process -> wait ();
2012-03-21 16:58:02 +00:00
$this -> assertFalse ( $process -> isRunning ());
}
2012-03-23 11:59:10 +00:00
public function testStop ()
{
$process = new Process ( 'php -r "while (true) {}"' );
2012-03-21 16:58:02 +00:00
$process -> start ();
$this -> assertTrue ( $process -> isRunning ());
$process -> stop ();
$this -> assertFalse ( $process -> isRunning ());
$this -> assertTrue ( $process -> hasBeenSignaled ());
}
2011-06-22 20:47:44 +01:00
public function responsesCodeProvider ()
2011-05-09 21:40:18 +01:00
{
return array (
//expected output / getter / code to execute
//array(1,'getExitCode','exit(1);'),
//array(true,'isSuccessful','exit();'),
2011-07-23 17:04:56 +01:00
array ( 'output' , 'getOutput' , 'echo \'output\';' ),
2011-06-22 20:47:44 +01:00
);
}
2011-06-23 12:39:36 +01:00
2011-06-22 20:47:44 +01:00
public function pipesCodeProvider ()
{
$variations = array (
2011-07-23 17:04:56 +01:00
'fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);' ,
'include \'' . __DIR__ . '/ProcessTestHelper.php\';' ,
2011-05-09 21:40:18 +01:00
);
2011-06-22 20:47:44 +01:00
$baseData = str_repeat ( '*' , 1024 );
$codes = array ();
foreach ( array ( 1 , 16 , 64 , 1024 , 4096 ) as $size )
{
$data = str_repeat ( $baseData , $size ) . '!' ;
foreach ( $variations as $code ) {
$codes [] = array ( $data , $code );
}
}
2011-06-23 12:39:36 +01:00
2011-06-22 20:47:44 +01:00
return $codes ;
2011-05-09 21:40:18 +01:00
}
2011-06-08 18:56:59 +01:00
2011-05-09 21:40:18 +01:00
/**
* provides default method names for simple getter / setter
*/
public function methodProvider ()
{
$defaults = array (
array ( 'CommandLine' ),
array ( 'Timeout' ),
array ( 'WorkingDirectory' ),
array ( 'Env' ),
array ( 'Stdin' ),
array ( 'Options' )
);
2011-06-08 18:56:59 +01:00
2011-05-09 21:40:18 +01:00
return $defaults ;
}
}