use POSIX qw(dup2);
use IO::Socket::INET;
our @EXPORT = qw(tmpdir tcp_server tcp_connect require_git require_mods
- run_script start_script key2sub xsys xqx);
+ run_script start_script key2sub xsys xqx mime_load);
+
+sub mime_load ($;&) {
+ my ($path, $cb) = @_;
+ if (open(my $fh, '<', $path)) {
+ PublicInbox::MIME->new(\(do { local $/; <$fh> }));
+ } elsif ($cb) {
+ require File::Temp;
+
+ my $mime = $cb->();
+ my ($dir) = ($path =~ m!(.+)/(?:[^/]+)\z!);
+ -d $dir or die "BUG: dir=$dir is not the dir of $path";
+ my $fh = File::Temp->new(DIR => $dir);
+ $fh->autoflush(1);
+ print $fh $mime->as_string or die "print: $!";
+ my $fn = $fh->filename;
+ rename($fn, $path) or die "link $fn => $path: $!";
+ $fh->unlink_on_destroy(0);
+ pop @_; # retry via tail recursion
+ goto &mime_load;
+ } else {
+ die "open $path: $!";
+ }
+}
sub tmpdir (;$) {
my ($base) = @_;
use strict;
use warnings;
use Test::More;
-use Email::MIME;
+use PublicInbox::TestCommon;
use_ok 'PublicInbox::Filter::Base';
{
{
my $f = PublicInbox::Filter::Base->new;
+ my $email = mime_load 't/filter_base-xhtml.eml', sub {
my $html_body = "<html><body>hi</body></html>";
my $parts = [
Email::MIME->create(
body => 'hi = "bye"',
)
];
- my $email = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => 'blah',
'Content-Type' => 'multipart/alternative'
],
parts => $parts,
- );
+ )}; # mime_load sub
is($f->delivery($email), 100, "xhtml rejected");
}
{
my $f = PublicInbox::Filter::Base->new;
+ my $email = mime_load 't/filter_base-junk.eml', sub {
my $parts = [
Email::MIME->create(
attributes => {
body => 'junk',
)
];
- my $email = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => 'blah',
'Content-Type' => 'multipart/mixed'
],
parts => $parts,
- );
+ )}; # mime_load sub
is($f->delivery($email), 100, 'proprietary format rejected on glob');
}
use strict;
use warnings;
use Test::More;
-use Email::MIME;
+use PublicInbox::TestCommon;
use_ok 'PublicInbox::Filter::Mirror';
my $f = PublicInbox::Filter::Mirror->new;
ok($f, 'created PublicInbox::Filter::Mirror object');
{
+ my $email = mime_load 't/filter_mirror.eml', sub {
my $html_body = "<html><body>hi</body></html>";
my $parts = [
Email::MIME->create(
body => 'hi = "bye"',
)
];
- my $email = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => 'blah',
'Content-Type' => 'multipart/alternative'
],
parts => $parts,
- );
+ )}; # mime_laod sub
is($f->ACCEPT, $f->delivery($email), 'accept any trash that comes');
}
-done_testing();
+ done_testing();
"learned ham idempotently ");
# ensure trained email is filtered, too
+ $mime = mime_load 't/mda-mime.eml', sub {
my $html_body = "<html><body>hi</body></html>";
my $parts = [
Email::MIME->create(
)
];
$mid = 'multipart-html-sucks@11';
- $mime = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => 'blah',
'Content-Type' => 'multipart/alternative',
],
parts => $parts,
- );
+ )}; # mime_load sub
{
$in = $mime->as_string;
use strict;
use warnings;
use Test::More;
-use Email::MIME;
+use PublicInbox::TestCommon;
use PublicInbox::Hval qw(ascii_html);
use PublicInbox::InboxWritable;
use_ok('PublicInbox::MsgIter');
{
+ my $mime = mime_load 't/msg_iter-order.eml', sub {
my $parts = [ Email::MIME->create(body => "a\n"),
Email::MIME->create(body => "b\n") ];
- my $mime = Email::MIME->create(parts => $parts,
+ Email::MIME->create(parts => $parts,
header_str => [ From => 'root@localhost' ]);
+ }; # mime_load sub
my @parts;
msg_iter($mime, sub {
my ($part, $level, @ex) = @{$_[0]};
}
{
+ my $mime = mime_load 't/msg_iter-nested.eml', sub {
my $parts = [ Email::MIME->create(body => 'a'),
Email::MIME->create(body => 'b') ];
$parts = [ Email::MIME->create(parts => $parts,
header_str => [ From => 'sub@localhost' ]),
Email::MIME->create(body => 'sig') ];
- my $mime = Email::MIME->create(parts => $parts,
+ Email::MIME->create(parts => $parts,
header_str => [ From => 'root@localhost' ]);
+ }; # mime_load sub
my @parts;
msg_iter($mime, sub {
my ($part, $level, @ex) = @{$_[0]};
# multipart with two text bodies
my %attr_text = (attributes => { content_type => 'text/plain' });
+ $mime = mime_load 't/plack-2-txt-bodies.eml', sub {
my $parts = [
Email::MIME->create(%attr_text, body => 'hi'),
Email::MIME->create(%attr_text, body => 'bye')
];
- $mime = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => 'blargh',
'In-Reply-To' => '<irp@example.com>'
],
parts => $parts,
- );
+ )}; # mime_load sub
$im->add($mime);
# multipart with attached patch + filename
- $parts = [ Email::MIME->create(%attr_text, body => 'hi, see attached'),
+ $mime = mime_load 't/plack-attached-patch.eml', sub {
+ my $parts = [
+ Email::MIME->create(%attr_text, body => 'hi, see attached'),
Email::MIME->create(
attributes => {
content_type => 'text/plain',
"@@ -49, 7 +49,34 @@\n"
)
];
- $mime = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'a@example.com',
Subject => '[PATCH] asdf',
'Message-ID' => '<patch@example.com>'
],
parts => $parts
- );
+ )}; # mime_load sub
$im->add($mime);
# multipart collapsed to single quoted-printable text/plain
- $parts = [
+ $mime = mime_load 't/plack-qp.eml', sub {
+ my $parts = [
Email::MIME->create(
attributes => {
content_type => 'text/plain',
body => 'hi = bye',
)
];
- $mime = Email::MIME->create(
+ Email::MIME->create(
header_str => [
From => 'qp@example.com',
Subject => 'QP',
'Message-ID' => '<qp@example.com>',
],
parts => $parts,
- );
+ )};
like($mime->body_raw, qr/hi =3D bye=/, 'our test used QP correctly');
$im->add($mime);
$im->init_bare;
{
- open my $fh, '<', '/dev/urandom' or die "unable to open urandom: $!\n";
- sysread($fh, my $buf, 8);
- is(8, length($buf), 'read some random data');
my $qp = "abcdef=g\n==blah\n";
- my $b64 = 'b64'.$buf."\n";
+ my $b64 = "b64\xde\xad\xbe\xef\n";
my $txt = "plain\ntext\npass\nthrough\n";
my $dot = "dotfile\n";
+ my $mime = mime_load 't/psgi_attach.eml', sub {
my $parts = [
Email::MIME->create(
attributes => {
},
body => $dot),
];
- my $mime = Email::MIME->create(
+ Email::MIME->create(
parts => $parts,
header_str => [ From => 'root@z', 'Message-Id' => '<Z@B>',
Subject => 'hi']
- );
- $mime = $mime->as_string;
- $mime =~ s/\r\n/\n/g; # normalize to LF only
- $mime = PublicInbox::MIME->new($mime);
+ )}; # mime_load sub
$im->add($mime);
$im->done;
# ensure conflicted attachments can be resolved
foreach my $body (qw(old new)) {
+ $mime = mime_load "t/psgi_v2-$body.eml", sub {
my $parts = [
Email::MIME->create(
attributes => { content_type => 'text/plain' },
body => $body
)
];
- $mime = Email::MIME->create(
+ Email::MIME->create(
parts => $parts,
header_str => [ From => 'root@z',
'Message-ID' => '<a@dup>',
Subject => 'hi']
- );
+ )}; # mime_load sub
ok($im->add($mime), "added attachment $body");
}
$im->done;
}
$ibx->with_umask(sub {
+ my $amsg = mime_load 't/search-amsg.eml', sub {
my $part1 = Email::MIME->create(
attributes => {
content_type => 'text/plain',
},
body_str => 'inside another',
);
- my $amsg = Email::MIME->create(
+ Email::MIME->create(
header_str => [
Subject => 'see attachment',
'Message-ID' => '<file@attached>',
To => 'list@example.com',
],
parts => [ $part1, $part2 ],
- );
+ )}; # mime_load sub
+
ok($rw->add_message($amsg), 'added attachment');
$rw_commit->();
$ro->reopen;