X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fmbox_reader.t;h=87e8f397662cd058aafc0075a23d4377e2c0abaa;hb=4eee5af6011cc8cdefb66c9729952c7eff5c0b0b;hp=53458ec2fb2095763c5f2c0e6301d3d16eb037b4;hpb=af0b0fb7a454470a32c452119d0392e0dedb3fe1;p=public-inbox.git diff --git a/t/mbox_reader.t b/t/mbox_reader.t index 53458ec2..87e8f397 100644 --- a/t/mbox_reader.t +++ b/t/mbox_reader.t @@ -24,6 +24,16 @@ my %raw = ( (("b: ".('b' x 72)."\n") x 1000) . "From hell\n", ); +{ + my $eml = PublicInbox::Eml->new($raw{small}); + my $mbox_keywords = PublicInbox::MboxReader->can('mbox_keywords'); + is_deeply($mbox_keywords->($eml), [], 'no keywords'); + $eml->header_set('Status', 'RO'); + is_deeply($mbox_keywords->($eml), ['seen'], 'seen extracted'); + $eml->header_set('X-Status', 'A'); + is_deeply($mbox_keywords->($eml), [qw(answered seen)], + 'seen+answered extracted'); +} if ($ENV{TEST_EXTRA}) { for my $fn (glob('t/*.eml'), glob('t/*/*.{patch,eml}')) { @@ -45,6 +55,8 @@ my $check_fmt = sub { seek($fh, 0, SEEK_SET) or BAIL_OUT "seek: $!"; $reader->$fmt($fh, sub { my ($eml) = @_; + $eml->header_set('Status'); + $eml->header_set('Lines'); my $cur = shift @order; my @cl = $eml->header_raw('Content-Length'); if ($fmt =~ /\Amboxcl/) { @@ -59,6 +71,12 @@ my $check_fmt = sub { "Content-Length is correct $fmt $cur"); # clobber for ->as_string comparison below $eml->header_set('Content-Length'); + + # special case for t/solve/bare.patch, not sure if we + # should even handle it... + if ($cl[0] eq '0' && ${$eml->{hdr}} eq '') { + delete $eml->{bdy}; + } } else { is(scalar(@cl), 0, "Content-Length unset $fmt $cur"); } @@ -72,4 +90,62 @@ for my $fmt (@mbox) { $check_fmt->($fmt) } s/\n/\r\n/sg for (values %raw); for my $fmt (@mbox) { $check_fmt->($fmt) } +{ + my $no_blank_eom = <<'EOM'; +From x@y Fri Oct 2 00:00:00 1993 +a: b + +body1 +From x@y Fri Oct 2 00:00:00 1993 +c: d + +body2 +EOM + # chop($no_blank_eom) eq "\n" or BAIL_OUT 'broken LF'; + for my $variant (qw(mboxrd mboxo)) { + my @x; + open my $fh, '<', \$no_blank_eom or BAIL_OUT 'PerlIO::scalar'; + $reader->$variant($fh, sub { push @x, shift }); + is_deeply($x[0]->{bdy}, \"body1\n", 'LF preserved in 1st'); + is_deeply($x[1]->{bdy}, \"body2\n", 'no LF added in 2nd'); + } +} + +SKIP: { + use PublicInbox::Spawn qw(popen_rd); + my $fh = popen_rd([ $^X, '-E', <<'' ]); +say "From x@y Fri Oct 2 00:00:00 1993"; +print "a: b\n\n", "x" x 70000, "\n\n"; +say "From x@y Fri Oct 2 00:00:00 2010"; +print "Final: bit\n\n", "Incomplete\n\n"; +exit 1 + + my @x; + eval { $reader->mboxrd($fh, sub { push @x, shift->as_string }) }; + like($@, qr/error closing mbox/, 'detects error reading from pipe'); + is(scalar(@x), 1, 'only saw one message'); + is(scalar(grep(/Final/, @x)), 0, 'no incomplete bit'); +} + +{ + my $html = <hi,how are you +EOM + for my $m (qw(mboxrd mboxcl mboxcl2 mboxo)) { + my (@w, @x); + local $SIG{__WARN__} = sub { push @w, @_ }; + open my $fh, '<', \$html or xbail 'PerlIO::scalar'; + PublicInbox::MboxReader->$m($fh, sub { + push @x, $_[0]->as_string + }); + if ($m =~ /\Amboxcl/) { + is_deeply(\@x, [], "messages in invalid $m"); + } else { + is_deeply(\@x, [ "\n$html" ], "body-only $m"); + } + is_deeply([grep(!/^W: leftover/, @w)], [], + "no extra warnings besides leftover ($m)"); + } +} + done_testing;