more testsuite smarts (many of them courtesy Ilya)
[p5sagit/p5-mst-13.2.git] / t / lib / io_multihomed.t
CommitLineData
cf7fe8a2 1#!./perl
2
3BEGIN {
4 unless(grep /blib/, @INC) {
5 chdir 't' if -d 't';
93430cb4 6 unshift @INC, '../lib' if -d '../lib';
cf7fe8a2 7 }
8}
9
10use Config;
11
12BEGIN {
13 if(-d "lib" && -f "TEST") {
45c0de28 14 my $reason;
15 if (! $Config{'d_fork'}) {
16 $reason = 'no fork';
17 }
18 elsif ($Config{'extensions'} !~ /\bSocket\b/) {
19 $reason = 'Socket extension unavailable';
20 }
21 elsif ($Config{'extensions'} !~ /\bIO\b/) {
22 $reason = 'IO extension unavailable';
23 }
24 undef $reason if $^O eq 'VMS' and $Config{d_socket};
25 if ($reason) {
26 print "1..0 # Skip: $reason\n";
cf7fe8a2 27 exit 0;
28 }
29 }
30}
31
32$| = 1;
33
34print "1..8\n";
35
36
37package Multi;
38require IO::Socket::INET;
39@ISA=qw(IO::Socket::INET);
40
41use Socket qw(inet_aton inet_ntoa unpack_sockaddr_in);
42
43sub _get_addr
44{
45 my($sock,$addr_str, $multi) = @_;
46 #print "_get_addr($sock, $addr_str, $multi)\n";
47
48 print "not " unless $multi;
49 print "ok 2\n";
50
51 (
52 # private IP-addresses which I hope does not work anywhere :-)
53 inet_aton("10.250.230.10"),
54 inet_aton("10.250.230.12"),
55 inet_aton("127.0.0.1") # loopback
56 )
57}
58
59sub connect
60{
61 my $self = shift;
62 if (@_ == 1) {
63 my($port, $addr) = unpack_sockaddr_in($_[0]);
64 $addr = inet_ntoa($addr);
65 #print "connect($self, $port, $addr)\n";
362d283a 66 if($addr eq "10.250.230.10") {
67 print "ok 3\n";
68 return 0;
69 }
70 if($addr eq "10.250.230.12") {
71 print "ok 4\n";
72 return 0;
73 }
cf7fe8a2 74 }
75 $self->SUPER::connect(@_);
76}
77
78
79
80package main;
81
82use IO::Socket;
83
84$listen = IO::Socket::INET->new(Listen => 2,
85 Proto => 'tcp',
86 Timeout => 5,
87 ) or die "$!";
88
89print "ok 1\n";
90
91$port = $listen->sockport;
92
93if($pid = fork()) {
94
95 $sock = $listen->accept() or die "$!";
96 print "ok 5\n";
97
98 print $sock->getline();
99 print $sock "ok 7\n";
100
101 waitpid($pid,0);
102
103 $sock->close;
104
105 print "ok 8\n";
106
107} elsif(defined $pid) {
108
109 $sock = Multi->new(PeerPort => $port,
110 Proto => 'tcp',
111 PeerAddr => 'localhost',
112 MultiHomed => 1,
113 Timeout => 1,
114 ) or die "$!";
115
116 print $sock "ok 6\n";
117 sleep(1); # race condition
118 print $sock->getline();
119
120 $sock->close;
121
122 exit;
123} else {
124 die;
125}