move op/ipc{msg,sem}.t into lib/ipc_sysv.t
[p5sagit/p5-mst-13.2.git] / t / lib / ph.t
1 #!./perl
2
3 # Check for presence and correctness of .ph files; for now,
4 # just socket.ph and pals.
5 #   -- Kurt Starsinic <kstar@isinet.com>
6
7 BEGIN {
8     chdir 't' if -d 't';
9     @INC = '../lib';
10 }
11
12 use Config;
13
14 # All the constants which Socket.pm tries to make available:
15 my @possibly_defined = qw(
16     INADDR_ANY INADDR_LOOPBACK INADDR_NONE AF_802 AF_APPLETALK AF_CCITT
17     AF_CHAOS AF_DATAKIT AF_DECnet AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK
18     AF_INET AF_LAT AF_MAX AF_NBS AF_NIT AF_NS AF_OSI AF_OSINET AF_PUP
19     AF_SNA AF_UNIX AF_UNSPEC AF_X25 MSG_DONTROUTE MSG_MAXIOVLEN MSG_OOB
20     MSG_PEEK PF_802 PF_APPLETALK PF_CCITT PF_CHAOS PF_DATAKIT PF_DECnet PF_DLI
21     PF_ECMA PF_GOSIP PF_HYLINK PF_IMPLINK PF_INET PF_LAT PF_MAX PF_NBS PF_NIT
22     PF_NS PF_OSI PF_OSINET PF_PUP PF_SNA PF_UNIX PF_UNSPEC PF_X25 SOCK_DGRAM
23     SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOL_SOCKET SOMAXCONN
24     SO_ACCEPTCONN SO_BROADCAST SO_DEBUG SO_DONTLINGER SO_DONTROUTE SO_ERROR
25     SO_KEEPALIVE SO_LINGER SO_OOBINLINE SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
26     SO_REUSEADDR SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK
27 );
28
29
30 # The libraries which I'm going to require:
31 my @libs = qw(Socket "sys/types.ph" "sys/socket.ph" "netinet/in.ph");
32
33
34 # These are defined by Socket.pm even if the C header files don't define them:
35 my %ok_to_miss = (
36     INADDR_NONE         => 1,
37     INADDR_LOOPBACK     => 1,
38 );
39
40
41 my $total_tests = scalar @libs + scalar @possibly_defined;
42 my $i           = 0;
43
44 print "1..$total_tests\n";
45
46
47 foreach (@libs) {
48     $i++;
49
50     if (eval "require $_" ) {
51         print "ok $i\n";
52     } else {
53         print "# Skipping tests; $_ may be missing\n";
54         foreach ($i .. $total_tests) { print "ok $_\n" }
55         exit;
56     }
57 }
58
59
60 foreach (@possibly_defined) {
61     $i++;
62
63     $pm_val = eval "Socket::$_()";
64     $ph_val = eval "main::$_()";
65
66     if (defined $pm_val and !defined $ph_val) {
67         if ($ok_to_miss{$_}) { print "ok $i\n" }
68         else                 { print "not ok $i\n" }
69         next;
70     } elsif (defined $ph_val and !defined $pm_val) {
71         print "not ok $i\n";
72         next;
73     }
74
75     # Socket.pm converts these to network byte order, so we convert the
76     # socket.ph version to match; note that these cases skip the following
77     # `elsif', which is only applied to _numeric_ values, not literal
78     # bitmasks.
79     if ($_ eq 'INADDR_ANY'
80     or  $_ eq 'INADDR_LOOPBACK'
81     or  $_ eq 'INADDR_NONE') {
82         $ph_val = pack("N*", $ph_val);  # htonl(3) equivalent
83     }
84
85     # Since Socket.pm and socket.ph wave their hands over macros differently,
86     # they could return functionally equivalent bitmaps with different numeric
87     # interpretations (due to sign extension).  The only apparent case of this
88     # is SO_DONTLINGER (only on Solaris, and deprecated, at that):
89     elsif ($pm_val != $ph_val) {
90         $pm_val = oct(sprintf "0x%lx", $pm_val);
91         $ph_val = oct(sprintf "0x%lx", $ph_val);
92     }
93
94     if ($pm_val == $ph_val) { print "ok $i\n" }
95     else                    { print "not ok $i\n" }
96 }
97
98