use strict;
use warnings;
use tests::Algorithm::Diff;
+use File::Temp 'tempfile';
sub fail;
sub pass;
our ($test, $src_dir) = @ARGV;
our ($src_stem) = "$src_dir/$test";
-our ($messages) = "";
-open (MESSAGES, '>', \$messages);
-select (MESSAGES);
+my ($msg_file) = tempfile ();
+select ($msg_file);
sub check_expected {
my ($expected) = pop @_;
$kw_line =~ s/^\([^\)]+\)\s+//;
print "$kw_line\n";
- # Append output, eliminating uninteresting header and trailer info
- # if possible.
- my (@core) = get_core_output (@output);
- @output = @core if @core;
- print "Program output:\n\n" . join ('', map ("$_\n", @output));
-
fail;
}
print <<EOF;
Pintos spontaneously rebooted during this test.
-This is most often caused by unhandled page faults. Output from
-initial boot through the first reboot is shown below:
-
+This is most often caused by unhandled page faults.
EOF
- my ($i) = 0;
- local ($_);
- for (@output) {
- print " $_\n";
- last if /Pintos booting/ && ++$i > 1;
- }
-
fail;
}
}
die "unknown option " . (keys (%options))[0] . "\n" if %options;
- my ($msg) = "Actual output:\n" . join ('', map (" $_\n", @output));
+ my ($msg);
# Compare actual output against each allowed output.
foreach my $exp_string (@$expected) {
my (@expected) = split ("\n", $exp_string);
- $msg .= "\nAcceptable output:\n";
+ $msg .= "Acceptable output:\n";
$msg .= join ('', map (" $_\n", @expected));
# Check whether actual and expected match.
sub finish {
my ($verdict, @rest) = @_;
+ my ($messages) = "";
+ seek ($msg_file, 0, 0);
+ while (<$msg_file>) {
+ $messages .= $_;
+ }
+ close ($msg_file);
+
my ($result_fn) = "$test.result";
open (RESULT, '>', $result_fn) or die "$result_fn: create: $!\n";
print RESULT "$verdict\n", $messages, @rest;