From c1d57186976e75a2a54f7bd167a77e2872cadc6a Mon Sep 17 00:00:00 2001 From: Matt Ficken Date: Mon, 15 May 2017 02:21:55 -0700 Subject: [PATCH] fixing run-tests.php for variables_order="GPCS" --- run-tests.php | 168 ++++++++++++++++++++++++++++---------------------- 1 file changed, 96 insertions(+), 72 deletions(-) diff --git a/run-tests.php b/run-tests.php index 1991b56a08..fbb664d809 100755 --- a/run-tests.php +++ b/run-tests.php @@ -94,6 +94,28 @@ if (ob_get_level()) echo "Not all buffers were deleted.\n"; error_reporting(E_ALL); $environment = isset($_ENV) ? $_ENV : array(); +// Note: php.ini-development sets variables_order="GPCS" not "EGPCS", in which case $_ENV is NOT populated. +// detect and handle this case, or die or warn +if (empty($environment)) { + // not documented, but returns array of all environment variables + $environment = getenv(); +} +if (empty($environment['TEMP'])) { + $environment['TEMP'] = sys_get_temp_dir(); + + if (empty($environment['TEMP'])) { + // for example, OpCache on Windows will fail in this case because child processes (for tests) will not get + // a TEMP variable, so GetTempPath() will fallback to c:\windows, while GetTempPath() will return %TEMP% for parent + // (likely a different path). The parent will initialize the OpCache in that path, and child will fail to reattach to + // the OpCache because it will be using the wrong path. + die("TEMP environment is NOT set"); + } else if (count($environment)==1) { + // not having other environment variables, only having TEMP, is probably ok, but strange and may make a + // difference in the test pass rate, so warn the user. + echo "WARNING: Only 1 environment variable will be available to tests(TEMP environment variable)".PHP_EOL; + } +} +// if ((substr(PHP_OS, 0, 3) == "WIN") && empty($environment["SystemRoot"])) { $environment["SystemRoot"] = getenv("SystemRoot"); } @@ -217,7 +239,7 @@ $ini_overwrites = array( 'display_startup_errors=1', 'log_errors=0', 'html_errors=0', - 'track_errors=1', + 'track_errors=0', 'report_memleaks=1', 'report_zend_debug=0', 'docref_root=', @@ -236,7 +258,7 @@ $ini_overwrites = array( $no_file_cache = '-d opcache.file_cache= -d opcache.file_cache_only=0'; -function write_information($show_html) +function write_information() { global $cwd, $php, $php_cgi, $phpdbg, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $leak_check, $valgrind_header, $no_file_cache; @@ -279,7 +301,7 @@ More .INIs : " , (function_exists(\'php_ini_scanned_files\') ? str_replace("\n" @unlink($info_file); // load list of enabled extensions - save_text($info_file, ''); + save_text($info_file, ''); $exts_to_test = explode(',',`$php $pass_options $info_params $no_file_cache "$info_file"`); // check for extensions that need special handling and regenerate $info_params_ex = array( @@ -324,7 +346,7 @@ define('TRAVIS_CI' , (bool) getenv('TRAVIS')); function save_or_mail_results() { global $sum_results, $just_save_results, $failed_test_summary, - $PHP_FAILED_TESTS, $CUR_DIR, $php, $output_file, $compression; + $PHP_FAILED_TESTS, $CUR_DIR, $php, $output_file; /* We got failed Tests, offer the user to send an e-mail to QA team, unless NO_INTERACTION is set */ if (!getenv('NO_INTERACTION') && !TRAVIS_CI) { @@ -435,7 +457,7 @@ function save_or_mail_results() $failed_tests_data .= $sep . "PHPINFO" . $sep; $failed_tests_data .= shell_exec($php . ' -ddisplay_errors=stderr -dhtml_errors=0 -i 2> /dev/null'); - if ($just_save_results || !mail_qa_team($failed_tests_data, $compression, $status) && !TRAVIS_CI) { + if (($just_save_results || !mail_qa_team($failed_tests_data, $status)) && !TRAVIS_CI) { file_put_contents($output_file, $failed_tests_data); if (!$just_save_results) { @@ -463,13 +485,8 @@ $failed_tests_file= false; $pass_option_n = false; $pass_options = ''; -$compression = 0; $output_file = $CUR_DIR . '/php_test_results_' . date('Ymd_Hi') . '.txt'; -if ($compression && in_array("compress.zlib", stream_get_filters())) { - $output_file = 'compress.zlib://' . $output_file . '.gz'; -} - $just_save_results = false; $leak_check = false; $html_output = false; @@ -494,7 +511,7 @@ foreach($cfgtypes as $type) { if (getenv('TEST_PHP_ARGS')) { - if (!isset($argc) || !$argc || !isset($argv)) { + if (!isset($argc, $argv) || !$argc) { $argv = array(__FILE__); } @@ -802,7 +819,7 @@ HELP; if ($test_cnt) { putenv('NO_INTERACTION=1'); verify_config(); - write_information($html_output); + write_information(); usort($test_files, "test_sort"); $start_time = time(); @@ -850,7 +867,7 @@ HELP; } verify_config(); -write_information($html_output); +write_information(); // Compile a list of all test files (*.phpt). $test_files = array(); @@ -882,7 +899,7 @@ foreach ($user_tests as $dir) { function find_files($dir, $is_ext_dir = false, $ignore = false) { - global $test_files, $exts_to_test, $ignored_by_ext, $exts_skipped, $exts_tested; + global $test_files, $exts_to_test, $ignored_by_ext, $exts_skipped; $o = opendir($dir) or error("cannot open directory: $dir"); @@ -986,7 +1003,7 @@ exit(0); // Send Email to QA Team // -function mail_qa_team($data, $compression, $status = false) +function mail_qa_team($data, $status = false) { $url_bits = parse_url(QA_SUBMISSION_PAGE); @@ -1075,7 +1092,7 @@ function error_report($testname, $logname, $tested) } } -function system_with_timeout($commandline, $env = null, $stdin = null) +function system_with_timeout($commandline, $env = null, $stdin = null, $captureStdIn = true, $captureStdOut = true, $captureStdErr = true) { global $leak_check, $cwd; @@ -1086,21 +1103,29 @@ function system_with_timeout($commandline, $env = null, $stdin = null) $bin_env[$key] = $value; } - $proc = proc_open($commandline, array( - 0 => array('pipe', 'r'), - 1 => array('pipe', 'w'), - 2 => array('pipe', 'w') - ), $pipes, $cwd, $bin_env, array('suppress_errors' => true, 'binary_pipes' => true)); + $descriptorspec = array(); + if ($captureStdIn) { + $descriptorspec[0] = array('pipe', 'r'); + } + if ($captureStdOut) { + $descriptorspec[1] = array('pipe', 'w'); + } + if ($captureStdErr) { + $descriptorspec[2] = array('pipe', 'w'); + } + $proc = proc_open($commandline, $descriptorspec, $pipes, $cwd, $bin_env, array('suppress_errors' => true, 'binary_pipes' => true)); if (!$proc) { return false; } - if (!is_null($stdin)) { - fwrite($pipes[0], $stdin); + if ($captureStdIn) { + if (!is_null($stdin)) { + fwrite($pipes[0], $stdin); + } + fclose($pipes[0]); + unset($pipes[0]); } - fclose($pipes[0]); - unset($pipes[0]); $timeout = $leak_check ? 300 : (isset($env['TEST_TIMEOUT']) ? $env['TEST_TIMEOUT'] : 60); @@ -1120,7 +1145,13 @@ function system_with_timeout($commandline, $env = null, $stdin = null) proc_terminate($proc, 9); return $data; } else if ($n > 0) { - $line = fread($pipes[1], 8192); + if ($captureStdOut) { + $line = fread($pipes[1], 8192); + } elseif ($captureStdErr) { + $line = fread($pipes[2], 8192); + } else { + $line = ''; + } if (strlen($line) == 0) { /* EOF */ break; @@ -1138,13 +1169,13 @@ function system_with_timeout($commandline, $env = null, $stdin = null) $data .= "\nTermsig=" . ($stat["exitcode"] - 128) . "\n"; } - $code = proc_close($proc); + proc_close($proc); return $data; } function run_all_tests($test_files, $env, $redir_tested = null) { - global $test_results, $failed_tests_file, $php, $test_cnt, $test_idx; + global $test_results, $failed_tests_file, $php, $test_idx; foreach($test_files as $name) { @@ -1195,12 +1226,11 @@ function show_file_block($file, $block, $section = null) // function run_test($php, $file, $env) { - global $log_format, $info_params, $ini_overwrites, $cwd, $PHP_FAILED_TESTS; + global $log_format, $ini_overwrites, $cwd, $PHP_FAILED_TESTS; global $pass_options, $DETAILED, $IN_REDIRECT, $test_cnt, $test_idx; global $leak_check, $temp_source, $temp_target, $cfg, $environment; global $no_clean; global $valgrind_version; - global $JUNIT; global $SHOW_ONLY_GROUPS; global $no_file_cache; $temp_filenames = null; @@ -1309,7 +1339,7 @@ TEST $file unset($section_text['FILEEOF']); } - foreach (array( 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX' ) as $prefix) { + foreach (array( 'FILE', 'EXPECT', 'EXPECTF', 'EXPECTREGEX' ) as $prefix) { $key = $prefix . '_EXTERNAL'; if (@count($section_text[$key]) == 1) { @@ -1351,6 +1381,21 @@ TEST $file return 'BORKED'; } + if (isset($section_text['CAPTURE_STDIO'])) { + $captureStdIn = stripos($section_text['CAPTURE_STDIO'], 'STDIN') !== false; + $captureStdOut = stripos($section_text['CAPTURE_STDIO'], 'STDOUT') !== false; + $captureStdErr = stripos($section_text['CAPTURE_STDIO'], 'STDERR') !== false; + } else { + $captureStdIn = true; + $captureStdOut = true; + $captureStdErr = true; + } + if ($captureStdOut && $captureStdErr) { + $cmdRedirect = ' 2>&1'; + } else { + $cmdRedirect = ''; + } + $tested = trim($section_text['TEST']); /* For GET/POST/PUT tests, check if cgi sapi is available and if it is, use it. */ @@ -1506,7 +1551,7 @@ TEST $file if (array_key_exists('EXTENSIONS', $section_text)) { $ext_dir=`$php -r 'echo ini_get("extension_dir");'`; $extensions = preg_split("/[\n\r]+/", trim($section_text['EXTENSIONS'])); - $loaded = explode(",", `$php -n -r 'echo join(",", get_loaded_extensions());'`); + $loaded = explode(",", `$php -n -r 'echo implode(",", get_loaded_extensions());'`); foreach ($extensions as $req_ext) { if (!in_array($req_ext, $loaded)) { if ($req_ext == 'opcache') { @@ -1571,10 +1616,6 @@ TEST $file show_result('SKIP', $tested, $tested_file, '', $temp_filenames); } - if (isset($old_php)) { - $php = $old_php; - } - if (!$cfg['keep']['skip']) { @unlink($test_skipif); } @@ -1603,9 +1644,9 @@ TEST $file } } } - + if (!extension_loaded("zlib") - && ( array_key_exists("GZIP_POST", $section_text) + && ( array_key_exists("GZIP_POST", $section_text) || array_key_exists("DEFLATE_POST", $section_text)) ) { $message = "ext/zlib required"; @@ -1622,7 +1663,7 @@ TEST $file $IN_REDIRECT['dir'] = realpath(dirname($file)); $IN_REDIRECT['prefix'] = trim($section_text['TEST']); - if (count($IN_REDIRECT['TESTS']) == 1) { + if (!empty($IN_REDIRECT['TESTS'])) { if (is_array($org_file)) { $test_files[] = $org_file[1]; @@ -1754,7 +1795,7 @@ TEST $file } save_text($tmp_post, $request); - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\""; } elseif (array_key_exists('PUT', $section_text) && !empty($section_text['PUT'])) { @@ -1788,7 +1829,7 @@ TEST $file } save_text($tmp_post, $request); - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\""; } else if (array_key_exists('POST', $section_text) && !empty($section_text['POST'])) { @@ -1805,7 +1846,7 @@ TEST $file $env['CONTENT_LENGTH'] = $content_length; } - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\""; } else if (array_key_exists('GZIP_POST', $section_text) && !empty($section_text['GZIP_POST'])) { @@ -1820,7 +1861,7 @@ TEST $file $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; $env['CONTENT_LENGTH'] = $content_length; - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\""; } else if (array_key_exists('DEFLATE_POST', $section_text) && !empty($section_text['DEFLATE_POST'])) { $post = trim($section_text['DEFLATE_POST']); @@ -1833,7 +1874,7 @@ TEST $file $env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'; $env['CONTENT_LENGTH'] = $content_length; - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" 2>&1 < \"$tmp_post\""; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\"$cmdRedirect < \"$tmp_post\""; } else { @@ -1841,7 +1882,7 @@ TEST $file $env['CONTENT_TYPE'] = ''; $env['CONTENT_LENGTH'] = ''; - $cmd = "$php $pass_options $ini_settings -f \"$test_file\" $args 2>&1"; + $cmd = "$php $pass_options $ini_settings -f \"$test_file\" $args$cmdRedirect"; } if ($leak_check) { @@ -1877,7 +1918,7 @@ COMMAND $cmd junit_start_timer($shortname); - $out = system_with_timeout($cmd, $env, isset($section_text['STDIN']) ? $section_text['STDIN'] : null); + $out = system_with_timeout($cmd, $env, isset($section_text['STDIN']) ? $section_text['STDIN'] : null, $captureStdIn, $captureStdOut, $captureStdErr); junit_finish_timer($shortname); @@ -1919,12 +1960,11 @@ COMMAND $cmd $output = preg_replace("/\r\n/", "\n", trim($out)); /* when using CGI, strip the headers from the output */ - $headers = ""; + $headers = array(); if (!empty($uses_cgi) && preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $out, $match)) { $output = trim($match[2]); $rh = preg_split("/[\n\r]+/", $match[1]); - $headers = array(); foreach ($rh as $line) { if (strpos($line, ':') !== false) { @@ -1949,26 +1989,23 @@ COMMAND $cmd } } - $org_headers = $headers; - $headers = array(); $output_headers = array(); foreach($want as $k => $v) { - if (isset($org_headers[$k])) { - $headers = $org_headers[$k]; - $output_headers[] = $k . ': ' . $org_headers[$k]; + if (isset($headers[$k])) { + $output_headers[] = $k . ': ' . $headers[$k]; } - if (!isset($org_headers[$k]) || $org_headers[$k] != $v) { + if (!isset($headers[$k]) || $headers[$k] != $v) { $failed_headers = true; } } ksort($wanted_headers); - $wanted_headers = join("\n", $wanted_headers); + $wanted_headers = implode("\n", $wanted_headers); ksort($output_headers); - $output_headers = join("\n", $output_headers); + $output_headers = implode("\n", $output_headers); } show_file_block('out', $output); @@ -2058,9 +2095,6 @@ COMMAND $cmd if (!$cfg['keep']['php']) { @unlink($test_file); } - if (isset($old_php)) { - $php = $old_php; - } if (!$leaked && !$failed_headers) { if (isset($section_text['XFAIL'] )) { @@ -2088,10 +2122,6 @@ COMMAND $cmd @unlink($test_file); } - if (isset($old_php)) { - $php = $old_php; - } - if (!$leaked && !$failed_headers) { if (isset($section_text['XFAIL'] )) { $warn = true; @@ -2191,10 +2221,6 @@ $output ); } - if (isset($old_php)) { - $php = $old_php; - } - $diff = empty($diff) ? '' : preg_replace('/\e/', '', $diff); junit_mark_test_as($restype, str_replace($cwd . '/', '', $tested_file), $tested, null, $info, $diff); @@ -2255,8 +2281,8 @@ function count_array_diff($ar1, $ar2, $is_reg, $w, $idx1, $idx2, $cnt1, $cnt2, $ function generate_array_diff($ar1, $ar2, $is_reg, $w) { - $idx1 = 0; $ofs1 = 0; $cnt1 = @count($ar1); - $idx2 = 0; $ofs2 = 0; $cnt2 = @count($ar2); + $idx1 = 0; $cnt1 = @count($ar1); + $idx2 = 0; $cnt2 = @count($ar2); $diff = array(); $old1 = array(); $old2 = array(); @@ -2274,10 +2300,8 @@ function generate_array_diff($ar1, $ar2, $is_reg, $w) if ($c1 > $c2) { $old1[$idx1] = sprintf("%03d- ", $idx1+1) . $w[$idx1++]; - $last = 1; } else if ($c2 > 0) { $old2[$idx2] = sprintf("%03d+ ", $idx2+1) . $ar2[$idx2++]; - $last = 2; } else { $old1[$idx1] = sprintf("%03d- ", $idx1+1) . $w[$idx1++]; $old2[$idx2] = sprintf("%03d+ ", $idx2+1) . $ar2[$idx2++]; @@ -2413,7 +2437,7 @@ function compute_summary() $sum_results['SKIPPED'] += $ignored_by_ext; $percent_results = array(); - while (list($v, $n) = each($sum_results)) { + foreach ($sum_results as $v => $n) { $percent_results[$v] = (100.0 * $n) / $n_total; } } -- 2.40.0