test/jdk/java/nio/channels/DatagramChannel/SocketOptionTests.java
author alanb
Sat, 09 Nov 2019 11:48:37 +0000
changeset 59000 612c58965775
parent 48397 ead47ddf5844
permissions -rw-r--r--
8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win) Reviewed-by: dfuchs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     1
/*
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
     2
 * Copyright (c) 2007, 2019, Oracle and/or its affiliates. All rights reserved.
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     4
 *
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     8
 *
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    13
 * accompanied this code).
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    14
 *
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    18
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2057
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2057
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2057
diff changeset
    21
 * questions.
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    22
 */
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    23
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    24
/* @test
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    25
 * @bug 4640544 8044773 8233435
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    26
 * @summary Unit test for setOption/getOption/options methods
48397
ead47ddf5844 8191788: add jdk.internal.vm.compiler to --limit-modules if -Djvmci.Compiler=graal is in the command line
kvn
parents: 47216
diff changeset
    27
 * @requires !vm.graal.enabled
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    28
 * @library /test/lib
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    29
 * @build jdk.test.lib.net.IPSupport
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    30
 *        jdk.test.lib.NetworkConfiguration
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    31
 *        SocketOptionTests
37676
24ef455da1b0 8044773: Refactor jdk.net API so that it can be moved out of the base module
chegar
parents: 36115
diff changeset
    32
 * @run main SocketOptionTests
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    33
 * @run main/othervm -Djava.net.preferIPv4Stack=true SocketOptionTests
40261
86a49ba76f52 8136930: Simplify use of module-system options by custom launchers
mchung
parents: 38474
diff changeset
    34
 * @run main/othervm --limit-modules=java.base SocketOptionTests
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    35
 */
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    36
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    37
import java.nio.*;
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    38
import java.nio.channels.*;
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    39
import java.net.*;
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    40
import java.io.IOException;
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    41
import java.util.*;
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    42
import static java.net.StandardProtocolFamily.*;
9679
d98ae8bc45fc 7042979: Rename StandardSocketOption and StandardWatchEventKind
alanb
parents: 7668
diff changeset
    43
import static java.net.StandardSocketOptions.*;
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    44
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    45
import jdk.test.lib.NetworkConfiguration;
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    46
import jdk.test.lib.net.IPSupport;
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    47
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    48
public class SocketOptionTests {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    49
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    50
    public static void main(String[] args) throws IOException {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    51
        IPSupport.throwSkippedExceptionIfNonOperational();
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    52
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    53
        NetworkConfiguration config = NetworkConfiguration.probe();
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    54
        InetAddress ip4Address = config.ip4Addresses().findAny().orElse(null);
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    55
        InetAddress ip6Address = config.ip6Addresses().findAny().orElse(null);
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    56
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    57
        System.out.println("[UNSPEC, bound to wildcard address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    58
        try (DatagramChannel dc = DatagramChannel.open()) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    59
            test(dc, new InetSocketAddress(0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    60
        }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    61
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    62
        if (IPSupport.hasIPv4()) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    63
            System.out.println("[INET, bound to wildcard address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    64
            try (DatagramChannel dc = DatagramChannel.open(INET)) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    65
                test(dc, new InetSocketAddress(0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    66
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    67
            System.out.println("[INET, bound to IPv4 address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    68
            try (DatagramChannel dc = DatagramChannel.open(INET)) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    69
                test(dc, new InetSocketAddress(ip4Address, 0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    70
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    71
        }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    72
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    73
        if (IPSupport.hasIPv6()) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    74
            System.out.println("[INET6, bound to wildcard address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    75
            try (DatagramChannel dc = DatagramChannel.open(INET6)) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    76
                test(dc, new InetSocketAddress(0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    77
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    78
            System.out.println("[INET6, bound to IPv6 address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    79
            try (DatagramChannel dc = DatagramChannel.open(INET6)) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    80
                test(dc, new InetSocketAddress(ip6Address, 0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    81
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    82
        }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    83
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    84
        if (IPSupport.hasIPv4() && IPSupport.hasIPv6()) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    85
            System.out.println("[UNSPEC, bound to IPv4 address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    86
            try (DatagramChannel dc = DatagramChannel.open()) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    87
                test(dc, new InetSocketAddress(ip4Address, 0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    88
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    89
            System.out.println("[INET6, bound to IPv4 address]");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    90
            try (DatagramChannel dc = DatagramChannel.open(INET6)) {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    91
                test(dc, new InetSocketAddress(ip4Address, 0));
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    92
            }
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    93
        }
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    94
    }
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    95
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
    96
    static void test(DatagramChannel dc, SocketAddress localAddress) throws IOException {
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
    97
        // check supported options
2057
3acf8e5e2ca0 6781363: New I/O: Update socket-channel API to jsr203/nio2-b99
alanb
parents: 1152
diff changeset
    98
        Set<SocketOption<?>> options = dc.supportedOptions();
36115
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
    99
        boolean reuseport = options.contains(SO_REUSEPORT);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   100
        List<? extends SocketOption<?>> expected;
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   101
        if (reuseport) {
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   102
           expected = Arrays.asList(SO_SNDBUF, SO_RCVBUF,
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   103
                      SO_REUSEADDR, SO_REUSEPORT, SO_BROADCAST, IP_TOS, IP_MULTICAST_IF,
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   104
                      IP_MULTICAST_TTL, IP_MULTICAST_LOOP);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   105
        } else {
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   106
           expected = Arrays.asList(SO_SNDBUF, SO_RCVBUF,
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   107
                      SO_REUSEADDR, SO_BROADCAST, IP_TOS, IP_MULTICAST_IF, IP_MULTICAST_TTL,
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   108
                      IP_MULTICAST_LOOP);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   109
        }
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   110
        for (SocketOption opt: expected) {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   111
            if (!options.contains(opt))
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   112
                throw new RuntimeException(opt.name() + " should be supported");
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   113
        }
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   114
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   115
        // check specified defaults
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   116
        checkOption(dc, SO_BROADCAST, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   117
        checkOption(dc, IP_MULTICAST_TTL, 1);           // true on supported platforms
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   118
        checkOption(dc, IP_MULTICAST_LOOP, true);       // true on supported platforms
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   119
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   120
        // allowed to change when not bound
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   121
        dc.setOption(SO_BROADCAST, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   122
        checkOption(dc, SO_BROADCAST, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   123
        dc.setOption(SO_BROADCAST, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   124
        checkOption(dc, SO_BROADCAST, false);
6696
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   125
        dc.setOption(SO_SNDBUF, 128*1024);       // can't check
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   126
        dc.setOption(SO_RCVBUF, 128*1024);       // can't check
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   127
        int before, after;
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   128
        before = dc.getOption(SO_SNDBUF);
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   129
        after = dc.setOption(SO_SNDBUF, Integer.MAX_VALUE).getOption(SO_SNDBUF);
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   130
        if (after < before)
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   131
            throw new RuntimeException("setOption caused SO_SNDBUF to decrease");
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   132
        before = dc.getOption(SO_RCVBUF);
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   133
        after = dc.setOption(SO_RCVBUF, Integer.MAX_VALUE).getOption(SO_RCVBUF);
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   134
        if (after < before)
7201f23dae0d 6989190: SO_SNDBUF/SO_RCVBUF limits should only be checked when setsockopt fails (sol)
alanb
parents: 5506
diff changeset
   135
            throw new RuntimeException("setOption caused SO_RCVBUF to decrease");
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   136
        dc.setOption(SO_REUSEADDR, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   137
        checkOption(dc, SO_REUSEADDR, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   138
        dc.setOption(SO_REUSEADDR, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   139
        checkOption(dc, SO_REUSEADDR, false);
36115
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   140
        if (reuseport) {
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   141
            dc.setOption(SO_REUSEPORT, true);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   142
            checkOption(dc, SO_REUSEPORT, true);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   143
            dc.setOption(SO_REUSEPORT, false);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   144
            checkOption(dc, SO_REUSEPORT, false);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 14342
diff changeset
   145
        }
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   146
        // bind socket
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   147
        dc.bind(localAddress);
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   148
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   149
        // allow to change when bound
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   150
        dc.setOption(SO_BROADCAST, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   151
        checkOption(dc, SO_BROADCAST, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   152
        dc.setOption(SO_BROADCAST, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   153
        checkOption(dc, SO_BROADCAST, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   154
        dc.setOption(IP_TOS, 0x08);     // can't check
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   155
        dc.setOption(IP_MULTICAST_TTL, 2);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   156
        checkOption(dc, IP_MULTICAST_TTL, 2);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   157
        dc.setOption(IP_MULTICAST_LOOP, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   158
        checkOption(dc, IP_MULTICAST_LOOP, false);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   159
        dc.setOption(IP_MULTICAST_LOOP, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   160
        checkOption(dc, IP_MULTICAST_LOOP, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   161
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   162
        // NullPointerException
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   163
        try {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   164
            dc.setOption(null, "value");
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   165
            throw new RuntimeException("NullPointerException not thrown");
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   166
        } catch (NullPointerException x) {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   167
        }
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   168
        try {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   169
            dc.getOption(null);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   170
            throw new RuntimeException("NullPointerException not thrown");
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   171
        } catch (NullPointerException x) {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   172
        }
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   173
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   174
        // ClosedChannelException
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   175
        dc.close();
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   176
        try {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   177
            dc.setOption(IP_MULTICAST_LOOP, true);
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   178
            throw new RuntimeException("ClosedChannelException not thrown");
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   179
        } catch (ClosedChannelException x) {
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   180
        }
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   181
    }
59000
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   182
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   183
    static <T> void checkOption(DatagramChannel dc,
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   184
                                SocketOption<T> name,
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   185
                                T expectedValue)
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   186
        throws IOException
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   187
    {
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   188
        T value = dc.getOption(name);
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   189
        if (!value.equals(expectedValue))
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   190
            throw new RuntimeException("value not as expected");
612c58965775 8233435: (dc) DatagramChannel should allow IPv6 socket join IPv4 multicast groups (macOS, win)
alanb
parents: 48397
diff changeset
   191
    }
1152
29d6145d1097 4640544: New I/O: Complete socket-channel functionality
alanb
parents:
diff changeset
   192
}