674 lines
26 KiB
PHP
674 lines
26 KiB
PHP
<?php
|
|
/**
|
|
* Test suite for bugs declared in the PHP_CompatInfo class
|
|
*
|
|
* PHP version 5
|
|
*
|
|
* @category PHP
|
|
* @package PHP_CompatInfo
|
|
* @author Laurent Laville <pear@laurent-laville.org>
|
|
* @license http://www.opensource.org/licenses/bsd-license.php BSD
|
|
* @version CVS: $Id: PHP_CompatInfo_TestSuite_Bugs.php,v 1.23 2008/12/18 23:06:45 farell Exp $
|
|
* @link http://pear.php.net/package/PHP_CompatInfo
|
|
* @since File available since Release 1.6.0
|
|
*/
|
|
if (!defined("PHPUnit_MAIN_METHOD")) {
|
|
define("PHPUnit_MAIN_METHOD", "PHP_CompatInfo_TestSuite_Bugs::main");
|
|
}
|
|
|
|
require_once "PHPUnit/Framework/TestCase.php";
|
|
require_once "PHPUnit/Framework/TestSuite.php";
|
|
|
|
require_once 'PHP/CompatInfo.php';
|
|
|
|
/**
|
|
* Test suite class to test standard PHP_CompatInfo API.
|
|
*
|
|
* @category PHP
|
|
* @package PHP_CompatInfo
|
|
* @author Laurent Laville <pear@laurent-laville.org>
|
|
* @license http://www.opensource.org/licenses/bsd-license.php BSD
|
|
* @version Release: 1.9.0
|
|
* @link http://pear.php.net/package/PHP_CompatInfo
|
|
* @since File available since Release 1.6.0
|
|
*/
|
|
class PHP_CompatInfo_TestSuite_Bugs extends PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* A PCI object
|
|
* @var object
|
|
*/
|
|
protected $pci;
|
|
|
|
/**
|
|
* Filename where to write results of debug pci events notification
|
|
* @var string
|
|
* @since 1.8.0RC1
|
|
*/
|
|
private $destLogFile;
|
|
|
|
/**
|
|
* Runs the test methods of this class.
|
|
*
|
|
* @return void
|
|
*/
|
|
public static function main()
|
|
{
|
|
include_once "PHPUnit/TextUI/TestRunner.php";
|
|
|
|
$suite = new PHPUnit_Framework_TestSuite('PHP_CompatInfo Bugs Tests');
|
|
PHPUnit_TextUI_TestRunner::run($suite);
|
|
}
|
|
|
|
/**
|
|
* Sets up the fixture.
|
|
* This method is called before a test is executed.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function setUp()
|
|
{
|
|
$this->destLogFile = dirname(__FILE__) . DIRECTORY_SEPARATOR .
|
|
__CLASS__ . '.log';
|
|
|
|
$this->pci = new PHP_CompatInfo('null');
|
|
$this->pci->addListener(array(&$this, 'debugNotify'));
|
|
}
|
|
|
|
/**
|
|
* Tears down the fixture.
|
|
* This method is called after a test is executed.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function tearDown()
|
|
{
|
|
unset($this->pci);
|
|
}
|
|
|
|
/**
|
|
* PCI Events notification observer for debug purpose only
|
|
*
|
|
* @param object &$auditEvent Instance of Event_Notification object
|
|
*
|
|
* @return void
|
|
*/
|
|
public function debugNotify(&$auditEvent)
|
|
{
|
|
$notifyName = $auditEvent->getNotificationName();
|
|
$notifyInfo = $auditEvent->getNotificationInfo();
|
|
|
|
if ($notifyName == PHP_COMPATINFO_EVENT_AUDITSTARTED) {
|
|
$dbt = debug_backtrace();
|
|
error_log('backtrace: '. $dbt[7]['function'] . PHP_EOL,
|
|
3, $this->destLogFile);
|
|
error_log($notifyName.':'. PHP_EOL .
|
|
var_export($notifyInfo, true) . PHP_EOL,
|
|
3, $this->destLogFile);
|
|
|
|
} elseif ($notifyName == PHP_COMPATINFO_EVENT_AUDITFINISHED) {
|
|
error_log($notifyName.':'. PHP_EOL .
|
|
var_export($notifyInfo, true) . PHP_EOL,
|
|
3, $this->destLogFile);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retrieve files list to be ignore by parsing process
|
|
*
|
|
* @param string $dir Directory to parse
|
|
* @param array $options Parser options
|
|
*
|
|
* @return array
|
|
* @since version 1.8.0RC1
|
|
*/
|
|
private function getIgnoredFileList($dir, $options)
|
|
{
|
|
$files = $this->pci->parser->getFileList($dir, $options);
|
|
|
|
$ff = new File_Find();
|
|
$ff->dirsep = DIRECTORY_SEPARATOR;
|
|
list(, $allfiles) = $ff->maptree($dir);
|
|
|
|
$ignored_files = PHP_CompatInfo_Parser::_arrayDiff($allfiles, $files);
|
|
return $ignored_files;
|
|
}
|
|
|
|
/**
|
|
* Test if a dictionary for an Extension is available or not
|
|
*
|
|
* @param array $resources List of Extension dictionaries
|
|
* that should be present to perform a unit test
|
|
* @param array &$testSkipped Reasons of tests skipped
|
|
*
|
|
* @return bool
|
|
* @since version 1.9.0b2
|
|
*/
|
|
private function isResourceAvailable($resources, &$testSkipped)
|
|
{
|
|
$dict = array();
|
|
foreach ($resources as $ext) {
|
|
if (!isset($GLOBALS['_PHP_COMPATINFO_FUNC_'.strtoupper($ext)])) {
|
|
$dict[] = $ext;
|
|
}
|
|
}
|
|
if (count($dict) == 1) {
|
|
$testSkipped[] = 'The '. $dict[0] .
|
|
' function dictionary is not available.';
|
|
} elseif (count($dict) > 1) {
|
|
$testSkipped[] = 'The '. implode(',', $dict) .
|
|
' function dictionaries are not available.';
|
|
}
|
|
return (count($testSkipped) == 0);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #1626
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=1626
|
|
* Class calls are seen wrong
|
|
* @covers PHP_CompatInfo::parseString
|
|
* @group parseString
|
|
*/
|
|
public function testBug1626()
|
|
{
|
|
$str = '<?php
|
|
include("File.php");
|
|
File::write("test", "test");
|
|
?>';
|
|
$r = $this->pci->parseString($str);
|
|
$exp = array('ignored_files' => array(),
|
|
'ignored_functions' => array(),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.0.0',
|
|
'classes' => array(),
|
|
'functions' => array(),
|
|
'extensions' => array(),
|
|
'constants' => array(),
|
|
'tokens' => array(),
|
|
'cond_code' => array(0));
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #2771
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=2771
|
|
* Substr($var,4) not working for SAPI_ extensions
|
|
* @covers PHP_CompatInfo::parseString
|
|
* @group parseString
|
|
*/
|
|
public function testBug2771()
|
|
{
|
|
$str = '<?php
|
|
apache_request_headers();
|
|
apache_response_headers();
|
|
?>';
|
|
$r = $this->pci->parseString($str);
|
|
$exp = array('ignored_files' => array(),
|
|
'ignored_functions' => array(),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.3.0',
|
|
'classes' => array(),
|
|
'functions' => array('apache_request_headers',
|
|
'apache_response_headers'),
|
|
'extensions' => array(),
|
|
'constants' => array(),
|
|
'tokens' => array(),
|
|
'cond_code' => array(0));
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #7813
|
|
*
|
|
* Parse source file of PEAR_PackageUpdate 0.5.0
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=7813
|
|
* wrong PHP minimum version detection
|
|
* @covers PHP_CompatInfo::parseFile
|
|
* @group parseFile
|
|
*/
|
|
public function testBug7813()
|
|
{
|
|
$ds = DIRECTORY_SEPARATOR;
|
|
$fn = dirname(__FILE__) . $ds . 'parseFile' . $ds . 'PackageUpdate.php';
|
|
$opt = array('debug' => true,
|
|
'ignore_functions' => array('debug_backtrace'));
|
|
$r = $this->pci->parseFile($fn, $opt);
|
|
$exp = array('ignored_files' => array(),
|
|
'ignored_functions' => array('debug_backtrace'),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.3.0',
|
|
'classes' => array('PEAR_Config'),
|
|
'functions' => array('array_keys',
|
|
'array_shift',
|
|
'class_exists',
|
|
'count',
|
|
'debug_backtrace',
|
|
'define',
|
|
'explode',
|
|
'factory',
|
|
'fclose',
|
|
'file_exists',
|
|
'file_get_contents',
|
|
'fopen',
|
|
'function_exists',
|
|
'fwrite',
|
|
'get_class',
|
|
'get_include_path',
|
|
'getenv',
|
|
'is_array',
|
|
'is_int',
|
|
'is_readable',
|
|
'reset',
|
|
'serialize',
|
|
'settype',
|
|
'strlen',
|
|
'unserialize',
|
|
'version_compare'),
|
|
'extensions' => array(),
|
|
'constants' => array('DIRECTORY_SEPARATOR',
|
|
'E_COMPILE_ERROR',
|
|
'E_COMPILE_WARNING',
|
|
'E_CORE_ERROR',
|
|
'E_CORE_WARNING',
|
|
'E_ERROR',
|
|
'E_NOTICE',
|
|
'E_PARSE',
|
|
'E_USER_ERROR',
|
|
'E_USER_NOTICE',
|
|
'E_USER_WARNING',
|
|
'E_WARNING',
|
|
'FALSE',
|
|
'NULL',
|
|
'PATH_SEPARATOR',
|
|
'TRUE'),
|
|
'tokens' => array(),
|
|
'cond_code' => array(1, array(array('debug_backtrace'),
|
|
array(),
|
|
array())),
|
|
'4.0.0' =>
|
|
array(
|
|
0 =>
|
|
array(
|
|
'function' => 'define',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
1 =>
|
|
array (
|
|
'function' => 'get_class',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
2 =>
|
|
array (
|
|
'function' => 'function_exists',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
3 =>
|
|
array (
|
|
'function' => 'count',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
4 =>
|
|
array (
|
|
'function' => 'class_exists',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
5 =>
|
|
array (
|
|
'function' => 'explode',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
6 =>
|
|
array (
|
|
'function' => 'file_exists',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
7 =>
|
|
array (
|
|
'function' => 'is_readable',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
8 =>
|
|
array (
|
|
'function' => 'unserialize',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
9 =>
|
|
array (
|
|
'function' => 'strlen',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
10 =>
|
|
array (
|
|
'function' => 'getenv',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
11 =>
|
|
array (
|
|
'function' => 'reset',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
12 =>
|
|
array (
|
|
'function' => 'array_keys',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
13 =>
|
|
array (
|
|
'function' => 'fopen',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
14 =>
|
|
array (
|
|
'function' => 'serialize',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
15 =>
|
|
array (
|
|
'function' => 'fwrite',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
16 =>
|
|
array (
|
|
'function' => 'fclose',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
17 =>
|
|
array (
|
|
'function' => 'settype',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
18 =>
|
|
array (
|
|
'function' => 'is_int',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
),
|
|
19 =>
|
|
array (
|
|
'function' => 'is_array',
|
|
'extension' => false,
|
|
'pecl' => false,
|
|
),
|
|
20 =>
|
|
array (
|
|
'function' => 'array_shift',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
)
|
|
),
|
|
'4.0.7' =>
|
|
array (
|
|
0 =>
|
|
array (
|
|
'function' => 'version_compare',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
)
|
|
),
|
|
'4.3.0' =>
|
|
array (
|
|
0 =>
|
|
array (
|
|
'function' => 'get_include_path',
|
|
'extension' => false,
|
|
'pecl' => false,
|
|
),
|
|
1 =>
|
|
array (
|
|
'function' => 'file_get_contents',
|
|
'extension' => false,
|
|
'pecl' => false
|
|
)
|
|
));
|
|
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #8559
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=8559
|
|
* PHP_CompatInfo fails to scan if it finds empty file in path
|
|
* @covers PHP_CompatInfo::parseDir
|
|
* @group parseDir
|
|
*/
|
|
public function testBug8559()
|
|
{
|
|
$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'emptyDir';
|
|
$r = $this->pci->parseDir($dir);
|
|
$this->assertFalse($r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #10100
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=10100
|
|
* Wrong parsing of possible attributes in strings
|
|
* @covers PHP_CompatInfo::parseString
|
|
* @group parseString
|
|
* @group bugs
|
|
*/
|
|
public function testBug10100()
|
|
{
|
|
$str = '<?php
|
|
$test = "public$link";
|
|
?>';
|
|
$r = $this->pci->parseString($str);
|
|
$exp = array('ignored_files' => array(),
|
|
'ignored_functions' => array(),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.0.0',
|
|
'classes' => array(),
|
|
'functions' => array(),
|
|
'extensions' => array(),
|
|
'constants' => array(),
|
|
'tokens' => array(),
|
|
'cond_code' => array(0));
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #13873
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=13873
|
|
* PHP_CompatInfo fails to scan conditional code
|
|
* if it finds other than encapsed string
|
|
* @covers PHP_CompatInfo::parseFolder
|
|
* @group parseDir
|
|
* @group bugs
|
|
*/
|
|
public function testBug13873()
|
|
{
|
|
$resources = array('date', 'pcre');
|
|
$testSkipped = array();
|
|
if (!$this->isResourceAvailable($resources, $testSkipped)) {
|
|
foreach ($testSkipped as $reason) {
|
|
$this->markTestSkipped($reason);
|
|
}
|
|
}
|
|
|
|
$ds = DIRECTORY_SEPARATOR;
|
|
$dir = dirname(__FILE__) . $ds . 'beehiveforum082' . $ds . 'forum';
|
|
$opt = array();
|
|
$r = $this->pci->parseFolder($dir, $opt);
|
|
$exp = array('ignored_files' => $this->getIgnoredFileList($dir, $opt),
|
|
'ignored_functions' => array(),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.0.6',
|
|
'classes' => array(),
|
|
'functions' => array('_htmlentities',
|
|
'_stripslashes',
|
|
'array_map',
|
|
'array_merge',
|
|
'basename',
|
|
'bh_session_check_perm',
|
|
'bh_session_get_value',
|
|
'bh_setcookie',
|
|
'db_affected_rows',
|
|
'db_connect',
|
|
'db_escape_string',
|
|
'db_fetch_array',
|
|
'db_insert_id',
|
|
'db_num_rows',
|
|
'db_query',
|
|
'db_trigger_error',
|
|
'defined',
|
|
'delete_attachment_by_aid',
|
|
'explode',
|
|
'fclose',
|
|
'file_exists',
|
|
'filesize',
|
|
'fix_html',
|
|
'floor',
|
|
'folder_get_available_by_forum',
|
|
'fopen',
|
|
'form_checkbox',
|
|
'form_input_hidden',
|
|
'form_input_password',
|
|
'form_submit',
|
|
'forum_apply_user_permissions',
|
|
'forum_check_global_setting_name',
|
|
'forum_check_password',
|
|
'forum_check_setting_name',
|
|
'forum_closed_message',
|
|
'forum_delete',
|
|
'forum_delete_tables',
|
|
'forum_get_all_prefixes',
|
|
'forum_get_global_settings',
|
|
'forum_get_password',
|
|
'forum_get_saved_password',
|
|
'forum_get_setting',
|
|
'forum_get_settings_by_fid',
|
|
'forum_process_unread_cutoff',
|
|
'forum_restricted_message',
|
|
'forum_search',
|
|
'forum_start_page_get_html',
|
|
'fread',
|
|
'function_exists',
|
|
'fwrite',
|
|
'get_forum_data',
|
|
'get_request_uri',
|
|
'get_table_prefix',
|
|
'get_webtag',
|
|
'header',
|
|
'html_display_error_msg',
|
|
'html_display_warning_msg',
|
|
'html_draw_bottom',
|
|
'html_draw_top',
|
|
'html_get_top_frame_name',
|
|
'implode',
|
|
'in_array',
|
|
'install_get_table_conflicts',
|
|
'intval',
|
|
'is_array',
|
|
'is_dir',
|
|
'is_md5',
|
|
'is_null',
|
|
'is_numeric',
|
|
'load_language_file',
|
|
'md5',
|
|
'mkdir',
|
|
'mt_rand',
|
|
'ob_end_clean',
|
|
'ob_get_contents',
|
|
'ob_start',
|
|
'perm_group_get_users',
|
|
'preg_match',
|
|
'sizeof',
|
|
'sprintf',
|
|
'str_replace',
|
|
'stristr',
|
|
'strlen',
|
|
'strtoupper',
|
|
'time',
|
|
'trim',
|
|
'user_get_logon',
|
|
'word_filter_rem_ob_tags'),
|
|
'extensions' => array('date', 'pcre'),
|
|
'constants' => array('FALSE',
|
|
'TRUE',
|
|
'__FILE__'),
|
|
'tokens' => array(),
|
|
'cond_code' => array(4)
|
|
);
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
|
|
/**
|
|
* Regression test for bug #14696
|
|
*
|
|
* @return void
|
|
* @link http://pear.php.net/bugs/bug.php?id=14696
|
|
* PHP_CompatInfo fails to scan code line when not ended with ;
|
|
* @covers PHP_CompatInfo::parseFile
|
|
* @group parseFile
|
|
* @group bugs
|
|
*/
|
|
public function testBug14696()
|
|
{
|
|
$ds = DIRECTORY_SEPARATOR;
|
|
$fn = dirname(__FILE__) . $ds . 'kohana22'
|
|
. $ds . 'modules' . $ds . 'gmaps'
|
|
. $ds . 'javascript.php';
|
|
|
|
$r = $this->pci->parseFile($fn);
|
|
$exp = array('ignored_files' => array(),
|
|
'ignored_functions' => array(),
|
|
'ignored_extensions' => array(),
|
|
'ignored_constants' => array(),
|
|
'max_version' => '',
|
|
'version' => '4.0.0',
|
|
'classes' => array(),
|
|
'functions' => array('substr'),
|
|
'extensions' => array(),
|
|
'constants' => array(),
|
|
'tokens' => array(),
|
|
'cond_code' => array(0)
|
|
);
|
|
|
|
$this->assertSame($exp, $r);
|
|
}
|
|
}
|
|
|
|
// Call PHP_CompatInfo_TestSuite_Bugs::main() if file is executed directly.
|
|
if (PHPUnit_MAIN_METHOD == "PHP_CompatInfo_TestSuite_Bugs::main") {
|
|
PHP_CompatInfo_TestSuite_Bugs::main();
|
|
}
|
|
?>
|