Support .skipif in test/run

Calls the first .skipif file to be found of:
$testname.skipif
./config.skipif
../config.skipif
../../config.skipif
etc...

And skips the test if that PHP file outputs anything.

Also expands $test.opts, $test.hdf, and $test.in to
look in config.* and parents
Esse commit está contido em:
Sara Golemon
2013-06-25 10:36:58 -07:00
commit 70dac3df33
+80 -21
Ver Arquivo
@@ -202,24 +202,35 @@ function find_tests($files) {
return array_filter($tests);
}
function find_config($test, $name) {
return find_config_for_dir(dirname($test), $name);
function find_test_ext($test, $ext) {
if (is_file("{$test}.{$ext}")) {
return "{$test}.{$ext}";
}
return find_file_for_dir(dirname($test), "config.{$ext}");
}
function find_config_for_dir($dir, $name) {
while ($dir && stat($dir)) {
$config = "$dir/$name";
if (is_file($config)) {
return $config;
function find_file($test, $name) {
return find_file_for_dir(dirname($test), $name);
}
function find_file_for_dir($dir, $name) {
while (($dir !== '.') && is_dir($dir)) {
$file = "$dir/$name";
if (is_file($file)) {
return $file;
}
$dir = substr($dir, 0, strrpos($dir, '/'));
$dir = dirname($dir);
}
return __DIR__.'/'.$name;
$file = __DIR__.'/'.$name;
if (file_exists($file)) {
return $file;
}
return null;
}
function find_debug_config($test, $name) {
$debug_config = find_config_for_dir(dirname($test), $name);
if (is_file($debug_config)) {
$debug_config = find_file_for_dir(dirname($test), $name);
if ($debug_config !== null) {
return "-m debug --debug-config ".$debug_config;
}
return "";
@@ -244,21 +255,26 @@ function extra_args($options) {
return idx($options, 'args', '');
}
function hhvm_cmd($options, $test) {
function hhvm_cmd($options, $test, $test_run = null) {
if ($test_run === null) {
$test_run = $test;
}
$cmd = implode(" ", array(
idx_file($_ENV, 'HHVM_BIN', bin_root().'/hphp/hhvm/hhvm'),
'--config',
find_config($test, 'config.hdf'),
find_test_ext($test, 'hdf'),
find_debug_config($test, 'hphpd.hdf'),
mode_cmd($options),
'-vEval.EnableArgsInBacktraces=true',
read_file("$test.opts"),
read_file(find_test_ext($test, 'opts')),
extra_args($options),
'--file',
$test
escapeshellarg($test_run)
));
if (file_exists("$test.in")) {
$cmd .= " <$test.in";
$in = find_test_ext($test, 'in');
if ($in !== null) {
$cmd .= ' < ' . escapeshellarg($in);
}
return $cmd;
}
@@ -267,7 +283,7 @@ function hphp_cmd($options, $test) {
return implode(" ", array(
idx_file($_ENV, 'HPHP_BIN', bin_root().'/hphp/hhvm/hphp'),
'--config',
find_config($test, 'hphp_config.hdf'),
find_file($test, 'hphp_config.hdf'),
read_file("$test.hphp_opts"),
"-thhbc -l0 -k1 -o $test.repo $test",
));
@@ -308,6 +324,29 @@ class Status {
}
}
public static function skip($test) {
array_push(self::$results, array('name'=>$test,'status'=>'skipped'));
switch (self::$mode) {
case self::MODE_NORMAL:
if (self::hasColor()) {
print "\033[1;33ms\033[0m";
} else {
print 's';
}
break;
case self::MODE_VERBOSE:
if (self::hasColor()) {
print "$test \033[1;33mskipped\033[0m\n";
} else {
print "$test skipped";
}
break;
case self::MODE_FBMAKE:
// Say nothing...
break;
}
}
public static function fail($test) {
array_push(self::$results, array(
'name' => $test,
@@ -371,7 +410,9 @@ function run($options, $tests, $bad_test_file) {
}
foreach ($tests as $test) {
$status = run_test($options, $test);
if ($status) {
if ($status === 'skip') {
Status::skip($test);
} else if ($status) {
Status::pass($test);
} else {
Status::fail($test);
@@ -386,14 +427,32 @@ function run($options, $tests, $bad_test_file) {
return 0;
}
function skip_test($options, $test) {
$skipif_test = find_test_ext($test, 'skipif');
if (!$skipif_test) {
return false;
}
$hhvm = hhvm_cmd($options, $test, $skipif_test);
$out = shell_exec($hhvm . ' 2> /dev/null');
$out = trim($out);
return (bool)strlen($out);
}
function run_test($options, $test) {
$hhvm = hhvm_cmd($options, $test);
$hhvm = __DIR__."/../tools/timeout.sh -t 300 $hhvm";
$output = "";
if (skip_test($options, $test)) {
return 'skip';
}
if (isset($options['repo'])) {
if (strpos($test, '.hhas') !== false ||
strpos($hhvm, '-m debug') != false || is_file($test.'.norepo')) {
# We don't have a way to skip, I guess run non-repo?
strpos($hhvm, '-m debug') != false ||
file_exists($test.'.norepo')) {
return 'skip';
} else {
unlink("$test.repo/hhvm.hhbc");
$hphp = hphp_cmd($options, $test);