# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### use Test; use strict; use Getopt::Long; my $HELP = 0; my $SPFIMPL = "any"; my $SPFPROG = "./spfquery"; my $SPFDATA = "test.txt"; my %TODO = (); my $QUERY_OPT = ""; my $PIPE_OUT = 0; my $PIPE_IN = 0; my $result = GetOptions('help' => \$HELP, 'impl=s' => \$SPFIMPL, 'query-opt=s' => \$QUERY_OPT, 'program=s' => \$SPFPROG, 'data=s' => \$SPFDATA, 'todo=i' => \%TODO, '-pipe-out' => \$PIPE_OUT, '-pipe-in' => \$PIPE_IN, ); if ($HELP || !$result) { print <; chomp @test_table; close TESTFILE; # this is supposed to be in a BEGIN clause, but I don't know perl # well enough to get the -data option to work that way. -wayne my @tests = grep { /^\s*spfquery / } @test_table; if ( $SPFIMPL eq "libspf-alt" ) { plan tests => 1 + @tests*3, todo => [362 .. 364, 503 .. 508]; } else { plan tests => 1 + @tests*3; # the TODO option doesn't work, and I don't understand why -wayne # plan tests => 1 + @tests*3, %TODO; } # 1: did the library load okay? ok(1); ######################### sub check_last_command { my ($ok, $default, $options, $result, $smtp_comment, $header_comment, $received_spf ) = @_; if (!$ok && !$Test::todo{$Test::ntest - 1}) { print "$SPFPROG $default $options $QUERY_OPT\n"; printf "Result: %s\n", $result; printf "SMTP comment: %s\n", $smtp_comment; printf "Header comment: %s\n", $header_comment; printf "Received-SPF: %s\n", $received_spf; open( SPFQUERY_DEBUG, "$SPFPROG $default $options $QUERY_OPT -debug=1 |" ); while () { print $_; } close( SPFQUERY_DEBUG ); if ($@) { print " trapped error: $@\n"; next; } } } my $default; my $options; my ($result, $smtp_comment, $header_comment, $received_spf); my ($found_result, $found_smtp_comment, $found_header_comment, $found_received_spf); my $command_checked = 1; my $ok = 1; if ( $PIPE_IN ) { *SPFQUERY = \*STDIN; while () { print "skipping: $_"; last if $_ eq "ok 1\n"; } } foreach my $line (@test_table) { $line =~ s/^\s*//; next if $line =~ /^$/; next if $line =~ /^#/; my ($command, $implre, $matchre) = split( ' ', $line, 3 ); if ( $command eq "default" ) { $default = $implre . " " . $matchre; } elsif ( $command eq "spfquery" ) { my $prev_options = $options; $options = $implre . " " . $matchre; if ( $PIPE_OUT ) { next if $options =~ /-local=/; if ( !$spfquery_init ) { open( SPFQUERY, "| $SPFPROG $default $QUERY_OPT -file -" ); $spfquery_init = 1; } my ($ip, $sender, $helo, $rcpt_to); ($ip) = ($options =~ m/-ip=([^ ][^ ]*)/); ($sender) = ($options =~ m/-sender=([^ ][^ ]*)/); ($helo) = ($options =~ m/-helo=([^ ][^ ]*)/); ($rcpt_to) = ($options =~ m/-rcpt-to=\"([^ ][^ ]*)\"/); printf SPFQUERY "$ip $sender $helo $rcpt_to\n"; } else { $found_result = $found_smtp_comment = $found_header_comment = $found_received_spf = 0; if ( !$command_checked ) { check_last_command($ok, $default, $prev_options, $result, $smtp_comment, $header_comment, $received_spf); $command_checked = 1; } next if $PIPE_IN && $options =~ /-local=/; open( SPFQUERY, "$SPFPROG $default $options $QUERY_OPT |" ) if ( !$PIPE_IN ); $ok = 1; chomp( $result = ); chomp( $smtp_comment = ); chomp( $header_comment = ); chomp( $received_spf = ); close( SPFQUERY ) if !$PIPE_IN; $command_checked = 0; } } else { next if $PIPE_OUT; if ( $implre =~ m,^/.*/$, ) { $implre =~ s,^/(.*)/$,$1,; next if $SPFIMPL !~ /$implre/; } else { next if $SPFIMPL ne $implre; } my $skip_test = !$ok || ($PIPE_IN && $options =~ /-local=/); if ( $command eq "result" ) { if ( !$found_result ) { $ok &= skip($skip_test, $result, $matchre); } $found_result = 1; } elsif ( $command eq "smtp-comment" ) { if ( !$found_smtp_comment ) { $ok &= skip($skip_test, $smtp_comment, $matchre); } $found_smtp_comment = 1; } elsif ( $command eq "header-comment" ) { if ( !$found_header_comment ) { $ok &= skip($skip_test, $header_comment, $matchre); } $found_header_comment = 1; } elsif ( $command eq "received-spf" ) { if ( !$found_received_spf ) { # $ok &= skip($skip_test, $received_spf, $matchre); # $ok &= skip($skip_test, $received_spf, "/^Received-SPF: *$result \\($header_comment\\)/" ); } $found_received_spf = 1; } else { $ok &= ok( $command, "", "invalid test command" ); } } } if ( !$command_checked ) { check_last_command($ok, $default, $options, $result, $smtp_comment, $header_comment, $received_spf); $command_checked = 1; } close( SPFQUERY ) if $PIPE_OUT;