bug #23711 Fix support for PHP 7.2 (Simperfit, nicolas-grekas)

This PR was merged into the 2.7 branch.

Discussion
----------

Fix support for PHP 7.2

| Q             | A
| ------------- | ---
| Branch?       |  2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | no
| Fixed tickets | #23671
| License       | MIT
| Doc PR        | -

There are still the deprecation problem with phpunit since it use `each()`.

There are 3 tests linked to session that I don't know how to fix / what to do, do you have any idea @nicolas-grekas ?

Commits
-------

fdf285b5c9 Fix 7.2 compat layer
e229dd0302 Fix PHP 7.2 support
This commit is contained in:
Fabien Potencier 2017-10-09 21:00:26 -07:00
commit 5fd0fe6631
17 changed files with 46 additions and 26 deletions

View File

@ -25,8 +25,9 @@ matrix:
- php: 5.5
- php: 5.6
- php: 7.0
env: deps=high
- php: 7.1
env: deps=high
- php: 7.2
env: deps=low
fast_finish: true

View File

@ -44,6 +44,9 @@ class AppVariableTest extends TestCase
$this->assertEquals('dev', $this->appVariable->getEnvironment());
}
/**
* @runInSeparateProcess
*/
public function testGetSession()
{
$request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->getMock();

View File

@ -23,6 +23,7 @@
"symfony/asset": "~2.7",
"symfony/finder": "~2.3",
"symfony/form": "~2.7.30|^2.8.23",
"symfony/http-foundation": "~2.7.36|^2.8.29",
"symfony/http-kernel": "~2.3",
"symfony/intl": "~2.3",
"symfony/routing": "~2.2",

View File

@ -55,7 +55,7 @@ class CacheClearCommandTest extends TestCase
$finder = new Finder();
$metaFiles = $finder->files()->in($this->kernel->getCacheDir())->name('*.php.meta');
// simply check that cache is warmed up
$this->assertGreaterThanOrEqual(1, count($metaFiles));
$this->assertNotEmpty($metaFiles);
foreach ($metaFiles as $file) {
$configCache = new ConfigCache(substr($file, 0, -5), true);
$this->assertTrue(

View File

@ -143,6 +143,9 @@ class ControllerTest extends TestCase
$this->assertSame(302, $response->getStatusCode());
}
/**
* @runInSeparateProcess
*/
public function testAddFlash()
{
$flashBag = new FlashBag();

View File

@ -23,7 +23,7 @@
"symfony/config": "~2.4",
"symfony/event-dispatcher": "~2.5",
"symfony/finder": "^2.0.5",
"symfony/http-foundation": "~2.7",
"symfony/http-foundation": "~2.7.36|^2.8.29",
"symfony/http-kernel": "~2.7.29|^2.8.22",
"symfony/filesystem": "~2.3",
"symfony/routing": "~2.7.24|^2.8.17",

View File

@ -79,7 +79,9 @@ class ErrorHandlerTest extends TestCase
$this->assertEquals(E_NOTICE, $exception->getSeverity());
$this->assertEquals(__FILE__, $exception->getFile());
$this->assertRegExp('/^Notice: Undefined variable: (foo|bar)/', $exception->getMessage());
$this->assertArrayHasKey('foobar', $exception->getContext());
if (\PHP_VERSION_ID < 70200) {
$this->assertArrayHasKey('foobar', $exception->getContext());
}
$trace = $exception->getTrace();
$this->assertEquals(__FILE__, $trace[0]['file']);

View File

@ -1,3 +1,5 @@
<?php
throw new \Exception('boo');
if (!function_exists('__phpunit_run_isolated_test')) {
throw new \Exception('boo');
}

View File

@ -421,6 +421,9 @@ class XmlFileLoaderTest extends TestCase
if (extension_loaded('suhosin') && false === strpos(ini_get('suhosin.executor.include.whitelist'), 'phar')) {
$this->markTestSkipped('To run this test, add "phar" to the "suhosin.executor.include.whitelist" settings in your php.ini file.');
}
if (defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM makes this test conflict with those run in separate processes.');
}
require_once self::$fixturesPath.'/includes/ProjectWithXsdExtensionInPhar.phar';

View File

@ -23,12 +23,6 @@ class LegacyDefaultCsrfProviderTest extends TestCase
{
protected $provider;
public static function setUpBeforeClass()
{
ini_set('session.save_handler', 'files');
ini_set('session.save_path', sys_get_temp_dir());
}
protected function setUp()
{
$this->provider = new DefaultCsrfProvider('SECRET');

View File

@ -102,8 +102,11 @@ class NativeSessionStorage implements SessionStorageInterface
*/
public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null)
{
session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
ini_set('session.use_cookies', 1);
$options += array(
// disable by default because it's managed by HeaderBag (if used)
'cache_limiter' => '',
'use_cookies' => 1,
);
if (\PHP_VERSION_ID >= 50400) {
session_register_shutdown();
@ -209,6 +212,10 @@ class NativeSessionStorage implements SessionStorageInterface
return false;
}
if (headers_sent()) {
return false;
}
if (null !== $lifetime) {
ini_set('session.cookie_lifetime', $lifetime);
}
@ -333,6 +340,10 @@ class NativeSessionStorage implements SessionStorageInterface
*/
public function setOptions(array $options)
{
if (headers_sent()) {
return;
}
$validOptions = array_flip(array(
'cache_limiter', 'cookie_domain', 'cookie_httponly',
'cookie_lifetime', 'cookie_path', 'cookie_secure',
@ -384,6 +395,10 @@ class NativeSessionStorage implements SessionStorageInterface
throw new \InvalidArgumentException('Must be instance of AbstractProxy or NativeSessionHandler; implement \SessionHandlerInterface; or be null.');
}
if (headers_sent($file, $line)) {
throw new \RuntimeException(sprintf('Failed to set the session handler because headers have already been sent by "%s" at line %d.', $file, $line));
}
// Wrap $saveHandler in proxy and prevent double wrapping of proxy
if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
$saveHandler = new SessionHandlerProxy($saveHandler);

View File

@ -269,6 +269,9 @@ class PdoSessionHandlerTest extends TestCase
$this->assertSame('', $data, 'Destroyed session returns empty string');
}
/**
* @runInSeparateProcess
*/
public function testSessionGC()
{
$previousLifeTime = ini_set('session.gc_maxlifetime', 1000);

View File

@ -38,8 +38,7 @@ class LocaleListenerTest extends TestCase
public function testLocaleFromRequestAttribute()
{
$request = Request::create('/');
session_name('foo');
$request->cookies->set('foo', 'value');
$request->cookies->set(session_name(), 'value');
$request->attributes->set('_locale', 'es');
$listener = new LocaleListener('fr', null, $this->requestStack);

View File

@ -62,8 +62,7 @@ class TestSessionListenerTest extends TestCase
{
$this->sessionHasBeenStarted();
$params = session_get_cookie_params();
session_set_cookie_params(0, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
@ini_set('session.cookie_lifetime', 0);
$response = $this->filterResponse(new Request(), HttpKernelInterface::MASTER_REQUEST);
$cookies = $response->headers->getCookies();

View File

@ -18,7 +18,7 @@
"require": {
"php": ">=5.3.9",
"symfony/event-dispatcher": "^2.6.7",
"symfony/http-foundation": "~2.7.20|^2.8.13",
"symfony/http-foundation": "~2.7.36|^2.8.29",
"symfony/debug": "^2.6.2",
"psr/log": "~1.0"
},

View File

@ -1,5 +1,8 @@
<?php
if (function_exists('__phpunit_run_isolated_test')) {
return;
}
/** @var $loader \Symfony\Component\Routing\Loader\PhpFileLoader */
/** @var \Symfony\Component\Routing\RouteCollection $collection */
$collection = $loader->import('validpattern.php');

View File

@ -29,14 +29,6 @@ class NativeSessionTokenStorageTest extends TestCase
*/
private $storage;
public static function setUpBeforeClass()
{
ini_set('session.save_handler', 'files');
ini_set('session.save_path', sys_get_temp_dir());
parent::setUpBeforeClass();
}
protected function setUp()
{
$_SESSION = array();