X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fv2mirror.t;h=eaf9e61d5eb4f29d56ef06884e58c4d17189d247;hb=cd50d183273c105a7f08b1875ba6f7a51d9f8e9a;hp=f95ad0f54b5e527261757ebdc35b6b8129faba03;hpb=9ec600316145da85d1ae5644ffaa1acd72b6b177;p=public-inbox.git diff --git a/t/v2mirror.t b/t/v2mirror.t index f95ad0f5..eaf9e61d 100644 --- a/t/v2mirror.t +++ b/t/v2mirror.t @@ -3,10 +3,13 @@ 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 PublicInbox::DS + HTTP::Date HTTP::Status Search::Xapian DBD::SQLite + IPC::Run)) { eval "require $mod"; plan skip_all => "$mod missing for v2mirror.t" if $@; } @@ -16,7 +19,6 @@ use POSIX qw(dup2); use_ok 'PublicInbox::V2Writable'; 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'; @@ -69,18 +71,9 @@ END { kill 'TERM', $pid if defined $pid }; $! = 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; @@ -150,18 +143,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'); } @@ -192,18 +176,9 @@ is($mibx->git->check($to_purge), undef, 'unindex+prune successful in mirror'); $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');