t/urilocalbl.t (163 lines of code) (raw):
#!/usr/bin/perl -T
use lib '.'; use lib 't';
use SATest; sa_t_init("urilocalbl");
my $tests = 0;
eval { require MaxMind::DB::Reader; $tests += 8; $has{GEOIP2} = 1 };
eval { require IP::Geolocation::MMDB; $tests += 8; $has{IPMMDB} = 1 };
eval { require Geo::IP; $tests += 8; $has{GEOIP} = 1 };
eval {
require IP::Country::DB_File;
IP::Country::DB_File->new('data/geodb/ipcc.db');
$tests += 8;
$has{DB_FILE} = 1;
};
eval { require IP::Country::Fast; $tests += 8; $has{FAST} = 1 };
use Test::More;
plan skip_all => "Net tests disabled" unless conf_bool('run_net_tests');
plan skip_all => "No supported GeoDB module installed" unless $tests;
$net = conf_bool('run_net_tests');
$ipv6 = $net && conf_bool('run_ipv6_dns_tests');
$tests *= 2 if $net;
$tests += 1 if $ipv6 && defined $has{GEOIP2};
$tests += 1 if $ipv6 && defined $has{IPMMDB};
$tests += 1 if $ipv6 && defined $has{DB_FILE};
plan tests => $tests;
# ---------------------------------------------------------------------------
tstpre ("
loadplugin Mail::SpamAssassin::Plugin::URILocalBL
");
%patterns_ipv4 = (
q{ X_URIBL_USA } => 'USA',
q{ X_URIBL_FINEG } => 'except Finland',
q{ X_URIBL_NA } => 'north America',
q{ X_URIBL_EUNEG } => 'except Europe',
q{ X_URIBL_CIDR1 } => 'our TestIP1',
q{ X_URIBL_CIDR2 } => 'our TestIP2',
q{ X_URIBL_CIDR3 } => 'our TestIP3',
);
%patterns_ipv6 = (
q{ X_URIBL_CIDR4 } => 'our TestIP4',
);
my $rules = "
dns_query_restriction allow google.com
uri_block_cc X_URIBL_USA us
describe X_URIBL_USA uri located in USA
uri_block_cc X_URIBL_FINEG !fi
describe X_URIBL_FINEG uri located anywhere except Finland
uri_block_cont X_URIBL_NA na
describe X_URIBL_NA uri located in north America
uri_block_cont X_URIBL_EUNEG !eu !af
describe X_URIBL_EUNEG uri located anywhere except Europe/Africa
uri_block_cidr X_URIBL_CIDR1 8.0.0.0/8 1.2.3.4
describe X_URIBL_CIDR1 uri is our TestIP1
uri_block_cidr X_URIBL_CIDR2 8.8.8.8
describe X_URIBL_CIDR2 uri is our TestIP2
uri_block_cidr X_URIBL_CIDR3 8.8.8.0/24
describe X_URIBL_CIDR3 uri is our TestIP3
";
my $rules_ipv6 = "
uri_block_cidr X_URIBL_CIDR4 2001:4860:4860::8888
describe X_URIBL_CIDR4 uri is our TestIP4
";
my @geoip2_readers = (
['GEOIP2', 'MaxMind::DB::Reader', 'GeoIP2'],
['IPMMDB', 'IP::Geolocation::MMDB', 'IP::Geolocation::MMDB'],
);
for my $reader (@geoip2_readers) {
my ($geoip2, $reader_class, $geodb_module) = @{$reader};
if (defined $has{$geoip2}) {
my $lrules = "
geodb_module $geodb_module
geodb_search_path data/geodb
$rules
";
tstlocalrules ($lrules);
%patterns = %patterns_ipv4;
ok sarun ("-L -t < data/spam/relayUS.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
if ($net) {
$lrules .= $rules_ipv6 if $ipv6;
tstlocalrules ($lrules);
if ($ipv6) {
%patterns = (%patterns_ipv4, %patterns_ipv6);
} else {
%patterns = %patterns_ipv4;
warn "skipping IPv6 DNS lookup tests (run_ipv6_dns_tests=n)\n";
}
ok sarun ("-t < data/spam/urilocalbl_net.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
} else {
warn "skipping DNS lookup tests (run_net_tests=n)\n";
}
} else {
warn "skipping $reader_class (GeoIP2) tests (not installed)\n";
}
}
if (defined $has{GEOIP}) {
tstlocalrules ("
geodb_module Geo::IP
geodb_search_path data/geodb
$rules
");
%patterns = %patterns_ipv4;
ok sarun ("-L -t < data/spam/relayUS.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
if ($net) {
ok sarun ("-t < data/spam/urilocalbl_net.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
} else {
warn "skipping DNS lookup tests (run_net_tests=n)\n";
}
} else {
warn "skipping Geo::IP tests (not installed)\n";
}
if (defined $has{DB_FILE}) {
my $lrules = "
geodb_module DB_File
geodb_options country:data/geodb/ipcc.db
$rules
";
tstlocalrules ($lrules);
%patterns = %patterns_ipv4;
ok sarun ("-L -t < data/spam/relayUS.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
if ($net) {
$lrules .= $rules_ipv6 if $ipv6;
tstlocalrules ($lrules);
if ($ipv6) {
%patterns = (%patterns_ipv4, %patterns_ipv6);
} else {
%patterns = %patterns_ipv4;
warn "skipping IPv6 DNS lookup tests (run_ipv6_dns_tests=n)\n";
}
ok sarun ("-t < data/spam/urilocalbl_net.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
} else {
warn "skipping DNS lookup tests (run_net_tests=n)\n";
}
} else {
warn "skipping IP::Country::DB_File tests (not installed or ipcc.db file format not compatible)\n";
}
if (defined $has{FAST}) {
tstlocalrules ("
geodb_module Fast
$rules
");
%patterns = %patterns_ipv4;
ok sarun ("-L -t < data/spam/relayUS.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
if ($net) {
ok sarun ("-t < data/spam/urilocalbl_net.eml", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
} else {
warn "skipping DNS lookup tests (run_net_tests=n)\n";
}
} else {
warn "skipping IP::Country::Fast tests (not installed)\n";
}