Fix Savannah bug #20452.

Add a new feature to the test suite suggested by Icarus Sparry:
set a timer before invoking a test, so that if it loops infinitely we
will wake up and have a chance to kill the process and continue.
This commit is contained in:
Paul Smith 2007-07-14 02:57:46 +00:00
parent 891ebd4d97
commit bb4d040fad
7 changed files with 84 additions and 24 deletions

View File

@ -1,3 +1,10 @@
2007-07-13 Paul Smith <psmith@gnu.org>
* file.c (expand_deps): Use variable_buffer as the start of the
buffer, not the original pointer (in case it was reallocated).
Fix suggested by Rafi Einstein <rafi.einstein@formalism-labs.com>.
Fixes Savannah bug #20452.
2007-07-04 Paul Smith <psmith@gnu.org>
* (ALL FILES): Update to GPLv3.

4
file.c
View File

@ -483,6 +483,7 @@ expand_deps (struct file *f)
{
p = variable_expand ("");
variable_buffer_output (p, d->name, strlen (d->name) + 1);
p = variable_buffer;
}
else
{
@ -495,7 +496,8 @@ expand_deps (struct file *f)
o = subst_expand (buffer, d->name, "%", "$*", 1, 2, 0);
d->name = strcache_add_len (buffer, o - buffer);
d->name = strcache_add_len (variable_buffer,
o - variable_buffer);
d->staticpattern = 0; /* Clear staticpattern so that we don't
re-expand %s below. */
}

View File

@ -1,3 +1,23 @@
2007-07-13 Paul Smith <psmith@gnu.org>
Install a timeout so tests can never loop infinitely.
Original idea and patch for a single-test version provided by
Icarus Sparry <savannah@icarus.freeuk.com>
* test_driver.pl (_run_command): New function: this is called by
other functions to actually run a command. Before we run it,
install a SIGALRM handler and set up a timer to go off in the
future (default is 5s; this can be overridden by individual tests).
(run_command): Call it.
(run_command_with_output): Call it.
* run_make_tests.pl (run_make_with_options): Override the default
timeout if the caller requests it.
(run_make_test): Pass any timeout override to run_make_with_options.
* scripts/features/parallelism: Increase the timeout for long tests.
* scripts/options/dash-l: Ditto.
2006-10-01 Paul Smith <psmith@paulandlesley.org>
* run_make_tests.pl (set_more_defaults): Remove setting of LANG in

View File

@ -82,7 +82,7 @@ $old_makefile = undef;
sub run_make_test
{
local ($makestring, $options, $answer, $err_code) = @_;
local ($makestring, $options, $answer, $err_code, $timeout) = @_;
# If the user specified a makefile string, create a new makefile to contain
# it. If the first value is not defined, use the last one (if there is
@ -121,7 +121,8 @@ sub run_make_test
$answer =~ s/#MAKE#/$make_name/g;
$answer =~ s/#PWD#/$pwd/g;
&run_make_with_options($makefile, $options, &get_logfile(0), $err_code);
run_make_with_options($makefile, $options, &get_logfile(0),
$err_code, $timeout);
&compare_output($answer, &get_logfile(1));
$old_makefile = $makefile;
@ -130,7 +131,7 @@ sub run_make_test
# The old-fashioned way...
sub run_make_with_options {
local ($filename,$options,$logname,$expected_code) = @_;
local ($filename,$options,$logname,$expected_code,$timeout) = @_;
local($code);
local($command) = $make_path;
@ -151,7 +152,15 @@ sub run_make_with_options {
print VALGRIND "\n\nExecuting: $command\n";
}
$code = &run_command_with_output($logname,$command);
{
my $old_timeout = $test_timeout;
$test_timeout = $timeout if $timeout;
$code = &run_command_with_output($logname,$command);
$test_timeout = $old_timeout;
}
# Check to see if we have Purify errors. If so, keep the logfile.
# For this to work you need to build with the Purify flag -exit-status=yes

View File

@ -69,6 +69,7 @@ unlink('1.inc', '2.inc');
# function in an exported recursive variable. I added some code to check
# for this situation and print a message if it occurred. This test used
# to trigger this code when I added it but no longer does after the fix.
# We have to increase the timeout from the default (5s) on this test.
run_make_test("
export HI = \$(shell \$(\$\@.CMD))
@ -79,7 +80,7 @@ second.CMD = $sleep_command 4; echo hi
all: first second
first second: ; \@echo \$\@; $sleep_command 1; echo \$\@",
'-j2', "first\nfirst\nsecond\nsecond");
'-j2', "first\nfirst\nsecond\nsecond", 0, 7);
# Michael Matz <matz@suse.de> reported a bug where if make is running in
# parallel without -k and two jobs die in a row, but not too close to each

View File

@ -45,7 +45,8 @@ close(MAKEFILE);
$mkoptions = "-l 0.0001";
$mkoptions .= " -j 4" if ($parallel_jobs);
&run_make_with_options($makefile, $mkoptions, &get_logfile);
# We have to wait longer than the default (5s).
&run_make_with_options($makefile, $mkoptions, &get_logfile, 0, 8);
$slurp = &read_file_into_string (&get_logfile(1));
if ($slurp !~ /cannot enforce load limit/) {

View File

@ -50,6 +50,10 @@ $tests_passed = 0;
$test_passed = 1;
# Timeout in seconds. If the test takes longer than this we'll fail it.
$test_timeout = 5;
# %makeENV is the cleaned-out environment.
%makeENV = ();
@ -766,21 +770,43 @@ sub detach_default_output
|| &error ("ddo: $! closing SAVEDOSerr\n", 1);
}
# run one command (passed as a list of arg 0 - n), returning 0 on success
# and nonzero on failure.
sub run_command
# This runs a command without any debugging info.
sub _run_command
{
local ($code);
my $code;
# We reset this before every invocation. On Windows I think there is only
# one environment, not one per process, so I think that variables set in
# test scripts might leak into subsequent tests if this isn't reset--???
resetENV();
eval {
local $SIG{ALRM} = sub { die "timeout\n"; };
alarm $test_timeout;
$code = system @_;
alarm 0;
};
if ($@) {
# The eval failed. If it wasn't SIGALRM then die.
$@ eq "timeout\n" or die;
# Timed out. Resend the alarm to our process group to kill the children.
$SIG{ALRM} = 'IGNORE';
kill -14, $$;
$code = 14;
}
return $code;
}
# run one command (passed as a list of arg 0 - n), returning 0 on success
# and nonzero on failure.
sub run_command
{
print "\nrun_command: @_\n" if $debug;
$code = system @_;
print "run_command: \"@_\" returned $code.\n" if $debug;
my $code = _run_command(@_);
print "run_command returned $code.\n" if $debug;
return $code;
}
@ -792,19 +818,13 @@ sub run_command
sub run_command_with_output
{
local ($filename) = shift;
local ($code);
# We reset this before every invocation. On Windows I think there is only
# one environment, not one per process, so I think that variables set in
# test scripts might leak into subsequent tests if this isn't reset--???
resetENV();
my $filename = shift;
print "\nrun_command_with_output($filename): @_\n" if $debug;
&attach_default_output ($filename);
$code = system @_;
my $code = _run_command(@_);
&detach_default_output;
print "run_command_with_output: '@_' returned $code.\n" if $debug;
print "run_command_with_output returned $code.\n" if $debug;
return $code;
}