Path: blob/master/test/jdk/java/net/SocketOption/CachedImplOptions.java
41149 views
/*1* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test25* @bug 824198826* @summary Checks that the caching of options does not affect other impls27* @run testng/othervm CachedImplOptions28* @run testng/othervm -Djava.net.preferIPv4Stack=true CachedImplOptions29*/3031import java.io.IOException;32import java.io.InputStream;33import java.io.OutputStream;34import java.net.DatagramPacket;35import java.net.DatagramSocket;36import java.net.DatagramSocketImpl;37import java.net.MulticastSocket;38import java.net.InetAddress;39import java.net.NetworkInterface;40import java.net.ServerSocket;41import java.net.Socket;42import java.net.SocketAddress;43import java.net.SocketException;44import java.net.SocketImpl;45import java.net.SocketOption;46import java.net.StandardSocketOptions;47import java.util.Set;48import org.testng.annotations.Test;49import static org.testng.Assert.*;5051public class CachedImplOptions {5253@Test54public void testDatagramSocket() throws IOException {55try (var impl = new DatagramSocket()) {56assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));57assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));58}59try (var impl = new DatagramSocket(new FooDatagramSocketImpl()) {}) {60assertEquals(impl.supportedOptions(), Set.of(FooDatagramSocketImpl.FOO_OPTION));61assertEquals(impl.supportedOptions(), Set.of(FooDatagramSocketImpl.FOO_OPTION));62}63try (var impl = new DatagramSocket(new BarDatagramSocketImpl()) {}) {64assertEquals(impl.supportedOptions(), Set.of(BarDatagramSocketImpl.BAR_OPTION));65assertEquals(impl.supportedOptions(), Set.of(BarDatagramSocketImpl.BAR_OPTION));66}67try (var impl = new DatagramSocket(new BazDatagramSocketImpl()) {}) {68assertEquals(impl.supportedOptions(), Set.of(BazDatagramSocketImpl.BAZ_OPTION));69assertEquals(impl.supportedOptions(), Set.of(BazDatagramSocketImpl.BAZ_OPTION));70}71try (var impl = new DatagramSocket()) {72assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));73assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));74}75}7677@Test78public void testMulticastSocket() throws IOException {79try (var impl = new MulticastSocket()) {80assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));81assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));82}8384// Use the factory to inject an alternative impl85DatagramSocket.setDatagramSocketImplFactory(() -> new FooDatagramSocketImpl());8687try (var impl = new MulticastSocket()) {88assertEquals(impl.supportedOptions(), Set.of(FooDatagramSocketImpl.FOO_OPTION));89assertEquals(impl.supportedOptions(), Set.of(FooDatagramSocketImpl.FOO_OPTION));90}91}9293static class FooDatagramSocketImpl extends AbstractDatagramSocketImpl {94public static final SocketOption<Boolean> FOO_OPTION = new SocketOption<>() {95@Override public String name() { return "FOO_OPTION"; }96@Override public Class<Boolean> type() { return Boolean.class; }97};98@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(FOO_OPTION); }99}100101static class BarDatagramSocketImpl extends AbstractDatagramSocketImpl {102public static final SocketOption<Integer> BAR_OPTION = new SocketOption<>() {103@Override public String name() { return "BAR_OPTION"; }104@Override public Class<Integer> type() { return Integer.class; }105};106@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(BAR_OPTION); }107}108109static class BazDatagramSocketImpl extends AbstractDatagramSocketImpl {110public static final SocketOption<Long> BAZ_OPTION = new SocketOption<>() {111@Override public String name() { return "BAZ_OPTION"; }112@Override public Class<Long> type() { return Long.class; }113};114@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(BAZ_OPTION); }115}116117static abstract class AbstractDatagramSocketImpl extends DatagramSocketImpl {118119@Override public Set<SocketOption<?>> supportedOptions() { return null; }120@Override protected void create() throws SocketException { }121@Override protected void bind(int lport, InetAddress laddr){ }122@Override protected void send(DatagramPacket p) { }123@Override protected int peek(InetAddress i) { return 0; }124@Override protected int peekData(DatagramPacket p) { return 0; }125@Override protected void receive(DatagramPacket p) { }126@Override protected void setTTL(byte ttl) { }127@Override protected byte getTTL() { return 0; }128@Override protected void setTimeToLive(int ttl) { }129@Override protected int getTimeToLive() { return 0; }130@Override protected void join(InetAddress inetaddr) { }131@Override protected void leave(InetAddress inetaddr) { }132@Override protected void joinGroup(SocketAddress x, NetworkInterface y) { }133@Override protected void leaveGroup(SocketAddress x, NetworkInterface y) { }134@Override protected void close() { }135@Override public void setOption(int optID, Object value) { }136@Override public Object getOption(int optID) { return null; }137}138139// -- socket140141@Test142public void testSocket() throws IOException {143try (var impl = new Socket()) {144assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));145assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));146}147try (var impl = new Socket(new LarrySocketImpl()) {}) {148assertEquals(impl.supportedOptions(), Set.of(LarrySocketImpl.LARRY_OPTION));149assertEquals(impl.supportedOptions(), Set.of(LarrySocketImpl.LARRY_OPTION));150}151try (var impl = new Socket(new CurlySocketImpl()) {}) {152assertEquals(impl.supportedOptions(), Set.of(CurlySocketImpl.CURLY_OPTION));153assertEquals(impl.supportedOptions(), Set.of(CurlySocketImpl.CURLY_OPTION));154}155try (var impl = new Socket(new MoeSocketImpl()) {}) {156assertEquals(impl.supportedOptions(), Set.of(MoeSocketImpl.MOE_OPTION));157assertEquals(impl.supportedOptions(), Set.of(MoeSocketImpl.MOE_OPTION));158}159try (var impl = new Socket()) {160assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));161assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_SNDBUF));162}163}164165@Test166public void testServerSocket() throws IOException {167try (var impl = new ServerSocket()) {168assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_RCVBUF));169assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_RCVBUF));170}171try (var impl = new ServerSocket(new LarrySocketImpl()) {}) {172assertEquals(impl.supportedOptions(), Set.of(LarrySocketImpl.LARRY_OPTION));173assertEquals(impl.supportedOptions(), Set.of(LarrySocketImpl.LARRY_OPTION));174}175try (var impl = new ServerSocket(new CurlySocketImpl()) {}) {176assertEquals(impl.supportedOptions(), Set.of(CurlySocketImpl.CURLY_OPTION));177assertEquals(impl.supportedOptions(), Set.of(CurlySocketImpl.CURLY_OPTION));178}179try (var impl = new ServerSocket(new MoeSocketImpl()) {}) {180assertEquals(impl.supportedOptions(), Set.of(MoeSocketImpl.MOE_OPTION));181assertEquals(impl.supportedOptions(), Set.of(MoeSocketImpl.MOE_OPTION));182}183try (var impl = new ServerSocket()) {184assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_RCVBUF));185assertTrue(impl.supportedOptions().contains(StandardSocketOptions.SO_RCVBUF));186}187}188189static class LarrySocketImpl extends AbstractSocketImpl {190public static final SocketOption<Boolean> LARRY_OPTION = new SocketOption<>() {191@Override public String name() { return "LARRY_OPTION"; }192@Override public Class<Boolean> type() { return Boolean.class; }193};194@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(LARRY_OPTION); }195}196197static class CurlySocketImpl extends AbstractSocketImpl {198public static final SocketOption<Integer> CURLY_OPTION = new SocketOption<>() {199@Override public String name() { return "CURLY_OPTION"; }200@Override public Class<Integer> type() { return Integer.class; }201};202@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(CURLY_OPTION); }203}204205static class MoeSocketImpl extends AbstractSocketImpl {206public static final SocketOption<Long> MOE_OPTION = new SocketOption<>() {207@Override public String name() { return "MOE_OPTION"; }208@Override public Class<Long> type() { return Long.class; }209};210@Override public Set<SocketOption<?>> supportedOptions() { return Set.of(MOE_OPTION); }211}212213static abstract class AbstractSocketImpl extends SocketImpl {214215@Override protected void create(boolean stream) { }216@Override protected void connect(String host, int port) { }217@Override protected void connect(InetAddress address, int port) { }218@Override protected void connect(SocketAddress address, int timeout) { }219@Override protected void bind(InetAddress host, int port) { }220@Override protected void listen(int backlog) { }221@Override protected void accept(SocketImpl s) { }222@Override protected InputStream getInputStream() { return null; }223@Override protected OutputStream getOutputStream() { return null; }224@Override protected int available() { return 0; }225@Override protected void close() { }226@Override protected void sendUrgentData(int data) { }227@Override public void setOption(int optID, Object value) { }228@Override public Object getOption(int optID) { return null; }229}230}231232233