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