]> Sergey Matveev's repositories - public-inbox.git/blob - t/qspawn.t
tests: replace select/usleep calls with tick()
[public-inbox.git] / t / qspawn.t
1 # Copyright (C) all contributors <meta@public-inbox.org>
2 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
3 use v5.12;
4 use Test::More;
5 use_ok 'PublicInbox::Qspawn';
6
7 {
8         my $cmd = [qw(sh -c), 'echo >&2 err; echo out'];
9         my $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => 1 });
10         my $res;
11         $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} });
12         is($res, "err\nout\n", 'captured stderr and stdout');
13
14         $res = undef;
15         $qsp = PublicInbox::Qspawn->new($cmd, {}, { 2 => \*STDOUT });
16         $qsp->psgi_qx({}, undef, sub { $res = ${$_[0]} });
17         is($res, "err\nout\n", 'captured stderr and stdout');
18 }
19
20 sub finish_err ($) {
21         my ($qsp) = @_;
22         $qsp->finish;
23         $qsp->{qsp_err} && ${$qsp->{qsp_err}};
24 }
25
26 my $limiter = PublicInbox::Qspawn::Limiter->new(1);
27 {
28         my $x = PublicInbox::Qspawn->new([qw(true)]);
29         $x->{qsp_err} = \(my $err = '');
30         my $run = 0;
31         $x->start($limiter, sub {
32                 my ($self) = @_;
33                 is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
34                 ok(!finish_err($self), 'no error on finish');
35                 $run = 1;
36         });
37         is($run, 1, 'callback ran alright');
38 }
39
40 {
41         my @err; local $SIG{__WARN__} = sub { push @err, @_ };
42         my $x = PublicInbox::Qspawn->new([qw(false)]);
43         $x->{qsp_err} = \(my $err = '');
44         my $run = 0;
45         $x->start($limiter, sub {
46                 my ($self) = @_;
47                 is(0, sysread($self->{rpipe}, my $buf, 1),
48                                 'read zero bytes from false');
49                 ok(finish_err($self), 'error on finish');
50                 $run = 1;
51         });
52         is($run, 1, 'callback ran alright');
53         ok(scalar @err, 'got warning');
54 }
55
56 foreach my $cmd ([qw(sleep 1)], [qw(sh -c), 'sleep 1; false']) {
57         my @err; local $SIG{__WARN__} = sub { push @err, @_ };
58         my $s = PublicInbox::Qspawn->new($cmd);
59         $s->{qsp_err} = \(my $err = '');
60         my @run;
61         $s->start($limiter, sub {
62                 my ($self) = @_;
63                 push @run, 'sleep';
64                 is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
65         });
66         my $n = 0;
67         my @t = map {
68                 my $i = $n++;
69                 my $x = PublicInbox::Qspawn->new([qw(true)]);
70                 $x->start($limiter, sub {
71                         my ($self) = @_;
72                         push @run, $i;
73                 });
74                 [$x, $i]
75         } (0..2);
76
77         if ($cmd->[-1] =~ /false\z/) {
78                 ok(finish_err($s), 'got error on false after sleep');
79                 ok(scalar @err, 'got warning');
80         } else {
81                 ok(!finish_err($s), 'no error on sleep');
82                 is_deeply([], \@err, 'no warnings');
83         }
84         ok(!finish_err($_->[0]), "true $_->[1] succeeded") foreach @t;
85         is_deeply([qw(sleep 0 1 2)], \@run, 'ran in order');
86 }
87
88 done_testing();
89
90 1;