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 $@;
}
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';
$! = 0;
$sock = IO::Socket::INET->new(%opts);
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',
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');
}
$v2w->done;
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", "$tmpdir/m");
- die "exec fail: $!";
- }
- ok($ipid, 'running index');
- is(waitpid($ipid, 0), $ipid, 'index done');
- is($?, 0, 'no error from index');
- ok(seek($err, 0, 0), 'rewound stderr');
- $err = eval { local $/; <$err> };
+ 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');