X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fmbox_reader.t;fp=t%2Fmbox_reader.t;h=9391dc2480717a7642e4f37f2608a47d2efdb110;hb=49350d47032788a7c1213a64e81ad07fc2d41b65;hp=0000000000000000000000000000000000000000;hpb=da089825419835c37afbdf7b7c5f0448766bdb27;p=public-inbox.git diff --git a/t/mbox_reader.t b/t/mbox_reader.t new file mode 100644 index 00000000..9391dc24 --- /dev/null +++ b/t/mbox_reader.t @@ -0,0 +1,76 @@ +#!perl -w +# Copyright (C) 2020 all contributors +# License: AGPL-3.0+ +use strict; +use v5.10.1; +use Test::More; +use PublicInbox::TestCommon; +use List::Util qw(shuffle); +use PublicInbox::Eml; +use Fcntl qw(SEEK_SET); +require_ok 'PublicInbox::MboxReader'; +require_ok 'PublicInbox::LeiToMail'; +my %raw = ( + hdr_only => "From: header-only\@example.com\n\n", + small_from => "From: small-from\@example.com\n\nFrom hell\n", + small => "From: small\@example.com\n\nfrom hell\n", + big_hdr_only => "From: big-header\@example.com\n" . + (('A: '.('a' x 72)."\n") x 1000)."\n", + big_body => "From: big-body\@example.com\n\n". + (('b: '.('b' x 72)."\n") x 1000) . + "From hell\n", + big_all => "From: big-all\@example.com\n". + (("A: ".('a' x 72)."\n") x 1000). "\n" . + (("b: ".('b' x 72)."\n") x 1000) . + "From hell\n", +); + +if ($ENV{TEST_EXTRA}) { + for my $fn (glob('t/*.eml'), glob('t/*/*.{patch,eml}')) { + $raw{$fn} = eml_load($fn)->as_string; + } +} + +my $reader = PublicInbox::MboxReader->new; +my $write_in_full = PublicInbox::LeiToMail->can('write_in_full'); +my $check_fmt = sub { + my $fmt = shift; + my @order = shuffle(keys %raw); + my $eml2mbox = PublicInbox::LeiToMail->can("eml2$fmt"); + open my $fh, '+>', undef or BAIL_OUT "open: $!"; + for my $k (@order) { + my $eml = PublicInbox::Eml->new($raw{$k}); + my $buf = $eml2mbox->($eml); + $write_in_full->($fh, $buf, undef); + } + seek($fh, 0, SEEK_SET) or BAIL_OUT "seek: $!"; + $reader->$fmt($fh, sub { + my ($eml) = @_; + my $cur = shift @order; + my @cl = $eml->header_raw('Content-Length'); + if ($fmt =~ /\Amboxcl/) { + is(scalar(@cl), 1, "Content-Length set $fmt $cur"); + my $raw = $eml->body_raw; + my $adj = 0; + if ($fmt eq 'mboxcl') { + my @from = ($raw =~ /^(From )/smg); + $adj = scalar(@from); + } + is(length($raw), $cl[0] - $adj, + "Content-Length is correct $fmt $cur"); + # clobber for ->as_string comparison below + $eml->header_set('Content-Length'); + } else { + is(scalar(@cl), 0, "Content-Length unset $fmt $cur"); + } + my $orig = PublicInbox::Eml->new($raw{$cur}); + is($eml->as_string, $orig->as_string, + "read back original $fmt $cur"); + }); +}; +my @mbox = qw(mboxrd mboxo mboxcl mboxcl2); +for my $fmt (@mbox) { $check_fmt->($fmt) } +s/\n/\r\n/sg for (values %raw); +for my $fmt (@mbox) { $check_fmt->($fmt) } + +done_testing;