X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=t%2Fqspawn.t;h=4b9dc8a535debf7a10b4a8f79b95f4e20313c871;hb=refs%2Fheads%2Fmaster;hp=05072e24d142bbfacd4d3d17725e17b927898a1e;hpb=64aea34d06f71828b0bdd6ae177b9bcf22d752b4;p=public-inbox.git diff --git a/t/qspawn.t b/t/qspawn.t index 05072e24..224e20db 100644 --- a/t/qspawn.t +++ b/t/qspawn.t @@ -1,57 +1,87 @@ -# Copyright (C) 2016 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ +use v5.12; use Test::More; use_ok 'PublicInbox::Qspawn'; + +{ + my $cmd = [qw(sh -c), 'echo >&2 err; echo out']; + my $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => 1 }); + my $res; + $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} }); + is($res, "err\nout\n", 'captured stderr and stdout'); + + $res = undef; + $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => \*STDOUT }); + $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} }); + is($res, "err\nout\n", 'captured stderr and stdout'); +} + +sub finish_err ($) { + my ($qsp) = @_; + $qsp->finish; + $qsp->{qsp_err} && ${$qsp->{qsp_err}}; +} + +my $limiter = PublicInbox::Qspawn::Limiter->new(1); { my $x = PublicInbox::Qspawn->new([qw(true)]); + $x->{qsp_err} = \(my $err = ''); my $run = 0; - $x->start(sub { - my ($rpipe) = @_; - is(0, sysread($rpipe, my $buf, 1), 'read zero bytes'); - ok(!$x->finish, 'no error on finish'); + $x->start($limiter, sub { + my ($self) = @_; + is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes'); + ok(!finish_err($self), 'no error on finish'); $run = 1; }); is($run, 1, 'callback ran alright'); } { + my @err; local $SIG{__WARN__} = sub { push @err, @_ }; my $x = PublicInbox::Qspawn->new([qw(false)]); + $x->{qsp_err} = \(my $err = ''); my $run = 0; - $x->start(sub { - my ($rpipe) = @_; - is(0, sysread($rpipe, my $buf, 1), 'read zero bytes from false'); - my $err = $x->finish; - is($err, 256, 'error on finish'); + $x->start($limiter, sub { + my ($self) = @_; + is(0, sysread($self->{rpipe}, my $buf, 1), + 'read zero bytes from false'); + ok(finish_err($self), 'error on finish'); $run = 1; }); is($run, 1, 'callback ran alright'); + ok(scalar @err, 'got warning'); } foreach my $cmd ([qw(sleep 1)], [qw(sh -c), 'sleep 1; false']) { + my @err; local $SIG{__WARN__} = sub { push @err, @_ }; my $s = PublicInbox::Qspawn->new($cmd); + $s->{qsp_err} = \(my $err = ''); my @run; - $s->start(sub { - my ($rpipe) = @_; + $s->start($limiter, sub { + my ($self) = @_; push @run, 'sleep'; - is(0, sysread($rpipe, my $buf, 1), 'read zero bytes'); + is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes'); }); my $n = 0; my @t = map { my $i = $n++; my $x = PublicInbox::Qspawn->new([qw(true)]); - $x->start(sub { - my ($rpipe) = @_; + $x->start($limiter, sub { + my ($self) = @_; push @run, $i; }); [$x, $i] } (0..2); if ($cmd->[-1] =~ /false\z/) { - ok($s->finish, 'got error on false after sleep'); + ok(finish_err($s), 'got error on false after sleep'); + ok(scalar @err, 'got warning'); } else { - ok(!$s->finish, 'no error on sleep'); + ok(!finish_err($s), 'no error on sleep'); + is_deeply([], \@err, 'no warnings'); } - ok(!$_->[0]->finish, "true $_->[1] succeeded") foreach @t; + ok(!finish_err($_->[0]), "true $_->[1] succeeded") foreach @t; is_deeply([qw(sleep 0 1 2)], \@run, 'ran in order'); }