Fixes for php8.0.0beta3 (#608)

* Set $errcontext argument optional to support PHP 8

- Argument is optional and deprecated in PHP 7.2

* Getting ready for PHP8, handling changed error levels/handlers mostly

* php5 compat syntax

* Updated UndefinedTemplateVarTest for PHP8 (and disabled a check for PHP<5.6) and re-enabled php:nightly in travis config

* Attempt to fix travis runs for (almost) all php versions supported

* Fix unit tests for php8, force composer to think we are still php7 to pick a supported phpunit and being less specific about an error msg because PHP8 is in active development and the exact wording is changing.

* Fixed a unit test that accidentally passed on phpunit < 7 because of sloppy string comparison.

* changelog

* run travis in xenial where possible for latest php versions. Fix unit tests from freakingo over inconsistent error messages in php8-beta.

* Incorporated AnrDaemons suggestions, making composer figure out the required phpunit version instead of specifying it explicitly and removing a unneeded error supression (@).

Co-authored-by: Jorge Sá Pereira <me@jorgesapereira.com>
This commit is contained in:
Simon Wisselink
2020-09-12 21:37:31 +02:00
committed by GitHub
parent 859a09e1bb
commit c295786e43
18 changed files with 78 additions and 51 deletions

View File

@@ -1,38 +1,39 @@
language: php language: php
os: linux
dist: xenial
sudo: false install:
- travis_retry composer install
dist: trusty jobs:
matrix:
include: include:
- php: 5.3 # Composer requires PHP 5.3.2+ to run, so we cannot test below 5.3 - php: 5.3 # Composer and PHPUnit require PHP 5.3.2+ to run, so we cannot test below 5.3
dist: precise # PHP 5.3 is supported only on Precise. dist: precise # PHP 5.3 is supported only on Precise.
- php: 5.4 - php: 5.4
dist: trusty # PHP 5.4 is supported only on Trusty.
- php: 5.5 - php: 5.5
dist: trusty # PHP 5.5 is supported only on Trusty.
- php: 5.6 - php: 5.6
- php: 7.0 - php: 7.0
- php: 7.1 - php: 7.1
- php: 7.2 - php: 7.2
- php: 7.3 - php: 7.3
- php: 7.4 - php: 7.4
# - php: nightly # PHP nightly build testing disabled because PHPUnit doesn't support PHP8 yet. - php: nightly
install: travis_retry composer config platform.php 7.4.0 && composer install
fast_finish: true fast_finish: true
allow_failures: allow_failures:
- php: nightly - php: nightly # PHP 8 is still in beta
services: services:
- memcached - memcached
- mysql - mysql
before_script: before_script:
- mysql -e "create database IF NOT EXISTS test;" -uroot - mysql -e "create database IF NOT EXISTS test;" -uroot
before_install: before_install:
- phpenv config-rm xdebug.ini || return 0 - phpenv config-rm xdebug.ini || return 0
install:
- travis_retry composer install
script: script:
- ./phpunit.sh - ./phpunit.sh

View File

@@ -7,10 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Changed ### Changed
- Travis unit tests now run for all php versions >= 5.3 - Changed error handlers and handling of undefined constants for php8-compatibility (set $errcontext argument optional) https://github.com/smarty-php/smarty/issues/605
- Changed expected error levels in unit tests for php8-compatibility
- Travis unit tests now run for all php versions >= 5.3, including php8
- Travis runs on Xenial where possible
### Fixed ### Fixed
- PHP5.3 compatability fixes - PHP5.3 compatibility fixes
## [3.1.36] - 2020-04-14 ## [3.1.36] - 2020-04-14

View File

@@ -40,7 +40,7 @@
} }
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "6.4.1 || ^5.7 || ^4.8", "phpunit/phpunit": "^7.5 || ^6.5 || ^5.7 || ^4.8",
"smarty/smarty-lexer": "^3.1" "smarty/smarty-lexer": "^3.1"
} }
} }

View File

@@ -94,9 +94,9 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
break; break;
} }
if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) { if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) {
return "@constant('{$_index[1]}')"; return "defined('{$_index[1]}') ? constant('{$_index[1]}') : null";
} else { } else {
return "@constant({$_index[1]})"; return "defined({$_index[1]}) ? constant({$_index[1]}) : null";
} }
// no break // no break
case 'config': case 'config':

View File

@@ -65,7 +65,7 @@ class Smarty_Internal_ErrorHandler
* *
* @return bool * @return bool
*/ */
public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext = array())
{ {
$_is_muted_directory = false; $_is_muted_directory = false;
// add the SMARTY_DIR to the list of muted directories // add the SMARTY_DIR to the list of muted directories

View File

@@ -16,7 +16,6 @@ if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Frame
class_alias('\PHPUnit\Framework\Error\Error', '\PHPUnit_Framework_Error_Error'); class_alias('\PHPUnit\Framework\Error\Error', '\PHPUnit_Framework_Error_Error');
class_alias('\PHPUnit\Framework\Error\Warning', '\PHPUnit_Framework_Error_Warning'); class_alias('\PHPUnit\Framework\Error\Warning', '\PHPUnit_Framework_Error_Warning');
class_alias('\PHPUnit\Framework\Error\Warning', '\PHPUnit_Framework_Error_Deprecated'); class_alias('\PHPUnit\Framework\Error\Warning', '\PHPUnit_Framework_Error_Deprecated');
class_alias('\PHPUnit\Util\Configuration', '\PHPUnit_Util_Configuration');
} }
require_once 'PHPUnit_Smarty.php'; require_once 'PHPUnit_Smarty.php';

View File

@@ -24,34 +24,37 @@ class UndefinedTemplateVarTest extends PHPUnit_Smarty
$this->cleanDirs(); $this->cleanDirs();
} }
/** /**
* Test E_NOTICE suppression template fetched by Smarty object * Test Error suppression template fetched by Smarty object
*/ */
public function testE_NoticeDisabled() public function testErrorDisabled()
{ {
$e1 = error_reporting(); $e1 = error_reporting();
$this->smarty->setErrorReporting(E_ALL & ~E_NOTICE); $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$this->assertEquals('undefined = ', $this->smarty->fetch('001_main.tpl')); $this->assertEquals('undefined = ', $this->smarty->fetch('001_main.tpl'));
$e2 = error_reporting(); $e2 = error_reporting();
$this->assertEquals($e1, $e2); $this->assertEquals($e1, $e2);
} }
/** /**
* Test E_NOTICE suppression template fetched by template object * Test Error suppression template fetched by template object
*/ */
public function testE_NoticeDisabledTplObject_1() public function testErrorDisabledTplObject_1()
{ {
$e1 = error_reporting(); $e1 = error_reporting();
$this->smarty->setErrorReporting(E_ALL & ~E_NOTICE); $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$tpl = $this->smarty->createTemplate('001_main.tpl'); $tpl = $this->smarty->createTemplate('001_main.tpl');
$this->assertEquals('undefined = ', $tpl->fetch()); $this->assertEquals('undefined = ', $tpl->fetch());
$e2 = error_reporting(); $e2 = error_reporting();
$this->assertEquals($e1, $e2); $this->assertEquals($e1, $e2);
} }
public function testE_NoticeDisabledTplObject_2() /**
* Test Error suppression template object fetched by Smarty object
*/
public function testErrorDisabledTplObject_2()
{ {
$e1 = error_reporting(); $e1 = error_reporting();
$this->smarty->setErrorReporting(E_ALL & ~E_NOTICE); $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$tpl = $this->smarty->createTemplate('001_main.tpl'); $tpl = $this->smarty->createTemplate('001_main.tpl');
$this->assertEquals('undefined = ', $this->smarty->fetch($tpl)); $this->assertEquals('undefined = ', $this->smarty->fetch($tpl));
$e2 = error_reporting(); $e2 = error_reporting();
@@ -59,16 +62,31 @@ class UndefinedTemplateVarTest extends PHPUnit_Smarty
} }
/** /**
* Throw E_NOTICE message * Throw Error message
*
* @expectedException PHPUnit_Framework_Error_Notice
* @expectedExceptionMessage Undefined index: foo
*/ */
public function testE_Notice() public function testError()
{ {
$e1 = error_reporting(); $exceptionThrown = false;
$this->assertEquals('undefined = ', $this->smarty->fetch('001_main.tpl'));
$e2 = error_reporting(); try {
$this->assertEquals($e1, $e2); $e1 = error_reporting();
$this->assertEquals('undefined = ', $this->smarty->fetch('001_main.tpl'));
$e2 = error_reporting();
$this->assertEquals($e1, $e2);
} catch (Exception $e) {
$exceptionThrown = true;
$this->assertStringStartsWith('Undefined ', $e->getMessage());
$this->assertTrue(in_array(
get_class($e),
array(
'PHPUnit_Framework_Error_Warning',
'PHPUnit_Framework_Error_Notice',
'PHPUnit\Framework\Error\Warning',
'PHPUnit\Framework\Error\Notice',
)
));
}
$this->assertTrue($exceptionThrown);
} }
} }

View File

@@ -27,7 +27,7 @@ class MuteExpectedErrorsTest extends PHPUnit_Smarty
{ {
$this->cleanDirs(); $this->cleanDirs();
} }
public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) public function error_handler($errno, $errstr, $errfile, $errline, $errcontext = array())
{ {
$this->_errors[] = $errfile . ' line ' . $errline; $this->_errors[] = $errfile . ' line ' . $errline;
} }

View File

@@ -403,7 +403,11 @@ class ConfigVarTest extends PHPUnit_Smarty
$this->assertEquals("", $this->smarty->fetch('foo.tpl')); $this->assertEquals("", $this->smarty->fetch('foo.tpl'));
} }
catch (Exception $e) { catch (Exception $e) {
$this->assertEquals('Undefined variable: foo', $e->getMessage()); if (PHP_VERSION_ID >= 80000) {
$this->assertStringStartsWith('Undefined variable', $e->getMessage());
} else {
$this->assertStringStartsWith('Undefined variable', $e->getMessage());
}
} }
} }
} }

View File

@@ -33,7 +33,7 @@ class ClearAllAssignBCTest extends PHPUnit_Smarty
public function testSmarty2ClearAllAssignInSmarty() public function testSmarty2ClearAllAssignInSmarty()
{ {
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE))); error_reporting((error_reporting() & ~(E_NOTICE | E_WARNING | E_USER_NOTICE)));
$this->smartyBC->clear_all_assign(); $this->smartyBC->clear_all_assign();
$this->assertEquals('barblar', $this->smartyBC->fetch($this->_tplBC)); $this->assertEquals('barblar', $this->smartyBC->fetch($this->_tplBC));
} }

View File

@@ -46,7 +46,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
*/ */
public function testClearAllAssignInTemplate() public function testClearAllAssignInTemplate()
{ {
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE))); error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
$this->_tpl->clearAllAssign(); $this->_tpl->clearAllAssign();
$this->assertEquals('foobar', $this->smarty->fetch($this->_tpl)); $this->assertEquals('foobar', $this->smarty->fetch($this->_tpl));
} }
@@ -56,7 +56,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
*/ */
public function testClearAllAssignInData() public function testClearAllAssignInData()
{ {
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE))); error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
$this->_data->clearAllAssign(); $this->_data->clearAllAssign();
$this->assertEquals('fooblar', $this->smarty->fetch($this->_tpl)); $this->assertEquals('fooblar', $this->smarty->fetch($this->_tpl));
} }
@@ -66,7 +66,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty
*/ */
public function testClearAllAssignInSmarty() public function testClearAllAssignInSmarty()
{ {
error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE))); error_reporting((error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING)));
$this->smarty->clearAllAssign(); $this->smarty->clearAllAssign();
$this->assertEquals('barblar', $this->smarty->fetch($this->_tpl)); $this->assertEquals('barblar', $this->smarty->fetch($this->_tpl));
} }

View File

@@ -33,14 +33,14 @@ class ClearAssignBCTest extends PHPUnit_Smarty
} }
public function testSmarty2ClearAssign() public function testSmarty2ClearAssign()
{ {
$this->smartyBC->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE)); $this->smartyBC->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
$this->smartyBC->clear_assign('blar'); $this->smartyBC->clear_assign('blar');
$this->assertEquals('foobar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}')); $this->assertEquals('foobar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}'));
} }
public function testSmarty2ArrayClearAssign() public function testSmarty2ArrayClearAssign()
{ {
$this->smartyBC->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE)); $this->smartyBC->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
$this->smartyBC->clear_assign(array('blar', 'foo')); $this->smartyBC->clear_assign(array('blar', 'foo'));
$this->assertEquals('bar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}')); $this->assertEquals('bar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}'));
} }

View File

@@ -36,7 +36,7 @@ class ClearAssignTest extends PHPUnit_Smarty
*/ */
public function testClearAssign() public function testClearAssign()
{ {
$this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE)); $this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
$this->smarty->clearAssign('blar'); $this->smarty->clearAssign('blar');
$this->assertEquals('foobar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}')); $this->assertEquals('foobar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}'));
} }
@@ -46,7 +46,7 @@ class ClearAssignTest extends PHPUnit_Smarty
*/ */
public function testArrayClearAssign() public function testArrayClearAssign()
{ {
$this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE)); $this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
$this->smarty->clearAssign(array('blar', 'foo')); $this->smarty->clearAssign(array('blar', 'foo'));
$this->assertEquals('bar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}')); $this->assertEquals('bar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}'));
} }

View File

@@ -44,7 +44,7 @@ class CompileForeachTest extends PHPUnit_Smarty
$this->smarty->assign('foo', $foo); $this->smarty->assign('foo', $foo);
} else { } else {
// unassigned $from parameter // unassigned $from parameter
$this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE)); $this->smarty->setErrorReporting(error_reporting() & ~(E_NOTICE | E_USER_NOTICE | E_WARNING));
} }
$this->assertEquals($result, $this->smarty->fetch($file), "testForeach - {$code} - {$testName}"); $this->assertEquals($result, $this->smarty->fetch($file), "testForeach - {$code} - {$testName}");

View File

@@ -275,7 +275,7 @@ class PluginFunctionHtmlCheckboxesTest extends PHPUnit_Smarty
protected $_errors = array(); protected $_errors = array();
public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) public function error_handler($errno, $errstr, $errfile, $errline, $errcontext = array())
{ {
$this->_errors[] = $errstr; $this->_errors[] = $errstr;
} }

View File

@@ -369,7 +369,7 @@ class PluginFunctionHtmlOptionsTest extends PHPUnit_Smarty
protected $_errors = array(); protected $_errors = array();
public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) public function error_handler($errno, $errstr, $errfile, $errline, $errcontext = array())
{ {
$this->_errors[] = $errstr; $this->_errors[] = $errstr;
} }

View File

@@ -275,7 +275,7 @@ class PluginFunctionHtmlRadiosTest extends PHPUnit_Smarty
protected $_errors = array(); protected $_errors = array();
public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) public function error_handler($errno, $errstr, $errfile, $errline, $errcontext = array())
{ {
$this->_errors[] = $errstr; $this->_errors[] = $errstr;
} }

View File

@@ -78,11 +78,13 @@ class ConstantsTest extends PHPUnit_Smarty
} }
public function testConstantsUndefined() public function testConstantsUndefined()
{ {
$this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$tpl = $this->smarty->createTemplate('string:{$smarty.const.MYCONSTANT2}'); $tpl = $this->smarty->createTemplate('string:{$smarty.const.MYCONSTANT2}');
$this->assertEquals("", $this->smarty->fetch($tpl)); $this->assertEquals("", $this->smarty->fetch($tpl));
} }
public function testConstantsUndefined2() public function testConstantsUndefined2()
{ {
$this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE);
$tpl = $this->smarty->createTemplate('eval:{$foo = MYCONSTANT2}{$foo}'); $tpl = $this->smarty->createTemplate('eval:{$foo = MYCONSTANT2}{$foo}');
$this->assertEquals("MYCONSTANT2", $this->smarty->fetch($tpl)); $this->assertEquals("MYCONSTANT2", $this->smarty->fetch($tpl));
} }