On Sat, 20 Jul 2024 11:06:04 GMT, Alan Bateman <al...@openjdk.org> wrote:

>> I had looked around in the test/jdk/java/net/Socket and 
>> test/jdk/java/net/ServerSocket tests to see if this is already tested. But I 
>> can't see anything that does this specific testing. I now decided to do a 
>> local change to the source to not throw the `IOException` when already 
>> bound/closed and reran the tests in these directories:
>> 
>> diff --git a/src/java.base/share/classes/java/net/ServerSocket.java 
>> b/src/java.base/share/classes/java/net/ServerSocket.java
>> index e1271fc9deb..3280f9edc4f 100644
>> --- a/src/java.base/share/classes/java/net/ServerSocket.java
>> +++ b/src/java.base/share/classes/java/net/ServerSocket.java
>> @@ -366,10 +366,10 @@ public void bind(SocketAddress endpoint) throws 
>> IOException {
>>       * @since 1.4
>>       */
>>      public void bind(SocketAddress endpoint, int backlog) throws 
>> IOException {
>> -        if (isClosed())
>> -            throw new SocketException("Socket is closed");
>> -        if (isBound())
>> -            throw new SocketException("Already bound");
>> +//        if (isClosed())
>> +//            throw new SocketException("Socket is closed");
>> +//        if (isBound())
>> +//            throw new SocketException("Already bound");
>>          if (endpoint == null)
>>              endpoint = new InetSocketAddress(0);
>>          if (!(endpoint instanceof InetSocketAddress epoint))
>> @@ -532,10 +532,10 @@ public SocketAddress getLocalSocketAddress() {
>>       * @see SecurityManager#checkAccept
>>       */
>>      public Socket accept() throws IOException {
>> -        if (isClosed())
>> -            throw new SocketException("Socket is closed");
>> -        if (!isBound())
>> -            throw new SocketException("Socket is not bound yet");
>> +//        if (isClosed())
>> +//            throw new SocketException("Socket is closed");
>> +//        if (!isBound())
>> +//            throw new SocketException("Socket is not bound yet");
>>          Socket s = new Socket((SocketImpl) null);
>>          implAccept(s);
>>          return s;
>> diff --git a/src/java.base/share/classes/java/net/Socket.java 
>> b/src/java.base/share/classes/java/net/Socket.java
>> index 1809687d5c0..cddbeb54a5a 100644
>> --- a/src/java.base/share/classes/java/net/Socket.java
>> +++ b/src/java.base/share/classes/java/net/Socket.java
>> @@ -737,10 +737,10 @@ public void connect(SocketAddress endpoint, int 
>> timeout) throws IOException {
>>              throw new IllegalArgumentException("connect: timeout can't be 
>> negative");
>>  
>>          int s = state;
>> -        if (isClo...
>
>> I had looked around in the test/jdk/java/net/Socket and 
>> test/jdk/java/net/ServerSocket tests to see if this is already tested. But I 
>> can't see anything that does this specific testing. I now decided to do a 
>> local change to the source to not throw the `IOException` when already 
>> bound/closed and reran the tests in these directories:
> 
> If there are holes in the testing then we need to fill them but I'm not sure 
> about introducing SocketBasicExceptionsTest to test a small subset of the 
> possible exceptions is the best approach. Also the tests for ServerSocket are 
> in a different directory. What would you think about a ClosedSocketTest and 
> ClosedServerServerTest (or better name) in each directory to test that the 
> methods throw as expected, it could test that close, isXXX, ... don't throw 
> as expected. We can do the same for bind and Socket.connect.

I've now introduced a ClosedSocketTest and a ClosedServerSocketTest in their 
relevant directories. Each of them invoke various operations on a closed 
Socket/ServerSocket instance and verify that they throw the expected exception 
or complete normally if expected to do so.

When writing this test, I noticed that a few other methods on ServerSocket and 
Socket also needed an update to their specification to match their current 
implementation. I have included those changes as well. Once we come to an 
agreement about these changes, I will update the title of the issue to make it 
clear that this covers more APIs than what the title currently says.

One related question is - some of these APIs, like the bind() are specified to 
throw an IOException when the implementation throws a SocketException (a 
subclass of IOException). Some other APIs within the same classes specify that 
they throw this exact SocketException. Should bind() and a few other APIs which 
currently specify IOException be updated to say SocketException to closely 
match their implementation?

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/20268#discussion_r1685457901

Reply via email to