Merge branch '2.3' into 2.6

* 2.3:
  Minor fixes
  Towards 100% HHVM compat
  trigger event with right user (add test)
  [Security] Initialize SwitchUserEvent::targetUser on attemptExitUser
  [Form] Fixed: Data mappers always receive forms indexed by their names

Conflicts:
	src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php
	src/Symfony/Component/Filesystem/Filesystem.php
	src/Symfony/Component/Process/Tests/AbstractProcessTest.php
This commit is contained in:
Nicolas Grekas 2015-06-30 18:10:16 +02:00
commit c53ee35a2e
18 changed files with 149 additions and 85 deletions

View File

@ -44,4 +44,4 @@ $phar->addFromString('schema/project-1.0.xsd', <<<EOT
</xsd:schema> </xsd:schema>
EOT EOT
); );
$phar->setStub('<?php require_once "phar://ProjectWithXsdExtensionInPhar.phar/ProjectWithXsdExtensionInPhar.php"; __HALT_COMPILER(); ?>'); $phar->setStub('<?php Phar::mapPhar("ProjectWithXsdExtensionInPhar.phar"); require_once "phar://ProjectWithXsdExtensionInPhar.phar/ProjectWithXsdExtensionInPhar.php"; __HALT_COMPILER(); ?>');

View File

@ -241,7 +241,7 @@ class Filesystem
$this->chgrp(new \FilesystemIterator($file), $group, true); $this->chgrp(new \FilesystemIterator($file), $group, true);
} }
if (is_link($file) && function_exists('lchgrp')) { if (is_link($file) && function_exists('lchgrp')) {
if (true !== @lchgrp($file, $group)) { if (true !== @lchgrp($file, $group) || (defined('HHVM_VERSION') && !posix_getgrnam($group))) {
throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file); throw new IOException(sprintf('Failed to chgrp file "%s".', $file), 0, null, $file);
} }
} else { } else {

View File

@ -916,7 +916,7 @@ class Form implements \IteratorAggregate, FormInterface
$child->setParent($this); $child->setParent($this);
if (!$this->lockSetData && $this->defaultDataSet && !$this->config->getInheritData()) { if (!$this->lockSetData && $this->defaultDataSet && !$this->config->getInheritData()) {
$iterator = new InheritDataAwareIterator(new \ArrayIterator(array($child))); $iterator = new InheritDataAwareIterator(new \ArrayIterator(array($child->getName() => $child)));
$iterator = new \RecursiveIteratorIterator($iterator); $iterator = new \RecursiveIteratorIterator($iterator);
$this->config->getDataMapper()->mapDataToForms($viewData, $iterator); $this->config->getDataMapper()->mapDataToForms($viewData, $iterator);
} }

View File

@ -350,7 +350,7 @@ class CompoundFormTest extends AbstractFormTest
->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator')) ->with('bar', $this->isInstanceOf('\RecursiveIteratorIterator'))
->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child, $test) { ->will($this->returnCallback(function ($data, \RecursiveIteratorIterator $iterator) use ($child, $test) {
$test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator()); $test->assertInstanceOf('Symfony\Component\Form\Util\InheritDataAwareIterator', $iterator->getInnerIterator());
$test->assertSame(array($child), iterator_to_array($iterator)); $test->assertSame(array($child->getName() => $child), iterator_to_array($iterator));
})); }));
$form->initialize(); $form->initialize();

View File

@ -15,6 +15,6 @@ abstract class DateTimeTestCase extends \PHPUnit_Framework_TestCase
{ {
public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actual) public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actual)
{ {
self::assertEquals($expected->format('c'), $actual->format('c')); self::assertEquals($expected->format('U'), $actual->format('U'));
} }
} }

View File

@ -216,7 +216,6 @@ class NativeSessionStorageTest extends \PHPUnit_Framework_TestCase
{ {
$storage = $this->getStorage(); $storage = $this->getStorage();
$this->assertFalse(isset($_SESSION));
$this->assertFalse($storage->getSaveHandler()->isActive()); $this->assertFalse($storage->getSaveHandler()->isActive());
$this->assertFalse($storage->isStarted()); $this->assertFalse($storage->isStarted());

View File

@ -91,7 +91,6 @@ class PhpBridgeSessionStorageTest extends \PHPUnit_Framework_TestCase
$storage = $this->getStorage(); $storage = $this->getStorage();
$this->assertFalse(isset($_SESSION));
$this->assertFalse($storage->getSaveHandler()->isActive()); $this->assertFalse($storage->getSaveHandler()->isActive());
$this->assertFalse($storage->isStarted()); $this->assertFalse($storage->isStarted());

View File

@ -37,7 +37,7 @@ class PhpExecutableFinder
{ {
// HHVM support // HHVM support
if (defined('HHVM_VERSION')) { if (defined('HHVM_VERSION')) {
return (false !== ($hhvm = getenv('PHP_BINARY')) ? $hhvm : PHP_BINARY).($includeArgs ? ' '.implode(' ', $this->findArguments()) : ''); return (getenv('PHP_BINARY') ?: PHP_BINARY).($includeArgs ? ' '.implode(' ', $this->findArguments()) : '');
} }
// PHP_BINARY return the current sapi executable // PHP_BINARY return the current sapi executable

View File

@ -11,21 +11,30 @@
namespace Symfony\Component\Process\Tests; namespace Symfony\Component\Process\Tests;
use Symfony\Component\Process\Exception\ProcessTimedOutException;
use Symfony\Component\Process\Exception\LogicException; use Symfony\Component\Process\Exception\LogicException;
use Symfony\Component\Process\Exception\ProcessTimedOutException;
use Symfony\Component\Process\Exception\RuntimeException;
use Symfony\Component\Process\PhpExecutableFinder;
use Symfony\Component\Process\Pipes\PipesInterface; use Symfony\Component\Process\Pipes\PipesInterface;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\RuntimeException;
/** /**
* @author Robert Schönthal <seroscho@googlemail.com> * @author Robert Schönthal <seroscho@googlemail.com>
*/ */
abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
{ {
protected static $phpBin;
public static function setUpBeforeClass()
{
$phpBin = new PhpExecutableFinder();
self::$phpBin = $phpBin->find();
}
public function testThatProcessDoesNotThrowWarningDuringRun() public function testThatProcessDoesNotThrowWarningDuringRun()
{ {
@trigger_error('Test Error', E_USER_NOTICE); @trigger_error('Test Error', E_USER_NOTICE);
$process = $this->getProcess("php -r 'sleep(3)'"); $process = $this->getProcess(self::$phpBin." -r 'sleep(3)'");
$process->run(); $process->run();
$actualError = error_get_last(); $actualError = error_get_last();
$this->assertEquals('Test Error', $actualError['message']); $this->assertEquals('Test Error', $actualError['message']);
@ -95,7 +104,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$expectedOutputSize = PipesInterface::CHUNK_SIZE * 2 + 2; $expectedOutputSize = PipesInterface::CHUNK_SIZE * 2 + 2;
$code = sprintf('echo str_repeat(\'*\', %d);', $expectedOutputSize); $code = sprintf('echo str_repeat(\'*\', %d);', $expectedOutputSize);
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg($code)));
$p->start(); $p->start();
// Let's wait enough time for process to finish... // Let's wait enough time for process to finish...
@ -134,7 +143,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testProcessResponses($expected, $getter, $code) public function testProcessResponses($expected, $getter, $code)
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg($code)));
$p->run(); $p->run();
$this->assertSame($expected, $p->$getter()); $this->assertSame($expected, $p->$getter());
@ -150,7 +159,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$expected = str_repeat(str_repeat('*', 1024), $size).'!'; $expected = str_repeat(str_repeat('*', 1024), $size).'!';
$expectedLength = (1024 * $size) + 1; $expectedLength = (1024 * $size) + 1;
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg($code)));
$p->setInput($expected); $p->setInput($expected);
$p->run(); $p->run();
@ -170,7 +179,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
fwrite($stream, $expected); fwrite($stream, $expected);
rewind($stream); rewind($stream);
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg($code))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg($code)));
$p->setInput($stream); $p->setInput($stream);
$p->run(); $p->run();
@ -182,7 +191,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testSetInputWhileRunningThrowsAnException() public function testSetInputWhileRunningThrowsAnException()
{ {
$process = $this->getProcess('php -r "usleep(500000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$process->start(); $process->start();
try { try {
$process->setInput('foobar'); $process->setInput('foobar');
@ -201,7 +210,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testInvalidInput($value) public function testInvalidInput($value)
{ {
$process = $this->getProcess('php -v'); $process = $this->getProcess(self::$phpBin.' -v');
$process->setInput($value); $process->setInput($value);
} }
@ -218,7 +227,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testValidInput($expected, $value) public function testValidInput($expected, $value)
{ {
$process = $this->getProcess('php -v'); $process = $this->getProcess(self::$phpBin.' -v');
$process->setInput($value); $process->setInput($value);
$this->assertSame($expected, $process->getInput()); $this->assertSame($expected, $process->getInput());
} }
@ -260,7 +269,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testCallbackIsExecutedForOutput() public function testCallbackIsExecutedForOutput()
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('echo \'foo\';'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('echo \'foo\';')));
$called = false; $called = false;
$p->run(function ($type, $buffer) use (&$called) { $p->run(function ($type, $buffer) use (&$called) {
@ -272,7 +281,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetErrorOutput() public function testGetErrorOutput()
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }')));
$p->run(); $p->run();
$this->assertEquals(3, preg_match_all('/ERROR/', $p->getErrorOutput(), $matches)); $this->assertEquals(3, preg_match_all('/ERROR/', $p->getErrorOutput(), $matches));
@ -285,7 +294,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock'); $lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock');
file_put_contents($lock, 'W'); file_put_contents($lock, 'W');
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }')));
$p->start(); $p->start();
while ($p->isRunning()) { while ($p->isRunning()) {
@ -301,7 +310,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testFlushErrorOutput() public function testFlushErrorOutput()
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; }')));
$p->run(); $p->run();
$p->clearErrorOutput(); $p->clearErrorOutput();
@ -315,7 +324,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock'); $lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock');
file_put_contents($lock, 'W'); file_put_contents($lock, 'W');
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { file_put_contents(\'php://stderr\', \'ERROR\'); $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }')));
$p->start(); $p->start();
@ -341,7 +350,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetOutput() public function testGetOutput()
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { echo \' foo \'; $n++; }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { echo \' foo \'; $n++; }')));
$p->run(); $p->run();
$this->assertEquals(3, preg_match_all('/foo/', $p->getOutput(), $matches)); $this->assertEquals(3, preg_match_all('/foo/', $p->getOutput(), $matches));
@ -354,7 +363,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock'); $lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock');
file_put_contents($lock, 'W'); file_put_contents($lock, 'W');
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { echo \' foo \'; $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { echo \' foo \'; $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }')));
$p->start(); $p->start();
while ($p->isRunning()) { while ($p->isRunning()) {
@ -370,7 +379,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testFlushOutput() public function testFlushOutput()
{ {
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n=0;while ($n<3) {echo \' foo \';$n++;}'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n=0;while ($n<3) {echo \' foo \';$n++;}')));
$p->run(); $p->run();
$p->clearOutput(); $p->clearOutput();
@ -384,7 +393,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock'); $lock = tempnam(sys_get_temp_dir(), get_class($this).'Lock');
file_put_contents($lock, 'W'); file_put_contents($lock, 'W');
$p = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { echo \' foo \'; $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }'))); $p = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 0; while ($n < 3) { if (\'W\' === file_get_contents('.var_export($lock, true).')) { echo \' foo \'; $n++; file_put_contents('.var_export($lock, true).', \'R\'); } usleep(100); }')));
$p->start(); $p->start();
@ -530,7 +539,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testStartIsNonBlocking() public function testStartIsNonBlocking()
{ {
$process = $this->getProcess('php -r "usleep(500000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$start = microtime(true); $start = microtime(true);
$process->start(); $process->start();
$end = microtime(true); $end = microtime(true);
@ -540,14 +549,14 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testUpdateStatus() public function testUpdateStatus()
{ {
$process = $this->getProcess('php -h'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertTrue(strlen($process->getOutput()) > 0); $this->assertTrue(strlen($process->getOutput()) > 0);
} }
public function testGetExitCodeIsNullOnStart() public function testGetExitCodeIsNullOnStart()
{ {
$process = $this->getProcess('php -r "usleep(200000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(200000);"');
$this->assertNull($process->getExitCode()); $this->assertNull($process->getExitCode());
$process->start(); $process->start();
$this->assertNull($process->getExitCode()); $this->assertNull($process->getExitCode());
@ -557,7 +566,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetExitCodeIsNullOnWhenStartingAgain() public function testGetExitCodeIsNullOnWhenStartingAgain()
{ {
$process = $this->getProcess('php -r "usleep(200000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(200000);"');
$process->run(); $process->run();
$this->assertEquals(0, $process->getExitCode()); $this->assertEquals(0, $process->getExitCode());
$process->start(); $process->start();
@ -568,14 +577,14 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetExitCode() public function testGetExitCode()
{ {
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertSame(0, $process->getExitCode()); $this->assertSame(0, $process->getExitCode());
} }
public function testStatus() public function testStatus()
{ {
$process = $this->getProcess('php -r "usleep(500000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$this->assertFalse($process->isRunning()); $this->assertFalse($process->isRunning());
$this->assertFalse($process->isStarted()); $this->assertFalse($process->isStarted());
$this->assertFalse($process->isTerminated()); $this->assertFalse($process->isTerminated());
@ -594,7 +603,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testStop() public function testStop()
{ {
$process = $this->getProcess('php -r "sleep(4);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(4);"');
$process->start(); $process->start();
$this->assertTrue($process->isRunning()); $this->assertTrue($process->isRunning());
$process->stop(); $process->stop();
@ -603,14 +612,14 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testIsSuccessful() public function testIsSuccessful()
{ {
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertTrue($process->isSuccessful()); $this->assertTrue($process->isSuccessful());
} }
public function testIsSuccessfulOnlyAfterTerminated() public function testIsSuccessfulOnlyAfterTerminated()
{ {
$process = $this->getProcess('php -r "sleep(1);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(1);"');
$process->start(); $process->start();
while ($process->isRunning()) { while ($process->isRunning()) {
$this->assertFalse($process->isSuccessful()); $this->assertFalse($process->isSuccessful());
@ -622,7 +631,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testIsNotSuccessful() public function testIsNotSuccessful()
{ {
$process = $this->getProcess('php -r "usleep(500000);throw new \Exception(\'BOUM\');"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(500000);throw new \Exception(\'BOUM\');"');
$process->start(); $process->start();
$this->assertTrue($process->isRunning()); $this->assertTrue($process->isRunning());
$process->wait(); $process->wait();
@ -635,7 +644,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Windows does not support POSIX signals'); $this->markTestSkipped('Windows does not support POSIX signals');
} }
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertFalse($process->hasBeenSignaled()); $this->assertFalse($process->hasBeenSignaled());
} }
@ -646,7 +655,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Windows does not support POSIX signals'); $this->markTestSkipped('Windows does not support POSIX signals');
} }
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertFalse($process->hasBeenSignaled()); $this->assertFalse($process->hasBeenSignaled());
} }
@ -657,7 +666,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Windows does not support POSIX signals'); $this->markTestSkipped('Windows does not support POSIX signals');
} }
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertEquals(0, $process->getTermSignal()); $this->assertEquals(0, $process->getTermSignal());
} }
@ -668,7 +677,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Windows does not support POSIX signals'); $this->markTestSkipped('Windows does not support POSIX signals');
} }
$process = $this->getProcess('php -r "sleep(4);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(4);"');
$process->start(); $process->start();
$process->stop(); $process->stop();
$this->assertTrue($process->hasBeenSignaled()); $this->assertTrue($process->hasBeenSignaled());
@ -683,7 +692,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
// SIGTERM is only defined if pcntl extension is present // SIGTERM is only defined if pcntl extension is present
$termSignal = defined('SIGTERM') ? SIGTERM : 15; $termSignal = defined('SIGTERM') ? SIGTERM : 15;
$process = $this->getProcess('php -r "sleep(4);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(4);"');
$process->start(); $process->start();
$process->stop(); $process->stop();
@ -712,7 +721,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testRestart() public function testRestart()
{ {
$process1 = $this->getProcess('php -r "echo getmypid();"'); $process1 = $this->getProcess(self::$phpBin.' -r "echo getmypid();"');
$process1->run(); $process1->run();
$process2 = $process1->restart(); $process2 = $process1->restart();
@ -734,7 +743,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
// Sleep doesn't work as it will allow the process to handle signals and close // Sleep doesn't work as it will allow the process to handle signals and close
// file handles from the other end. // file handles from the other end.
$process = $this->getProcess('php -r "while (true) {}"'); $process = $this->getProcess(self::$phpBin.' -r "while (true) {}"');
$process->start(); $process->start();
// PHP will deadlock when it tries to cleanup $process // PHP will deadlock when it tries to cleanup $process
@ -743,7 +752,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testRunProcessWithTimeout() public function testRunProcessWithTimeout()
{ {
$timeout = 0.5; $timeout = 0.5;
$process = $this->getProcess('php -r "usleep(600000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(600000);"');
$process->setTimeout($timeout); $process->setTimeout($timeout);
$start = microtime(true); $start = microtime(true);
try { try {
@ -765,13 +774,13 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testCheckTimeoutOnNonStartedProcess() public function testCheckTimeoutOnNonStartedProcess()
{ {
$process = $this->getProcess('php -r "sleep(3);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(3);"');
$process->checkTimeout(); $process->checkTimeout();
} }
public function testCheckTimeoutOnTerminatedProcess() public function testCheckTimeoutOnTerminatedProcess()
{ {
$process = $this->getProcess('php -v'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$process->checkTimeout(); $process->checkTimeout();
} }
@ -780,7 +789,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
{ {
$timeout = 0.5; $timeout = 0.5;
$precision = 100000; $precision = 100000;
$process = $this->getProcess('php -r "sleep(3);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(3);"');
$process->setTimeout($timeout); $process->setTimeout($timeout);
$start = microtime(true); $start = microtime(true);
@ -802,7 +811,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testIdleTimeout() public function testIdleTimeout()
{ {
$process = $this->getProcess('php -r "sleep(3);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(3);"');
$process->setTimeout(10); $process->setTimeout(10);
$process->setIdleTimeout(0.5); $process->setIdleTimeout(0.5);
@ -819,7 +828,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testIdleTimeoutNotExceededWhenOutputIsSent() public function testIdleTimeoutNotExceededWhenOutputIsSent()
{ {
$process = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 30; while ($n--) {echo "foo\n"; usleep(100000); }'))); $process = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 30; while ($n--) {echo "foo\n"; usleep(100000); }')));
$process->setTimeout(2); $process->setTimeout(2);
$process->setIdleTimeout(1); $process->setIdleTimeout(1);
@ -835,7 +844,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testStartAfterATimeout() public function testStartAfterATimeout()
{ {
$process = $this->getProcess(sprintf('php -r %s', escapeshellarg('$n = 1000; while ($n--) {echo \'\'; usleep(1000); }'))); $process = $this->getProcess(sprintf('%s -r %s', self::$phpBin, escapeshellarg('$n = 1000; while ($n--) {echo \'\'; usleep(1000); }')));
$process->setTimeout(0.1); $process->setTimeout(0.1);
try { try {
@ -850,7 +859,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetPid() public function testGetPid()
{ {
$process = $this->getProcess('php -r "usleep(500000);"'); $process = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$process->start(); $process->start();
$this->assertGreaterThan(0, $process->getPid()); $this->assertGreaterThan(0, $process->getPid());
$process->wait(); $process->wait();
@ -858,13 +867,13 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testGetPidIsNullBeforeStart() public function testGetPidIsNullBeforeStart()
{ {
$process = $this->getProcess('php -r "sleep(1);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(1);"');
$this->assertNull($process->getPid()); $this->assertNull($process->getPid());
} }
public function testGetPidIsNullAfterRun() public function testGetPidIsNullAfterRun()
{ {
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->run(); $process->run();
$this->assertNull($process->getPid()); $this->assertNull($process->getPid());
} }
@ -909,7 +918,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testSignalProcessNotRunning() public function testSignalProcessNotRunning()
{ {
$this->verifyPosixIsEnabled(); $this->verifyPosixIsEnabled();
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$process->signal(SIGHUP); $process->signal(SIGHUP);
} }
@ -918,7 +927,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testMethodsThatNeedARunningProcess($method) public function testMethodsThatNeedARunningProcess($method)
{ {
$process = $this->getProcess('php -m'); $process = $this->getProcess(self::$phpBin.' -v');
$this->setExpectedException('Symfony\Component\Process\Exception\LogicException', sprintf('Process must be started before calling %s.', $method)); $this->setExpectedException('Symfony\Component\Process\Exception\LogicException', sprintf('Process must be started before calling %s.', $method));
$process->{$method}(); $process->{$method}();
} }
@ -939,7 +948,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testMethodsThatNeedATerminatedProcess($method) public function testMethodsThatNeedATerminatedProcess($method)
{ {
$process = $this->getProcess('php -r "sleep(1);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(1);"');
$process->start(); $process->start();
try { try {
$process->{$method}(); $process->{$method}();
@ -981,7 +990,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('POSIX signals do not work on Windows'); $this->markTestSkipped('POSIX signals do not work on Windows');
} }
$process = $this->getProcess('php -r "sleep(3);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(3);"');
$process->start(); $process->start();
$process->signal(-4); $process->signal(-4);
} }
@ -995,14 +1004,14 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('POSIX signals do not work on Windows'); $this->markTestSkipped('POSIX signals do not work on Windows');
} }
$process = $this->getProcess('php -r "sleep(3);"'); $process = $this->getProcess(self::$phpBin.' -r "sleep(3);"');
$process->start(); $process->start();
$process->signal('Céphalopodes'); $process->signal('Céphalopodes');
} }
public function testDisableOutputDisablesTheOutput() public function testDisableOutputDisablesTheOutput()
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$this->assertFalse($p->isOutputDisabled()); $this->assertFalse($p->isOutputDisabled());
$p->disableOutput(); $p->disableOutput();
$this->assertTrue($p->isOutputDisabled()); $this->assertTrue($p->isOutputDisabled());
@ -1012,7 +1021,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testDisableOutputWhileRunningThrowsException() public function testDisableOutputWhileRunningThrowsException()
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$p->start(); $p->start();
$this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Disabling output while the process is running is not possible.'); $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Disabling output while the process is running is not possible.');
$p->disableOutput(); $p->disableOutput();
@ -1020,7 +1029,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testEnableOutputWhileRunningThrowsException() public function testEnableOutputWhileRunningThrowsException()
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$p->disableOutput(); $p->disableOutput();
$p->start(); $p->start();
$this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Enabling output while the process is running is not possible.'); $this->setExpectedException('Symfony\Component\Process\Exception\RuntimeException', 'Enabling output while the process is running is not possible.');
@ -1029,7 +1038,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
public function testEnableOrDisableOutputAfterRunDoesNotThrowException() public function testEnableOrDisableOutputAfterRunDoesNotThrowException()
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$p->disableOutput(); $p->disableOutput();
$p->start(); $p->start();
$p->wait(); $p->wait();
@ -1065,7 +1074,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testStartWithACallbackAndDisabledOutput($startMethod, $exception, $exceptionMessage) public function testStartWithACallbackAndDisabledOutput($startMethod, $exception, $exceptionMessage)
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$p->disableOutput(); $p->disableOutput();
$this->setExpectedException($exception, $exceptionMessage); $this->setExpectedException($exception, $exceptionMessage);
$p->{$startMethod}(function () {}); $p->{$startMethod}(function () {});
@ -1085,7 +1094,7 @@ abstract class AbstractProcessTest extends \PHPUnit_Framework_TestCase
*/ */
public function testGetOutputWhileDisabled($fetchMethod) public function testGetOutputWhileDisabled($fetchMethod)
{ {
$p = $this->getProcess('php -r "usleep(500000);"'); $p = $this->getProcess(self::$phpBin.' -r "usleep(500000);"');
$p->disableOutput(); $p->disableOutput();
$p->start(); $p->start();
$this->setExpectedException('Symfony\Component\Process\Exception\LogicException', 'Output has been disabled.'); $this->setExpectedException('Symfony\Component\Process\Exception\LogicException', 'Output has been disabled.');

View File

@ -102,7 +102,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Cannot test when open_basedir is set'); $this->markTestSkipped('Cannot test when open_basedir is set');
} }
$this->iniSet('open_basedir', dirname(PHP_BINARY).PATH_SEPARATOR.'/'); $this->iniSet('open_basedir', dirname(PHP_BINARY).(!defined('HHVM_VERSION') ? PATH_SEPARATOR.'/' : ''));
$finder = new ExecutableFinder(); $finder = new ExecutableFinder();
$result = $finder->find($this->getPhpBinaryName()); $result = $finder->find($this->getPhpBinaryName());
@ -125,7 +125,7 @@ class ExecutableFinderTest extends \PHPUnit_Framework_TestCase
} }
$this->setPath(''); $this->setPath('');
$this->iniSet('open_basedir', PHP_BINARY.PATH_SEPARATOR.'/'); $this->iniSet('open_basedir', PHP_BINARY.(!defined('HHVM_VERSION') ? PATH_SEPARATOR.'/' : ''));
$finder = new ExecutableFinder(); $finder = new ExecutableFinder();
$result = $finder->find($this->getPhpBinaryName(), false); $result = $finder->find($this->getPhpBinaryName(), false);

View File

@ -53,10 +53,10 @@ class PhpExecutableFinderTest extends \PHPUnit_Framework_TestCase
$f = new PhpExecutableFinder(); $f = new PhpExecutableFinder();
$current = $f->find(); $current = getenv('PHP_BINARY') ?: PHP_BINARY;
$this->assertEquals($f->find(), $current.' --php', '::find() returns the executable PHP'); $this->assertEquals($current.' --php', $f->find(), '::find() returns the executable PHP');
$this->assertEquals($f->find(false), $current, '::find() returns the executable PHP'); $this->assertEquals($current, $f->find(false), '::find() returns the executable PHP');
} }
/** /**

View File

@ -150,7 +150,7 @@ class SimpleProcessTest extends AbstractProcessTest
public function testStopTerminatesProcessCleanly() public function testStopTerminatesProcessCleanly()
{ {
try { try {
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"'); $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
$process->run(function () use ($process) { $process->run(function () use ($process) {
$process->stop(); $process->stop();
}); });
@ -164,7 +164,7 @@ class SimpleProcessTest extends AbstractProcessTest
$this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.'); $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
try { try {
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"'); $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
$process->run(function () use ($process) { $process->run(function () use ($process) {
if ($process->isRunning()) { if ($process->isRunning()) {
$process->signal(defined('SIGKILL') ? SIGKILL : 9); $process->signal(defined('SIGKILL') ? SIGKILL : 9);
@ -180,7 +180,7 @@ class SimpleProcessTest extends AbstractProcessTest
$this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.'); $this->expectExceptionIfPHPSigchild('Symfony\Component\Process\Exception\RuntimeException', 'This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
try { try {
$process = $this->getProcess('php -r "echo \'foo\'; sleep(1); echo \'bar\';"'); $process = $this->getProcess(self::$phpBin.' -r "echo \'foo\'; sleep(1); echo \'bar\';"');
$process->run(function () use ($process) { $process->run(function () use ($process) {
if ($process->isRunning()) { if ($process->isRunning()) {
$process->signal(defined('SIGTERM') ? SIGTERM : 15); $process->signal(defined('SIGTERM') ? SIGTERM : 15);

View File

@ -39,7 +39,7 @@ class PhpGeneratorDumperTest extends \PHPUnit_Framework_TestCase
$this->routeCollection = new RouteCollection(); $this->routeCollection = new RouteCollection();
$this->generatorDumper = new PhpGeneratorDumper($this->routeCollection); $this->generatorDumper = new PhpGeneratorDumper($this->routeCollection);
$this->testTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.php'; $this->testTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.'.$this->getName().'.php';
@unlink($this->testTmpFilepath); @unlink($this->testTmpFilepath);
} }

View File

@ -165,7 +165,8 @@ class SwitchUserListener implements ListenerInterface
} }
if (null !== $this->dispatcher) { if (null !== $this->dispatcher) {
$switchEvent = new SwitchUserEvent($request, $original->getUser()); $user = $this->provider->refreshUser($original->getUser());
$switchEvent = new SwitchUserEvent($request, $user);
$this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent); $this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);
} }

View File

@ -11,7 +11,9 @@
namespace Symfony\Component\Security\Http\Tests\Firewall; namespace Symfony\Component\Security\Http\Tests\Firewall;
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
use Symfony\Component\Security\Http\Firewall\SwitchUserListener; use Symfony\Component\Security\Http\Firewall\SwitchUserListener;
use Symfony\Component\Security\Http\SecurityEvents;
class SwitchUserListenerTest extends \PHPUnit_Framework_TestCase class SwitchUserListenerTest extends \PHPUnit_Framework_TestCase
{ {
@ -100,6 +102,56 @@ class SwitchUserListenerTest extends \PHPUnit_Framework_TestCase
$listener->handle($this->event); $listener->handle($this->event);
} }
public function testExitUserDispatchesEventWithRefreshedUser()
{
$originalUser = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
$refreshedUser = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
$this
->userProvider
->expects($this->any())
->method('refreshUser')
->with($originalUser)
->willReturn($refreshedUser);
$originalToken = $this->getToken();
$originalToken
->expects($this->any())
->method('getUser')
->willReturn($originalUser);
$role = $this
->getMockBuilder('Symfony\Component\Security\Core\Role\SwitchUserRole')
->disableOriginalConstructor()
->getMock();
$role->expects($this->any())->method('getSource')->willReturn($originalToken);
$this
->securityContext
->expects($this->any())
->method('getToken')
->willReturn($this->getToken(array($role)));
$this
->request
->expects($this->any())
->method('get')
->with('_switch_user')
->willReturn('_exit');
$this
->request
->expects($this->any())
->method('getUri')
->willReturn('/');
$dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
$dispatcher
->expects($this->once())
->method('dispatch')
->with(SecurityEvents::SWITCH_USER, $this->callback(function (SwitchUserEvent $event) use ($refreshedUser) {
return $event->getTargetUser() === $refreshedUser;
}))
;
$listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager, null, '_switch_user', 'ROLE_ALLOWED_TO_SWITCH', $dispatcher);
$listener->handle($this->event);
}
/** /**
* @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException * @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
*/ */

View File

@ -137,12 +137,12 @@ class StopwatchEventTest extends \PHPUnit_Framework_TestCase
public function testStartTime() public function testStartTime()
{ {
$event = new StopwatchEvent(microtime(true) * 1000); $event = new StopwatchEvent(microtime(true) * 1000);
$this->assertTrue($event->getStartTime() < 0.5); $this->assertLessThan(0.5, $event->getStartTime());
$event = new StopwatchEvent(microtime(true) * 1000); $event = new StopwatchEvent(microtime(true) * 1000);
$event->start(); $event->start();
$event->stop(); $event->stop();
$this->assertTrue($event->getStartTime() < 1); $this->assertLessThan(1, $event->getStartTime());
$event = new StopwatchEvent(microtime(true) * 1000); $event = new StopwatchEvent(microtime(true) * 1000);
$event->start(); $event->start();

View File

@ -50,15 +50,19 @@ class InlineTest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('Your platform does not support locales.'); $this->markTestSkipped('Your platform does not support locales.');
} }
$required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'); try {
if (false === setlocale(LC_ALL, $required_locales)) { $requiredLocales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
$this->markTestSkipped('Could not set any of required locales: '.implode(', ', $required_locales)); if (false === setlocale(LC_NUMERIC, $requiredLocales)) {
$this->markTestSkipped('Could not set any of required locales: '.implode(', ', $requiredLocales));
}
$this->assertEquals('1.2', Inline::dump(1.2));
$this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));
setlocale(LC_NUMERIC, $locale);
} catch (\Exception $e) {
setlocale(LC_NUMERIC, $locale);
throw $e;
} }
$this->assertEquals('1.2', Inline::dump(1.2));
$this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0)));
setlocale(LC_ALL, $locale);
} }
public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF() public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF()