about summary refs log tree commit homepage
path: root/t/v2mirror.t
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2018-12-26 09:07:49 +0000
committerEric Wong <e@80x24.org>2018-12-29 03:45:37 +0000
commit59c946a014f34cd90621b1fb3b30af99ba80bf61 (patch)
tree194643ecd5d2388dbfd62a4503842f03c414be13 /t/v2mirror.t
parent2b5da4383d9c6defd2d473bf02eb8920bd589890 (diff)
downloadpublic-inbox-59c946a014f34cd90621b1fb3b30af99ba80bf61.tar.gz
IPC::Run provides a nice simplification in several places; and
we already use it (optionally) on a lot of tests.

For the non-test code, we still rely on our vfork-capable
Inline::C stuff since real-world server processes can get large
enough to where vfork is an advantage.  Maybe Perl5 can use
CLONE_VFORK somehow, one day:

  https://rt.perl.org/Ticket/Display.html?id=128227

Ohg V'q engure cbeg choyvp-vaobk gb Ehol :C
Diffstat (limited to 't/v2mirror.t')
-rw-r--r--t/v2mirror.t50
1 files changed, 12 insertions, 38 deletions
diff --git a/t/v2mirror.t b/t/v2mirror.t
index f95ad0f5..283b2b22 100644
--- a/t/v2mirror.t
+++ b/t/v2mirror.t
@@ -3,10 +3,12 @@
 use strict;
 use warnings;
 use Test::More;
+require './t/common.perl';
 
 # Integration tests for HTTP cloning + mirroring
 foreach my $mod (qw(Plack::Util Plack::Builder Danga::Socket
-                        HTTP::Date HTTP::Status Search::Xapian DBD::SQLite)) {
+                        HTTP::Date HTTP::Status Search::Xapian DBD::SQLite
+                        IPC::Run)) {
         eval "require $mod";
         plan skip_all => "$mod missing for v2mirror.t" if $@;
 }
@@ -16,7 +18,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 +70,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 +142,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 +175,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');