use strict; use Test::More; use File::Find; use File::Spec; # let's test all the log files in t/ my @files = ( "doesnotexist.log" ); find( sub { push @files, $File::Find::name if /\.log$/ }, 't' ); # the command-line parameters to test my @args = qw( -h -k -km -kl -kt -ks ); my $tests = @files * @args * 3 - @args; plan tests => $tests; SKIP: { eval { require Test::Cmd; }; skip "mailstat does not exist on $^O", $tests if $^O =~ /^(?:dos|os2|MSWin32)/; skip "Test::Cmd not installed", $tests if $@; my $mailstat; find( sub { $mailstat = $File::Find::name if $_ eq 'mailstat' && -x }, split /:/, $ENV{PATH} ); SKIP: { skip "mailstat not found", $tests unless $mailstat; # Test::Cmd need to be a singleton... my $test = Test::Cmd->new( workdir => ''); # arguments for each script my @orig = ( prog => $mailstat ); my @perl = ( prog => './scripts/mailstat.pl', interpreter => $^X ); # compare output, errput and status code for all combinations for my $file ( @files ) { for my $args ( @args ) { $test->run( @orig, args => "$args $file" ); my $orig_out = $test->stdout; my $orig_err = $test->stderr; my $orig_sts = $? >> 8; $test->run( @perl, args => "$args $file" ); my $perl_out = $test->stdout; my $perl_err = $test->stderr; my $perl_sts = $? >> 8; is( $perl_out, $orig_out, "Same output for $args $file" ); is( $perl_err, $orig_err, "Same errput for $args $file" ) if $file !~ /empty\.log/; # ignore errput for empty.log is( $perl_sts, $orig_sts, "Same status code for $args $file" ); } } } }