diff options
author | Eric Wong <e@80x24.org> | 2020-09-24 20:51:45 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2020-09-26 09:20:22 +0000 |
commit | f4728a1ef16593305956c4dada424353f57b3879 (patch) | |
tree | 97386cdf038abddea78411b6e8587fa784d2760a | |
parent | 2255a4ad2fa2384c1f4cec6dd267383396cbc945 (diff) | |
download | public-inbox-f4728a1ef16593305956c4dada424353f57b3879.tar.gz |
xt: add eml ->as_string round trip checker
Unlike Email::MIME, PublicInbox::Eml::as_string should be able to round trip from the Perl object to a raw scalar and back without changes.
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | xt/eml_check_roundtrip.t | 43 |
2 files changed, 44 insertions, 0 deletions
@@ -385,6 +385,7 @@ t/xcpdb-reshard.t xt/cmp-msgstr.t xt/cmp-msgview.t xt/eml_check_limits.t +xt/eml_check_roundtrip.t xt/git-http-backend.t xt/git_async_cmp.t xt/httpd-async-stream.t diff --git a/xt/eml_check_roundtrip.t b/xt/eml_check_roundtrip.t new file mode 100644 index 00000000..9b216c53 --- /dev/null +++ b/xt/eml_check_roundtrip.t @@ -0,0 +1,43 @@ +#!perl -w +# Copyright (C) 2020 all contributors <meta@public-inbox.org> +# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt> +use strict; +use Test::More; +use PublicInbox::TestCommon; +use PublicInbox::Eml; +use PublicInbox::Inbox; +use List::Util qw(max); +use Benchmark qw(:all :hireswallclock); +use PublicInbox::Spawn qw(popen_rd); +use Carp (); +require_git(2.19); # for --unordered +my $inboxdir = $ENV{GIANT_INBOX_DIR}; +plan skip_all => "GIANT_INBOX_DIR not defined for $0" unless $inboxdir; +my $ibx = PublicInbox::Inbox->new({ inboxdir => $inboxdir, name => 'x' }); +my $git = $ibx->git; +my @cat = qw(cat-file --buffer --batch-check --batch-all-objects --unordered); +my $fh = $git->popen(@cat); +my $cat_cb = sub { + my ($bref, $oid, $type, $size, $check) = @_; + my $orig = $$bref; + my $copy = PublicInbox::Eml->new($bref)->as_string; + ++$check->[$orig eq $copy ? 0 : 1]; +}; + +my $n = 0; +my $check = [ 0, 0 ]; # [ eql, neq ] +my $t = timeit(1, sub { + my ($blob, $type); + while (<$fh>) { + ($blob, $type) = split / /; + next if $type ne 'blob'; + $git->cat_async($blob, $cat_cb, $check); + if ((++$n % 8192) == 0) { + diag "n=$n eql=$check->[0] neq=$check->[1]"; + } + } + $git->cat_async_wait; +}); +is($check->[0], $n, 'all messages round tripped'); +is($check->[1], 0, 'no messages failed to round trip'); +done_testing; |