xref: /openbsd-src/gnu/usr.bin/perl/dist/IO/t/cachepropagate-unix.t (revision c90a81c56dcebd6a1b73fe4aff9b03385b8e63b3)
1#!/usr/bin/perl
2
3use warnings;
4use strict;
5
6use File::Temp qw(tempdir);
7use File::Spec::Functions;
8use IO::Socket;
9use IO::Socket::UNIX;
10use Socket;
11use Config;
12use Test::More;
13
14plan skip_all => "UNIX domain sockets not implemented on $^O"
15  if ($^O =~ m/^(?:qnx|nto|vos|MSWin32|VMS)$/);
16
17plan tests => 15;
18
19my $socketpath = catfile(tempdir( CLEANUP => 1 ), 'testsock');
20
21# start testing stream sockets:
22my $listener = IO::Socket::UNIX->new(Type => SOCK_STREAM,
23				     Listen => 1,
24				     Local => $socketpath);
25ok(defined($listener), 'stream socket created');
26
27my $p = $listener->protocol();
28ok(defined($p), 'protocol defined');
29my $d = $listener->sockdomain();
30ok(defined($d), 'domain defined');
31my $s = $listener->socktype();
32ok(defined($s), 'type defined');
33
34SKIP: {
35    skip "fork not available", 4
36	unless $Config{d_fork} || $Config{d_pseudofork};
37
38    my $cpid = fork();
39    if (0 == $cpid) {
40	# the child:
41	sleep(1);
42	my $connector = IO::Socket::UNIX->new(Peer => $socketpath);
43	exit(0);
44    } else {
45	ok(defined($cpid), 'spawned a child');
46    }
47
48    my $new = $listener->accept();
49
50    is($new->sockdomain(), $d, 'domain match');
51  SKIP: {
52      skip "no Socket::SO_PROTOCOL", 1 if !defined(eval { Socket::SO_PROTOCOL });
53      skip "SO_PROTOCOL defined but not implemented", 1
54         if !defined $new->sockopt(Socket::SO_PROTOCOL);
55      is($new->protocol(), $p, 'protocol match');
56    }
57  SKIP: {
58      skip "no Socket::SO_TYPE", 1 if !defined(eval { Socket::SO_TYPE });
59      skip "SO_TYPE defined but not implemented", 1
60         if !defined $new->sockopt(Socket::SO_TYPE);
61      is($new->socktype(), $s, 'type match');
62    }
63
64    unlink($socketpath);
65    wait();
66}
67
68undef $TODO;
69SKIP: {
70    skip "datagram unix sockets not supported on $^O", 7
71      if $^O eq "haiku";
72    # now test datagram sockets:
73    $listener = IO::Socket::UNIX->new(Type => SOCK_DGRAM,
74				      Local => $socketpath);
75    ok(defined($listener), 'datagram socket created');
76
77    $p = $listener->protocol();
78    ok(defined($p), 'protocol defined');
79    $d = $listener->sockdomain();
80    ok(defined($d), 'domain defined');
81    $s = $listener->socktype();
82    ok(defined($s), 'type defined');
83
84    my $new = IO::Socket::UNIX->new_from_fd($listener->fileno(), 'r+');
85
86    is($new->sockdomain(), $d, 'domain match');
87    SKIP: {
88      skip "no Socket::SO_PROTOCOL", 1 if !defined(eval { Socket::SO_PROTOCOL });
89      skip "SO_PROTOCOL defined but not implemented", 1
90         if !defined $new->sockopt(Socket::SO_PROTOCOL);
91      is($new->protocol(), $p, 'protocol match');
92    }
93    SKIP: {
94      skip "AIX: getsockopt(SO_TYPE) is badly broken on UDP/UNIX sockets", 1
95         if $^O eq "aix";
96      skip "no Socket::SO_TYPE", 1 if !defined(eval { Socket::SO_TYPE });
97      skip "SO_TYPE defined but not implemented", 1
98         if !defined $new->sockopt(Socket::SO_TYPE);
99      is($new->socktype(), $s, 'type match');
100    }
101}
102unlink($socketpath);
103