test/jdk/java/net/Inet6Address/PreferIPv6AddressesTest.java
author phh
Sat, 30 Nov 2019 14:33:05 -0800
changeset 59330 5b96c12f909d
parent 54770 62b6e7587b1f
permissions -rw-r--r--
8234541: C1 emits an empty message when it inlines successfully Summary: Use "inline" as the message when successfull Reviewed-by: thartmann, mdoerr Contributed-by: navy.xliu@gmail.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     1
/*
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     4
 *
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     7
 * published by the Free Software Foundation.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     8
 *
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    13
 * accompanied this code).
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    14
 *
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    18
 *
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    21
 * questions.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    22
 */
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    23
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    24
/**
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    25
 * @test
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    26
 * @bug 8016521
54770
62b6e7587b1f 8220673: Add test library support for determining platform IP support
aeubanks
parents: 47216
diff changeset
    27
 * @library /test/lib
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    28
 * @summary InetAddress should not always re-order addresses returned from name
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    29
 *          service
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    30
 * @run main/othervm -Djava.net.preferIPv6Addresses=false PreferIPv6AddressesTest
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    31
 * @run main/othervm -Djava.net.preferIPv6Addresses=true PreferIPv6AddressesTest
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    32
 * @run main/othervm -Djava.net.preferIPv6Addresses=system PreferIPv6AddressesTest
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    33
 * @run main/othervm PreferIPv6AddressesTest
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    34
 */
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    35
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    36
import java.io.IOException;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    37
import java.net.*;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    38
import java.nio.channels.DatagramChannel;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    39
import java.util.Arrays;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    40
import java.util.stream.IntStream;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    41
import static java.lang.System.out;
54770
62b6e7587b1f 8220673: Add test library support for determining platform IP support
aeubanks
parents: 47216
diff changeset
    42
import jdk.test.lib.net.IPSupport;
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    43
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    44
public class PreferIPv6AddressesTest {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    45
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    46
    // A name, that if resolves, returns both IPv4 and IPv6 addresses.
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    47
    static final String HOST_NAME = "www.google.com";
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    48
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    49
    static final InetAddress LOOPBACK = InetAddress.getLoopbackAddress();
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    50
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    51
    static final String preferIPV6Address =
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    52
            System.getProperty("java.net.preferIPv6Addresses", "false");
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    53
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    54
    public static void main(String args[]) throws IOException {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    55
        InetAddress addrs[];
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    56
        try {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    57
            addrs = InetAddress.getAllByName(HOST_NAME);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    58
        } catch (UnknownHostException e) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    59
            out.println("Unknown host " + HOST_NAME + ", cannot run test.");
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    60
            return;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    61
        }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    62
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    63
        int firstIPv4Address = IntStream.range(0, addrs.length)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    64
                .filter(x -> addrs[x] instanceof Inet4Address)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    65
                .findFirst().orElse(-1);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    66
        int firstIPv6Address = IntStream.range(0, addrs.length)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    67
                .filter(x -> addrs[x] instanceof Inet6Address)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    68
                .findFirst().orElse(-1);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    69
54770
62b6e7587b1f 8220673: Add test library support for determining platform IP support
aeubanks
parents: 47216
diff changeset
    70
        out.println("IPv6 supported: " + IPSupport.hasIPv6());
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    71
        out.println("Addresses: " + Arrays.asList(addrs));
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    72
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    73
        if (preferIPV6Address.equalsIgnoreCase("true") && firstIPv6Address != -1) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    74
            int off = firstIPv4Address != -1 ? firstIPv4Address : addrs.length;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    75
            assertAllv6Addresses(addrs, 0, off);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    76
            assertAllv4Addresses(addrs, off, addrs.length);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    77
            assertLoopbackAddress(Inet6Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    78
            assertAnyLocalAddress(Inet6Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    79
        } else if (preferIPV6Address.equalsIgnoreCase("false") && firstIPv4Address != -1) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    80
            int off = firstIPv6Address != -1 ? firstIPv6Address : addrs.length;
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    81
            assertAllv4Addresses(addrs, 0, off);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    82
            assertAllv6Addresses(addrs, off, addrs.length);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    83
            assertLoopbackAddress(Inet4Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    84
            assertAnyLocalAddress(Inet4Address.class);
54770
62b6e7587b1f 8220673: Add test library support for determining platform IP support
aeubanks
parents: 47216
diff changeset
    85
        } else if (preferIPV6Address.equalsIgnoreCase("system") && IPSupport.hasIPv6()) {
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    86
            assertLoopbackAddress(Inet6Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    87
            assertAnyLocalAddress(Inet6Address.class);
54770
62b6e7587b1f 8220673: Add test library support for determining platform IP support
aeubanks
parents: 47216
diff changeset
    88
        } else if (preferIPV6Address.equalsIgnoreCase("system") && !IPSupport.hasIPv6()) {
38552
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    89
            assertLoopbackAddress(Inet4Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    90
            assertAnyLocalAddress(Inet4Address.class);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    91
        }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    92
    }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    93
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    94
    static void assertAllv4Addresses(InetAddress[] addrs, int off, int len) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    95
        IntStream.range(off, len)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    96
                 .mapToObj(x -> addrs[x])
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    97
                 .forEach(x -> {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    98
                     if (!(x instanceof Inet4Address))
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
    99
                         throw new RuntimeException("Expected IPv4, got " + x);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   100
                 });
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   101
    }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   102
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   103
    static void assertAllv6Addresses(InetAddress[] addrs, int off, int len) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   104
        IntStream.range(off, len)
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   105
                .mapToObj(x -> addrs[x])
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   106
                .forEach(x -> {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   107
                    if (!(x instanceof Inet6Address))
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   108
                        throw new RuntimeException("Expected IPv6, got " + x);
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   109
                });
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   110
    }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   111
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   112
    static void assertLoopbackAddress(Class<?> expectedType) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   113
        if (!LOOPBACK.getClass().isAssignableFrom(expectedType))
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   114
            throw new RuntimeException("Expected " + expectedType
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   115
                    + ", got " + LOOPBACK.getClass());
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   116
    }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   117
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   118
    static void assertAnyLocalAddress(Class<?> expectedType) {
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   119
        InetAddress anyAddr = (new InetSocketAddress(0)).getAddress();
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   120
        if (!anyAddr.getClass().isAssignableFrom(expectedType))
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   121
            throw new RuntimeException("Expected " + expectedType
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   122
                    + ", got " + anyAddr.getClass());
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   123
    }
ca398af91529 8016521: InetAddress should not always re-order addresses returned from name service
vtewari
parents:
diff changeset
   124
}