summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPaul Smith <psmith@gnu.org>2007-07-14 02:57:46 +0000
committerPaul Smith <psmith@gnu.org>2007-07-14 02:57:46 +0000
commitbb4d040fadcb76a8828eaf24b4f0557ec11f44fb (patch)
treecaeae1a84c3787f3c4c930e14af86e25928689d2 /tests
parent891ebd4d9766c1fb0bd11bd0fe8ef3ca871d4bc0 (diff)
downloadgunmake-bb4d040fadcb76a8828eaf24b4f0557ec11f44fb.tar.gz
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.
Diffstat (limited to 'tests')
-rw-r--r--tests/ChangeLog20
-rwxr-xr-xtests/run_make_tests.pl17
-rw-r--r--tests/scripts/features/parallelism3
-rw-r--r--tests/scripts/options/dash-l3
-rw-r--r--tests/test_driver.pl54
5 files changed, 74 insertions, 23 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 93a9e3b..6e53dc7 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -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
diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl
index 48be41b..0adb172 100755
--- a/tests/run_make_tests.pl
+++ b/tests/run_make_tests.pl
@@ -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
diff --git a/tests/scripts/features/parallelism b/tests/scripts/features/parallelism
index abe49a5..432c088 100644
--- a/tests/scripts/features/parallelism
+++ b/tests/scripts/features/parallelism
@@ -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
diff --git a/tests/scripts/options/dash-l b/tests/scripts/options/dash-l
index 58216f9..0b0f196 100644
--- a/tests/scripts/options/dash-l
+++ b/tests/scripts/options/dash-l
@@ -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/) {
diff --git a/tests/test_driver.pl b/tests/test_driver.pl
index 68007ec..bea9816 100644
--- a/tests/test_driver.pl
+++ b/tests/test_driver.pl
@@ -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;
}