use strict;

BEGIN {
  if ($ENV{NO_NETWORK_TESTING} ||
      ($ENV{PERL_CORE}) && !$ENV{PERL_TEST_Net_Ping}) {
    print "1..0 # Skip: network dependent test\n";
    exit;
  }
  unless (eval "require Socket") {
    print "1..0 \# Skip: no Socket\n";
    exit;
  }
  unless (getservbyname('echo', 'tcp')) {
    print "1..0 \# Skip: no echo port\n";
    exit;
  }
}

# Hopefully this is never a routeable host
my $fail_ip = $ENV{NET_PING_FAIL_IP} || "192.0.2.0";

# Remote network test using tcp protocol.
#
# NOTE:
#   Network connectivity will be required for all tests to pass.
#   Firewalls may also cause some tests to fail, so test it
#   on a clear network.  If you know you do not have a direct
#   connection to remote networks, but you still want the tests
#   to pass, use the following:
#
# $ PERL_CORE=1 make test

use Test::More tests => 13;
BEGIN {use_ok('Net::Ping');}

my $p = new Net::Ping "tcp",9;

isa_ok($p, 'Net::Ping', 'new() worked');

# message_type can't be used
eval {
  $p->message_type();
};
like($@, qr/message type only supported on 'icmp' protocol/, "message_type() API only concern 'icmp' protocol");

my $localhost = $p->ping("localhost");
if ($localhost) {
  isnt($p->ping("localhost"), 0, 'Test on the default port');
} else {
  ok(1, "SKIP localhost on the default port on $^O");
}

# Change to use the more common web port.
# This will pull from /etc/services on UNIX.
# (Make sure getservbyname works in scalar context.)
isnt($p->{port_num} = (getservbyname("http", "tcp") || 80), undef, "getservbyname http");

if ($localhost) {
  isnt($p->ping("localhost"), 0, 'Test localhost on the web port');
} else {
  my $result = $p->ping("localhost");
  if ($result) {
    isnt($p->ping("localhost"), 0, "localhost on the web port unexpectedly worked on $^O");
  } else {
    ok(1, "SKIP localhost on the web port on $^O");
  }
}

is($p->ping($fail_ip), 0, "Can't reach $fail_ip");

# Test a few remote servers
# Hopefully they are up when the tests are run.

if ($p->ping('google.com')) { # check for firewall
  foreach (qw(google.com www.google.com www.wisc.edu
              yahoo.com www.yahoo.com www.duckduckgo.com)) {
    isnt($p->ping($_), 0, "Can ping $_");
  }
} else {
 SKIP: {
    skip "Cannot ping google.com: no TCP connection or firewall", 6;
  }
}
