8222829: DatagramSocket.setSoTimeout does not specify IAE when timeout is negative

Clarifies behaviour of setSoTimeout() method when given negative timeout value.

Reviewed-by: alanb, chegar, dfuchs
This commit is contained in:
Patrick Concannon 2019-10-08 15:03:20 +01:00
parent ee87f2a7a4
commit dcceed10b6
2 changed files with 45 additions and 18 deletions

View File

@ -899,12 +899,15 @@ class DatagramSocket implements java.io.Closeable {
*
* @param timeout the specified timeout in milliseconds.
* @throws SocketException if there is an error in the underlying protocol, such as an UDP error.
* @throws IllegalArgumentException if {@code timeout} is negative
* @since 1.1
* @see #getSoTimeout()
*/
public synchronized void setSoTimeout(int timeout) throws SocketException {
if (isClosed())
throw new SocketException("Socket is closed");
if (timeout < 0)
throw new IllegalArgumentException("timeout < 0");
getImpl().setOption(SocketOptions.SO_TIMEOUT, timeout);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,32 +23,56 @@
/**
* @test
* @bug 4163126
* @summary test to see if timeout hangs
* @run main/timeout=15 DatagramTimeout
* @bug 4163126 8222829
* @summary Test to see if timeout hangs. Also checks that
* negative timeout value fails as expected.
* @run testng DatagramTimeout
*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketTimeoutException;
import java.nio.channels.DatagramChannel;
import org.testng.annotations.Test;
import static org.testng.Assert.expectThrows;
public class DatagramTimeout {
public static void main(String[] args) throws Exception {
boolean success = false;
DatagramSocket sock = new DatagramSocket();
private static final Class<IllegalArgumentException> IAE = IllegalArgumentException.class;
private static final Class<SocketTimeoutException> STE = SocketTimeoutException.class;
try {
DatagramPacket p;
/**
* Test DatagramSocket setSoTimeout with a valid timeout value.
*/
@Test
public void testSetTimeout() throws Exception {
try (DatagramSocket s = new DatagramSocket()) {
byte[] buffer = new byte[50];
p = new DatagramPacket(buffer, buffer.length);
sock.setSoTimeout(2);
sock.receive(p);
} catch (SocketTimeoutException e) {
success = true;
} finally {
sock.close();
DatagramPacket p = new DatagramPacket(buffer, buffer.length);
s.setSoTimeout(2);
expectThrows(STE, () -> s.receive(p));
}
if (!success)
throw new RuntimeException("Socket timeout failure.");
}
/**
* Test DatagramSocket setSoTimeout with a negative timeout.
*/
@Test
public void testSetNegativeTimeout() throws Exception {
try (DatagramSocket s = new DatagramSocket()) {
expectThrows(IAE, () -> s.setSoTimeout(-1));
}
}
/**
* Test DatagramSocketAdaptor setSoTimeout with a negative timeout.
*/
@Test
public void testNegativeTimeout() throws Exception {
try (DatagramChannel dc = DatagramChannel.open()) {
var s = dc.socket();
expectThrows(IAE, () -> s.setSoTimeout(-1));
}
}
}