X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fmda.t;h=5dbcec63fc100dfa5c60e84e0c82353a58c23d69;hb=f826a7830bce67c0f8c653baf97f7769bb2c57d9;hp=fdba967204c310b333e406aa3f687776e5963be7;hpb=23a4e44bedabe5b8b651346cabc2a870c5377a30;p=public-inbox.git
diff --git a/t/mda.t b/t/mda.t
index fdba9672..5dbcec63 100644
--- a/t/mda.t
+++ b/t/mda.t
@@ -1,14 +1,14 @@
-# Copyright (C) 2014-2015 all contributors
-# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
+# Copyright (C) 2014-2018 all contributors
+# License: AGPL-3.0+
use strict;
use warnings;
use Test::More;
use Email::MIME;
-use Email::Filter;
use File::Temp qw/tempdir/;
use Cwd;
-use IPC::Run qw(run);
use PublicInbox::MID qw(mid2path);
+eval { require IPC::Run };
+plan skip_all => "missing IPC::Run for t/mda.t" if $@;
my $mda = "blib/script/public-inbox-mda";
my $learn = "blib/script/public-inbox-learn";
@@ -23,7 +23,7 @@ my $fail_bin = getcwd()."/t/fail-bin";
my $fail_path = "$fail_bin:$ENV{PATH}"; # for spamc spam mock
my $addr = 'test-public@example.com';
my $cfgpfx = "publicinbox.test";
-my $failbox = "$home/fail.mbox";
+my $faildir = "$home/faildir/";
my $mime;
{
@@ -54,11 +54,10 @@ local $ENV{GIT_COMMITTER_NAME} = eval {
open(my $fh, '<', $mbox) or die "failed to open mbox: $mbox\n";
my $str = eval { local $/; <$fh> };
close $fh;
- my $msg = Email::Filter->new(data => $str);
- $msg = Email::MIME->new($msg->simple->as_string);
+ my $msg = Email::MIME->new($str);
my $from = $msg->header('From');
- my $author = PublicInbox::Address::from_name($from);
+ my ($author) = PublicInbox::Address::names($from);
my ($email) = PublicInbox::Address::emails($from);
my $date = $msg->header('Date');
@@ -74,7 +73,7 @@ die $@ if $@;
{
my $good_rev;
- local $ENV{PI_EMERGENCY} = $failbox;
+ local $ENV{PI_EMERGENCY} = $faildir;
local $ENV{HOME} = $home;
local $ENV{ORIGINAL_RECIPIENT} = $addr;
my $simple = Email::Simple->new(<;
+ is(scalar @prev, 0 , "nothing in PI_EMERGENCY before");
local $ENV{PATH} = $fail_path;
- run([$mda], \$in);
+ IPC::Run::run([$mda], \$in);
my @revs = `git --git-dir=$maindir rev-list HEAD`;
is(scalar @revs, 1, "bad revision not committed");
- ok(-s $failbox > 0, "PI_EMERGENCY is written to");
+ my @new = <$faildir/new/*>;
+ is(scalar @new, 1, "PI_EMERGENCY is written to");
}
fail_bad_header($good_rev, "bad recipient", <<"");
@@ -160,7 +161,7 @@ Date: deadbeef
# spam training
{
- local $ENV{PI_EMERGENCY} = $failbox;
+ local $ENV{PI_EMERGENCY} = $faildir;
local $ENV{HOME} = $home;
local $ENV{ORIGINAL_RECIPIENT} = $addr;
local $ENV{PATH} = $main_path;
@@ -178,7 +179,7 @@ EOF
{
# deliver the spam message, first
- run([$mda], \$in);
+ IPC::Run::run([$mda], \$in);
my $path = mid2path($mid);
my $msg = `git --git-dir=$maindir cat-file blob HEAD:$path`;
like($msg, qr/\Q$mid\E/, "message delivered");
@@ -186,16 +187,17 @@ EOF
# now train it
local $ENV{GIT_AUTHOR_EMAIL} = 'trainer@example.com';
local $ENV{GIT_COMMITTER_EMAIL} = 'trainer@example.com';
- run([$learn, "spam"], \$msg);
+ local $ENV{GIT_COMMITTER_NAME} = undef;
+ IPC::Run::run([$learn, "spam"], \$msg);
is($?, 0, "no failure from learning spam");
- run([$learn, "spam"], \$msg);
+ IPC::Run::run([$learn, "spam"], \$msg);
is($?, 0, "no failure from learning spam idempotently");
}
}
# train ham message
{
- local $ENV{PI_EMERGENCY} = $failbox;
+ local $ENV{PI_EMERGENCY} = $faildir;
local $ENV{HOME} = $home;
local $ENV{ORIGINAL_RECIPIENT} = $addr;
local $ENV{PATH} = $main_path;
@@ -216,12 +218,12 @@ EOF
local $ENV{GIT_AUTHOR_EMAIL} = 'trainer@example.com';
local $ENV{GIT_COMMITTER_EMAIL} = 'trainer@example.com';
- run([$learn, "ham"], \$in);
+ IPC::Run::run([$learn, "ham"], \$in);
is($?, 0, "learned ham without failure");
my $path = mid2path($mid);
my $msg = `git --git-dir=$maindir cat-file blob HEAD:$path`;
like($msg, qr/\Q$mid\E/, "ham message delivered");
- run([$learn, "ham"], \$in);
+ IPC::Run::run([$learn, "ham"], \$in);
is($?, 0, "learned ham idempotently ");
# ensure trained email is filtered, too
@@ -256,7 +258,7 @@ EOF
{
$in = $mime->as_string;
- run([$learn, "ham"], \$in);
+ IPC::Run::run([$learn, "ham"], \$in);
is($?, 0, "learned ham without failure");
my $path = mid2path($mid);
$msg = `git --git-dir=$maindir cat-file blob HEAD:$path`;
@@ -265,72 +267,19 @@ EOF
}
}
-# faildir - emergency destination is maildir
-{
- my $faildir= "$home/faildir/";
- local $ENV{PI_EMERGENCY} = $faildir;
- local $ENV{HOME} = $home;
- local $ENV{ORIGINAL_RECIPIENT} = $addr;
- local $ENV{PATH} = $fail_path;
- my $in = <
-To: You
-Cc: $addr
-Message-ID:
-Subject: faildir subject
-Date: Thu, 01 Jan 1970 00:00:00 +0000
-
-EOF
- run([$mda], \$in);
- ok(-d $faildir, "emergency exists");
- my @new = glob("$faildir/new/*");
- is(scalar(@new), 1, "message delivered");
- is(unlink(@new), 1, "removed emergency message");
-
- local $ENV{PATH} = $main_path;
- $in = <
-To: $addr
-Content-Type: text/html
-Message-ID:
-Subject: faildir subject
-Date: Thu, 01 Jan 1970 00:00:00 +0000
-
-bad
-EOF
- my $out = '';
- my $err = '';
- run([$mda], \$in, \$out, \$err);
- isnt($?, 0, "mda exited with failure");
- is(length $out, 0, 'nothing in stdout');
- isnt(length $err, 0, 'error message in stderr');
-
- @new = glob("$faildir/new/*");
- is(scalar(@new), 0, "new message did not show up");
-
- # reject multipart again
- $in = $mime->as_string;
- $err = '';
- run([$mda], \$in, \$out, \$err);
- isnt($?, 0, "mda exited with failure");
- is(length $out, 0, 'nothing in stdout');
- isnt(length $err, 0, 'error message in stderr');
- @new = glob("$faildir/new/*");
- is(scalar(@new), 0, "new message did not show up");
-}
-
done_testing();
sub fail_bad_header {
my ($good_rev, $msg, $in) = @_;
- open my $fh, '>', $failbox or die "failed to open $failbox: $!\n";
- close $fh or die "failed to close $failbox: $!\n";
+ my @f = glob("$faildir/*/*");
+ unlink @f if @f;
my ($out, $err) = ("", "");
local $ENV{PATH} = $main_path;
- run([$mda], \$in, \$out, \$err);
+ IPC::Run::run([$mda], \$in, \$out, \$err);
my $rev = `git --git-dir=$maindir rev-list HEAD`;
chomp $rev;
is($rev, $good_rev, "bad revision not commited ($msg)");
- ok(-s $failbox > 0, "PI_EMERGENCY is written to ($msg)");
+ @f = glob("$faildir/*/*");
+ is(scalar @f, 1, "faildir written to");
[ $in, $out, $err ];
}