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