< prev index next >

test/lib/jdk/test/lib/net/IPSupport.java

Print this page
@@ -1,7 +1,7 @@
  /*
-  * Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
+  * Copyright (c) 2019, 2021, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.

@@ -25,15 +25,16 @@
  
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.PrintStream;
  import java.io.UncheckedIOException;
+ import java.net.Inet4Address;
+ import java.net.Inet6Address;
  import java.net.InetAddress;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.net.SocketException;
- import java.net.UnknownHostException;
+ import java.net.ProtocolFamily;
+ import java.net.StandardProtocolFamily;
+ import java.nio.channels.SocketChannel;
  import java.security.AccessController;
  import java.security.PrivilegedActionException;
  import java.security.PrivilegedExceptionAction;
  import java.util.concurrent.Callable;
  import jtreg.SkippedException;

@@ -47,40 +48,28 @@
      private static final boolean hasIPv6;
      private static final boolean preferIPv4Stack;
      private static final boolean preferIPv6Addresses;
  
      static {
-         try {
-             InetAddress loopbackIPv4 = InetAddress.getByAddress(
-                     new byte[] {0x7F, 0x00, 0x00, 0x01});
- 
-             InetAddress loopbackIPv6 = InetAddress.getByAddress(
-                     new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01});
- 
-             hasIPv4 = runPrivilegedAction(() -> hasAddress(loopbackIPv4));
-             hasIPv6 = runPrivilegedAction(() -> hasAddress(loopbackIPv6));
-         } catch (UnknownHostException e) {
-             throw new AssertionError(e);
-         }
+         hasIPv4 = runPrivilegedAction(() -> isSupported(Inet4Address.class));
+         hasIPv6 = runPrivilegedAction(() -> isSupported(Inet6Address.class));
          preferIPv4Stack = runPrivilegedAction(() -> Boolean.parseBoolean(
              System.getProperty("java.net.preferIPv4Stack")));
          preferIPv6Addresses = runPrivilegedAction(() -> Boolean.parseBoolean(
              System.getProperty("java.net.preferIPv6Addresses")));
          if (!preferIPv4Stack && !hasIPv4 && !hasIPv6) {
              throw new AssertionError("IPv4 and IPv6 both not available and java.net.preferIPv4Stack is not true");
          }
      }
  
-     private static boolean hasAddress(InetAddress address) {
-         try (Socket socket = new Socket()) {
-             socket.bind(new InetSocketAddress(address, 0));
+     private static boolean isSupported(Class<? extends InetAddress> addressType) {
+         ProtocolFamily family = addressType == Inet4Address.class ?
+                 StandardProtocolFamily.INET : StandardProtocolFamily.INET6;
+         try (var sc = SocketChannel.open(family)) {
              return true;
-         } catch (SocketException se) {
+         } catch (IOException | UnsupportedOperationException ex) {
              return false;
-         } catch (IOException e) {
-             throw new UncheckedIOException(e);
          }
      }
  
      private static <T> T runPrivilegedAction(Callable<T> callable) {
          try {
< prev index next >