2 # Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
3 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
7 use PublicInbox::TestCommon;
8 use List::Util qw(shuffle);
10 use Fcntl qw(SEEK_SET);
11 require_ok 'PublicInbox::MboxReader';
12 require_ok 'PublicInbox::LeiToMail';
14 hdr_only => "From: header-only\@example.com\n\n",
15 small_from => "From: small-from\@example.com\n\nFrom hell\n",
16 small => "From: small\@example.com\n\nfrom hell\n",
17 big_hdr_only => "From: big-header\@example.com\n" .
18 (('A: '.('a' x 72)."\n") x 1000)."\n",
19 big_body => "From: big-body\@example.com\n\n".
20 (('b: '.('b' x 72)."\n") x 1000) .
22 big_all => "From: big-all\@example.com\n".
23 (("A: ".('a' x 72)."\n") x 1000). "\n" .
24 (("b: ".('b' x 72)."\n") x 1000) .
28 if ($ENV{TEST_EXTRA}) {
29 for my $fn (glob('t/*.eml'), glob('t/*/*.{patch,eml}')) {
30 $raw{$fn} = eml_load($fn)->as_string;
34 my $reader = PublicInbox::MboxReader->new;
37 my @order = shuffle(keys %raw);
38 my $eml2mbox = PublicInbox::LeiToMail->can("eml2$fmt");
39 open my $fh, '+>', undef or BAIL_OUT "open: $!";
41 my $eml = PublicInbox::Eml->new($raw{$k});
42 my $buf = $eml2mbox->($eml);
43 print $fh $$buf or BAIL_OUT "print $!";
45 seek($fh, 0, SEEK_SET) or BAIL_OUT "seek: $!";
46 $reader->$fmt($fh, sub {
48 my $cur = shift @order;
49 my @cl = $eml->header_raw('Content-Length');
50 if ($fmt =~ /\Amboxcl/) {
51 is(scalar(@cl), 1, "Content-Length set $fmt $cur");
52 my $raw = $eml->body_raw;
54 if ($fmt eq 'mboxcl') {
55 my @from = ($raw =~ /^(From )/smg);
58 is(length($raw), $cl[0] - $adj,
59 "Content-Length is correct $fmt $cur");
60 # clobber for ->as_string comparison below
61 $eml->header_set('Content-Length');
63 is(scalar(@cl), 0, "Content-Length unset $fmt $cur");
65 my $orig = PublicInbox::Eml->new($raw{$cur});
66 is($eml->as_string, $orig->as_string,
67 "read back original $fmt $cur");
70 my @mbox = qw(mboxrd mboxo mboxcl mboxcl2);
71 for my $fmt (@mbox) { $check_fmt->($fmt) }
72 s/\n/\r\n/sg for (values %raw);
73 for my $fmt (@mbox) { $check_fmt->($fmt) }