Added tests for conditional unblocking
[perl.git] / t / op / sigdispatch.t
1 #!perl -w
2
3 # We assume that TestInit has been used.
4
5 BEGIN {
6       require './test.pl';
7 }
8
9 use strict;
10 use Config;
11
12 plan tests => 9;
13
14 watchdog(10);
15
16 $SIG{ALRM} = sub {
17     die "Alarm!\n";
18 };
19
20 pass('before the first loop');
21
22 alarm 2;
23
24 eval {
25     1 while 1;
26 };
27
28 is($@, "Alarm!\n", 'after the first loop');
29
30 pass('before the second loop');
31
32 alarm 2;
33
34 eval {
35     while (1) {
36     }
37 };
38
39 is($@, "Alarm!\n", 'after the second loop');
40
41 SKIP: {
42     skip('We can\'t test blocking without sigprocmask', 3) if $ENV{PERL_CORE_MINITEST} || !$Config{d_sigprocmask};
43
44     require POSIX;
45     my $new = POSIX::SigSet->new(&POSIX::SIGUSR1);
46     POSIX::sigprocmask(&POSIX::SIG_BLOCK, $new);
47     
48     my $gotit = 0;
49     $SIG{USR1} = sub { $gotit++ };
50     kill SIGUSR1, $$;
51     is $gotit, 0, 'Haven\'t third received signal yet';
52     
53     my $old = POSIX::SigSet->new();
54     POSIX::sigsuspend($old);
55     is $gotit, 1, 'Received third signal';
56     
57     kill SIGUSR1, $$;
58     is $gotit, 1, 'Haven\'t fourth received signal yet';
59     POSIX::sigprocmask(&POSIX::SIG_UNBLOCK, $new, $old);
60     ok $old->ismember(&POSIX::SIGUSR1), 'SIGUSR1 was still blocked';
61     is $gotit, 2, 'Received fourth signal';
62 }