< prev index next >

test/jdk/java/net/SocketImpl/ImplSupportedOptions.java

Print this page




  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 8213418
  27  * @summary Ensure correct impl supported socket options
  28  * @run testng ImplSupportedOptions
  29  */
  30 
  31 import java.io.IOException;
  32 import java.io.InputStream;
  33 import java.io.OutputStream;
  34 import java.net.InetAddress;
  35 import java.net.ServerSocket;
  36 import java.net.Socket;
  37 import java.net.SocketAddress;
  38 import java.net.SocketException;
  39 import java.net.SocketImpl;
  40 import java.net.SocketOption;
  41 import java.net.StandardSocketOptions;


  42 import java.util.Set;
  43 import org.testng.annotations.Test;
  44 import static org.testng.Assert.assertEquals;

  45 import static org.testng.Assert.assertTrue;
  46 
  47 public class ImplSupportedOptions {
  48 


  49     @Test
  50     public void socketSupportedOptions() throws Exception {
  51         Socket s = new Socket();
  52         Set<?> standardOptions = s.supportedOptions();
  53         assertTrue(standardOptions.contains(StandardSocketOptions.SO_LINGER),
  54                    "Expected SO_LINGER, in:" + standardOptions);
  55         assertEquals(standardOptions, s.supportedOptions());
  56         assertEquals(standardOptions, s.supportedOptions());
  57 
  58         s = new DummySocket();
  59         Set<?> dummyOptions = s.supportedOptions();
  60         assertEquals(dummyOptions.size(), 1);
  61         assertTrue(dummyOptions.contains(DummySocketImpl.SOCKET_OPT));
  62         assertEquals(dummyOptions, s.supportedOptions());
  63         assertEquals(dummyOptions, s.supportedOptions());






  64 
  65         s = new Socket();
  66         standardOptions = s.supportedOptions();
  67         assertTrue(standardOptions.contains(StandardSocketOptions.SO_LINGER),
  68                    "Expected SO_LINGER, in:" + standardOptions);
  69         assertEquals(standardOptions, s.supportedOptions());
  70         assertEquals(standardOptions, s.supportedOptions());
  71 
  72         s = new DummySocket();
  73         dummyOptions = s.supportedOptions();
  74         assertEquals(dummyOptions.size(), 1);
  75         assertTrue(dummyOptions.contains(DummySocketImpl.SOCKET_OPT));
  76         assertEquals(dummyOptions, s.supportedOptions());
  77         assertEquals(dummyOptions, s.supportedOptions());






  78     }
  79 
  80     @Test
  81     public void serverSocketSupportedOptions() throws Exception {
  82         ServerSocket s = new ServerSocket();
  83         Set<?> standardOptions = s.supportedOptions();
  84         assertTrue(standardOptions.contains(StandardSocketOptions.SO_REUSEADDR),
  85                    "Expected SO_REUSEADDR, in:" + standardOptions);
  86         assertEquals(standardOptions, s.supportedOptions());
  87         assertEquals(standardOptions, s.supportedOptions());
  88 
  89         s = new DummyServerSocket();
  90         Set<?> dummyOptions = s.supportedOptions();
  91         assertEquals(dummyOptions.size(), 1);
  92         assertTrue(dummyOptions.contains(DummySocketImpl.SOCKET_OPT));
  93         assertEquals(dummyOptions, s.supportedOptions());
  94         assertEquals(dummyOptions, s.supportedOptions());



  95 
  96         s = new ServerSocket();
  97         standardOptions = s.supportedOptions();
  98         assertTrue(standardOptions.contains(StandardSocketOptions.SO_REUSEADDR),
  99                    "Expected SO_REUSEADDR, in:" + standardOptions);
 100         assertEquals(standardOptions, s.supportedOptions());
 101         assertEquals(standardOptions, s.supportedOptions());
 102 
 103         s = new DummyServerSocket();
 104         dummyOptions = s.supportedOptions();
 105         assertEquals(dummyOptions.size(), 1);
 106         assertTrue(dummyOptions.contains(DummySocketImpl.SOCKET_OPT));
 107         assertEquals(dummyOptions, s.supportedOptions());
 108         assertEquals(dummyOptions, s.supportedOptions());



 109     }
 110 
 111     static class DummySocket extends Socket {
 112         DummySocket() throws IOException  {
 113             super(new DummySocketImpl());
 114         }
 115     }
 116 
 117     static class DummyServerSocket extends ServerSocket {
 118         DummyServerSocket() throws IOException  {
 119             super(new DummySocketImpl());
 120         }
 121     }
 122 
 123     static class DummySocketImpl extends SocketImpl {
 124 
 125         public static final SocketOption<String> SOCKET_OPT =
 126                 new ImplSocketOption<>("SOCKET_OPT", String.class);
 127 






 128         private static class ImplSocketOption<T> implements SocketOption<T> {
 129             private final String name;
 130             private final Class<T> type;
 131             ImplSocketOption(String name, Class<T> type) {
 132                 this.name = name;
 133                 this.type = type;
 134             }
 135             @Override public String name() { return name; }
 136             @Override public Class<T> type() { return type; }
 137             @Override public String toString() { return name; }
 138         }

 139 
 140         private final Set<SocketOption<?>> SO = Set.of(SOCKET_OPT);





 141 
 142         @Override
 143         public Set<SocketOption<?>> supportedOptions() { return SO; }





















 144 
 145         // ---
 146 
 147         @Override
 148         protected void create(boolean stream) throws IOException { }
 149 
 150         @Override
 151         protected void connect(String host, int port) throws IOException { }
 152 
 153         @Override
 154         protected void connect(InetAddress address, int port) throws IOException { }
 155 
 156         @Override
 157         protected void connect(SocketAddress address, int timeout) throws IOException { }
 158 
 159         @Override
 160         protected void bind(InetAddress host, int port) throws IOException { }
 161 
 162         @Override
 163         protected void listen(int backlog) throws IOException { }
 164 
 165         @Override


 168         @Override
 169         protected InputStream getInputStream() throws IOException { return null; }
 170 
 171         @Override
 172         protected OutputStream getOutputStream() throws IOException { return null; }
 173 
 174         @Override
 175         protected int available() throws IOException { return 0; }
 176 
 177         @Override
 178         protected void close() throws IOException { }
 179 
 180         @Override
 181         protected void sendUrgentData(int data) throws IOException { }
 182 
 183         @Override
 184         public void setOption(int optID, Object value) throws SocketException { }
 185 
 186         @Override
 187         public Object getOption(int optID) throws SocketException { return null; }















 188     }
 189 }


  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 8213418
  27  * @summary Ensure correct impl supported socket options
  28  * @run testng ImplSupportedOptions
  29  */
  30 
  31 import java.io.IOException;
  32 import java.io.InputStream;
  33 import java.io.OutputStream;
  34 import java.net.InetAddress;
  35 import java.net.ServerSocket;
  36 import java.net.Socket;
  37 import java.net.SocketAddress;
  38 import java.net.SocketException;
  39 import java.net.SocketImpl;
  40 import java.net.SocketOption;
  41 import java.net.StandardSocketOptions;
  42 import java.util.HashMap;
  43 import java.util.Map;
  44 import java.util.Set;
  45 import org.testng.annotations.Test;
  46 import static org.testng.Assert.assertEquals;
  47 import static org.testng.Assert.assertThrows;
  48 import static org.testng.Assert.assertTrue;
  49 
  50 public class ImplSupportedOptions {
  51 
  52     static final Class<UnsupportedOperationException> UOE = UnsupportedOperationException.class;
  53 
  54     @Test
  55     public void socketSupportedOptions() throws Exception {
  56         Socket s1 = new Socket();
  57         Set<?> standardOptions = s1.supportedOptions();
  58         assertTrue(standardOptions.contains(StandardSocketOptions.SO_LINGER),
  59                    "Expected SO_LINGER, in:" + standardOptions);
  60         assertEquals(standardOptions, s1.supportedOptions());
  61         assertEquals(standardOptions, s1.supportedOptions());
  62 
  63         Socket s2 = new DummySocket();
  64         Set<?> dummyOptions = s2.supportedOptions();
  65         assertEquals(dummyOptions.size(), 2);
  66         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SOCKET_OPT));
  67         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SOCKET_OPT1));
  68         assertEquals(dummyOptions, s2.supportedOptions());
  69         assertEquals(dummyOptions, s2.supportedOptions());
  70         s2.setOption(StandardDummySocketOptions.SOCKET_OPT, "aValue");
  71         assertEquals(s2.getOption(StandardDummySocketOptions.SOCKET_OPT), "aValue");
  72         s2.setOption(StandardDummySocketOptions.SOCKET_OPT1, 46);
  73         assertEquals((int)s2.getOption(StandardDummySocketOptions.SOCKET_OPT1), 46);
  74         assertThrows(UOE, () -> s2.setOption(StandardDummySocketOptions.SERVER_SOCKET_OPT, ""));
  75 
  76         Socket s3 = new Socket();
  77         standardOptions = s3.supportedOptions();
  78         assertTrue(standardOptions.contains(StandardSocketOptions.SO_LINGER),
  79                    "Expected SO_LINGER, in:" + standardOptions);
  80         assertEquals(standardOptions, s3.supportedOptions());
  81         assertEquals(standardOptions, s3.supportedOptions());
  82 
  83         Socket s4 = new DummySocket();
  84         dummyOptions = s4.supportedOptions();
  85         assertEquals(dummyOptions.size(), 2);
  86         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SOCKET_OPT));
  87         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SOCKET_OPT1));
  88         assertEquals(dummyOptions, s4.supportedOptions());
  89         assertEquals(dummyOptions, s4.supportedOptions());
  90         s4.setOption(StandardDummySocketOptions.SOCKET_OPT, "bValue");
  91         assertEquals(s4.getOption(StandardDummySocketOptions.SOCKET_OPT), "bValue");
  92         s4.setOption(StandardDummySocketOptions.SOCKET_OPT1, 47);
  93         assertEquals((int)s4.getOption(StandardDummySocketOptions.SOCKET_OPT1), 47);
  94         assertThrows(UOE, () -> s4.setOption(StandardDummySocketOptions.SERVER_SOCKET_OPT, ""));
  95     }
  96 
  97     @Test
  98     public void serverSocketSupportedOptions() throws Exception {
  99         ServerSocket s1 = new ServerSocket();
 100         Set<?> standardOptions = s1.supportedOptions();
 101         assertTrue(standardOptions.contains(StandardSocketOptions.SO_REUSEADDR),
 102                    "Expected SO_REUSEADDR, in:" + standardOptions);
 103         assertEquals(standardOptions, s1.supportedOptions());
 104         assertEquals(standardOptions, s1.supportedOptions());
 105 
 106         ServerSocket s2 = new DummyServerSocket();
 107         Set<?> dummyOptions = s2.supportedOptions();
 108         assertEquals(dummyOptions.size(), 1);
 109         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SERVER_SOCKET_OPT));
 110         assertEquals(dummyOptions, s2.supportedOptions());
 111         assertEquals(dummyOptions, s2.supportedOptions());
 112         s2.setOption(StandardDummySocketOptions.SERVER_SOCKET_OPT, "xxyyzz");
 113         assertEquals(s2.getOption(StandardDummySocketOptions.SERVER_SOCKET_OPT), "xxyyzz");
 114         assertThrows(UOE, () -> s2.setOption(StandardDummySocketOptions.SOCKET_OPT, ""));
 115 
 116         ServerSocket s3 = new ServerSocket();
 117         standardOptions = s3.supportedOptions();
 118         assertTrue(standardOptions.contains(StandardSocketOptions.SO_REUSEADDR),
 119                    "Expected SO_REUSEADDR, in:" + standardOptions);
 120         assertEquals(standardOptions, s3.supportedOptions());
 121         assertEquals(standardOptions, s3.supportedOptions());
 122 
 123         ServerSocket s4 = new DummyServerSocket();
 124         dummyOptions = s4.supportedOptions();
 125         assertEquals(dummyOptions.size(), 1);
 126         assertTrue(dummyOptions.contains(StandardDummySocketOptions.SERVER_SOCKET_OPT));
 127         assertEquals(dummyOptions, s4.supportedOptions());
 128         assertEquals(dummyOptions, s4.supportedOptions());
 129         s4.setOption(StandardDummySocketOptions.SERVER_SOCKET_OPT, "xxyyzz");
 130         assertEquals(s4.getOption(StandardDummySocketOptions.SERVER_SOCKET_OPT), "xxyyzz");
 131         assertThrows(UOE, () -> s4.setOption(StandardDummySocketOptions.SOCKET_OPT1, 32));
 132     }
 133 
 134     public static final class StandardDummySocketOptions {
 135         private StandardDummySocketOptions() {}











 136 
 137         public static final SocketOption<String> SOCKET_OPT =
 138                 new ImplSocketOption<>("SOCKET_OPT", String.class);
 139 
 140         public static final SocketOption<Integer> SOCKET_OPT1 =
 141                 new ImplSocketOption<>("SOCKET_OPT1", Integer.class);
 142 
 143         public static final SocketOption<String> SERVER_SOCKET_OPT =
 144                 new ImplSocketOption<>("SERVER_SOCKET_OPT", String.class);
 145 
 146         private static class ImplSocketOption<T> implements SocketOption<T> {
 147             private final String name;
 148             private final Class<T> type;
 149             ImplSocketOption(String name, Class<T> type) {
 150                 this.name = name;
 151                 this.type = type;
 152             }
 153             @Override public String name() { return name; }
 154             @Override public Class<T> type() { return type; }
 155             @Override public String toString() { return name; }
 156         }
 157     }
 158 
 159     static class DummySocket extends Socket {
 160         DummySocket() throws IOException {
 161             super(new DummySocketImpl() {
 162                 private final Set<SocketOption<?>> SO =
 163                         Set.of(StandardDummySocketOptions.SOCKET_OPT,
 164                                StandardDummySocketOptions.SOCKET_OPT1);
 165 
 166                 @Override
 167                 public Set<SocketOption<?>> supportedOptions() {
 168                     return SO;
 169                 }
 170             });
 171         }
 172     }
 173 
 174     static class DummyServerSocket extends ServerSocket {
 175         DummyServerSocket() throws IOException  {
 176             super(new DummySocketImpl() {
 177                 private final Set<SocketOption<?>> SSO =
 178                         Set.of(StandardDummySocketOptions.SERVER_SOCKET_OPT);
 179 
 180                 @Override
 181                 public Set<SocketOption<?>> supportedOptions() {
 182                     return SSO;
 183                 }
 184             });
 185         }
 186     }
 187 
 188     static abstract class DummySocketImpl extends SocketImpl {
 189 
 190         private final Map<SocketOption<?>,Object> optionMap = new HashMap<>();
 191 
 192         @Override
 193         protected void create(boolean stream) throws IOException { }
 194 
 195         @Override
 196         protected void connect(String host, int port) throws IOException { }
 197 
 198         @Override
 199         protected void connect(InetAddress address, int port) throws IOException { }
 200 
 201         @Override
 202         protected void connect(SocketAddress address, int timeout) throws IOException { }
 203 
 204         @Override
 205         protected void bind(InetAddress host, int port) throws IOException { }
 206 
 207         @Override
 208         protected void listen(int backlog) throws IOException { }
 209 
 210         @Override


 213         @Override
 214         protected InputStream getInputStream() throws IOException { return null; }
 215 
 216         @Override
 217         protected OutputStream getOutputStream() throws IOException { return null; }
 218 
 219         @Override
 220         protected int available() throws IOException { return 0; }
 221 
 222         @Override
 223         protected void close() throws IOException { }
 224 
 225         @Override
 226         protected void sendUrgentData(int data) throws IOException { }
 227 
 228         @Override
 229         public void setOption(int optID, Object value) throws SocketException { }
 230 
 231         @Override
 232         public Object getOption(int optID) throws SocketException { return null; }
 233 
 234         @Override
 235         protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
 236             if (!supportedOptions().contains(name))
 237                 throw new UnsupportedOperationException("unsupported option:" + name);
 238             optionMap.put(name, value);
 239         }
 240 
 241         @Override
 242         protected <T> T getOption(SocketOption<T> name) throws IOException {
 243             if (!supportedOptions().contains(name))
 244                 throw new UnsupportedOperationException("unsupported option:" + name);
 245 
 246             return (T)optionMap.get(name);
 247         }
 248     }
 249 }
< prev index next >