xref: /openbsd-src/gnu/usr.bin/perl/ext/POSIX/t/sigset.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
1898184e3Ssthen#!./perl -w
2898184e3Ssthen
3898184e3Ssthenuse strict;
4898184e3Ssthenuse Test::More;
5898184e3Ssthenuse Config;
6898184e3Ssthen
7898184e3Ssthenplan(skip_all => "POSIX is unavailable")
8898184e3Ssthen    unless $Config{extensions} =~ /\bPOSIX\b/;
9898184e3Ssthenplan(skip_all => "sigemptyset is unavailable on $^O")
10*256a93a4Safresh1    if $^O eq 'MSWin32';
11898184e3Ssthen
12898184e3Ssthenrequire POSIX;
13898184e3SsthenPOSIX->import();
14898184e3Ssthen
15898184e3Ssthenmy @signo;
16898184e3Ssthenmy ($min, $max) = (~0, -1);
17898184e3Ssthen
18898184e3Ssthensub expected_signals {
19898184e3Ssthen    my $sigset = shift;
20898184e3Ssthen    my $desc = shift;
21898184e3Ssthen    my %expected;
22898184e3Ssthen    ++$expected{$_} foreach @_;
23898184e3Ssthen
24898184e3Ssthen    local $Test::Builder::Level = $Test::Builder::Level + 1;
25898184e3Ssthen
26898184e3Ssthen    for my $sig ($min..$max) {
27898184e3Ssthen	if ($expected{$sig}) {
28898184e3Ssthen	    cmp_ok($sigset->ismember($sig), '==', 1,
29898184e3Ssthen		   "$desc - sig $sig is a member");
30898184e3Ssthen	} else {
31898184e3Ssthen	    cmp_ok($sigset->ismember($sig), '==', 0,
32898184e3Ssthen		   "$desc - sig $sig is not a member");
33898184e3Ssthen	}
34898184e3Ssthen    }
35898184e3Ssthen}
36898184e3Ssthen
37898184e3Ssthenforeach (@POSIX::EXPORT) {
38898184e3Ssthen    next unless /^SIG[A-Z0-9]+$/;
39898184e3Ssthen    my $val = eval "POSIX::$_";
40898184e3Ssthen    next unless defined $val;
41898184e3Ssthen    $min = $val if $min > $val;
42898184e3Ssthen    $max = $val if $max < $val;
43898184e3Ssthen    push @signo, $val;
44898184e3Ssthen}
45898184e3Ssthen
46898184e3Ssthen# Sanity check that we found something:
47898184e3Ssthencmp_ok(scalar @signo, '>=', 6,
48898184e3Ssthen       'found at least 6 signals (6 are named in the ANSI C spec)');
49898184e3Ssthen
50898184e3Ssthenmy $sigset = POSIX::SigSet->new();
51898184e3Ssthenisa_ok($sigset, 'POSIX::SigSet', 'checking the type of the object');
52898184e3Ssthenexpected_signals($sigset, 'new object');
53898184e3Ssthen
54898184e3Ssthenis($sigset->fillset(), '0 but true', 'fillset');
55898184e3Ssthen# because on some systems, not all integers are valid signals...
56898184e3Ssthen# so the only thing we can really be confident about is that all the signals
57898184e3Ssthen# with names are going to be present:
58898184e3Ssthenforeach (@signo) {
59898184e3Ssthen    cmp_ok($sigset->ismember($_), '==', 1, "after fillset sig $_ is a member");
60898184e3Ssthen}
61898184e3Ssthenis($sigset->emptyset(), '0 but true', 'empyset');
62898184e3Ssthenexpected_signals($sigset, 'after emptyset');
63898184e3Ssthen
64898184e3Ssthenis($sigset->addset($signo[1]), '0 but true', 'addset');
65898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[1]);
66898184e3Ssthenis($sigset->addset($signo[2]), '0 but true', 'addset');
67898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[1], $signo[2]);
68898184e3Ssthenis($sigset->addset($signo[4]), '0 but true', 'addset');
69898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[1], $signo[2], $signo[4]);
70898184e3Ssthenis($sigset->addset($signo[2]), '0 but true', 'addset');
71898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[1], $signo[2], $signo[4]);
72898184e3Ssthenis($sigset->delset($signo[4]), '0 but true', 'delset');
73898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[1], $signo[2]);
74898184e3Ssthenis($sigset->addset($signo[0]), '0 but true', 'addset');
75898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[0], $signo[1], $signo[2]);
76898184e3Ssthenis($sigset->delset($signo[4]), '0 but true', 'delset');
77898184e3Ssthenexpected_signals($sigset, 'after delset', $signo[0], $signo[1], $signo[2]);
78898184e3Ssthenis($sigset->delset($signo[1]), '0 but true', 'delset');
79898184e3Ssthenexpected_signals($sigset, 'after delset', $signo[0], $signo[2]);
80898184e3Ssthenis($sigset->delset($signo[0]), '0 but true', 'delset');
81898184e3Ssthenexpected_signals($sigset, 'after addset', $signo[2]);
82898184e3Ssthenis($sigset->delset($signo[2]), '0 but true', 'delset');
83898184e3Ssthenexpected_signals($sigset, 'empty again');
84898184e3Ssthen
85898184e3Ssthenforeach ([$signo[0]],
86898184e3Ssthen	 [$signo[2]],
87898184e3Ssthen	 [$signo[3]],
88898184e3Ssthen	 [@signo[2,3,6]],
89898184e3Ssthen	) {
90898184e3Ssthen    $sigset = POSIX::SigSet->new(@$_);
91898184e3Ssthen    isa_ok($sigset, 'POSIX::SigSet', 'checking the type of the object');
92898184e3Ssthen    local $" = ', ';
93898184e3Ssthen    expected_signals($sigset, "new(@$_)", @$_);
94898184e3Ssthen}
95898184e3Ssthen
96de8cc8edSafresh1SKIP:
97de8cc8edSafresh1{
98de8cc8edSafresh1    # CID 244386
99de8cc8edSafresh1    # linux and freebsd do validate for positive and very large signal numbers
100de8cc8edSafresh1    # darwin uses a macro that simply ignores large signals and shifts by
101de8cc8edSafresh1    # a negative number for negative signals, always succeeding
102de8cc8edSafresh1    #
103de8cc8edSafresh1    # since the idea is to validate our code rather than the implementation
104de8cc8edSafresh1    # of sigaddset, just test the platforms we know can fail
105de8cc8edSafresh1    skip "Not all systems validate the signal number", 2
106de8cc8edSafresh1      unless $^O =~ /^(linux|freebsd)$/;
107de8cc8edSafresh1    my $badsig = -1;
108de8cc8edSafresh1    note "badsig $badsig";
109de8cc8edSafresh1    ok(!eval{ POSIX::SigSet->new($badsig); 1 },
110de8cc8edSafresh1       "POSIX::SigSet->new should throw on large signal number");
111de8cc8edSafresh1    like($@."", qr/POSIX::Sigset->new: failed to add signal $badsig/,
112de8cc8edSafresh1         "check message");
113de8cc8edSafresh1}
114de8cc8edSafresh1
115898184e3Ssthendone_testing();
116