#!/bin/perl # # Testcase runner for libhubbub # # Usage: testrunner # # Operates upon INDEX files described in the README. # Locates and executes testcases, feeding data files to programs # as appropriate. # Logs testcase output to file. # Aborts test sequence on detection of error. # use warnings; use strict; use File::Spec; use IPC::Open3; # Get EXE extension (if any) my $exeext = ""; $exeext = shift @ARGV if (@ARGV > 0); # Open log file and /dev/null open(LOG, ">log") or die "Failed opening test log"; open(NULL, "+<", File::Spec->devnull) or die "Failed opening /dev/null"; # Open testcase index open(TINDEX, ") { next if ($line =~ /^(#.*)?$/); # Found one; decompose (my $test, my $desc, my $data) = split /\t+/, $line; # Strip whitespace $test =~ s/^\s+|\s+$//g; $desc =~ s/^\s+|\s+$//g; $data =~ s/^\s+|\s+$//g if ($data); # Append EXE extension to binary name $test = $test . $exeext; print "Test: $desc\n"; my $pid; if ($data) { # Testcase has external data files # Open datafile index open(DINDEX, "<./data/$data/INDEX") or die "Failed opening ./data/$data/INDEX"; # Parse datafile index, looking for datafiles while (my $dentry = ) { next if ($dentry =~ /^(#.*)?$/); # Found one; decompose (my $dtest, my $ddesc) = split /\t+/, $dentry; # Strip whitespace $dtest =~ s/^\s+|\s+$//g; $ddesc =~ s/^\s+|\s+$//g; print LOG "Running ./$test ./data/Aliases " . "./data/$data/$dtest\n"; # Make message fit on an 80 column terminal my $msg = " ==> $test [$data/$dtest]"; $msg = $msg . "." x (80 - length($msg) - 8); print $msg; # Run testcase $pid = open3("&&NULL", "./$test", "./data/Aliases", "./data/$data/$dtest"); my $last; # Marshal testcase output to log file while (my $output = ) { print LOG " $output"; $last = $output; } # Wait for child to finish waitpid($pid, 0); print substr($last, 0, 4) . "\n"; # Bail, noisily, on failure if (substr($last, 0, 4) eq "FAIL") { print "\n\nFailure detected: " . "consult log file\n\n\n"; exit(1); } } close(DINDEX); } else { # Testcase has no external data files print LOG "Running ./$test ./data/Aliases\n"; # Make message fit on an 80 column terminal my $msg = " ==> $test"; $msg = $msg . "." x (80 - length($msg) - 8); print $msg; # Run testcase $pid = open3("&NULL", "./$test", "./data/Aliases"); my $last; # Marshal testcase output to log file while (my $output = ) { print LOG " $output"; $last = $output; } # Wait for child to finish waitpid($pid, 0); print substr($last, 0, 4) . "\n"; # Bail, noisily, on failure if (substr($last, 0, 4) eq "FAIL") { print "\n\nFailure detected: " . "consult log file\n\n\n"; exit(1); } } print "\n"; } # Clean up close(TINDEX); close(NULL); close(LOG);