| #!/usr/bin/perl -w -T |
| |
| BEGIN { |
| if (-e 't/test_dir') { # if we are running "t/rule_tests.t", kluge around ... |
| chdir 't'; |
| } |
| |
| if (-e 'test_dir') { # running from test directory, not .. |
| unshift(@INC, '../blib/lib'); |
| } |
| } |
| |
| my $prefix = '.'; |
| if (-e 'test_dir') { # running from test directory, not .. |
| $prefix = '..'; |
| } |
| |
| 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 |
| |
| 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=log/localrules.tmp --reuse --file log/mail.txt > log/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("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=log/localrules.tmp --file log/mail.txt > log/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("noreuse.out", \&patterns_run_cb); |
| ok_all_patterns(); |
| clear_pattern_counters(); |
| |
| # test with reuse |
| ok_system("$perl_path -w ../masses/mass-check -c=log/localrules.tmp --reuse --file log/mail.txt > log/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("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=log/localrules.tmp --reuse --file log/mail.txt > log/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("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) |
| |
| } |
| |