a0d0fce7aeefae2860d50655fb72760bbb267989
[openafs.git] / tests / opr / softsig-t
1 #!/usr/bin/env perl
2 #
3 # Copyright (c) 2010 Your File System Inc. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
15 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
25 use strict;
26 use warnings;
27 use Test::More tests => 11;
28 use IO::File;
29 use POSIX qw(:signal_h);
30 use File::Temp;
31 use FindBin qw($Bin);
32
33 # Start up our test process, and send it various signals. Check that these
34 # signals make it to it correctly, and are reported on the command line.
35
36 my $softsig_helper;
37
38 # Our softsig helper should be in $TOP_OBJDIR/tests/opr. To calculate that
39 # path, use the BUILD env var if the test harness has set it; otherwise, our
40 # next best guess is that it's in the same dir as this script.
41 if (defined($ENV{BUILD})) {
42     $softsig_helper = $ENV{BUILD} . "/opr/softsig-helper";
43 } else {
44     $softsig_helper = $Bin . "/softsig-helper";
45 }
46
47 # This -dummy argument prevents Perl from putting an intermediate sh
48 # -c between us and softsig-helper in the case where the build
49 # directory happens to contain shell metacharacters, like the ~ in
50 # /build/openafs-vb8tid/openafs-1.8.0~pre1 used by the Debian
51 # builders.
52 my $pid = open(HELPER, "-|", $softsig_helper, "-dummy")
53   or die "Couldn't start test helper.";
54
55 # Wait for softsig to start up.
56 is(<HELPER>, "Ready\n");
57
58 # Check that a load of common signals are correctly trapped.
59
60 kill 'INT', $pid;
61 is(<HELPER>, "Received INT\n");
62
63 kill 'HUP', $pid;
64 is(<HELPER>, "Received HUP\n");
65
66 kill 'QUIT', $pid;
67 is(<HELPER>, "Received QUIT\n");
68
69 kill 'ALRM', $pid;
70 is(<HELPER>, "Received ALRM\n");
71
72 kill 'TERM', $pid;
73 is(<HELPER>, "Received TERM\n");
74
75 kill 'USR1', $pid;
76 is(<HELPER>, "Received USR1\n");
77
78 kill 'USR2', $pid;
79 is(<HELPER>, "Received USR2\n");
80
81
82 # Check that we can actually stop the process with a kill.
83
84 kill 'KILL', $pid;
85 close(HELPER);
86 is($?, SIGKILL, "Helper exited on KILL signal.");
87
88 # Check that an internal segmentation fault kills the process.
89
90 $pid = open(HELPER, "-|", $softsig_helper, "-crash")
91     or die "Couldn't start test helper.";
92 close(HELPER);
93 is($? & 0x7f, SIGSEGV, "Helper exited on SEGV signal.");
94
95 # Check that an internal bus error kills the process.
96 # Skip this test when running on ancient versions of Perl
97 # which do not have SIGBUS defined.
98 SKIP: {
99     my $sigbus = eval "SIGBUS";
100     skip("Skipping buserror test; SIGBUS constant is not defined.", 1) unless $sigbus;
101
102     my ($fh, $path) = mkstemp("/tmp/softsig-t_XXXXXX");
103     $pid = open(HELPER, "-|", $softsig_helper, "-buserror", $path)
104         or die "Couldn't start test helper.";
105     close(HELPER);
106     is($? & 0x7f, $sigbus, "Helper exited on BUS signal.");
107     $fh->close;
108     unlink $path;
109 }