Net::Ping: Handle getprotobyn{ame,umber} not being available
[perl.git] / dist / Net-Ping / t / 450_service.t
1 # Testing service_check method using tcp and syn protocols.
2
3 use Config;
4
5 BEGIN {
6   unless (eval "require IO::Socket") {
7     print "1..0 \# Skip: no IO::Socket\n";
8     exit;
9   }
10   unless (getservbyname('echo', 'tcp')) {
11     print "1..0 \# Skip: no echo port\n";
12     exit;
13   }
14   unless ($Config{d_getpbyname}) {
15     print "1..0 \# Skip: no getprotobyname\n";
16     exit;
17   }
18 }
19
20 use strict;
21 use Test::More tests => 26;
22 BEGIN {use_ok('Net::Ping')};
23
24 # I'm lazy so I'll just use IO::Socket
25 # for the TCP Server stuff instead of doing
26 # all that direct socket() junk manually.
27
28 my $sock1 = new IO::Socket::INET
29   LocalAddr => "127.0.0.1",
30   Proto => "tcp",
31   Listen => 8,
32   or warn "bind: $!";
33
34 isa_ok($sock1, 'IO::Socket::INET',
35        'Start a TCP listen server on ephemeral port');
36
37 # Start listening on another ephemeral port
38 my $sock2 = new IO::Socket::INET
39   LocalAddr => "127.0.0.1",
40   Proto => "tcp",
41   Listen => 8,
42   or warn "bind: $!";
43
44 isa_ok($sock2, 'IO::Socket::INET',
45        'Start a second TCP listen server on ephemeral port');
46
47 my $port1 = $sock1->sockport;
48 cmp_ok($port1, '>', 0);
49
50 my $port2 = $sock2->sockport;
51 cmp_ok($port2, '>', 0);
52
53
54 isnt($port1, $port2, 'Make sure the servers are listening on different ports');
55
56 $sock2->close;
57
58 # This is how it should be:
59 # 127.0.0.1:$port1 - service ON
60 # 127.0.0.1:$port2 - service OFF
61
62 #####
63 # First, we test using the "tcp" protocol.
64 # (2 seconds should be long enough to connect to loopback.)
65 my $p = new Net::Ping "tcp", 2;
66
67 isa_ok($p, 'Net::Ping', 'new() worked');
68
69 # Disable service checking
70 $p->service_check(0);
71
72 # Try on the first port
73 $p->{port_num} = $port1;
74
75 is($p->ping("127.0.0.1"), 1, 'first port is reachable');
76
77 # Try on the other port
78 $p->{port_num} = $port2;
79
80 {
81     local $TODO;
82     $TODO = "Believed not to work on $^O" if $^O eq 'hpux';
83     is($p->ping("127.0.0.1"), 1, 'second port is reachable');
84 }
85
86 # Enable service checking
87 $p->service_check(1);
88
89 # Try on the first port
90 $p->{port_num} = $port1;
91
92 is($p->ping("127.0.0.1"), 1, 'first service is on');
93
94 # Try on the other port
95 $p->{port_num} = $port2;
96
97 isnt($p->ping("127.0.0.1"), 2, 'second service is off');
98
99 # test 11 just finished.
100
101 #####
102 # Lastly, we test using the "syn" protocol.
103 $p = new Net::Ping "syn", 2;
104
105 isa_ok($p, 'Net::Ping', 'new() worked');
106
107 # Disable service checking
108 $p->service_check(0);
109
110 # Try on the first port
111 $p->{port_num} = $port1;
112
113 is($p->ping("127.0.0.1"), 1, "send SYN to first port") or diag ("ERRNO: $!");
114
115 is($p->ack(), '127.0.0.1', 'IP should be reachable');
116 is($p->ack(), undef, 'No more sockets');
117
118 ###
119 # Get a fresh object
120 $p = new Net::Ping "syn", 2;
121
122 isa_ok($p, 'Net::Ping', 'new() worked');
123
124 # Disable service checking
125 $p->service_check(0);
126
127 # Try on the other port
128 $p->{port_num} = $port2;
129
130 is($p->ping("127.0.0.1"), 1, "send SYN to second port") or diag ("ERRNO: $!");
131
132 {
133     local $TODO;
134     $TODO = "Believed not to work on $^O" if $^O eq 'hpux' || $^O eq 'MSWin32';
135     is($p->ack(), '127.0.0.1', 'IP should be reachable');
136 }
137 is($p->ack(), undef, 'No more sockets');
138
139
140 ###
141 # Get a fresh object
142 $p = new Net::Ping "syn", 2;
143
144 isa_ok($p, 'Net::Ping', 'new() worked');
145
146 # Enable service checking
147 $p->service_check(1);
148
149 # Try on the first port
150 $p->{port_num} = $port1;
151
152 is($p->ping("127.0.0.1"), 1, "send SYN to first port") or diag ("ERRNO: $!");
153
154 is($p->ack(), '127.0.0.1', 'IP should be reachable');
155 is($p->ack(), undef, 'No more sockets');
156
157
158 ###
159 # Get a fresh object
160 $p = new Net::Ping "syn", 2;
161
162 isa_ok($p, 'Net::Ping', 'new() worked');
163
164 # Enable service checking
165 $p->service_check(1);
166
167 # Try on the other port
168 $p->{port_num} = $port2;
169
170 is($p->ping("127.0.0.1"), 1, "send SYN to second port") or diag ("ERRNO: $!");
171
172 is($p->ack(), undef, 'No sockets should have service on');