1#!/usr/bin/perl -T 2 3use lib '.'; use lib 't'; 4use SATest; sa_t_init("spamd_protocol_10"); 5 6use Test::More; 7plan skip_all => "Spamd tests disabled" if $SKIP_SPAMD_TESTS; 8plan tests => 10; 9 10use File::Path; 11use IO::Socket; 12 13# --------------------------------------------------------------------------- 14 15%patterns = ( 16 q{ SPAMD/1.1 0 EX_OK }, 'response-11', 17 q{ Spam: True ; }, 'spamheader', # we use a regexp later for the rest 18 q{ GTUBE }, 'gtube', 19); 20 21 22start_spamd("-L"); 23 24my $data = ""; 25open (GTUBE, "data/spam/gtube.eml") || die $!; 26foreach (<GTUBE>) { 27 s/\r?\n?$/\n/; 28 print "GTUBE: $_"; 29 $data .= $_; 30} 31close (GTUBE); 32 33my $out; 34 35for ($p = 0; $p <= 1; $p++) { 36 $out = run_symbols ($data, $p); 37 ok (defined ($out)); 38 39 if ($out =~ /Spam: True \; ([\d\.]+) \/ 5\.0/) { 40 # the exact count could be just over or under 1000. compute! 41 ok ($1 >= 980 && $1 < 1020); 42 } 43 44 patterns_run_cb ($out); 45 ok_all_patterns(); 46 clear_pattern_counters(); 47} 48 49stop_spamd(); 50exit; 51 52 53sub run_symbols { 54 my($data, $proto10) = @_; 55 my $use_inet4 = 56 !$have_inet6 || 57 ($have_inet4 && $spamdhost =~ /^\d+\.\d+\.\d+\.\d+\z/); 58 my %args = ( PeerAddr => $spamdhost, 59 PeerPort => $spamdport, 60 Proto => "tcp", 61 Type => SOCK_STREAM 62 ); 63 $socket = $use_inet4 ? IO::Socket::INET->new(%args) 64 : IO::Socket::INET6->new(%args); 65 unless ($socket) { 66 warn("FAILED - Couldn't Connect to SpamCheck Host\n"); 67 return undef; 68 } 69 70 if ($proto10) { 71 sockwrite ("SYMBOLS SPAMC/1.0\r\n"); 72 } 73 else { 74 sockwrite ("SYMBOLS SPAMC/1.2\r\n"); 75 sockwrite ("Content-Length: " . length($data) . "\r\n"); 76 sockwrite ("\r\n"); 77 } 78 sockwrite ($data); 79 80 shutdown($socket, 1); 81 82 $data = ""; 83 while (<$socket>) { 84 s/\r?\n?$/\n/; 85 print "READ: $_"; 86 $data .= $_; 87 } 88 89 $socket = undef; 90 91 return $data; 92} 93 94sub sockwrite { 95 my $data = shift; 96 print $socket $data; 97 $data =~ s/^/WRITE: /mg; 98 print $data; 99} 100 101