2000-08-28 03:46:06 +08:00
< ? php
2000-08-29 17:12:44 +08:00
/*
+----------------------------------------------------------------------+
2001-12-11 23:32:16 +08:00
| PHP Version 4 |
2000-08-29 17:12:44 +08:00
+----------------------------------------------------------------------+
2001-12-11 23:32:16 +08:00
| Copyright ( c ) 1997 - 2002 The PHP Group |
2000-08-29 17:12:44 +08:00
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license , |
| that is bundled with this package in the file LICENSE , and is |
| available at through the world - wide - web at |
| http :// www . php . net / license / 2_02 . txt . |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ php . net so we can mail you a copy immediately . |
+----------------------------------------------------------------------+
2002-10-13 03:29:56 +08:00
| Authors : Ilia Alshanetsky < ilia @ php . net > |
| Preston L . Bannister < pbannister @ php . net > |
2002-09-12 03:42:59 +08:00
| Marcus Boerger < helly @ php . net > |
2002-10-13 03:29:56 +08:00
| Derick Rethans < derick @ php . net > |
| Sander Roobol < sander @ php . net > |
2002-05-17 05:48:28 +08:00
| ( based on version by : Stig Bakken < ssb @ fast . no > ) |
2000-08-29 17:12:44 +08:00
| ( based on the PHP 3 test framework by Rasmus Lerdorf ) |
+----------------------------------------------------------------------+
*/
2002-05-17 05:48:28 +08:00
/*
2002-10-08 11:00:06 +08:00
Require exact specification of PHP executable to test ( no guessing ! ) .
Die if any internal errors encountered in test script .
Regularized output for simpler post - processing of output .
Optionally output error lines indicating the failing test source and log
for direct jump with MSVC or Emacs .
2002-05-17 05:48:28 +08:00
*/
2000-12-08 08:21:09 +08:00
/*
* TODO :
2001-03-21 14:04:36 +08:00
* - do not test PEAR components if base class and / or component class cannot be instanciated
2000-12-08 08:21:09 +08:00
*/
2002-10-23 02:53:56 +08:00
// change into the PHP source directory.
if ( getenv ( 'TEST_PHP_SRCDIR' )) {
@ chdir ( getenv ( 'TEST_PHP_SRCDIR' ));
}
2002-10-08 11:00:06 +08:00
$cwd = getcwd ();
2002-05-17 05:48:28 +08:00
set_time_limit ( 0 );
ob_implicit_flush ();
2002-05-19 21:16:03 +08:00
error_reporting ( E_ALL );
2002-05-17 05:48:28 +08:00
2002-05-08 15:23:54 +08:00
if ( ini_get ( 'safe_mode' )) {
2002-10-08 11:00:06 +08:00
echo <<< SAFE_MODE_WARNING
2002-05-08 15:23:54 +08:00
+-----------------------------------------------------------+
| ! WARNING ! |
| You are running the test - suite with " safe_mode " ENABLED ! |
| |
| Chances are high that no test will work at all , |
| depending on how you configured " safe_mode " ! |
+-----------------------------------------------------------+
SAFE_MODE_WARNING ;
}
2002-05-17 05:48:28 +08:00
// Don't ever guess at the PHP executable location.
// Require the explicit specification.
// Otherwise we could end up testing the wrong file!
2002-05-08 15:23:54 +08:00
2002-10-08 16:39:10 +08:00
if ( getenv ( 'TEST_PHP_EXECUTABLE' )) {
$php = getenv ( 'TEST_PHP_EXECUTABLE' );
2002-05-19 21:16:03 +08:00
} else {
error ( " environment variable TEST_PHP_EXECUTABLE must be set to specify PHP executable! " );
}
2000-08-28 03:46:06 +08:00
2002-10-08 16:39:10 +08:00
if ( getenv ( 'TEST_PHP_LOG_FORMAT' )) {
$log_format = strtoupper ( getenv ( 'TEST_PHP_LOG_FORMAT' ));
2002-08-27 07:26:46 +08:00
} else {
$log_format = 'LEOD' ;
}
2002-10-07 23:16:47 +08:00
if ( function_exists ( 'is_executable' ) && !@ is_executable ( $php )) {
2002-05-19 21:16:03 +08:00
error ( " invalid PHP executable specified by TEST_PHP_EXECUTABLE = " . $php );
}
2000-08-28 03:46:06 +08:00
2002-05-17 05:48:28 +08:00
// Check whether a detailed log is wanted.
2002-10-08 16:39:10 +08:00
if ( getenv ( 'TEST_PHP_DETAILED' )) {
define ( 'DETAILED' , getenv ( 'TEST_PHP_DETAILED' ));
2002-05-19 21:24:38 +08:00
} else {
define ( 'DETAILED' , 0 );
}
2001-10-23 19:11:29 +08:00
2002-10-14 15:18:23 +08:00
// Check whether user test dirs are requested.
if ( getenv ( 'TEST_PHP_USER' )) {
$user_tests = explode ( ',' , getenv ( 'TEST_PHP_USER' ));
} else {
2002-10-14 17:32:36 +08:00
$user_tests = array ();
2002-10-14 15:18:23 +08:00
}
2002-05-17 05:48:28 +08:00
// Write test context information.
2000-08-28 03:46:06 +08:00
2002-05-17 05:48:28 +08:00
echo "
=====================================================================
2002-10-08 11:00:06 +08:00
CWD : $cwd
2002-05-17 05:48:28 +08:00
PHP : $php
PHP_SAPI : " . PHP_SAPI . "
PHP_VERSION : " . PHP_VERSION . "
PHP_OS : " . PHP_OS . "
2002-05-19 22:48:27 +08:00
INI actual : " . realpath(get_cfg_var('cfg_file_path')) . "
2002-10-07 01:04:10 +08:00
More . INIs : " . str_replace( " \n " , " " , php_ini_scanned_files()) . "
2002-10-14 15:18:23 +08:00
Extra dirs : " ;
foreach ( $user_tests as $test_dir ) {
echo " { $test_dir } \n " ;
}
echo "
2002-05-17 05:48:28 +08:00
=====================================================================
" ;
2000-08-28 03:46:06 +08:00
2002-05-17 05:48:28 +08:00
// Determine the tests to be run.
2001-03-21 14:04:36 +08:00
2002-05-17 05:48:28 +08:00
$test_to_run = array ();
$test_files = array ();
$test_results = array ();
2002-10-13 03:29:56 +08:00
$GLOBALS [ '__PHP_FAILED_TESTS__' ] = array ();
2001-03-21 14:04:36 +08:00
2002-05-19 21:16:03 +08:00
// If parameters given assume they represent selected tests to run.
2002-10-02 09:52:25 +08:00
if ( isset ( $argc ) && $argc > 1 ) {
2002-05-19 21:16:03 +08:00
for ( $i = 1 ; $i < $argc ; $i ++ ) {
$testfile = realpath ( $argv [ $i ]);
$test_to_run [ $testfile ] = 1 ;
}
2002-10-02 09:52:25 +08:00
// Run selected tests.
if ( count ( $test_to_run )) {
echo " Running selected tests. \n " ;
foreach ( $test_to_run AS $name => $runnable ) {
2002-10-11 00:08:15 +08:00
if ( ! preg_match ( " / \ .phpt $ / " , $name ))
continue ;
2002-10-02 09:52:25 +08:00
if ( $runnable ) {
$test_results [ $name ] = run_test ( $php , $name );
}
}
exit ( 0 );
}
2001-08-28 00:39:49 +08:00
}
2002-05-17 05:48:28 +08:00
// Compile a list of all test files (*.phpt).
2002-10-02 09:52:25 +08:00
$test_files = array ();
$exts_to_test = get_loaded_extensions ();
2002-10-05 05:19:51 +08:00
$exts_tested = count ( $exts_to_test );
$exts_skipped = 0 ;
$ignored_by_ext = 0 ;
2002-10-02 09:52:25 +08:00
sort ( $exts_to_test );
2002-10-05 05:19:51 +08:00
$test_dirs = array ( 'tests' , 'pear' , 'ext' );
2002-10-02 09:52:25 +08:00
2002-10-05 05:19:51 +08:00
foreach ( $test_dirs as $dir ) {
2002-10-08 11:00:06 +08:00
find_files ( " { $cwd } / { $dir } " , ( $dir == 'ext' ));
2002-10-02 09:52:25 +08:00
}
2002-10-14 15:18:23 +08:00
foreach ( $user_tests as $dir ) {
find_files ( " { $dir } " , ( $dir == 'ext' ));
}
2002-10-08 11:00:06 +08:00
function find_files ( $dir , $is_ext_dir = FALSE , $ignore = FALSE )
2002-10-02 09:52:25 +08:00
{
2002-10-05 05:19:51 +08:00
global $test_files , $exts_to_test , $ignored_by_ext , $exts_skipped , $exts_tested ;
2002-05-19 21:16:03 +08:00
$o = opendir ( $dir ) or error ( " cannot open directory: $dir " );
2002-10-08 11:00:06 +08:00
while (( $name = readdir ( $o )) !== FALSE ) {
2002-05-19 21:16:03 +08:00
if ( is_dir ( " { $dir } / { $name } " ) && ! in_array ( $name , array ( '.' , '..' , 'CVS' ))) {
2002-10-05 05:19:51 +08:00
$skip_ext = ( $is_ext_dir && ! in_array ( $name , $exts_to_test ));
if ( $skip_ext ) {
$exts_skipped ++ ;
}
2002-10-08 11:00:06 +08:00
find_files ( " { $dir } / { $name } " , FALSE , $ignore || $skip_ext );
}
2002-05-19 21:16:03 +08:00
// Cleanup any left-over tmp files from last run.
2002-10-02 09:52:25 +08:00
if ( substr ( $name , - 4 ) == '.tmp' ) {
2002-05-19 21:16:03 +08:00
@ unlink ( " $dir / $name " );
continue ;
}
// Otherwise we're only interested in *.phpt files.
2002-10-02 09:52:25 +08:00
if ( substr ( $name , - 5 ) == '.phpt' ) {
2002-10-05 05:19:51 +08:00
if ( $ignore ) {
$ignored_by_ext ++ ;
} else {
$testfile = realpath ( " { $dir } / { $name } " );
$test_files [] = $testfile ;
}
2002-05-19 21:16:03 +08:00
}
}
closedir ( $o );
2002-05-17 05:48:28 +08:00
}
2001-05-03 00:39:04 +08:00
2002-05-19 21:16:03 +08:00
sort ( $test_files );
2000-08-28 03:46:06 +08:00
2002-05-19 21:16:03 +08:00
$start_time = time ();
2000-08-28 03:46:06 +08:00
2002-05-19 21:16:03 +08:00
echo " TIME START " . date ( 'Y-m-d H:i:s' , $start_time ) . "
2002-05-17 05:48:28 +08:00
=====================================================================
2002-05-19 21:16:03 +08:00
" ;
2001-05-03 00:39:04 +08:00
2002-05-17 05:48:28 +08:00
foreach ( $test_files as $name ) {
2002-10-08 11:00:06 +08:00
$test_results [ $name ] = run_test ( $php , $name );
2000-08-28 03:46:06 +08:00
}
2002-05-19 21:16:03 +08:00
$end_time = time ();
2001-05-03 00:39:04 +08:00
2002-05-17 05:48:28 +08:00
// Summarize results
2001-03-21 14:04:36 +08:00
2002-05-17 05:48:28 +08:00
if ( 0 == count ( $test_results )) {
2002-10-08 11:00:06 +08:00
echo " No tests were run. \n " ;
return ;
2000-08-28 03:46:06 +08:00
}
2002-05-17 05:48:28 +08:00
$n_total = count ( $test_results );
2002-10-05 05:19:51 +08:00
$n_total += $ignored_by_ext ;
2002-05-19 21:16:03 +08:00
$sum_results = array ( 'PASSED' => 0 , 'SKIPPED' => 0 , 'FAILED' => 0 );
2002-05-17 05:48:28 +08:00
foreach ( $test_results as $v ) {
2002-10-08 11:00:06 +08:00
$sum_results [ $v ] ++ ;
2000-08-28 03:46:06 +08:00
}
2002-10-05 05:19:51 +08:00
$sum_results [ 'SKIPPED' ] += $ignored_by_ext ;
2002-05-17 05:48:28 +08:00
$percent_results = array ();
while ( list ( $v , $n ) = each ( $sum_results )) {
2002-10-08 11:00:06 +08:00
$percent_results [ $v ] = ( 100.0 * $n ) / $n_total ;
2000-08-28 03:46:06 +08:00
}
2002-05-17 05:48:28 +08:00
echo "
=====================================================================
2002-05-19 21:16:03 +08:00
TIME END " . date('Y-m-d H:i:s', $end_time ) . "
2002-05-17 05:48:28 +08:00
=====================================================================
2002-05-19 21:16:03 +08:00
TEST RESULT SUMMARY
---------------------------------------------------------------------
2002-10-05 05:19:51 +08:00
Exts skipped : " . sprintf( " % 4 d " , $exts_skipped ) . "
Exts tested : " . sprintf( " % 4 d " , $exts_tested ) . "
---------------------------------------------------------------------
2002-05-17 05:48:28 +08:00
Number of tests : " . sprintf( " % 4 d " , $n_total ) . "
Tests skipped : " . sprintf( " % 4 d ( % 2.1 f %% ) " , $sum_results['SKIPPED'] , $percent_results['SKIPPED'] ) . "
Tests failed : " . sprintf( " % 4 d ( % 2.1 f %% ) " , $sum_results['FAILED'] , $percent_results['FAILED'] ) . "
Tests passed : " . sprintf( " % 4 d ( % 2.1 f %% ) " , $sum_results['PASSED'] , $percent_results['PASSED'] ) . "
2002-10-05 05:19:51 +08:00
---------------------------------------------------------------------
2002-05-19 21:16:03 +08:00
Time taken : " . sprintf( " % 4 d seconds " , $end_time - $start_time ) . "
2002-05-17 05:48:28 +08:00
=====================================================================
" ;
2002-10-13 03:29:56 +08:00
define ( 'PHP_QA_EMAIL' , 'php-qa@lists.php.net' );
define ( 'QA_SUBMISSION_PAGE' , 'http://qa.php.net/buildtest-process.php' );
/* We got failed Tests, offer the user to send and e-mail to QA team */
if ( $sum_results [ 'FAILED' ]) {
$fp = fopen ( " php://stdin " , " r+ " );
fwrite ( $fp , " Some tests have failed, would you like to send the \n report to PHP's QA team? [Yn]: " );
fflush ( $fp );
$user_input = fgets ( $fp , 10 );
if ( strlen ( trim ( $user_input )) == 0 || strtolower ( $user_input [ 0 ]) == 'y' ) {
/*
* Collect information about the host system for our report
* Fetch phpinfo () output so that we can see the PHP enviroment
* Make an archive of all the failed tests
* Send an email
*/
$failed_tests_data = '' ;
$sep = " \n " . str_repeat ( '=' , 80 ) . " \n " ;
$failed_tests_data .= " Automake: \n " . shell_exec ( 'automake --version' ) . " \n " ;
$failed_tests_data .= " Autoconf: \n " . shell_exec ( 'autoconf --version' ) . " \n " ;
$failed_tests_data .= " Libtool: \n " . shell_exec ( 'libtool --version' ) . " \n " ;
$failed_tests_data .= " Bison: \n " . shell_exec ( 'bison --version' ) . " \n " ;
2002-10-23 16:51:17 +08:00
$failed_tests_data .= " Compiler: \n " . shell_exec ( 'cc -v' ) . " \n " ;
2002-10-13 03:29:56 +08:00
$failed_tests_data .= " \n \n " ;
foreach ( $GLOBALS [ '__PHP_FAILED_TESTS__' ] as $test_info ) {
$failed_tests_data .= $sep . $test_info [ 'name' ];
$failed_tests_data .= $sep . file_get_contents ( realpath ( $test_info [ 'output' ]));
$failed_tests_data .= $sep . file_get_contents ( realpath ( $test_info [ 'diff' ]));
$failed_tests_data .= $sep . " \n \n " ;
}
$failed_tests_data .= $sep . " PHPINFO " . $sep ;
$failed_tests_data .= shell_exec ( $php . ' -i' );
$compression = 0 ;
if ( ! mail_qa_team ( $failed_tests_data , $compression )) {
$output_file = 'php_test_results_' . date ( 'Ymd' ) . ( $compression ? '.txt.gz' : '.txt' );
$fp = fopen ( $output_file , " w " );
fwrite ( $fp , $failed_tests_data );
fclose ( $fp );
echo " \n The test script was unable to automatically send the report to PHP's QA Team \n Please send " . $output_file . " to " . PHP_QA_EMAIL . " manually, thank you. \n " ;
} else {
fwrite ( $fp , " \n Thank you for helping to make PHP better. \n " );
fclose ( $fp );
}
}
}
//
// Send Email to QA Team
//
function mail_qa_team ( $data , $compression )
{
$url_bits = parse_url ( QA_SUBMISSION_PAGE );
if ( empty ( $url_bits [ 'port' ])) $url_bits [ 'port' ] = 80 ;
2002-10-16 00:46:57 +08:00
$data = " php_test_data= " . urlencode ( base64_encode ( preg_replace ( " /[ \\ x00]/ " , " [0x0] " , $data )));
2002-10-13 03:29:56 +08:00
$data_length = strlen ( $data );
$fs = fsockopen ( $url_bits [ 'host' ], $url_bits [ 'port' ], $errno , $errstr , 10 );
if ( ! $fs ) {
return FALSE ;
}
echo " Posting to { $url_bits [ 'host' ] } { $url_bits [ 'path' ] } \n " ;
fwrite ( $fs , " POST " . $url_bits [ 'path' ] . " HTTP/1.1 \r \n " );
fwrite ( $fs , " Host: " . $url_bits [ 'host' ] . " \r \n " );
fwrite ( $fs , " User-Agent: QA Browser 0.1 \r \n " );
fwrite ( $fs , " Content-Type: application/x-www-form-urlencoded \r \n " );
fwrite ( $fs , " Content-Length: " . $data_length . " \r \n \r \n " );
2002-10-16 00:46:57 +08:00
fwrite ( $fs , $data );
2002-10-13 03:29:56 +08:00
fwrite ( $fs , " \r \n \r \n " );
fclose ( $fs );
return 1 ;
}
2002-05-17 05:48:28 +08:00
//
// Write the given text to a temporary file, and return the filename.
//
2002-10-02 09:52:25 +08:00
function save_text ( $filename , $text )
{
2002-10-08 11:00:06 +08:00
$fp = @ fopen ( $filename , 'w' ) or error ( " Cannot open file ' " . $filename . " ' (save_text) " );
fwrite ( $fp , $text );
fclose ( $fp );
if ( 1 < DETAILED ) echo "
2002-05-17 05:48:28 +08:00
FILE $filename {{{
$text
}}}
" ;
}
2001-05-03 00:39:04 +08:00
2002-05-17 05:48:28 +08:00
//
// Write an error in a format recognizable to Emacs or MSVC.
//
2001-05-03 00:39:04 +08:00
2002-05-17 05:48:28 +08:00
function error_report ( $testname , $logname , $tested )
{
2002-10-08 11:00:06 +08:00
$testname = realpath ( $testname );
$logname = realpath ( $logname );
switch ( strtoupper ( getenv ( 'TEST_PHP_ERROR_STYLE' ))) {
case 'MSVC' :
echo $testname . " (1) : $tested\n " ;
echo $logname . " (1) : $tested\n " ;
break ;
case 'EMACS' :
echo $testname . " :1: $tested\n " ;
echo $logname . " :1: $tested\n " ;
break ;
}
2000-08-28 03:46:06 +08:00
}
2002-05-17 05:48:28 +08:00
//
// Run an individual test case.
//
2000-08-28 03:46:06 +08:00
2002-05-17 05:48:28 +08:00
function run_test ( $php , $file )
{
2002-08-27 07:26:46 +08:00
global $log_format ;
2002-10-08 11:00:06 +08:00
if ( DETAILED ) echo "
2002-05-17 05:48:28 +08:00
=================
TEST $file
" ;
2002-10-08 11:00:06 +08:00
// Load the sections of the test file.
$section_text = array (
'TEST' => '(unnamed test)' ,
'SKIPIF' => '' ,
'GET' => '' ,
'ARGS' => '' ,
);
$fp = @ fopen ( $file , " r " ) or error ( " Cannot open test file: $file " );
$section = '' ;
while ( ! feof ( $fp )) {
$line = fgets ( $fp );
// Match the beginning of a section.
if ( ereg ( '^--([A-Z]+)--' , $line , $r )) {
$section = $r [ 1 ];
$section_text [ $section ] = '' ;
continue ;
}
// Add to the section text.
$section_text [ $section ] .= $line ;
}
fclose ( $fp );
2002-10-08 16:53:51 +08:00
$shortname = str_replace ( $GLOBALS [ 'cwd' ] . '/' , '' , $file );
$tested = trim ( $section_text [ 'TEST' ]) . " [ $shortname ] " ;
2002-10-08 11:00:06 +08:00
$tmp = realpath ( dirname ( $file ));
$tmp_skipif = $tmp . uniqid ( '/phpt.' );
2002-10-22 16:54:23 +08:00
$tmp_file = ereg_replace ( '\.phpt$' , '.php' , $file );
2002-10-08 11:00:06 +08:00
$tmp_post = $tmp . uniqid ( '/phpt.' );
2002-05-19 21:16:03 +08:00
@ unlink ( $tmp_skipif );
@ unlink ( $tmp_file );
@ unlink ( $tmp_post );
2002-10-08 11:00:06 +08:00
2002-10-22 16:54:23 +08:00
// unlink old test results
@ unlink ( ereg_replace ( '\.phpt$' , '.diff' , $file ));
@ unlink ( ereg_replace ( '\.phpt$' , '.log' , $file ));
@ unlink ( ereg_replace ( '\.phpt$' , '.exp' , $file ));
@ unlink ( ereg_replace ( '\.phpt$' , '.out' , $file ));
2002-10-08 11:00:06 +08:00
2002-10-22 16:54:23 +08:00
// Reset environment from any previous test.
2002-10-08 11:00:06 +08:00
putenv ( " REDIRECT_STATUS= " );
putenv ( " QUERY_STRING= " );
putenv ( " PATH_TRANSLATED= " );
putenv ( " SCRIPT_FILENAME= " );
putenv ( " REQUEST_METHOD= " );
putenv ( " CONTENT_TYPE= " );
putenv ( " CONTENT_LENGTH= " );
2002-10-03 06:31:37 +08:00
// Check if test should be skipped.
2002-08-03 19:44:12 +08:00
if ( array_key_exists ( 'SKIPIF' , $section_text )) {
2002-10-08 11:00:06 +08:00
if ( trim ( $section_text [ 'SKIPIF' ])) {
2002-08-03 19:44:12 +08:00
save_text ( $tmp_skipif , $section_text [ 'SKIPIF' ]);
$output = `$php $tmp_skipif` ;
@ unlink ( $tmp_skipif );
2002-10-21 16:52:45 +08:00
if ( ereg ( " ^skip " , trim ( $output ))){
2002-10-21 17:04:56 +08:00
echo " SKIP $tested " ;
2002-10-21 18:23:31 +08:00
$reason = ( ereg ( " ^skip[[:space:]]*(.+) \$ " , trim ( $output ))) ? ereg_replace ( " ^skip[[:space:]]*(.+) \$ " , " \\ 1 " , trim ( $output )) : FALSE ;
2002-10-21 16:55:49 +08:00
if ( $reason ) {
2002-10-21 17:04:56 +08:00
echo " (reason: $reason ) \n " ;
} else {
echo " \n " ;
2002-10-21 16:55:49 +08:00
}
2002-08-03 19:44:12 +08:00
return 'SKIPPED' ;
}
2002-05-19 21:16:03 +08:00
}
}
2002-08-03 19:44:12 +08:00
2002-10-13 03:29:56 +08:00
// Default ini settings
$settings = array (
" -d 'open_basedir=' " ,
" -d 'disable_functions=' " ,
" -d 'error_reporting=2047' " ,
" -d 'display_errors=1' " ,
" -d 'html_errors=0' " ,
" -d 'docref_root=/phpmanual/' " ,
" -d 'docref_ext=.html' " ,
" -d 'error_prepend_string=' " ,
" -d 'error_append_string=' " ,
" -d 'auto_append_file=' " ,
" -d 'auto_prepend_file=' " ,
);
$ini_settings = ' ' . join ( ' ' , $settings );
2002-10-08 11:00:06 +08:00
// Any special ini settings
2002-08-03 19:44:12 +08:00
if ( array_key_exists ( 'INI' , $section_text )) {
2002-10-08 11:00:06 +08:00
foreach ( preg_split ( " /[ \n \r ]+/ " , $section_text [ 'INI' ]) as $setting ) {
if ( strlen ( $setting )) {
2002-08-03 19:44:12 +08:00
$ini_settings .= " -d ' $setting ' " ;
2002-10-08 11:00:06 +08:00
}
}
2002-08-03 19:44:12 +08:00
}
2002-10-08 11:00:06 +08:00
// We've satisfied the preconditions - run the test!
save_text ( $tmp_file , $section_text [ 'FILE' ]);
if ( array_key_exists ( 'GET' , $section_text )) {
$query_string = trim ( $section_text [ 'GET' ]);
} else {
2002-08-03 19:44:12 +08:00
$query_string = '' ;
2002-10-08 11:00:06 +08:00
}
2002-05-17 05:48:28 +08:00
2002-10-08 11:00:06 +08:00
putenv ( " REDIRECT_STATUS=1 " );
putenv ( " QUERY_STRING= $query_string " );
putenv ( " PATH_TRANSLATED= $tmp_file " );
putenv ( " SCRIPT_FILENAME= $tmp_file " );
$args = $section_text [ 'ARGS' ] ? ' -- ' . $section_text [ 'ARGS' ] : '' ;
if ( array_key_exists ( 'POST' , $section_text ) && ! empty ( $section_text [ 'POST' ])) {
$post = trim ( $section_text [ 'POST' ]);
save_text ( $tmp_post , $post );
$content_length = strlen ( $post );
putenv ( " REQUEST_METHOD=POST " );
putenv ( " CONTENT_TYPE=application/x-www-form-urlencoded " );
putenv ( " CONTENT_LENGTH= $content_length " );
$cmd = " $php $ini_settings -f $tmp_file 2>&1 < $tmp_post " ;
} else {
putenv ( " REQUEST_METHOD=GET " );
putenv ( " CONTENT_TYPE= " );
putenv ( " CONTENT_LENGTH= " );
$cmd = " $php $ini_settings -f $tmp_file $args 2>&1 " ;
}
if ( DETAILED ) echo "
2002-05-17 05:48:28 +08:00
CONTENT_LENGTH = " . getenv( " CONTENT_LENGTH " ) . "
CONTENT_TYPE = " . getenv( " CONTENT_TYPE " ) . "
PATH_TRANSLATED = " . getenv( " PATH_TRANSLATED " ) . "
QUERY_STRING = " . getenv( " QUERY_STRING " ) . "
REDIRECT_STATUS = " . getenv( " REDIRECT_STATUS " ) . "
REQUEST_METHOD = " . getenv( " REQUEST_METHOD " ) . "
SCRIPT_FILENAME = " . getenv( " SCRIPT_FILENAME " ) . "
COMMAND $cmd
" ;
2002-10-08 11:00:06 +08:00
$out = `$cmd` ;
@ unlink ( $tmp_post );
// Does the output match what is expected?
$output = trim ( $out );
$output = preg_replace ( '/\r\n/' , " \n " , $output );
if ( isset ( $section_text [ 'EXPECTF' ])) {
$wanted = trim ( $section_text [ 'EXPECTF' ]);
2002-10-09 01:51:57 +08:00
$wanted_re = preg_replace ( '/\r\n/' , " \n " , $wanted );
$wanted_re = preg_quote ( $wanted_re , '/' );
2002-10-08 11:00:06 +08:00
// Stick to basics
2002-10-11 00:08:15 +08:00
$wanted_re = str_replace ( " %s " , " .+? " , $wanted_re ); //not greedy
2002-10-09 01:51:57 +08:00
$wanted_re = str_replace ( " %i " , " [0-9]+ " , $wanted_re );
2002-10-19 04:34:41 +08:00
$wanted_re = str_replace ( " %d " , " [0-9]+ " , $wanted_re );
$wanted_re = str_replace ( " %x " , " [0-9a-fA-F]+ " , $wanted_re );
2002-10-09 01:51:57 +08:00
$wanted_re = str_replace ( " %f " , " [0-9 \ .+ \ -]+ " , $wanted_re );
2002-10-07 08:05:20 +08:00
/* DEBUG YOUR REGEX HERE
2002-10-08 11:00:06 +08:00
var_dump ( $wanted );
print ( str_repeat ( '=' , 80 ) . " \n " );
var_dump ( $output );
2002-10-07 08:05:20 +08:00
*/
2002-10-21 16:55:49 +08:00
if ( preg_match ( " /^ $wanted_re\ $ /s " , $output )) {
2002-10-08 11:00:06 +08:00
echo " PASS $tested\n " ;
return 'PASSED' ;
}
} else {
$wanted = trim ( $section_text [ 'EXPECT' ]);
$wanted = preg_replace ( '/\r\n/' , " \n " , $wanted );
2002-08-27 07:26:46 +08:00
// compare and leave on success
2002-10-08 11:00:06 +08:00
$ok = ( 0 == strcmp ( $output , $wanted ));
if ( $ok ) {
2002-10-22 16:54:23 +08:00
@ unlink ( $tmp_file );
2002-10-08 11:00:06 +08:00
echo " PASS $tested\n " ;
return 'PASSED' ;
}
}
2002-05-17 05:48:28 +08:00
2002-10-08 11:00:06 +08:00
// Test failed so we need to report details.
echo " FAIL $tested\n " ;
2002-10-07 08:05:20 +08:00
2002-10-13 03:29:56 +08:00
$GLOBALS [ '__PHP_FAILED_TESTS__' ][] = array (
'name' => $file ,
'output' => ereg_replace ( '\.phpt$' , '.log' , $file ),
'diff' => ereg_replace ( '\.phpt$' , '.diff' , $file )
);
2002-10-07 08:05:20 +08:00
2002-08-27 07:26:46 +08:00
// write .exp
2002-10-08 11:00:06 +08:00
if ( strpos ( $log_format , 'E' ) !== FALSE ) {
$logname = ereg_replace ( '\.phpt$' , '.exp' , $file );
$log = fopen ( $logname , 'w' ) or error ( " Cannot create test log - $logname " );
fwrite ( $log , $wanted );
fclose ( $log );
2002-08-27 07:26:46 +08:00
}
// write .out
2002-10-08 11:00:06 +08:00
if ( strpos ( $log_format , 'O' ) !== FALSE ) {
$logname = ereg_replace ( '\.phpt$' , '.out' , $file );
$log = fopen ( $logname , 'w' ) or error ( " Cannot create test log - $logname " );
fwrite ( $log , $output );
fclose ( $log );
2002-08-27 07:26:46 +08:00
}
// write .diff
2002-10-08 11:00:06 +08:00
if ( strpos ( $log_format , 'D' ) !== FALSE ) {
$logname = ereg_replace ( '\.phpt$' , '.diff' , $file );
$log = fopen ( $logname , 'w' ) or error ( " Cannot create test log - $logname " );
fwrite ( $log , generate_diff ( $wanted , $output ));
fclose ( $log );
}
2002-08-27 07:26:46 +08:00
// write .log
2002-10-08 11:00:06 +08:00
if ( strpos ( $log_format , 'L' ) !== FALSE ) {
$logname = ereg_replace ( '\.phpt$' , '.log' , $file );
$log = fopen ( $logname , 'w' ) or error ( " Cannot create test log - $logname " );
fwrite ( $log , "
2002-05-17 05:48:28 +08:00
---- EXPECTED OUTPUT
$wanted
---- ACTUAL OUTPUT
$output
---- FAILED
" );
2002-10-08 11:00:06 +08:00
fclose ( $log );
error_report ( $file , $logname , $tested );
2002-08-27 07:26:46 +08:00
}
2002-05-17 05:48:28 +08:00
2002-10-08 11:00:06 +08:00
return 'FAILED' ;
2000-08-28 03:46:06 +08:00
}
2002-10-02 09:52:25 +08:00
function generate_diff ( $wanted , $output )
{
2002-10-08 11:00:06 +08:00
$w = explode ( " \n " , $wanted );
$o = explode ( " \n " , $output );
$w1 = array_diff ( $w , $o );
$o1 = array_diff ( $o , $w );
$w2 = array ();
$o2 = array ();
foreach ( $w1 as $idx => $val ) $w2 [ sprintf ( " %03d< " , $idx )] = sprintf ( " %03d- " , $idx + 1 ) . $val ;
foreach ( $o1 as $idx => $val ) $o2 [ sprintf ( " %03d> " , $idx )] = sprintf ( " %03d+ " , $idx + 1 ) . $val ;
$diff = array_merge ( $w2 , $o2 );
ksort ( $diff );
return implode ( " \r \n " , $diff );
2002-08-27 07:26:46 +08:00
}
2002-10-02 09:52:25 +08:00
function error ( $message )
{
2002-05-19 21:16:03 +08:00
echo " ERROR: { $message } \n " ;
exit ( 1 );
}
2002-05-09 14:39:05 +08:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
* End :
2002-10-08 11:00:06 +08:00
* vim600 : fdm = marker
* vim : noet sw = 4 ts = 4
2002-05-09 14:39:05 +08:00
*/
2001-05-27 17:09:00 +08:00
?>