]> granicus.if.org Git - php/commitdiff
fixing run-tests.php for variables_order="GPCS"
authorMatt Ficken <mattficken@php.net>
Mon, 15 May 2017 09:21:55 +0000 (02:21 -0700)
committerMatt Ficken <mattficken@php.net>
Mon, 15 May 2017 09:21:55 +0000 (02:21 -0700)
run-tests.php

index 1991b56a087a4b6df1d9a65676d24112078512a1..fbb664d809d246576e4bf20b8533cc878dab3d22 100755 (executable)
@@ -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, '<?php echo str_replace("Zend OPcache", "opcache", join(",", get_loaded_extensions())); ?>');
+       save_text($info_file, '<?php echo str_replace("Zend OPcache", "opcache", implode(",", get_loaded_extensions())); ?>');
        $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/', '<esc>', $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;
        }
 }