1 # Copyright (C) all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
5 use_ok 'PublicInbox::Qspawn';
6 use_ok 'PublicInbox::Limiter';
9 my $cmd = [qw(sh -c), 'echo >&2 err; echo out'];
10 my $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => 1 });
12 $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} });
13 is($res, "err\nout\n", 'captured stderr and stdout');
16 $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => \*STDOUT });
17 $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} });
18 is($res, "err\nout\n", 'captured stderr and stdout');
24 $qsp->{qsp_err} && ${$qsp->{qsp_err}};
27 my $limiter = PublicInbox::Limiter->new(1);
29 my $x = PublicInbox::Qspawn->new([qw(true)]);
30 $x->{qsp_err} = \(my $err = '');
32 $x->start($limiter, sub {
34 is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
35 ok(!finish_err($self), 'no error on finish');
38 is($run, 1, 'callback ran alright');
42 my @err; local $SIG{__WARN__} = sub { push @err, @_ };
43 my $x = PublicInbox::Qspawn->new([qw(false)]);
44 $x->{qsp_err} = \(my $err = '');
46 $x->start($limiter, sub {
48 is(0, sysread($self->{rpipe}, my $buf, 1),
49 'read zero bytes from false');
50 ok(finish_err($self), 'error on finish');
53 is($run, 1, 'callback ran alright');
54 ok(scalar @err, 'got warning');
57 foreach my $cmd ([qw(sleep 1)], [qw(sh -c), 'sleep 1; false']) {
58 my @err; local $SIG{__WARN__} = sub { push @err, @_ };
59 my $s = PublicInbox::Qspawn->new($cmd);
60 $s->{qsp_err} = \(my $err = '');
62 $s->start($limiter, sub {
65 is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
70 my $x = PublicInbox::Qspawn->new([qw(true)]);
71 $x->start($limiter, sub {
78 if ($cmd->[-1] =~ /false\z/) {
79 ok(finish_err($s), 'got error on false after sleep');
80 ok(scalar @err, 'got warning');
82 ok(!finish_err($s), 'no error on sleep');
83 is_deeply([], \@err, 'no warnings');
85 ok(!finish_err($_->[0]), "true $_->[1] succeeded") foreach @t;
86 is_deeply([qw(sleep 0 1 2)], \@run, 'ran in order');