X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fv2mirror.t;h=86ca895d34aaa130cf05ebfc0973854d82e3e4b7;hb=dde1b083571ed893cbb1990f01f9e11ed804cba5;hp=c0c329ca41defab379b3bd955816f6046638388a;hpb=9c9170688649c975d866b5326b12623dc8f4604b;p=public-inbox.git
diff --git a/t/v2mirror.t b/t/v2mirror.t
index c0c329ca..86ca895d 100644
--- a/t/v2mirror.t
+++ b/t/v2mirror.t
@@ -1,12 +1,15 @@
-# Copyright (C) 2018 all contributors
+# Copyright (C) 2018-2019 all contributors
# License: AGPL-3.0+
use strict;
use warnings;
use Test::More;
+require './t/common.perl';
+require_git(2.6);
# Integration tests for HTTP cloning + mirroring
-foreach my $mod (qw(Plack::Util Plack::Builder Danga::Socket
- HTTP::Date HTTP::Status Search::Xapian DBD::SQLite)) {
+foreach my $mod (qw(Plack::Util Plack::Builder
+ HTTP::Date HTTP::Status Search::Xapian DBD::SQLite
+ IPC::Run)) {
eval "require $mod";
plan skip_all => "$mod missing for v2mirror.t" if $@;
}
@@ -14,9 +17,9 @@ use File::Temp qw/tempdir/;
use IO::Socket;
use POSIX qw(dup2);
use_ok 'PublicInbox::V2Writable';
+use PublicInbox::InboxWritable;
use PublicInbox::MIME;
use PublicInbox::Config;
-use Fcntl qw(FD_CLOEXEC F_SETFD F_GETFD);
# FIXME: too much setup
my $tmpdir = tempdir('pi-v2mirror-XXXXXX', TMPDIR => 1, CLEANUP => 1);
my $script = 'blib/script/public-inbox';
@@ -57,40 +60,27 @@ my $epoch_max = $v2w->{epoch_max};
ok($epoch_max > 0, "multiple epochs");
$v2w->done;
-my %opts = (
- LocalAddr => '127.0.0.1',
- ReuseAddr => 1,
- Proto => 'tcp',
- Listen => 1024,
-);
my ($sock, $pid);
END { kill 'TERM', $pid if defined $pid };
$! = 0;
-$sock = IO::Socket::INET->new(%opts);
+$sock = tcp_server();
ok($sock, 'sock created');
-my $fl = fcntl($sock, F_GETFD, 0);
-$pid = fork;
-if ($pid == 0) {
- # pretend to be systemd
- fcntl($sock, F_SETFD, $fl &= ~FD_CLOEXEC);
- dup2(fileno($sock), 3) or die "dup2 failed: $!\n";
- $ENV{LISTEN_PID} = $$;
- $ENV{LISTEN_FDS} = 1;
- exec "$script-httpd", "--stdout=$tmpdir/out", "--stderr=$tmpdir/err";
- die "FAIL: $!\n";
-}
-ok(defined $pid, 'forked httpd process successfully');
+my $cmd = [ "$script-httpd", "--stdout=$tmpdir/out", "--stderr=$tmpdir/err" ];
+ok(defined($pid = spawn_listener(undef, $cmd, [ $sock ])),
+ 'spawned httpd process successfully');
my ($host, $port) = ($sock->sockhost, $sock->sockport);
$sock = undef;
my @cmd;
foreach my $i (0..$epoch_max) {
- @cmd = (qw(git clone --mirror -q), "http://$host:$port/v2/$i",
+ my $sfx = $i == 0 ? '.git' : '';
+ @cmd = (qw(git clone --mirror -q),
+ "http://$host:$port/v2/$i$sfx",
"$tmpdir/m/git/$i.git");
- is(system(@cmd), 0, 'cloned OK');
- ok(-d "$tmpdir/m/git/$i.git", 'mirror OK');
+ is(system(@cmd), 0, "cloned $i.git");
+ ok(-d "$tmpdir/m/git/$i.git", "mirror $i OK");
}
@cmd = ("$script-init", '-V2', 'm', "$tmpdir/m", 'http://example.com/m',
@@ -150,18 +140,9 @@ is(scalar($mset->items), 0, 'purged message gone from origin');
fetch_each_epoch();
{
- open my $err, '+>', "$tmpdir/index-err" or die "open: $!";
- my $ipid = fork;
- if ($ipid == 0) {
- dup2(fileno($err), 2) or die "dup2 failed: $!";
- exec("$script-index", '--prune', "$tmpdir/m");
- die "exec fail: $!";
- }
- ok($ipid, 'running index..');
- is(waitpid($ipid, 0), $ipid, 'index --prune done');
- is($?, 0, 'no error from index');
- ok(seek($err, 0, 0), 'rewound stderr');
- $err = eval { local $/; <$err> };
+ my $cmd = [ "$script-index", '--prune', "$tmpdir/m" ];
+ my ($in, $out, $err) = ('', '', '');
+ ok(IPC::Run::run($cmd, \$in, \$out, \$err), '-index --prune');
like($err, qr/discontiguous range/, 'warned about discontiguous range');
unlike($err, qr/fatal/, 'no scary fatal error shown');
}
@@ -182,7 +163,24 @@ is($mibx->git->check($to_purge), undef, 'unindex+prune successful in mirror');
is_deeply(\@warn, [], 'no warnings from index_sync after purge');
}
-$v2w->done;
+# deletes happen in a different fetch window
+{
+ $mset = $mibx->search->reopen->query('m:1@example.com', {mset => 1});
+ is(scalar($mset->items), 1, '1@example.com visible in mirror');
+ $mime->header_set('Message-ID', '<1@example.com>');
+ $mime->header_set('Subject', 'subject = 1');
+ ok($v2w->remove($mime), 'removed <1@example.com> from source');
+ $v2w->done;
+ fetch_each_epoch();
+
+ my ($in, $out, $err) = ('', '', '');
+ my $cmd = [ "$script-index", "$tmpdir/m" ];
+ ok(IPC::Run::run($cmd, \$in, \$out, \$err), 'index ran');
+ is($err, '', 'no errors reported by index');
+ $mset = $mibx->search->reopen->query('m:1@example.com', {mset => 1});
+ is(scalar($mset->items), 0, '1@example.com no longer visible in mirror');
+}
+
ok(kill('TERM', $pid), 'killed httpd');
$pid = undef;
waitpid(-1, 0);