xref: /openbsd-src/gnu/usr.bin/perl/cpan/Socket/t/Socket.t (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
1#!./perl
2
3use v5.6.1;
4use strict;
5use warnings;
6
7our %Config;
8my $has_alarm;
9BEGIN {
10    require Config; import Config;
11    if ($Config{'extensions'} !~ /\bSocket\b/ &&
12        !(($^O eq 'VMS') && $Config{d_socket})) {
13        print "1..0\n";
14        exit 0;
15    }
16    $has_alarm = $Config{d_alarm};
17}
18
19use Socket qw(:all);
20use Test::More tests => 6;
21
22my $has_echo = $^O ne 'MSWin32';
23my $alarmed = 0;
24sub arm      { $alarmed = 0; alarm(shift) if $has_alarm }
25sub alarmed  { $alarmed = 1 }
26$SIG{ALRM} = 'alarmed'                    if $has_alarm;
27
28SKIP: {
29    unless(socket(T, PF_INET, SOCK_STREAM, IPPROTO_TCP)) {
30        skip "No PF_INET", 3;
31    }
32
33    pass "socket(PF_INET)";
34
35    arm(5);
36    my $host = $^O eq 'MacOS' || ($^O eq 'irix' && $Config{osvers} == 5) ?
37                                 '127.0.0.1' : 'localhost';
38    my $localhost = inet_aton($host);
39
40    SKIP: {
41        unless($has_echo && defined $localhost && connect(T,pack_sockaddr_in(7,$localhost))) {
42            skip "Unable to connect to localhost:7", 2;
43        }
44
45        arm(0);
46
47        pass "PF_INET echo localhost connected";
48
49        diag "Connected to " .
50                inet_ntoa((unpack_sockaddr_in(getpeername(T)))[1])."\n";
51
52        arm(5);
53        syswrite(T,"hello",5);
54        arm(0);
55
56        arm(5);
57        my $buff;
58        my $read = sysread(T,$buff,10); # Connection may be granted, then closed!
59        arm(0);
60
61        while ($read > 0 && length($buff) < 5) {
62            # adjust for fact that TCP doesn't guarantee size of reads/writes
63            arm(5);
64            $read = sysread(T,$buff,10,length($buff));
65            arm(0);
66        }
67
68        ok(($read == 0 || $buff eq "hello"), "PF_INET echo localhost reply");
69    }
70}
71
72SKIP: {
73    unless(socket(S, PF_INET, SOCK_STREAM, IPPROTO_TCP)) {
74        skip "No PF_INET", 3;
75    }
76
77    pass "socket(PF_INET)";
78
79    SKIP: {
80        arm(5);
81        unless($has_echo && connect(S,pack_sockaddr_in(7,INADDR_LOOPBACK))) {
82            skip "Unable to connect to localhost:7", 2;
83        }
84
85        arm(0);
86
87        pass "PF_INET echo INADDR_LOOPBACK connected";
88
89        diag "Connected to " .
90                inet_ntoa((unpack_sockaddr_in(getpeername(S)))[1])."\n";
91
92        arm(5);
93        syswrite(S,"olleh",5);
94        arm(0);
95
96        arm(5);
97        my $buff;
98        my $read = sysread(S,$buff,10); # Connection may be granted, then closed!
99        arm(0);
100
101        while ($read > 0 && length($buff) < 5) {
102            # adjust for fact that TCP doesn't guarantee size of reads/writes
103            arm(5);
104            $read = sysread(S,$buff,10,length($buff));
105            arm(0);
106        }
107
108        ok(($read == 0 || $buff eq "olleh"), "PF_INET echo INADDR_LOOPBACK reply");
109    }
110}
111