more tests for Qpsmtpd.pm
This commit is contained in:
parent
b60c14a7c1
commit
f8e2fdb966
@ -264,12 +264,12 @@ sub _config_from_file {
|
|||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
my @config = <$CF>;
|
my @config = <$CF>;
|
||||||
chomp @config;
|
|
||||||
@config = grep { length($_) and $_ !~ m/^\s*#/ and $_ =~ m/\S/ }
|
|
||||||
map { s/^\s+//; s/\s+$//; $_; } # trim leading/trailing whitespace
|
|
||||||
@config;
|
|
||||||
close $CF;
|
close $CF;
|
||||||
|
|
||||||
|
chomp @config;
|
||||||
|
@config = grep { length($_) and $_ !~ m/^\s*#/ and $_ =~ m/\S/ } @config;
|
||||||
|
for (@config) { s/^\s+//; s/\s+$//; } # trim leading/trailing whitespace
|
||||||
|
|
||||||
my $pos = 0;
|
my $pos = 0;
|
||||||
while ($pos < @config) {
|
while ($pos < @config) {
|
||||||
|
|
||||||
@ -425,7 +425,7 @@ sub _load_package_plugin {
|
|||||||
qq[require $package;\n] . qq[sub ${plugin}::plugin_name { '$plugin' }];
|
qq[require $package;\n] . qq[sub ${plugin}::plugin_name { '$plugin' }];
|
||||||
$eval =~ m/(.*)/s;
|
$eval =~ m/(.*)/s;
|
||||||
$eval = $1;
|
$eval = $1;
|
||||||
eval $eval;
|
eval $eval; ## no critic (Eval)
|
||||||
die "Failed loading $package - eval $@" if $@;
|
die "Failed loading $package - eval $@" if $@;
|
||||||
if ($plugin_line !~ /logging/) {
|
if ($plugin_line !~ /logging/) {
|
||||||
$self->log(LOGDEBUG, "Loading $package ($plugin_line)");
|
$self->log(LOGDEBUG, "Loading $package ($plugin_line)");
|
||||||
@ -476,7 +476,6 @@ sub pause_read { die "Continuations only work in qpsmtpd-async" }
|
|||||||
sub run_continuation {
|
sub run_continuation {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
#my $t1 = $SAMPLER->("run_hooks", undef, 1);
|
|
||||||
die "No continuation in progress" unless $self->{_continuation};
|
die "No continuation in progress" unless $self->{_continuation};
|
||||||
$self->continue_read();
|
$self->continue_read();
|
||||||
my $todo = $self->{_continuation};
|
my $todo = $self->{_continuation};
|
||||||
@ -488,8 +487,6 @@ sub run_continuation {
|
|||||||
while (@$todo) {
|
while (@$todo) {
|
||||||
my $code = shift @$todo;
|
my $code = shift @$todo;
|
||||||
|
|
||||||
#my $t2 = $SAMPLER->($hook . "_" . $code->{name}, undef, 1);
|
|
||||||
#warn("Got sampler called: ${hook}_$code->{name}\n");
|
|
||||||
$self->varlog(LOGDEBUG, $hook, $code->{name});
|
$self->varlog(LOGDEBUG, $hook, $code->{name});
|
||||||
my $tran = $self->transaction;
|
my $tran = $self->transaction;
|
||||||
eval { (@r) = $code->{code}->($self, $tran, @$args); };
|
eval { (@r) = $code->{code}->($self, $tran, @$args); };
|
||||||
@ -567,7 +564,6 @@ sub run_continuation {
|
|||||||
sub hook_responder {
|
sub hook_responder {
|
||||||
my ($self, $hook, $msg, $args) = @_;
|
my ($self, $hook, $msg, $args) = @_;
|
||||||
|
|
||||||
#my $t1 = $SAMPLER->("hook_responder", undef, 1);
|
|
||||||
my $code = shift @$msg;
|
my $code = shift @$msg;
|
||||||
|
|
||||||
my $responder = $hook . '_respond';
|
my $responder = $hook . '_respond';
|
||||||
@ -578,40 +574,41 @@ sub hook_responder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub _register_hook {
|
sub _register_hook {
|
||||||
my $self = shift;
|
my ($self, $hook, $code, $unshift) = @_;
|
||||||
my ($hook, $code, $unshift) = @_;
|
|
||||||
|
|
||||||
if ($unshift) {
|
if ($unshift) {
|
||||||
unshift @{$hooks->{$hook}}, $code;
|
unshift @{$hooks->{$hook}}, $code;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
push @{$hooks->{$hook}}, $code;
|
push @{$hooks->{$hook}}, $code;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
sub spool_dir {
|
sub spool_dir {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
unless ($Spool_dir) { # first time through
|
return $Spool_dir if $Spool_dir; # already set
|
||||||
|
|
||||||
$self->log(LOGDEBUG, "Initializing spool_dir");
|
$self->log(LOGDEBUG, "Initializing spool_dir");
|
||||||
$Spool_dir = $self->config('spool_dir') || $self->tildeexp('~/tmp/');
|
$Spool_dir = $self->config('spool_dir') || $self->tildeexp('~/tmp/');
|
||||||
|
|
||||||
$Spool_dir .= "/" unless ($Spool_dir =~ m!/$!);
|
$Spool_dir .= "/" if $Spool_dir !~ m!/$!;
|
||||||
|
|
||||||
$Spool_dir =~ /^(.+)$/ or die "spool_dir not configured properly";
|
$Spool_dir =~ /^(.+)$/ or die "spool_dir not configured properly";
|
||||||
$Spool_dir = $1; # cleanse the taint
|
$Spool_dir = $1; # cleanse the taint
|
||||||
|
|
||||||
my $Spool_perms = $self->config('spool_perms') || '0700';
|
my $Spool_perms = $self->config('spool_perms') || '0700';
|
||||||
|
|
||||||
if (!-d $Spool_dir) { # create it if it doesn't exist
|
if (!-d $Spool_dir) { # create if it doesn't exist
|
||||||
mkdir($Spool_dir, oct($Spool_perms))
|
mkdir($Spool_dir, oct($Spool_perms))
|
||||||
or die "Could not create spool_dir $Spool_dir: $!";
|
or die "Could not create spool_dir $Spool_dir: $!";
|
||||||
}
|
}
|
||||||
|
|
||||||
# Make sure the spool dir has appropriate rights
|
# Make sure the spool dir has appropriate rights
|
||||||
|
if (((stat $Spool_dir)[2] & oct('07777')) != oct($Spool_perms)) {
|
||||||
$self->log(LOGWARN,
|
$self->log(LOGWARN,
|
||||||
"Permissions on spool_dir $Spool_dir are not $Spool_perms")
|
"Permissions on spool_dir $Spool_dir are not $Spool_perms")
|
||||||
unless ((stat $Spool_dir)[2] & 07777) == oct($Spool_perms);
|
};
|
||||||
}
|
|
||||||
|
|
||||||
return $Spool_dir;
|
return $Spool_dir;
|
||||||
}
|
}
|
||||||
@ -629,10 +626,9 @@ sub temp_file {
|
|||||||
|
|
||||||
sub temp_dir {
|
sub temp_dir {
|
||||||
my ($self, $mask) = @_;
|
my ($self, $mask) = @_;
|
||||||
$mask ||= '0700';
|
|
||||||
my $dirname = $self->temp_file();
|
my $dirname = $self->temp_file();
|
||||||
-d $dirname
|
-d $dirname
|
||||||
or mkdir($dirname, $mask)
|
or mkdir($dirname, $mask || '0700')
|
||||||
or die "Could not create temporary directory $dirname: $!";
|
or die "Could not create temporary directory $dirname: $!";
|
||||||
return $dirname;
|
return $dirname;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
package Qpsmtpd::Plugin;
|
package Qpsmtpd::Plugin;
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
4
t/config/test_config_file
Normal file
4
t/config/test_config_file
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# a comment line that should get stripped
|
||||||
|
# another comment line that should get stripped
|
||||||
|
|
||||||
|
1st line with content
|
124
t/qpsmtpd.t
124
t/qpsmtpd.t
@ -21,16 +21,19 @@ my $qp = bless {}, 'Qpsmtpd';
|
|||||||
ok($qp->version(), "version, " . $qp->version());
|
ok($qp->version(), "version, " . $qp->version());
|
||||||
is_deeply(Qpsmtpd::hooks(), {}, 'hooks, empty');
|
is_deeply(Qpsmtpd::hooks(), {}, 'hooks, empty');
|
||||||
|
|
||||||
|
__temp_file();
|
||||||
__temp_dir();
|
__temp_dir();
|
||||||
__size_threshold();
|
__size_threshold();
|
||||||
__authenticated();
|
__authenticated();
|
||||||
__auth_user();
|
__auth_user();
|
||||||
__auth_mechanism();
|
__auth_mechanism();
|
||||||
|
__spool_dir();
|
||||||
|
|
||||||
__log();
|
__log();
|
||||||
__load_logging();
|
__load_logging();
|
||||||
|
|
||||||
__config_dir();
|
__config_dir();
|
||||||
|
__config_from_file();
|
||||||
__get_qmail_config();
|
__get_qmail_config();
|
||||||
__config();
|
__config();
|
||||||
|
|
||||||
@ -43,10 +46,12 @@ sub __get_qmail_config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub __config_from_file {
|
sub __config_from_file {
|
||||||
|
my $test_file = 't/config/test_config_file';
|
||||||
# $configfile, $config, $visited
|
my @r = $qp->_config_from_file($test_file);
|
||||||
|
ok( @r, "_config_from_file, $test_file");
|
||||||
}
|
cmp_ok('1st line with content', 'eq', $r[0], "_config_from_file string compare");
|
||||||
|
ok( !$r[1], "_config_from_file");
|
||||||
|
};
|
||||||
|
|
||||||
sub __log {
|
sub __log {
|
||||||
my $warned = '';
|
my $warned = '';
|
||||||
@ -82,6 +87,68 @@ sub __load_logging {
|
|||||||
$Qpsmtpd::hooks->{logging} = undef; # restore
|
$Qpsmtpd::hooks->{logging} = undef; # restore
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub __spool_dir {
|
||||||
|
my $dir = $qp->spool_dir();
|
||||||
|
ok( $dir, "spool_dir is at $dir");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __temp_file {
|
||||||
|
my $r = $qp->temp_file();
|
||||||
|
ok( $r, "temp_file at $r");
|
||||||
|
if ($r && -f $r) {
|
||||||
|
unlink $r;
|
||||||
|
ok( unlink $r, "cleaned up temp file $r");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __temp_dir {
|
||||||
|
my $r = $qp->temp_dir();
|
||||||
|
ok( $r, "temp_dir at $r");
|
||||||
|
if ($r && -d $r) { File::Path::rmtree($r); }
|
||||||
|
|
||||||
|
$r = $qp->temp_dir('0775');
|
||||||
|
ok( $r, "temp_dir with mask, $r");
|
||||||
|
if ($r && -d $r) { File::Path::rmtree($r); }
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __size_threshold {
|
||||||
|
ok( ! $qp->size_threshold(), "size_threshold is undefined")
|
||||||
|
or warn "size_threshold: " . $qp->size_threshold;
|
||||||
|
|
||||||
|
$Qpsmtpd::Size_threshold = 5;
|
||||||
|
cmp_ok( 5, '==', $qp->size_threshold(), "size_threshold equals 5");
|
||||||
|
|
||||||
|
$Qpsmtpd::Size_threshold = undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __authenticated {
|
||||||
|
ok( ! $qp->authenticated(), "authenticated is undefined");
|
||||||
|
|
||||||
|
$qp->{_auth} = 1;
|
||||||
|
ok($qp->authenticated(), "authenticated is true");
|
||||||
|
|
||||||
|
$qp->{_auth} = 0;
|
||||||
|
ok(! $qp->authenticated(), "authenticated is false");
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __auth_user {
|
||||||
|
ok( ! $qp->auth_user(), "auth_user is undefined");
|
||||||
|
|
||||||
|
$qp->{_auth_user} = 'matt';
|
||||||
|
cmp_ok('matt', 'eq', $qp->auth_user(), "auth_user set");
|
||||||
|
|
||||||
|
$qp->{_auth_user} = undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub __auth_mechanism {
|
||||||
|
ok( ! $qp->auth_mechanism(), "auth_mechanism is undefined");
|
||||||
|
|
||||||
|
$qp->{_auth_mechanism} = 'MD5';
|
||||||
|
cmp_ok('MD5', 'eq', $qp->auth_mechanism(), "auth_mechanism set");
|
||||||
|
|
||||||
|
$qp->{_auth_mechanism} = undef;
|
||||||
|
}
|
||||||
|
|
||||||
sub __config {
|
sub __config {
|
||||||
my @r = $qp->config('badhelo');
|
my @r = $qp->config('badhelo');
|
||||||
ok($r[0], "config, badhelo, @r");
|
ok($r[0], "config, badhelo, @r");
|
||||||
@ -183,55 +250,6 @@ sub __config {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __temp_dir {
|
|
||||||
my $r = $qp->temp_dir();
|
|
||||||
ok( $r, "temp_dir, $r");
|
|
||||||
|
|
||||||
$r = $qp->temp_dir('0775');
|
|
||||||
ok( $r, "temp_dir with mask, $r");
|
|
||||||
|
|
||||||
if ($r && -d $r) { File::Path::rmtree $r; }
|
|
||||||
}
|
|
||||||
|
|
||||||
sub __size_threshold {
|
|
||||||
ok( ! $qp->size_threshold(), "size_threshold is undefined")
|
|
||||||
or warn "size_threshold: " . $qp->size_threshold;
|
|
||||||
|
|
||||||
$Qpsmtpd::Size_threshold = 5;
|
|
||||||
cmp_ok( 5, '==', $qp->size_threshold(), "size_threshold equals 5");
|
|
||||||
|
|
||||||
$Qpsmtpd::Size_threshold = undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub __authenticated {
|
|
||||||
ok( ! $qp->authenticated(), "authenticated is undefined");
|
|
||||||
|
|
||||||
$qp->{_auth} = 1;
|
|
||||||
ok($qp->authenticated(), "authenticated is true");
|
|
||||||
|
|
||||||
$qp->{_auth} = 0;
|
|
||||||
ok(! $qp->authenticated(), "authenticated is false");
|
|
||||||
}
|
|
||||||
|
|
||||||
sub __auth_user {
|
|
||||||
ok( ! $qp->auth_user(), "auth_user is undefined");
|
|
||||||
|
|
||||||
$qp->{_auth_user} = 'matt';
|
|
||||||
cmp_ok('matt', 'eq', $qp->auth_user(), "auth_user set");
|
|
||||||
|
|
||||||
$qp->{_auth_user} = undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub __auth_mechanism {
|
|
||||||
ok( ! $qp->auth_mechanism(), "auth_mechanism is undefined");
|
|
||||||
|
|
||||||
$qp->{_auth_mechanism} = 'MD5';
|
|
||||||
cmp_ok('MD5', 'eq', $qp->auth_mechanism(), "auth_mechanism set");
|
|
||||||
|
|
||||||
$qp->{_auth_mechanism} = undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
package FakeAddress;
|
package FakeAddress;
|
||||||
|
|
||||||
sub new {
|
sub new {
|
||||||
|
Loading…
Reference in New Issue
Block a user