blob: d9f2923b8a54874e7aba0465f6f58e5852efe6ea [file] [log] [blame]
#!/usr/bin/perl -w -T
BEGIN {
if (-e 't/test_dir') { # if we are running "t/rule_names.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("meta");
use Mail::SpamAssassin;
use vars qw( %rules %scores $perl_path);
# "parse-rules-for-masses" requires Data::Dumper
use constant HAS_DATADUMPER => eval 'use Data::Dumper; 1;';
use Test::More;
plan skip_all => "Needs Data::Dumper" unless HAS_DATADUMPER;
plan skip_all => "Tests don't work on Windows" if $^O =~ /^(mswin|dos|os2)/i;
plan tests => 2;
# meta failures
my $meta_dependency_disabled = 0;
my $meta_dependency_nonexistent = 0;
for (my $scoreset = 0; $scoreset < 4; $scoreset++) {
my $output = "log/rules-$scoreset.pl";
unlink $output || die;
%rules = ();
%scores = ();
if (untaint_system("$perl_path $prefix/build/parse-rules-for-masses -o $output -d \"$prefix/rules\" -s $scoreset -x")) {
warn "parse-rules-for-masses failed!";
}
eval {
require "log/rules-$scoreset.pl";
};
if ($@) {
warn "log/rules-$scoreset.pl is unparseable: $@";
warn "giving up on test.";
ok(1);
ok(1);
exit;
}
while (my ($name, $info) = each %rules) {
next if ($name eq '_scoreset');
my $type = $info->{type} || "unknown";
# look at meta rules that are not disabled
if ($type eq "meta" && ($name =~ /^__/ || $info->{score} != 0)) {
if ($info->{depends}) {
for my $depend (@{ $info->{depends} }) {
if (!exists $rules{$depend}) {
warn "$name depends on $depend which is nonexistent\n";
$meta_dependency_nonexistent = 1;
next;
}
# if dependency is a predicate, it'll run
next if $depend =~ /^__/;
# if dependency has a non-zero score, it'll run
next if (defined $rules{$depend}->{score} &&
$rules{$depend}->{score} != 0);
# ignore "tflags net" and "tflags learn" rules -- it is OK
# for those to have zero scores in some scoresets, for obvious
# reasons.
next if (defined $rules{$depend}->{tflags} &&
$rules{$depend}->{tflags} =~ /\b(?:net|learn)\b/);
warn "$name depends on $depend with 0 score in set $scoreset\n";
$meta_dependency_disabled = 1;
}
}
}
}
}
ok(!$meta_dependency_disabled);
ok(!$meta_dependency_nonexistent);