#!/usr/bin/perl # # File: test.pl # Author: James Couzens (Maintainer) # Author: Wayne Schlitt (Author) # Author: Meng Weng Wong (Original Author) # # Desc: # Originally designed to stress test any SPF implementation however # this particular implementation has long since been updated with any of Wayne's # code since he has added many "features" to his library which I disagree with. # We don't need features at this stage, we need stable code. Quite frankly, # we don't need any features, we just need what the RFC states. # # Date: 01/25/04 - based on the perl Mail-SPF-Query-1.99.tar # Date: 07/28/04 - Edit to use to spfqtool # Date: 10/07/04 - cleaned this mess up, no wonder people think perl is ugly # ######################### use Test; use strict; use Getopt::Long; my $HELP = 0; my $SPFPROG = "./spfqtool_static"; my $SPFDATA = "test.txt"; my $VALGRIND = '/usr/bin/valgrind'; my $VG_OPTS = '--log-file=vg_test.txt --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 --trace-children=yes'; my $result = GetOptions( 'help' => \$HELP, 'program=s' => \$SPFPROG, 'data=s' => \$SPFDATA, ); if ($HELP || !$result) { print <; chomp @test_table; close(TESTFILE); plan tests => (1 + @test_table); }; # 1: did the library load okay? ok(1); ######################### foreach my $tuple (@test_table) { my ($num, $domain, $ipv4, $expected_result, $expected_smtp_comment, $expected_header_comment) = $tuple =~ /\t/ ? split(/\t/, $tuple) : split(' ', $tuple); my ($sender, $localpolicy) = split(':', $domain, 2); $sender =~ s/\\([0-7][0-7][0-7])/chr(oct($1))/ge; $domain = $sender; if ($domain =~ /\@/) { ($domain) = $domain =~ /\@(.+)/ } if ($expected_result =~ /=(pass | fail),/) { print "these tests are not implemented yet.\n"; for (my $debug = 0; $debug < 2; $debug++) { last; my $query = ""; my $ok = 1; my $header_comment; foreach my $e_result (split(/,/, $expected_result)) { if ($e_result !~ /=/) { my ($msg_result, $smtp_comment); ($msg_result, $smtp_comment, $header_comment) = eval { $query->message_result2 }; # its this kind of code that makes people hate perl !@($*_#! $ok = ok($msg_result, $e_result) if (!$debug); if (!$ok) { last; } } else { my ($recip, $expected_recip_result) = split(/=/, $e_result, 2); my ($recip_result, $smtp_comment) = eval { $query->result2(split(';',$recip)) }; $ok = ok($recip_result, $expected_recip_result) if (!$debug); if (!$ok) { last; } } # else } # foreach $header_comment =~ s/\S+: //; # strip the reporting hostname prefix if ($expected_header_comment) { $ok &= ok($header_comment, $expected_header_comment) if (!$debug); } last if ($ok); } # foreach } # if expected result else { open(SPFQUERY, "$SPFPROG -i \"$ipv4\" -s \"$sender\" -h \"$domain\" -z 1 |"); my ($result, $smtp_comment, $header_comment); chomp($result = ); chomp($smtp_comment = ); chomp($header_comment = ); close(SPFQUERY); $header_comment =~ s/^\S+: //; # strip the reporting hostname prefix print "bin/spfqtool_static -i $ipv4 -s $sender -h $domain -z 1\n"; my $ok = (! $expected_smtp_comment ? ok($result, $expected_result) : (ok($result, $expected_result) && ok($smtp_comment, $expected_smtp_comment) && ok($header_comment, $expected_header_comment))); if (not $ok) { print "./spfqtool_static -i \"$ipv4\" -s \"$sender\" -h \"$domain\" -z 1 |\n"; printf "Result: %s\n", $result; printf "SMTP comment: %s\n", $smtp_comment; printf "Header comment: %s\n", $header_comment; open(SPFQUERY, "$SPFPROG -i \"$ipv4\" -s \"$sender\" -h \"$domain\" -z 1 |"); while() { print $_; } close(SPFQUERY); if ($@) { print " trapped error: $@\n"; next; } } # if (not $ok) } # else } # foreach # end of test.pl