From 6512b1245ebc6fe30bb32227c0ef8f912d4988ab Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 21 Mar 2020 02:03:54 +0000 Subject: www: add endpoint to retrieve altid dumps This ensures all our indexed data, including data from altid searches (e.g. "gmane:$ARTNUM") is retrievable. It uses a "POST" request to avoid wasting cycles when invoked by crawlers, since it could potentially be several megabytes of data not indexable by search engines. --- t/www_altid.t | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 t/www_altid.t (limited to 't') diff --git a/t/www_altid.t b/t/www_altid.t new file mode 100644 index 00000000..a885c389 --- /dev/null +++ b/t/www_altid.t @@ -0,0 +1,83 @@ +# Copyright (C) 2020 all contributors +# License: AGPL-3.0+ +use strict; +use Test::More; +use PublicInbox::TestCommon; +use PublicInbox::Inbox; +use PublicInbox::InboxWritable; +use PublicInbox::Config; +use PublicInbox::Spawn qw(which spawn); +which('sqlite3') or plan skip_all => 'sqlite3 binary missing'; +require_mods(qw(DBD::SQLite HTTP::Request::Common Plack::Test URI::Escape + Plack::Builder IO::Uncompress::Gunzip)); +use_ok($_) for qw(Plack::Test HTTP::Request::Common); +require_ok 'PublicInbox::Msgmap'; +require_ok 'PublicInbox::AltId'; +require_ok 'PublicInbox::WWW'; +my ($inboxdir, $for_destroy) = tmpdir(); +my $aid = 'xyz'; +my $spec = "serial:$aid:file=blah.sqlite3"; +if ('setup') { + my $opts = { + inboxdir => $inboxdir, + name => 'test', + -primary_address => 'test@example.com', + }; + my $ibx = PublicInbox::Inbox->new($opts); + $ibx = PublicInbox::InboxWritable->new($ibx, 1); + my $im = $ibx->importer(0); + my $mime = PublicInbox::MIME->new(<<'EOF'); +From: a@example.com +Message-Id: + +EOF + $im->add($mime); + $im->done; + mkdir "$inboxdir/public-inbox" or die; + my $altid = PublicInbox::AltId->new($ibx, $spec, 1); + $altid->mm_alt->mid_set(1, 'a@example.com'); +} + +my $cfgpath = "$inboxdir/cfg"; +open my $fh, '>', $cfgpath or die; +print $fh <new($cfgpath); +my $www = PublicInbox::WWW->new($cfg); +my $cmpfile = "$inboxdir/cmp.sqlite3"; +my $client = sub { + my ($cb) = @_; + my $res = $cb->(POST("/test/$aid.sql.gz")); + is($res->code, 200, 'retrieved gzipped dump'); + IO::Uncompress::Gunzip::gunzip(\($res->content) => \(my $buf)); + pipe(my ($r, $w)) or die; + my $cmd = ['sqlite3', $cmpfile]; + my $pid = spawn($cmd, undef, { 0 => $r }); + print $w $buf or die; + close $w or die; + is(waitpid($pid, 0), $pid, 'sqlite3 exited'); + is($?, 0, 'sqlite3 loaded dump'); + my $mm_cmp = PublicInbox::Msgmap->new_file($cmpfile); + is($mm_cmp->mid_for(1), 'a@example.com', 'sqlite3 dump valid'); + $mm_cmp = undef; + unlink $cmpfile or die; +}; +test_psgi(sub { $www->call(@_) }, $client); +SKIP: { + require_mods(qw(Plack::Test::ExternalServer), 4); + my $env = { PI_CONFIG => $cfgpath }; + my $sock = tcp_server() or die; + my ($out, $err) = map { "$inboxdir/std$_.log" } qw(out err); + my $cmd = [ qw(-httpd -W0), "--stdout=$out", "--stderr=$err" ]; + my $td = start_script($cmd, $env, { 3 => $sock }); + my ($h, $p) = ($sock->sockhost, $sock->sockport); + local $ENV{PLACK_TEST_EXTERNALSERVER_URI} = "http://$h:$p"; + Plack::Test::ExternalServer::test_psgi(client => $client); +} +done_testing; -- cgit v1.2.3-24-ge0c7