Browse Source

Consolidate Valgrind logic into a single var and class

pull/2700/merge
Sara Golemon 9 years ago
parent
commit
5a2a92f128
No known key found for this signature in database GPG Key ID: DBDB397470D12172
  1. 104
      run-tests.php

104
run-tests.php

@ -83,9 +83,6 @@ set_time_limit(0);
ini_set('pcre.backtrack_limit', PHP_INT_MAX);
$valgrind_version = 0;
$valgrind_header = '';
// delete as much output buffers as possible
while(@ob_end_clean());
if (ob_get_level()) echo "Not all buffers were deleted.\n";
@ -260,7 +257,7 @@ $no_file_cache = '-d opcache.file_cache= -d opcache.file_cache_only=0';
function write_information()
{
global $php, $php_cgi, $phpdbg, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $leak_check, $valgrind_header, $no_file_cache;
global $php, $php_cgi, $phpdbg, $php_info, $user_tests, $ini_overwrites, $pass_options, $exts_to_test, $valgrind, $no_file_cache;
// Get info from php
$info_file = __DIR__ . '/run-test-info.php';
@ -333,7 +330,7 @@ Extra dirs : ";
echo "{$test_dir}\n ";
}
echo "
VALGRIND : " . ($leak_check ? $valgrind_header : 'Not used') . "
VALGRIND : " . ($valgrind ? $valgrind->getHeader() : 'Not used') . "
=====================================================================
";
}
@ -489,7 +486,7 @@ $pass_options = '';
$output_file = INIT_DIR . '/php_test_results_' . date('Ymd_Hi') . '.txt';
$just_save_results = false;
$leak_check = false;
$valgrind = null;
$html_output = false;
$html_file = null;
$temp_source = null;
@ -602,19 +599,7 @@ if (isset($argc) && $argc > 1) {
break;
//case 'l'
case 'm':
$leak_check = true;
$valgrind_cmd = "valgrind --version";
$valgrind_header = system_with_timeout($valgrind_cmd, $environment);
$replace_count = 0;
if (!$valgrind_header) {
error("Valgrind returned no version info, cannot proceed.\nPlease check if Valgrind is installed.");
} else {
$valgrind_version = preg_replace("/valgrind-(\d+)\.(\d+)\.(\d+)([.\w_-]+)?(\s+)/", '$1.$2.$3', $valgrind_header, 1, $replace_count);
if ($replace_count != 1) {
error("Valgrind returned invalid version info (\"$valgrind_header\"), cannot proceed.");
}
$valgrind_header = trim($valgrind_header);
}
$valgrind = new RuntestsValgrind($environment);
break;
case 'n':
if (!$pass_option_n) {
@ -1113,7 +1098,7 @@ function error_report($testname, $logname, $tested)
function system_with_timeout($commandline, $env = null, $stdin = null, $captureStdIn = true, $captureStdOut = true, $captureStdErr = true)
{
global $leak_check;
global $valgrind;
$data = '';
@ -1146,7 +1131,7 @@ function system_with_timeout($commandline, $env = null, $stdin = null, $captureS
unset($pipes[0]);
}
$timeout = $leak_check ? 300 : (isset($env['TEST_TIMEOUT']) ? $env['TEST_TIMEOUT'] : 60);
$timeout = $valgrind ? 300 : (isset($env['TEST_TIMEOUT']) ? $env['TEST_TIMEOUT'] : 60);
while (true) {
/* hide errors from interrupted syscalls */
@ -1250,9 +1235,8 @@ function run_test($php, $file, $env)
{
global $log_format, $ini_overwrites, $PHP_FAILED_TESTS;
global $pass_options, $DETAILED, $IN_REDIRECT, $test_cnt, $test_idx;
global $leak_check, $temp_source, $temp_target, $cfg, $environment;
global $valgrind, $temp_source, $temp_target, $cfg, $environment;
global $no_clean;
global $valgrind_version;
global $SHOW_ONLY_GROUPS;
global $no_file_cache;
global $slow_min_ms;
@ -1617,7 +1601,7 @@ TEST $file
$extra = substr(PHP_OS, 0, 3) !== "WIN" ?
"unset REQUEST_METHOD; unset QUERY_STRING; unset PATH_TRANSLATED; unset SCRIPT_FILENAME; unset REQUEST_METHOD;": "";
if ($leak_check) {
if ($valgrind) {
$env['USE_ZEND_ALLOC'] = '0';
$env['ZEND_DONT_UNLOAD_MODULES'] = 1;
} else {
@ -1912,25 +1896,11 @@ TEST $file
$cmd = "$php $pass_options $ini_settings -f \"$test_file\" $args$cmdRedirect";
}
if ($leak_check) {
if ($valgrind) {
$env['USE_ZEND_ALLOC'] = '0';
$env['ZEND_DONT_UNLOAD_MODULES'] = 1;
$valgrind_cmd = "valgrind -q --tool=memcheck --trace-children=yes";
if (strpos($test_file, "pcre") !== false) {
$valgrind_cmd .= " --smc-check=all";
}
/* --vex-iropt-register-updates=allregs-at-mem-access is necessary for phpdbg watchpoint tests */
if (version_compare($valgrind_version, '3.8.0', '>=')) {
/* valgrind 3.3.0+ doesn't have --log-file-exactly option */
$cmd = "$valgrind_cmd --vex-iropt-register-updates=allregs-at-mem-access --log-file=$memcheck_filename $cmd";
} elseif (version_compare($valgrind_version, '3.3.0', '>=')) {
$cmd = "$valgrind_cmd --vex-iropt-precise-memory-exns=yes --log-file=$memcheck_filename $cmd";
} else {
$cmd = "$valgrind_cmd --vex-iropt-precise-memory-exns=yes --log-file-exactly=$memcheck_filename $cmd";
}
$cmd = $valgrind->wrapCommand($cmd, $memcheck_filename, strpos($test_file, "pcre") !== false);
} else {
$env['USE_ZEND_ALLOC'] = '1';
$env['ZEND_DONT_UNLOAD_MODULES'] = 0;
@ -1991,7 +1961,7 @@ COMMAND $cmd
$leaked = false;
$passed = false;
if ($leak_check) { // leak check
if ($valgrind) { // leak check
$leaked = filesize($memcheck_filename) > 0;
if (!$leaked) {
@ -2487,7 +2457,7 @@ function compute_summary()
function get_summary($show_ext_summary, $show_html)
{
global $exts_skipped, $exts_tested, $n_total, $sum_results, $percent_results, $end_time, $start_time, $failed_test_summary, $PHP_FAILED_TESTS, $leak_check;
global $exts_skipped, $exts_tested, $n_total, $sum_results, $percent_results, $end_time, $start_time, $failed_test_summary, $PHP_FAILED_TESTS, $valgrind;
$x_total = $n_total - $sum_results['SKIPPED'] - $sum_results['BORKED'];
@ -2532,7 +2502,7 @@ Tests warned : ' . sprintf('%4d (%5.1f%%)', $sum_results['WARNED'], $percent_
Tests failed : ' . sprintf('%4d (%5.1f%%)', $sum_results['FAILED'], $percent_results['FAILED']) . ' ' . sprintf('(%5.1f%%)', $x_failed) . '
Expected fail : ' . sprintf('%4d (%5.1f%%)', $sum_results['XFAILED'], $percent_results['XFAILED']) . ' ' . sprintf('(%5.1f%%)', $x_xfailed);
if ($leak_check) {
if ($valgrind) {
$summary .= '
Tests leaked : ' . sprintf('%4d (%5.1f%%)', $sum_results['LEAKED'], $percent_results['LEAKED']) . ' ' . sprintf('(%5.1f%%)', $x_leaked);
}
@ -2975,6 +2945,54 @@ function junit_finish_timer($file_name) {
unset($JUNIT['files'][$file_name]['start']);
}
class RuntestsValgrind {
protected $version = '';
protected $header = '';
protected $version_3_3_0 = false;
protected $verison_3_8_0 = false;
public function getVersion() {
return $this->version;
}
public function getHeader() {
return $this->header;
}
public function __construct(array $environment) {
$header = system_with_timeout('valgrind --version', $environment);
if (!$header) {
error("Valgrind returned no version info, cannot proceed.\nPlease check if Valgrind is installed.");
}
$count = 0;
$version = preg_replace("/valgrind-(\d+)\.(\d+)\.(\d+)([.\w_-]+)?(\s+)/", '$1.$2.$3', $header, 1, $count);
if ($count != 1) {
error("Valgrind returned invalid version info (\"{$header}\"), cannot proceed.");
}
$this->version = $version;
$this->header = trim($header);
$this->version_3_3_0 = version_compare($version, '3.3.0', '>=');
$this->version_3_8_0 = version_compare($version, '3.8.0', '>=');
}
public function wrapCommand($cmd, $memcheck_filename, $check_all) {
$vcmd = 'valgrind -q --tool=memcheck --trace-children=yes';
if ($check_all) {
$vcmd .= ' --smc-check=all';
}
/* --vex-iropt-register-updates=allregs-at-mem-access is necessary for phpdbg watchpoint tests */
if ($this->version_3_8_0) {
/* valgrind 3.3.0+ doesn't have --log-file-exactly option */
return "$vcmd --vex-iropt-register-updates=allregs-at-mem-access --log-file=$memcheck_filename $cmd";
} elseif ($this->version_3_3_0) {
return "$vcmd --vex-iropt-precise-memory-exns=yes --log-file=$memcheck_filename $cmd";
} else {
return "$vcmd --vex-iropt-precise-memory-exns=yes --log-file-exactly=$memcheck_filename $cmd";
}
}
}
/*
* Local variables:
* tab-width: 4

Loading…
Cancel
Save