Add Tests for CPAN::Nox
[p5sagit/p5-mst-13.2.git] / lib / sigtrap.t
CommitLineData
d1b75174 1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6}
7
8use strict;
9use Config;
10
11my $can_catch_kill = 0;
12
13use Test::More tests => 18;
14
15use_ok( 'sigtrap' );
16
17package main;
18local %SIG;
19
20# use a version of sigtrap.pm somewhat too high
21eval{ sigtrap->import(99999) };
22like( $@, qr/version 99999 required,/, 'import excessive version number' );
23
24# use an invalid signal name
25eval{ sigtrap->import('abadsignal') };
26like( $@, qr/^Unrecognized argument abadsignal/, 'send bad signame to import' );
27
28eval{ sigtrap->import('handler') };
29like( $@, qr/^No argument specified/, 'send handler without subref' );
30
31sigtrap->import('AFAKE');
32is( $SIG{AFAKE}, \&sigtrap::handler_traceback, 'install normal handler' );
33
34sigtrap->import('die', 'AFAKE', 'stack-trace', 'FAKE2');
35is( $SIG{AFAKE}, \&sigtrap::handler_die, 'install the die handler' );
36is( $SIG{FAKE2}, \&sigtrap::handler_traceback, 'install traceback handler' );
37
38my @normal = qw( HUP INT PIPE TERM );
39@SIG{@normal} = 1 x @normal;
40sigtrap->import('normal-signals');
41is( (grep { ref $_ } @SIG{@normal}), @normal, 'check normal-signals set' );
42
43my @error = qw( ABRT BUS EMT FPE ILL QUIT SEGV SYS TRAP );
44@SIG{@error} = 1 x @error;
45sigtrap->import('error-signals');
46is( (grep { ref $_ } @SIG{@error}), @error, 'check error-signals set' );
47
48my @old = qw( ABRT BUS EMT FPE ILL PIPE QUIT SEGV SYS TERM TRAP );
49@SIG{@old} = 1 x @old;
50sigtrap->import('old-interface-signals');
51is( (grep { ref $_ } @SIG{@old}), @old, 'check old-interface-signals set' );
52
53my $handler = sub {};
54sigtrap->import(handler => $handler, 'FAKE3');
55is( $SIG{FAKE3}, $handler, 'install custom handler' );
56
57$SIG{FAKE} = 'IGNORE';
58sigtrap->import('untrapped', 'FAKE');
59is( $SIG{FAKE}, 'IGNORE', 'respect existing handler set to IGNORE' );
60
61my $out = tie *STDOUT, 'TieOut';
62$SIG{FAKE} = 'DEFAULT';
63$sigtrap::Verbose = 1;
64sigtrap->import('any', 'FAKE');
65is( $SIG{FAKE}, \&sigtrap::handler_traceback, 'should set default handler' );
66like( $out->read, qr/^Installing handler/, 'does it talk with $Verbose set?' );
67
68# handler_die croaks with first argument
69eval { sigtrap::handler_die('FAKE') };
70like( $@, qr/^Caught a SIGFAKE/, 'does handler_die() croak?' );
71
72SKIP: {
73 skip( 'kill not implemented', 3) unless $can_catch_kill and
74 $Config{sig_name} =~ 'ABRT';
75
76 $out = tie *STDERR, 'TieOut';
77 my $line = __LINE__ + 1;
78 eval { sigtrap::handler_traceback('kudra') };
79 is( $@, '', 'handler_traceback() should not die' );
80 my $trace = $out->read();
81 like( $trace, qr/^Caught a SIGkudra/, 'check traceback message' );
82 like( $trace, qr/eval.+sigtrap.t.+$line/, 'check trace in traceback' );
83} # end of SKIP
84
85package TieOut;
86
87sub TIEHANDLE {
88 bless(\(my $scalar), $_[0]);
89}
90
91sub PRINT {
92 my $self = shift;
93 $$self .= join '', @_;
94}
95
96sub WRITE {
97 my ($self, $msg, $length) = @_;
98 $$self .= $msg;
99}
100
101sub read {
102 my $self = shift;
103 substr($$self, 0, length($$self), '');
104}