blob: 718230bd122d63095262bfa44707e9d3ebca6d6d [file] [log] [blame]
#!/usr/bin/perl -w -T
use strict;
use lib '.'; use lib 't';
use SATest; sa_t_init("reuse");
use vars qw(%patterns %anti_patterns $perl_path &patterns_run_cb);
use Mail::SpamAssassin;
use Test::More;
plan skip_all => "no mass check" unless (-e '../masses/mass-check');
plan tests => 37;
# Tests the following cases:
# - No reuse: no change
# - Reuse and no X-Spam-Status: no change
# - Reuse on: metas work
# - Reuse works with existing tests (disabled)
# - Reuse works with non-existing tests (they get scores)
# - Reuse handles multiple "old rule names"
# - Reuse works in positive and negative cases
# - Rules defined only by "reuse" can have arbitrary scores and priorities set
# Need all files under $localrules for mass-check
foreach my $tainted (<$siterules/*.pre>) {
$tainted =~ /(.*)/;
my $file = $1;
copy ($file, "$localrules")
or warn "cannot copy $file to $localrules: $!";
}
tstlocalrules('
# suppress RB warnings
util_rb_tld com
# Check that order of reuse/body lines for BODY_RULE_* does not matter
reuse BODY_RULE_1
body BODY_RULE_1 /./
score BODY_RULE_1 1.0
body BODY_RULE_2 /\bfoobar\b/
score BODY_RULE_2 1.0
header HEADER_RULE_1 Subject =~ /\bmessage\b/
meta META_RULE_1 BODY_RULE_1 || BODY_RULE_2
reuse BODY_RULE_2
priority BODY_RULE_2 -2
score BODY_RULE_2 1.5
reuse NEW_RULE OTHER_RULE
priority NEW_RULE -3
score NEW_RULE 0.5
reuse OTHER_RULE
priority OTHER_RULE -4
reuse RENAMED_RULE OLD_RULE_1 OLD_RULE_2 OLD_RULE_3
reuse SCORED_RULE OLD_RULE_2
score SCORED_RULE 2.0
priority SCORED_RULE -1
');
# reuse on, mail has no X-Spam-Status
write_mail(0);
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/noxss.out");
%patterns = (
'BODY_RULE_1' => 'BODY_RULE_1',
'HEADER_RULE_1' => 'HEADER_RULE_1',
'META_RULE_1' => 'META_RULE_1'
);
%anti_patterns = (
'NEW_RULE' => 'NEW_RULE',
'OTHER_RULE' => 'OTHER_RULE',
'RENAMED_RULE' => 'RENAMED_RULE',
'NONEXISTANT_RULE' => 'NONEXISTANT_RULE',
'BODY_RULE_2' => 'BODY_RULE_2',
'SCORED_RULE' => 'SCORED_RULE'
);
checkfile("$workdir/noxss.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
# write mail with X-Spam-Status
write_mail(1);
# test without reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --file $workdir/mail.txt > $workdir/noreuse.out");
%patterns = (
'BODY_RULE_1' => 'BODY_RULE_1',
'HEADER_RULE_1' => 'HEADER_RULE_1',
'META_RULE_1' => 'META_RULE_1'
);
%anti_patterns = (
'NEW_RULE' => 'NEW_RULE',
'OTHER_RULE' => 'OTHER_RULE',
'RENAMED_RULE' => 'RENAMED_RULE',
'NONEXISTANT_RULE' => 'NONEXISTANT_RULE',
'BODY_RULE_2' => 'BODY_RULE_2',
'SCORED_RULE' => 'SCORED_RULE'
);
checkfile("$workdir/noreuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
# test with reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/reuse.out");
%patterns = (
'HEADER_RULE_1' => 'HEADER_RULE_1',
'BODY_RULE_2' => 'BODY_RULE_2',
'META_RULE_1' => 'META_RULE_1',
'NEW_RULE' => 'NEW_RULE',
'OTHER_RULE' => 'OTHER_RULE',
'RENAMED_RULE' => 'RENAMED_RULE',
'SCORED_RULE' => 'SCORED_RULE',
'Y 8' => 'score'
);
%anti_patterns = (
'BODY_RULE_1' => 'BODY_RULE_1',
'NONEXISTANT_RULE' => 'NONEXISTANT_RULE'
);
checkfile("$workdir/reuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
tstlocalrules('
# suppress RB warnings
util_rb_tld com
meta META_RULE_1 RULE_A && !RULE_B
body RULE_A /./
reuse RULE_B OTHER_RULE
body RULE_C / does not hit /
meta META_RULE_2 (RULE_A && RULE_B) || RULE_C
');
write_mail(1);
# test with reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/metareuse.out");
%patterns = (
'META_RULE_2' => 'META_RULE_2',
'RULE_A' => 'RULE_A',
'RULE_B' => 'RULE_B',
);
%anti_patterns = (
'META_RULE_1' => 'META_RULE_1',
'RULE_C' => 'RULE_C',
);
checkfile("$workdir/metareuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
sub write_mail {
my ($x_spam_status) = @_;
my $msg = <<EOF;
Received: from internal.example.com [127.0.0.1] by localhost
for recipient\@example.com; Fri, 07 Oct 2002 09:02:00 +0000
Received: from external.spammer.com (external.spammer.com
[150.51.53.1]) by internal.example.com for recipient\@example.com;
Fri, 07 Oct 2002 09:01:00 +0000
Message-ID: <clean.1010101\@example.com>
Date: Mon, 07 Oct 2002 09:00:00 +0000
From: Sender <sender\@this-spammer.com>
MIME-Version: 1.0
To: Recipient <recipient\@example.com>
Subject: trivial message
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
EOF
if ($x_spam_status) {
$msg .= <<END;
X-Spam-Status: Yes, score=15.3 required=5.0 tests=BODY_RULE_2,
NONEXISTANT_RULE,OTHER_RULE,OLD_RULE_2,OLD_RULE_3
END
}
$msg .= <<END;
This is a test message.
END
tstfile($msg);
}
sub ok_system {
my $cmd = shift;
print "\t$cmd\n";
untaint_system($cmd);
my $exit_code = ($?>>8);
ok ($exit_code == 0)
}