summaryrefslogtreecommitdiff
path: root/dist/Net-Ping/t/501_ping_icmpv6.t
diff options
context:
space:
mode:
Diffstat (limited to 'dist/Net-Ping/t/501_ping_icmpv6.t')
-rw-r--r--dist/Net-Ping/t/501_ping_icmpv6.t73
1 files changed, 73 insertions, 0 deletions
diff --git a/dist/Net-Ping/t/501_ping_icmpv6.t b/dist/Net-Ping/t/501_ping_icmpv6.t
new file mode 100644
index 0000000000..f29e16cadb
--- /dev/null
+++ b/dist/Net-Ping/t/501_ping_icmpv6.t
@@ -0,0 +1,73 @@
+# Test to perform ICMPv6 protocol testing.
+# Root access is required.
+# In the core test suite it calls itself via sudo -n (no password) to test it.
+
+use strict;
+use Config;
+use Net::Ping;
+use Test::More;
+use Cwd;
+use File::Spec;
+
+BEGIN {
+ unless (eval "require Socket") {
+ plan skip_all => 'no Socket';
+ }
+ unless ($Config{d_getpbyname}) {
+ plan skip_all => 'no getprotobyname';
+ }
+}
+
+my $is_devel = $ENV{PERL_CORE} || -d ".git" ? 1 : 0;
+if (!Net::Ping::_isroot()) {
+ my $file = __FILE__;
+ my $lib = $ENV{PERL_CORE} ? '-I../../lib' : '-Mblib';
+ # -n prevents from asking for a password. rather fail then
+ # A technical problem is with leak-detectors, like asan, which
+ # require PERL_DESTRUCT_LEVEL=2 to be set in the root env.
+ my $env = "PERL_DESTRUCT_LEVEL=2";
+ if ($ENV{TEST_PING6_HOST}) {
+ $env .= " TEST_PING6_HOST=$ENV{TEST_PING6_HOST}";
+ }
+ if ($ENV{PERL_CORE} && $Config{ldlibpthname}) {
+ my $up = File::Spec->updir();
+ my $dir = Cwd::abs_path(File::Spec->catdir($up, $up));
+ $env .= " $Config{ldlibpthname}=\"$dir\"";
+ }
+ if ($is_devel and
+ system("sudo -n $env \"$^X\" $lib $file") == 0) {
+ exit;
+ } else {
+ plan skip_all => 'no sudo/failed';
+ }
+}
+
+
+SKIP: {
+ skip "icmpv6 ping requires root privileges.", 1
+ if !Net::Ping::_isroot() or $^O eq 'MSWin32';
+ my $p = new Net::Ping "icmpv6";
+ # 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 $rightip = "2001:4860:4860::8888"; # pingable ip of google's dnsserver
+ # for a firewalled ipv6 network try an optional local ipv6 host
+ $rightip = $ENV{TEST_PING6_HOST} if $ENV{TEST_PING6_HOST};
+ my $wrongip = "2001:4860:4860::1234"; # non existing ip
+ # diag "Pinging existing IPv6 ";
+ my $result = $p->ping($rightip);
+ if ($result == 1) {
+ ok($result, "icmpv6 ping $rightip");
+ # diag "Pinging wrong IPv6 ";
+ ok(!$p->ping($wrongip), "icmpv6 ping $wrongip");
+ } else {
+ TODO: {
+ local $TODO = "icmpv6 firewalled?";
+ is($result, 1, "icmpv6 ping $rightip");
+ }
+ }
+}
+
+done_testing;