diff --git a/.travis.yml b/.travis.yml index f39da33b..a8a11dcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,38 +1,39 @@ language: php +os: linux +dist: xenial -sudo: false +install: + - travis_retry composer install -dist: trusty - -matrix: +jobs: 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. - php: 5.4 + dist: trusty # PHP 5.4 is supported only on Trusty. - php: 5.5 + dist: trusty # PHP 5.5 is supported only on Trusty. - php: 5.6 - php: 7.0 - php: 7.1 - php: 7.2 - php: 7.3 - 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 allow_failures: - - php: nightly + - php: nightly # PHP 8 is still in beta services: - memcached - mysql before_script: - - mysql -e "create database IF NOT EXISTS test;" -uroot + - mysql -e "create database IF NOT EXISTS test;" -uroot before_install: - - phpenv config-rm xdebug.ini || return 0 - -install: - - travis_retry composer install + - phpenv config-rm xdebug.ini || return 0 script: - - ./phpunit.sh + - ./phpunit.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e052a44..27702e35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### 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 -- PHP5.3 compatability fixes +- PHP5.3 compatibility fixes ## [3.1.36] - 2020-04-14 diff --git a/composer.json b/composer.json index 9a5e7fd6..183f9f24 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ } }, "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" } } diff --git a/libs/sysplugins/smarty_internal_compile_private_special_variable.php b/libs/sysplugins/smarty_internal_compile_private_special_variable.php index b317c9f3..d29012d4 100644 --- a/libs/sysplugins/smarty_internal_compile_private_special_variable.php +++ b/libs/sysplugins/smarty_internal_compile_private_special_variable.php @@ -94,9 +94,9 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C break; } if (strpos($_index[ 1 ], '$') === false && strpos($_index[ 1 ], '\'') === false) { - return "@constant('{$_index[1]}')"; + return "defined('{$_index[1]}') ? constant('{$_index[1]}') : null"; } else { - return "@constant({$_index[1]})"; + return "defined({$_index[1]}) ? constant({$_index[1]}) : null"; } // no break case 'config': diff --git a/libs/sysplugins/smarty_internal_errorhandler.php b/libs/sysplugins/smarty_internal_errorhandler.php index 0ba00659..56dca18f 100644 --- a/libs/sysplugins/smarty_internal_errorhandler.php +++ b/libs/sysplugins/smarty_internal_errorhandler.php @@ -65,7 +65,7 @@ class Smarty_Internal_ErrorHandler * * @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; // add the SMARTY_DIR to the list of muted directories diff --git a/tests/Bootstrap.php b/tests/Bootstrap.php index b3e05a8c..ac4a4e6f 100644 --- a/tests/Bootstrap.php +++ b/tests/Bootstrap.php @@ -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\Warning', '\PHPUnit_Framework_Error_Warning'); class_alias('\PHPUnit\Framework\Error\Warning', '\PHPUnit_Framework_Error_Deprecated'); - class_alias('\PHPUnit\Util\Configuration', '\PHPUnit_Util_Configuration'); } require_once 'PHPUnit_Smarty.php'; diff --git a/tests/UnitTests/A_2/UndefinedTemplateVar/UndefinedTemplateVarTest.php b/tests/UnitTests/A_2/UndefinedTemplateVar/UndefinedTemplateVarTest.php index 8a564cbc..289e73e6 100644 --- a/tests/UnitTests/A_2/UndefinedTemplateVar/UndefinedTemplateVarTest.php +++ b/tests/UnitTests/A_2/UndefinedTemplateVar/UndefinedTemplateVarTest.php @@ -24,34 +24,37 @@ class UndefinedTemplateVarTest extends PHPUnit_Smarty $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(); - $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')); $e2 = error_reporting(); $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(); - $this->smarty->setErrorReporting(E_ALL & ~E_NOTICE); + $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE); $tpl = $this->smarty->createTemplate('001_main.tpl'); $this->assertEquals('undefined = ', $tpl->fetch()); $e2 = error_reporting(); $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(); - $this->smarty->setErrorReporting(E_ALL & ~E_NOTICE); + $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE); $tpl = $this->smarty->createTemplate('001_main.tpl'); $this->assertEquals('undefined = ', $this->smarty->fetch($tpl)); $e2 = error_reporting(); @@ -59,16 +62,31 @@ class UndefinedTemplateVarTest extends PHPUnit_Smarty } /** - * Throw E_NOTICE message - * - * @expectedException PHPUnit_Framework_Error_Notice - * @expectedExceptionMessage Undefined index: foo + * Throw Error message */ - public function testE_Notice() + public function testError() { - $e1 = error_reporting(); - $this->assertEquals('undefined = ', $this->smarty->fetch('001_main.tpl')); - $e2 = error_reporting(); - $this->assertEquals($e1, $e2); + $exceptionThrown = false; + + try { + $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); } } diff --git a/tests/UnitTests/A_Core/MuteExpectedErrors/MuteExpectedErrorsTest.php b/tests/UnitTests/A_Core/MuteExpectedErrors/MuteExpectedErrorsTest.php index 2c39bdfb..6fbb53c1 100644 --- a/tests/UnitTests/A_Core/MuteExpectedErrors/MuteExpectedErrorsTest.php +++ b/tests/UnitTests/A_Core/MuteExpectedErrors/MuteExpectedErrorsTest.php @@ -27,7 +27,7 @@ class MuteExpectedErrorsTest extends PHPUnit_Smarty { $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; } diff --git a/tests/UnitTests/ConfigFileTests/file/ConfigVarTest.php b/tests/UnitTests/ConfigFileTests/file/ConfigVarTest.php index 8a23ba3d..41faf101 100644 --- a/tests/UnitTests/ConfigFileTests/file/ConfigVarTest.php +++ b/tests/UnitTests/ConfigFileTests/file/ConfigVarTest.php @@ -403,7 +403,11 @@ class ConfigVarTest extends PHPUnit_Smarty $this->assertEquals("", $this->smarty->fetch('foo.tpl')); } 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()); + } } } } diff --git a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignBCTest.php b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignBCTest.php index eff71dee..48c104e9 100644 --- a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignBCTest.php +++ b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignBCTest.php @@ -33,7 +33,7 @@ class ClearAllAssignBCTest extends PHPUnit_Smarty 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->assertEquals('barblar', $this->smartyBC->fetch($this->_tplBC)); } diff --git a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php index 2b3b3cac..459e8557 100644 --- a/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php +++ b/tests/UnitTests/SmartyMethodsTests/ClearAllAssign/ClearAllAssignTest.php @@ -46,7 +46,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty */ 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->assertEquals('foobar', $this->smarty->fetch($this->_tpl)); } @@ -56,7 +56,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty */ 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->assertEquals('fooblar', $this->smarty->fetch($this->_tpl)); } @@ -66,7 +66,7 @@ class ClearAllAssignTest extends PHPUnit_Smarty */ 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->assertEquals('barblar', $this->smarty->fetch($this->_tpl)); } diff --git a/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignBCTest.php b/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignBCTest.php index 17a0ed5f..b9867627 100644 --- a/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignBCTest.php +++ b/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignBCTest.php @@ -33,14 +33,14 @@ class ClearAssignBCTest extends PHPUnit_Smarty } 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->assertEquals('foobar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}')); } 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->assertEquals('bar', $this->smartyBC->fetch('eval:{$foo}{$bar}{$blar}')); } diff --git a/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignTest.php b/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignTest.php index d47e9da6..2b466928 100644 --- a/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignTest.php +++ b/tests/UnitTests/SmartyMethodsTests/ClearAssign/ClearAssignTest.php @@ -36,7 +36,7 @@ class ClearAssignTest extends PHPUnit_Smarty */ 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->assertEquals('foobar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}')); } @@ -46,7 +46,7 @@ class ClearAssignTest extends PHPUnit_Smarty */ 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->assertEquals('bar', $this->smarty->fetch('eval:{$foo}{$bar}{$blar}')); } diff --git a/tests/UnitTests/TemplateSource/TagTests/Foreach/CompileForeachTest.php b/tests/UnitTests/TemplateSource/TagTests/Foreach/CompileForeachTest.php index 78a5214f..0630d6f8 100644 --- a/tests/UnitTests/TemplateSource/TagTests/Foreach/CompileForeachTest.php +++ b/tests/UnitTests/TemplateSource/TagTests/Foreach/CompileForeachTest.php @@ -44,7 +44,7 @@ class CompileForeachTest extends PHPUnit_Smarty $this->smarty->assign('foo', $foo); } else { // 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}"); diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlCheckboxesTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlCheckboxesTest.php index 3d28dc67..2e4d6e68 100644 --- a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlCheckboxesTest.php +++ b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlCheckboxesTest.php @@ -275,7 +275,7 @@ class PluginFunctionHtmlCheckboxesTest extends PHPUnit_Smarty 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; } diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlOptionsTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlOptionsTest.php index c5f7e6c9..d9182c4e 100644 --- a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlOptionsTest.php +++ b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlOptionsTest.php @@ -369,7 +369,7 @@ class PluginFunctionHtmlOptionsTest extends PHPUnit_Smarty 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; } diff --git a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlRadiosTest.php b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlRadiosTest.php index 0f5789b2..819d1049 100644 --- a/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlRadiosTest.php +++ b/tests/UnitTests/TemplateSource/TagTests/PluginFunction/PluginFunctionHtmlRadiosTest.php @@ -275,7 +275,7 @@ class PluginFunctionHtmlRadiosTest extends PHPUnit_Smarty 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; } diff --git a/tests/UnitTests/TemplateSource/ValueTests/ConstantTests/ConstantsTest.php b/tests/UnitTests/TemplateSource/ValueTests/ConstantTests/ConstantsTest.php index 3ab161b9..42f9df6f 100644 --- a/tests/UnitTests/TemplateSource/ValueTests/ConstantTests/ConstantsTest.php +++ b/tests/UnitTests/TemplateSource/ValueTests/ConstantTests/ConstantsTest.php @@ -78,11 +78,13 @@ class ConstantsTest extends PHPUnit_Smarty } public function testConstantsUndefined() { + $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE); $tpl = $this->smarty->createTemplate('string:{$smarty.const.MYCONSTANT2}'); $this->assertEquals("", $this->smarty->fetch($tpl)); } public function testConstantsUndefined2() { + $this->smarty->setErrorReporting(E_ALL & ~E_WARNING & ~E_NOTICE); $tpl = $this->smarty->createTemplate('eval:{$foo = MYCONSTANT2}{$foo}'); $this->assertEquals("MYCONSTANT2", $this->smarty->fetch($tpl)); }