use
POSIX
qw(WIFEXITED WIFSIGNALED WIFSTOPPED WEXITSTATUS WTERMSIG WSTOPSIG)
;
use
vars
qw($RUNNING_ON_WINDOWS $SSL_AVAILABLE
$SKIP_SPAMD_TESTS $SKIP_SPAMC_TESTS $NO_SPAMC_EXE
$SKIP_SETUID_NOBODY_TESTS $SKIP_DNSBL_TESTS
$have_inet4 $have_inet6 $spamdhost $spamdport
$workdir $siterules $localrules $userrules $userstate
$keep_workdir $mainpid $spamd_pidfile)
;
my
$sa_code_dir
;
BEGIN {
use
vars
qw(@ISA @EXPORT @EXPORT_OK)
;
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw($have_inet4 $have_inet6 $spamdhost $spamdport)
;
$RUNNING_ON_WINDOWS
= ($^O =~ /^(mswin|dos|os2)/oi);
$SKIP_SPAMD_TESTS
=
$RUNNING_ON_WINDOWS
||
(
$ENV
{
'SPAMD_HOST'
} && !(
$ENV
{
'SPAMD_HOST'
} eq
'127.0.0.1'
||
$ENV
{
'SPAMD_HOST'
} eq
'::1'
||
$ENV
{
'SPAMD_HOST'
} eq
'localhost'
) );
$SKIP_SETUID_NOBODY_TESTS
= 0;
$SKIP_DNSBL_TESTS
= 0;
$have_inet4
=
eval
{
my
$sock
= IO::Socket::INET->new(
LocalAddr
=>
'127.0.0.1'
,
Proto
=>
'udp'
);
$sock
->
close
or
die
"error closing inet socket: $!"
if
$sock
;
$sock
? 1 :
undef
;
};
$have_inet6
=
eval
{
my
$sock
= IO::Socket::INET6->new(
LocalAddr
=>
'::1'
,
Proto
=>
'udp'
);
$sock
->
close
or
die
"error closing inet6 socket: $!"
if
$sock
;
$sock
? 1 :
undef
;
};
if
(!
$RUNNING_ON_WINDOWS
) {
$ENV
{
'PATH'
} =
'/bin:/usr/bin:/usr/local/bin'
;
delete
@ENV
{
qw(IFS CDPATH ENV BASH_ENV)
};
}
else
{
my
@pathdirs
=
split
(
';'
,
$ENV
{
'PATH'
});
$ENV
{
'PATH'
} =
join
(
';'
,
map
{
my
$pathdir
=
$_
;
$pathdir
=~ s/\\*\z//;
my
$abspathdir
= File::Spec->canonpath(Cwd::realpath(
$pathdir
))
if
(-d
$pathdir
);
if
(
defined
$abspathdir
) {
$abspathdir
=~ /^(.*)\z/s;
$abspathdir
= $1;
}
((
defined
$abspathdir
) and (
lc
$pathdir
eq
lc
$abspathdir
))?(
$abspathdir
):()
}
@pathdirs
);
}
if
(-e
't/test_dir'
) {
$sa_code_dir
=
'blib/lib'
; }
elsif
(-e
'test_dir'
) {
$sa_code_dir
=
'../blib/lib'
; }
else
{
die
"FATAL: not in or below test directory?\n"
; }
File::Spec->rel2abs(
$sa_code_dir
) =~ /^(.*)\z/s;
$sa_code_dir
= $1;
if
(not -d
$sa_code_dir
) {
die
"FATAL: not in expected directory relative to built code tree?\n"
;
}
}
sub
sa_t_init {
my
$tname
=
shift
;
$mainpid
= $$;
if
(
$config
{PERL_PATH}) {
$perl_path
=
$config
{PERL_PATH};
}
elsif
($^X =~ m|^/|) {
$perl_path
= $^X;
}
else
{
$perl_path
=
$Config
{perlpath};
$perl_path
=~ s|/[^/]*$|/$^X|;
}
$perl_cmd
=
$perl_path
;
if
(
$ENV
{
'PERL5OPT'
}) {
my
$o
=
$ENV
{
'PERL5OPT'
};
if
(
$o
=~ /(Devel::Cover)/) {
warn
"# setting TEST_PERL_TAINT=no to avoid lack of taint-safety in $1\n"
;
$ENV
{
'TEST_PERL_TAINT'
} =
'no'
;
}
$perl_cmd
.=
" \"$o\""
;
}
$perl_cmd
.=
" -T"
if
!
defined
(
$ENV
{
'TEST_PERL_TAINT'
}) or
$ENV
{
'TEST_PERL_TAINT'
} ne
'no'
;
$perl_cmd
.=
" -w"
if
!
defined
(
$ENV
{
'TEST_PERL_WARN'
}) or
$ENV
{
'TEST_PERL_WARN'
} ne
'no'
;
my
@pathdirs
=
@INC
;
if
(
$ENV
{
'PERL5LIB'
}) {
@pathdirs
=
split
(
$Config
{path_sep},
$ENV
{
'PERL5LIB'
});
}
my
$inc_opts
=
join
(
' -I'
,
map
{
my
$pathdir
=
$_
;
my
$canonpathdir
= File::Spec->canonpath(Cwd::realpath(
$pathdir
))
if
((-d
$pathdir
) and File::Spec->file_name_is_absolute(
$pathdir
));
if
(
defined
$canonpathdir
) {
$canonpathdir
=~ /^(.*)\z/s;
$canonpathdir
= $1;
}
((
defined
$canonpathdir
))?(
$canonpathdir
):()
}
@pathdirs
);
$perl_cmd
.=
" -I$inc_opts"
if
(
$inc_opts
);
$scr
=
$ENV
{
'SPAMASSASSIN_SCRIPT'
};
$scr
||=
"$perl_cmd ../spamassassin.raw"
;
$spamd
=
$ENV
{
'SPAMD_SCRIPT'
};
$spamd
||=
"$perl_cmd ../spamd/spamd.raw"
;
$spamc
=
$ENV
{
'SPAMC_SCRIPT'
};
$spamc
||=
"../spamc/spamc"
;
$salearn
=
$ENV
{
'SALEARN_SCRIPT'
};
$salearn
||=
"$perl_cmd ../sa-learn.raw"
;
$saawl
=
$ENV
{
'SAAWL_SCRIPT'
};
$saawl
||=
"$perl_cmd ../sa-awl"
;
$sacheckspamd
=
$ENV
{
'SACHECKSPAMD_SCRIPT'
};
$sacheckspamd
||=
"$perl_cmd ../sa-check_spamd"
;
$spamdlocalhost
=
$ENV
{
'SPAMD_LOCALHOST'
};
if
(!
$spamdlocalhost
) {
$spamdlocalhost
=
$have_inet4
|| !
$have_inet6
?
'127.0.0.1'
:
'::1'
;
}
$spamdhost
=
$ENV
{
'SPAMD_HOST'
};
$spamdhost
||=
$spamdlocalhost
;
if
(
$tname
!~ /spam[cd]/) {
$TEST_DOES_NOT_RUN_SPAMC_OR_D
= 1;
}
else
{
$spamdport
=
$ENV
{
'SPAMD_PORT'
};
}
(-f
"t/test_dir"
) &&
chdir
(
"t"
);
-f
"test_dir"
or
die
"FATAL: not in test directory?\n"
;
mkdir
(
"log"
, 0755);
-d
"log"
or
die
"FATAL: failed to create log dir\n"
;
chmod
(0755,
"log"
);
if
(!
$RUNNING_ON_WINDOWS
) {
untaint_system(
"chacl -B log 2>/dev/null || setfacl -b log 2>/dev/null"
);
}
if
(
defined
$workdir
) {
if
(!
$keep_workdir
) {
rmtree(
$workdir
);
}
}
$workdir
= tempdir(
"$tname.XXXXXX"
,
DIR
=>
"log"
);
die
"FATAL: failed to create workdir: $!"
unless
-d
$workdir
;
chmod
(0755,
$workdir
);
}
sub
untaint_var {
local
($1);
$_
[0] =~ /^(.*)\z/s;
return
$1;
}
sub
untaint_system {
my
@args
;
push
@args
, untaint_var(
$_
)
foreach
(
@_
);
return
system
(
@args
);
}
END {
if
(
defined
$workdir
&& !
$keep_workdir
&& $$ ==
$mainpid
) {
rmtree(
$workdir
);
}
}
1;