/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.harmony.tests.java.net;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketImpl;
import java.net.SocketImplFactory;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.security.Permission;
import java.util.Arrays;
import java.util.Locale;
import tests.support.Support_Configuration;
public class SocketTest extends junit.framework.TestCase {
private class ClientThread implements Runnable {
public void run() {
try {
Socket socket = new Socket();
InetSocketAddress addr = new InetSocketAddress(host, port);
socket.connect(addr);
socket.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
private class ServerThread implements Runnable {
private static final int FIRST_TIME = 1;
private static final int SECOND_TIME = 2;
private int backlog = 10;
public boolean ready = false;
private int serverSocketConstructor = 0;
public void run() {
try {
ServerSocket socket;
switch (serverSocketConstructor) {
case FIRST_TIME:
socket = new ServerSocket(port, backlog,
new InetSocketAddress(host, port).getAddress());
port = socket.getLocalPort();
break;
case SECOND_TIME:
socket = new ServerSocket(port, backlog);
host = socket.getInetAddress().getHostName();
port = socket.getLocalPort();
break;
default:
socket = new ServerSocket();
break;
}
synchronized (this) {
ready = true;
this.notifyAll();
}
socket.setSoTimeout(5000);
Socket client = socket.accept();
client.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
}
public synchronized void waitCreated() throws Exception {
while (!ready) {
this.wait();
}
}
}
boolean interrupted;
String host = "localhost";
int port;
Thread t;
private void connectTestImpl(int ssConsType) throws Exception {
ServerThread server = new ServerThread();
server.serverSocketConstructor = ssConsType;
Thread serverThread = new Thread(server);
serverThread.start();
server.waitCreated();
ClientThread client = new ClientThread();
Thread clientThread = new Thread(client);
clientThread.start();
try {
serverThread.join();
clientThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
protected void tearDown() {
try {
if (t != null) {
t.interrupt();
}
} catch (Exception e) {
}
this.t = null;
this.interrupted = false;
}
/**
* java.net.Socket#bind(java.net.SocketAddress)
*/
public void test_bindLjava_net_SocketAddress() throws IOException {
@SuppressWarnings("serial")
class UnsupportedSocketAddress extends SocketAddress {
public UnsupportedSocketAddress() {
}
}
// Address we cannot bind to
Socket theSocket = new Socket();
InetSocketAddress bogusAddress = new InetSocketAddress(InetAddress
.getByAddress(Support_Configuration.nonLocalAddressBytes), 42);
try {
theSocket.bind(bogusAddress);
fail("No exception when binding to bad address");
} catch (IOException ex) {
// Expected
}
theSocket.close();
// Now create a socket that is not bound and then bind it
theSocket = new Socket();
theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
int portNumber = theSocket.getLocalPort();
// Validate that the localSocketAddress reflects the address we
// bound to
assertEquals("Local address not correct after bind",
new InetSocketAddress(InetAddress.getLocalHost(), portNumber),
theSocket.getLocalSocketAddress());
// Make sure we can now connect and that connections appear to come
// from the address we bound to.
InetSocketAddress theAddress = new InetSocketAddress(InetAddress
.getLocalHost(), 0);
ServerSocket server = new ServerSocket();
server.bind(theAddress);
int sport = server.getLocalPort();
InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
.getLocalHost(), sport);
theSocket.connect(boundAddress);
Socket worker = server.accept();
assertEquals(
"Returned Remote address from server connected to does not match expected local address",
new InetSocketAddress(InetAddress.getLocalHost(), portNumber),
worker.getRemoteSocketAddress());
theSocket.close();
worker.close();
server.close();
// Validate if we pass in null that it picks an address for us and
// all is ok
theSocket = new Socket();
theSocket.bind(null);
assertNotNull("Bind with null did not work", theSocket
.getLocalSocketAddress());
theSocket.close();
// now check the error conditions
// Address that we have already bound to
theSocket = new Socket();
theAddress = new InetSocketAddress(InetAddress.getLocalHost(), 0);
theSocket.bind(theAddress);
Socket theSocket2 = new Socket();
try {
theSocket2.bind(theSocket.getLocalSocketAddress());
fail("No exception binding to address that is not available");
} catch (IOException ex) {
// Expected
}
theSocket.close();
theSocket2.close();
// Unsupported SocketAddress subclass
theSocket = new Socket();
try {
theSocket.bind(new UnsupportedSocketAddress());
fail("No exception when binding using unsupported SocketAddress subclass");
} catch (IllegalArgumentException ex) {
// Expected
}
theSocket.close();
}
/**
* java.net.Socket#bind(java.net.SocketAddress)
*/
public void test_bindLjava_net_SocketAddress_Proxy() throws IOException {
// The Proxy will not impact on the bind operation. It can be assigned
// with any address.
Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(
"127.0.0.1", 0));
Socket socket = new Socket(proxy);
InetAddress address = InetAddress.getByName("localhost");
socket.bind(new InetSocketAddress(address, 0));
assertEquals(address, socket.getLocalAddress());
assertTrue(0 != socket.getLocalPort());
socket.close();
}
public void test_close() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSoLinger(false, 100);
client.close();
try {
client.getOutputStream();
fail("Failed to close socket");
} catch (IOException expected) {
}
server.close();
}
public void test_connect_unknownhost() throws Exception {
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress("1.2.3.4hello", 12345));
fail();
} catch (UnknownHostException expected) {
}
}
public void test_connect_unresolved() throws IOException {
Socket socket = new Socket();
InetSocketAddress unresolved = InetSocketAddress.createUnresolved("www.apache.org", 80);
try {
socket.connect(unresolved);
fail();
} catch (UnknownHostException expected) {
}
try {
socket.connect(unresolved, 123);
fail();
} catch (UnknownHostException expected) {
}
}
public void test_connectLjava_net_SocketAddress() throws Exception {
@SuppressWarnings("serial")
class UnsupportedSocketAddress extends SocketAddress {
public UnsupportedSocketAddress() {
}
}
Socket theSocket = new Socket();
try {
theSocket.connect(null);
fail("No exception for null arg");
} catch (IllegalArgumentException e) {
// Expected
}
try {
theSocket.connect(new UnsupportedSocketAddress());
fail("No exception for invalid socket address");
} catch (IllegalArgumentException e) {
// Expected
}
try {
theSocket.connect(new InetSocketAddress(InetAddress
.getByAddress(new byte[] { 0, 0, 0, 0 }), 42));
fail("No exception with non-connectable address");
} catch (ConnectException e) {
// Expected
}
// now validate that we get a connect exception if we try to connect to
// an address on which nobody is listening
theSocket = new Socket();
try {
theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
0));
fail("No exception when connecting to address nobody listening on");
} catch (ConnectException e) {
// Expected
}
// Now validate that we can actually connect when somebody is listening
ServerSocket server = new ServerSocket(0);
InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
.getLocalHost(), server.getLocalPort());
Socket client = new Socket();
client.connect(boundAddress);
// validate that when a socket is connected that it answers
// correctly to related queries
assertTrue("Wrong connected status", client.isConnected());
assertFalse("Wrong closed status", client.isClosed());
assertTrue("Wrong bound status", client.isBound());
assertFalse("Wrong input shutdown status", client.isInputShutdown());
assertFalse("Wrong output shutdown status", client.isOutputShutdown());
assertTrue("Local port was 0", client.getLocalPort() != 0);
client.close();
server.close();
// Now validate that we get the right exception if we connect when we
// are already connected
server = new ServerSocket(0);
boundAddress = new InetSocketAddress(InetAddress.getLocalHost(), server
.getLocalPort());
client = new Socket();
client.connect(boundAddress);
try {
client.connect(boundAddress);
fail("No exception when we try to connect on a connected socket: ");
} catch (SocketException e) {
// Expected
}
client.close();
server.close();
}
/**
* Regression for Harmony-2503
*/
public void test_connectLjava_net_SocketAddress_AnyAddress()
throws Exception {
connectTestImpl(ServerThread.FIRST_TIME);
connectTestImpl(ServerThread.SECOND_TIME);
}
/**
* java.net.Socket#connect(java.net.SocketAddress, int)
*/
public void test_connectLjava_net_SocketAddressI() throws Exception {
@SuppressWarnings("serial")
class UnsupportedSocketAddress extends SocketAddress {
public UnsupportedSocketAddress() {
}
}
// Start by validating the error checks
Socket theSocket = new Socket();
try {
theSocket.connect(new InetSocketAddress(0), -100);
fail("No exception for negative timeout");
} catch (IllegalArgumentException e) {
// Expected
}
try {
theSocket.connect(null, 0);
fail("No exception for null address");
} catch (IllegalArgumentException e) {
// Expected
}
try {
theSocket.connect(new UnsupportedSocketAddress(), 1000);
fail("No exception for invalid socket address type");
} catch (IllegalArgumentException e) {
// Expected
}
SocketAddress nonConnectableAddress = new InetSocketAddress(InetAddress
.getByAddress(new byte[] { 0, 0, 0, 0 }), 0);
try {
theSocket.connect(nonConnectableAddress, 1000);
fail("No exception when non Connectable Address passed in: ");
} catch (SocketException e) {
// Expected
}
// Now validate that we get a connect exception if we try to connect to
// an address on which nobody is listening
theSocket = new Socket();
try {
theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
0), 0);
fail("No exception when connecting to address nobody listening on");
} catch (ConnectException e) {
// Expected
}
theSocket.close();
// Now validate that we can actually connect when somebody is listening
ServerSocket server = new ServerSocket(0);
InetSocketAddress boundAddress = new InetSocketAddress(InetAddress
.getLocalHost(), server.getLocalPort());
Socket client = new Socket();
client.connect(boundAddress, 0);
// Validate that when a socket is connected that it answers
// correctly to related queries
assertTrue("Wrong connected status", client.isConnected());
assertFalse("Wrong closed status", client.isClosed());
assertTrue("Wrong bound status", client.isBound());
assertFalse("Wrong input shutdown status", client.isInputShutdown());
assertFalse("Wrong output shutdown status", client.isOutputShutdown());
assertTrue("Local port was 0", client.getLocalPort() != 0);
client.close();
server.close();
// Now validate that we get a connect exception if we try to connect to
// an address on which nobody is listening
theSocket = new Socket();
SocketAddress nonListeningAddress = new InetSocketAddress(InetAddress
.getLocalHost(), 42);
try {
theSocket.connect(nonListeningAddress, 1000);
fail("No exception when connecting to address nobody listening on");
} catch (ConnectException e) {
// Expected
} catch (SocketTimeoutException e) {
// The other possibility is that the system timed us out.
}
theSocket.close();
// Now validate that we get the right exception if we connect when we
// are already connected
server = new ServerSocket(0);
boundAddress = new InetSocketAddress(InetAddress.getLocalHost(), server
.getLocalPort());
client = new Socket();
client.connect(boundAddress, 10000);
try {
client.connect(boundAddress, 10000);
fail("No exception when we try to connect on a connected socket: ");
} catch (SocketException e) {
// Expected
}
client.close();
server.close();
}
/**
* java.net.Socket#Socket()
*/
public void test_Constructor() {
// create the socket and then validate some basic state
Socket s = new Socket();
assertFalse("new socket should not be connected", s.isConnected());
assertFalse("new socket should not be bound", s.isBound());
assertFalse("new socket should not be closed", s.isClosed());
assertFalse("new socket should not be in InputShutdown", s
.isInputShutdown());
assertFalse("new socket should not be in OutputShutdown", s
.isOutputShutdown());
}
/**
* java.net.Socket#Socket(java.lang.String, int)
*/
public void test_ConstructorLjava_lang_StringI() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
assertEquals("Failed to create socket", server.getLocalPort(), client
.getPort());
// Regression for HARMONY-946
ServerSocket ss = new ServerSocket(0);
Socket s = new Socket("0.0.0.0", ss.getLocalPort());
ss.close();
s.close();
}
/**
* java.net.Socket#Socket(java.lang.String, int,
*java.net.InetAddress, int)
*/
public void test_ConstructorLjava_lang_StringILjava_net_InetAddressI()
throws IOException {
ServerSocket server = new ServerSocket(0);
int serverPort = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost().getHostName(),
serverPort, InetAddress.getLocalHost(), 0);
assertTrue("Failed to create socket", client.getPort() == serverPort);
client.close();
Socket theSocket;
try {
theSocket = new Socket("127.0.0.1", serverPort, InetAddress
.getLocalHost(), 0);
} catch (IOException e) {
// check here if InetAddress.getLocalHost() is returning the
// loopback address, if so that is likely the cause of the failure
assertFalse(
"Misconfiguration - local host is the loopback address",
InetAddress.getLocalHost().isLoopbackAddress());
throw e;
}
assertTrue(theSocket.isConnected());
try {
new Socket("127.0.0.1", serverPort, theSocket.getLocalAddress(),
theSocket.getLocalPort());
fail("Was able to create two sockets on same port");
} catch (IOException e) {
// Expected
}
theSocket.close();
server.close();
}
@SuppressWarnings("deprecation")
public void test_ConstructorLjava_lang_StringIZ() throws IOException {
ServerSocket server = new ServerSocket(0);
int serverPort = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost().getHostAddress(),
serverPort, true);
assertEquals("Failed to create socket", serverPort, client.getPort());
client.close();
client = new Socket(InetAddress.getLocalHost().getHostName(),
serverPort, false);
client.close();
server.close();
}
/**
* java.net.Socket#Socket(java.net.InetAddress, int)
*/
public void test_ConstructorLjava_net_InetAddressI() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
assertEquals("Failed to create socket", server.getLocalPort(), client
.getPort());
client.close();
server.close();
}
/**
* java.net.Socket#Socket(java.net.InetAddress, int,
*java.net.InetAddress, int)
*/
public void test_ConstructorLjava_net_InetAddressILjava_net_InetAddressI()
throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort(), InetAddress.getLocalHost(), 0);
assertNotSame("Failed to create socket", 0, client.getLocalPort());
}
/**
* java.net.Socket#Socket(java.net.InetAddress, int, boolean)
*/
@SuppressWarnings("deprecation")
public void test_ConstructorLjava_net_InetAddressIZ() throws IOException {
ServerSocket server = new ServerSocket(0);
int serverPort = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost(), serverPort, true);
assertEquals("Failed to create socket", serverPort, client.getPort());
client = new Socket(InetAddress.getLocalHost(), serverPort, false);
client.close();
}
/**
* java.net.Socket#Socket(Proxy)
*/
public void test_ConstructorLjava_net_Proxy_Exception() {
SocketAddress addr1 = InetSocketAddress.createUnresolved("127.0.0.1", 80);
Proxy proxy1 = new Proxy(Proxy.Type.HTTP, addr1);
// IllegalArgumentException test
try {
new Socket(proxy1);
fail("should throw IllegalArgumentException");
} catch (IllegalArgumentException e) {
// expected
}
Proxy proxy2 = new Proxy(Proxy.Type.SOCKS, addr1);
// should not throw any exception
new Socket(proxy2);
new Socket(Proxy.NO_PROXY);
}
/**
* java.net.Socket#getChannel()
*/
public void test_getChannel() {
assertNull(new Socket().getChannel());
}
/**
* java.net.Socket#getInetAddress()
*/
public void test_getInetAddress() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
assertTrue("Returned incorrect InetAdrees", client.getInetAddress()
.equals(InetAddress.getLocalHost()));
client.close();
server.close();
}
/**
* java.net.Socket#getInputStream()
*/
public void test_getInputStream() throws IOException {
// Simple fetch test
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
InputStream is = client.getInputStream();
assertNotNull("Failed to get stream", is);
is.close();
client.close();
server.close();
}
private boolean isUnix() {
String osName = System.getProperty("os.name");
// only comparing ASCII, so assume english locale
osName = (osName == null ? null : osName.toLowerCase(Locale.ENGLISH));
if (osName != null && osName.startsWith("windows")) { //$NON-NLS-1$
return false;
}
return true;
}
public void test_getKeepAlive() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort(), null, 0);
client.setKeepAlive(true);
assertTrue("getKeepAlive false when it should be true", client.getKeepAlive());
client.setKeepAlive(false);
assertFalse("getKeepAlive true when it should be False", client.getKeepAlive());
}
public void test_getLocalAddress() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
assertTrue("Returned incorrect InetAddress", client.getLocalAddress()
.equals(InetAddress.getLocalHost()));
client = new Socket();
client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
assertTrue(client.getLocalAddress().isAnyLocalAddress());
client.close();
server.close();
}
/**
* java.net.Socket#getLocalPort()
*/
public void test_getLocalPort() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
assertNotSame("Returned incorrect port", 0, client.getLocalPort());
client.close();
server.close();
}
public void test_getLocalSocketAddress() throws IOException {
// set up server connect and then validate that we get the right
// response for the local address
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
int clientPort = client.getLocalPort();
assertEquals("Returned incorrect InetSocketAddress(1):",
new InetSocketAddress(InetAddress.getLocalHost(), clientPort),
client.getLocalSocketAddress());
client.close();
server.close();
// now create a socket that is not bound and validate we get the
// right answer
client = new Socket();
assertNull(
"Returned incorrect InetSocketAddress -unbound socket- Expected null",
client.getLocalSocketAddress());
// now bind the socket and make sure we get the right answer
client.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
clientPort = client.getLocalPort();
assertEquals("Returned incorrect InetSocketAddress(2):",
new InetSocketAddress(InetAddress.getLocalHost(), clientPort),
client.getLocalSocketAddress());
client.close();
// now validate the behaviour when the any address is returned
client = new Socket();
client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
assertTrue(((InetSocketAddress) client.getLocalSocketAddress()).getAddress().isAnyLocalAddress());
client.close();
// now validate the same for getLocalAddress
client = new Socket();
client.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0));
assertTrue(client.getLocalAddress().isAnyLocalAddress());
client.close();
}
public void test_getOOBInline() throws Exception {
Socket theSocket = new Socket();
theSocket.setOOBInline(true);
assertTrue("expected OOBIline to be true", theSocket.getOOBInline());
theSocket.setOOBInline(false);
assertFalse("expected OOBIline to be false", theSocket.getOOBInline());
theSocket.setOOBInline(false);
assertFalse("expected OOBIline to be false", theSocket.getOOBInline());
}
/**
* java.net.Socket#getOutputStream()
*/
@SuppressWarnings("deprecation")
public void test_getOutputStream() throws IOException {
// Simple fetch test
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
OutputStream os = client.getOutputStream();
assertNotNull("Failed to get stream", os);
os.close();
client.close();
server.close();
// Simple read/write test over the IO streams
final ServerSocket sinkServer = new ServerSocket(0);
Runnable runnable = new Runnable() {
public void run() {
try {
Socket worker = sinkServer.accept();
sinkServer.close();
InputStream in = worker.getInputStream();
in.read();
in.close();
worker.close();
} catch (IOException e) {
fail();
}
}
};
Thread thread = new Thread(runnable, "Socket.getOutputStream");
thread.start();
Socket pingClient = new Socket(InetAddress.getLocalHost(), sinkServer
.getLocalPort());
// Busy wait until the client is connected.
int c = 0;
while (!pingClient.isConnected()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
if (++c > 4) {
fail("thread is not alive");
}
}
// Write some data to the server
OutputStream out = pingClient.getOutputStream();
out.write(new byte[256]);
// Wait for the server to finish
Thread.yield();
c = 0;
while (thread.isAlive()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
if (++c > 4) {
fail("read call did not exit");
}
}
// Subsequent writes should throw an exception
try {
// The output buffer may remain valid until the close completes
for (int i = 0; i < 400; i++) {
out.write(new byte[256]);
}
fail("write to closed socket did not cause exception");
} catch (IOException e) {
// Expected
}
out.close();
pingClient.close();
sinkServer.close();
// Regression test for HARMONY-873
ServerSocket ss2 = new ServerSocket(0);
Socket s = new Socket("127.0.0.1", ss2.getLocalPort());
ss2.accept();
s.shutdownOutput();
try {
s.getOutputStream();
fail("should throw SocketException");
} catch (SocketException e) {
// expected
}
}
public void test_getPort() throws IOException {
ServerSocket server = new ServerSocket(0);
int serverPort = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost(), serverPort);
assertEquals("Returned incorrect port", serverPort, client.getPort());
client.close();
server.close();
}
public void test_getReceiveBufferSize() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setReceiveBufferSize(130);
assertTrue("Incorrect buffer size", client.getReceiveBufferSize() >= 130);
client.close();
server.close();
}
/**
* java.net.Socket#getRemoteSocketAddress()
*/
public void test_getRemoteSocketAddress() throws IOException {
// set up server connect and then validate that we get the right
// response for the remote address
ServerSocket server = new ServerSocket(0);
int serverPort = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost(), serverPort);
assertEquals("Returned incorrect InetSocketAddress(1):",
new InetSocketAddress(InetAddress.getLocalHost(), serverPort),
client.getRemoteSocketAddress());
client.close();
// now create one that is not connected and validate that we get the
// right answer
Socket theSocket = new Socket();
theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
assertNull("Returned incorrect InetSocketAddress -unconnected socket:",
theSocket.getRemoteSocketAddress());
// now connect and validate we get the right answer
theSocket.connect(new InetSocketAddress(InetAddress.getLocalHost(),
serverPort));
assertEquals("Returned incorrect InetSocketAddress(2):",
new InetSocketAddress(InetAddress.getLocalHost(), serverPort),
theSocket.getRemoteSocketAddress());
theSocket.close();
server.close();
}
public void test_getReuseAddress() throws Exception {
Socket theSocket = new Socket();
theSocket.setReuseAddress(true);
assertTrue("getReuseAddress false when it should be true", theSocket.getReuseAddress());
theSocket.setReuseAddress(false);
assertFalse("getReuseAddress true when it should be False", theSocket.getReuseAddress());
}
public void test_getSendBufferSize() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSendBufferSize(134);
assertTrue("Incorrect buffer size", client.getSendBufferSize() >= 134);
client.close();
server.close();
}
public void test_getSoLinger() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSoLinger(true, 200);
assertEquals("Returned incorrect linger", 200, client.getSoLinger());
client.setSoLinger(false, 0);
client.close();
server.close();
}
public void test_getSoTimeout() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSoTimeout(100);
assertEquals("Returned incorrect sotimeout", 100, client.getSoTimeout());
client.close();
server.close();
}
public void test_getTcpNoDelay() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
boolean bool = !client.getTcpNoDelay();
client.setTcpNoDelay(bool);
assertTrue("Failed to get no delay setting: " + client.getTcpNoDelay(), client.getTcpNoDelay() == bool);
client.close();
server.close();
}
public void test_getTrafficClass() throws Exception {
/*
* We cannot actually check that the values are set as if a platform
* does not support the option then it may come back unset even
* though we set it so just get the value to make sure we can get it
*/
int trafficClass = new Socket().getTrafficClass();
assertTrue(0 <= trafficClass);
assertTrue(trafficClass <= 255);
}
/**
* java.net.Socket#isBound()
*/
public void test_isBound() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
Socket worker = server.accept();
assertTrue("Socket indicated not bound when it should be (1)", client
.isBound());
worker.close();
client.close();
server.close();
client = new Socket();
assertFalse("Socket indicated bound when it was not (2)", client
.isBound());
server = new ServerSocket();
server.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
InetSocketAddress boundAddress = new InetSocketAddress(server
.getInetAddress(), server.getLocalPort());
client.connect(boundAddress);
worker = server.accept();
assertTrue("Socket indicated not bound when it should be (2)", client
.isBound());
worker.close();
client.close();
server.close();
// now test when we bind explicitly
InetSocketAddress theLocalAddress = new InetSocketAddress(InetAddress
.getLocalHost(), 0);
client = new Socket();
assertFalse("Socket indicated bound when it was not (3)", client
.isBound());
client.bind(theLocalAddress);
assertTrue("Socket indicated not bound when it should be (3a)", client
.isBound());
client.close();
assertTrue("Socket indicated not bound when it should be (3b)", client
.isBound());
}
/**
* java.net.Socket#isClosed()
*/
public void test_isClosed() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
Socket worker = server.accept();
// validate isClosed returns expected values
assertFalse("Socket should indicate it is not closed(1):", client
.isClosed());
client.close();
assertTrue("Socket should indicate it is closed(1):", client.isClosed());
// validate that isClosed works ok for sockets returned from
// ServerSocket.accept()
assertFalse("Accepted Socket should indicate it is not closed:", worker
.isClosed());
worker.close();
assertTrue("Accepted Socket should indicate it is closed:", worker
.isClosed());
// and finally for the server socket
assertFalse("Server Socket should indicate it is not closed:", server
.isClosed());
server.close();
assertTrue("Server Socket should indicate it is closed:", server
.isClosed());
}
/**
* java.net.Socket#isConnected()
*/
public void test_isConnected() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
Socket worker = server.accept();
assertTrue("Socket indicated not connected when it should be", client
.isConnected());
client.close();
worker.close();
server.close();
// now do it with the new constructors and revalidate
InetSocketAddress theAddress = new InetSocketAddress(InetAddress
.getLocalHost(), 0);
client = new Socket();
assertFalse("Socket indicated connected when it was not", client
.isConnected());
server = new ServerSocket();
server.bind(theAddress);
InetSocketAddress boundAddress = new InetSocketAddress(server
.getInetAddress(), server.getLocalPort());
client.connect(boundAddress);
worker = server.accept();
assertTrue("Socket indicated not connected when it should be", client
.isConnected());
client.close();
worker.close();
server.close();
}
/**
* java.net.Socket#isInputShutdown()
*/
public void test_isInputShutdown() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
Socket worker = server.accept();
InputStream theInput = client.getInputStream();
OutputStream theOutput = worker.getOutputStream();
// make sure we get the right answer with newly connected socket
assertFalse("Socket indicated input shutdown when it should not have",
client.isInputShutdown());
// shutdown the output
client.shutdownInput();
// make sure we get the right answer once it is shut down
assertTrue(
"Socket indicated input was NOT shutdown when it should have been",
client.isInputShutdown());
client.close();
worker.close();
server.close();
// make sure we get the right answer for closed sockets
assertFalse(
"Socket indicated input was shutdown when socket was closed",
worker.isInputShutdown());
theInput.close();
theOutput.close();
}
/**
* java.net.Socket#isOutputShutdown()
*/
public void test_isOutputShutdown() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server
.getLocalPort());
Socket worker = server.accept();
InputStream theInput = client.getInputStream();
OutputStream theOutput = worker.getOutputStream();
// make sure we get the right answer with newly connected socket
assertFalse("Socket indicated output shutdown when it should not have",
worker.isOutputShutdown());
// shutdown the output
worker.shutdownOutput();
// make sure we get the right answer once it is shut down
assertTrue(
"Socket indicated output was NOT shutdown when it should have been",
worker.isOutputShutdown());
client.close();
worker.close();
server.close();
// make sure we get the right answer for closed sockets
assertFalse(
"Socket indicated output was output shutdown when the socket was closed",
client.isOutputShutdown());
theInput.close();
theOutput.close();
}
/**
* java.net.Socket#sendUrgentData(int)
*/
public void test_sendUrgentDataI() throws Exception {
/*
* Some platforms may not support urgent data in this case we will not
* run these tests. For now run on all platforms until we find those
* that do not support urgent data
*/
String platform = System.getProperty("os.name");
if (platform.equals("Dummy")) {
return;
}
/*
* Test 1: Validate that when OOBInline is false that any urgent data is
* silently ignored
*/
InetAddress localHost = InetAddress.getLocalHost();
ServerSocket server = new ServerSocket(0, 5, localHost);
SocketAddress serverAddress = new InetSocketAddress(localHost, server
.getLocalPort());
Socket client = new Socket();
client.setOOBInline(false);
client.connect(serverAddress);
Socket worker = server.accept();
worker.setTcpNoDelay(true);
OutputStream theOutput = worker.getOutputStream();
// Send the regular data
byte[] sendBytes = "Test".getBytes();
theOutput.write(sendBytes);
theOutput.flush();
// Send the urgent data byte which should not be received
worker.sendUrgentData("UrgentData".getBytes()[0]);
theOutput.write(sendBytes);
worker.shutdownOutput();
worker.close();
// Try to read the bytes back
int totalBytesRead = 0;
byte[] myBytes = new byte[100];
InputStream theInput = client.getInputStream();
while (true) {
int bytesRead = theInput.read(myBytes, totalBytesRead,
myBytes.length - totalBytesRead);
if (bytesRead == -1) {
break;
}
totalBytesRead = totalBytesRead + bytesRead;
}
client.close();
server.close();
byte[] expectBytes = new byte[2 * sendBytes.length];
System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length,
sendBytes.length);
byte[] resultBytes = new byte[totalBytesRead];
System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
assertTrue("Urgent data was received", Arrays.equals(expectBytes,
resultBytes));
/*
* Test 2: Now validate that urgent data is received as expected. Expect
* that it should be between the two writes.
*/
server = new ServerSocket(0, 5, localHost);
serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
client = new Socket();
client.setOOBInline(true);
client.connect(serverAddress);
worker = server.accept();
worker.setTcpNoDelay(true);
theOutput = worker.getOutputStream();
// Send the regular data
sendBytes = "Test - Urgent Data".getBytes();
theOutput.write(sendBytes);
// Send the urgent data (one byte) which should be received
client.setOOBInline(true);
byte urgentByte = "UrgentData".getBytes()[0];
worker.sendUrgentData(urgentByte);
// Send more data, the urgent byte must stay in position
theOutput.write(sendBytes);
worker.shutdownOutput();
worker.close();
// Try to read the bytes back
totalBytesRead = 0;
myBytes = new byte[100];
theInput = client.getInputStream();
while (true) {
int bytesRead = theInput.read(myBytes, totalBytesRead,
myBytes.length - totalBytesRead);
if (bytesRead == -1) {
break;
}
totalBytesRead = totalBytesRead + bytesRead;
}
client.close();
server.close();
expectBytes = new byte[2 * sendBytes.length + 1];
System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
expectBytes[sendBytes.length] = urgentByte;
System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length + 1,
sendBytes.length);
resultBytes = new byte[totalBytesRead];
System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
assertTrue("Urgent data was not received with one urgent byte", Arrays
.equals(expectBytes, resultBytes));
/*
* Test 3: Now validate that urgent data is received as expected. Expect
* that it should be between the two writes.
*/
server = new ServerSocket(0, 5, localHost);
serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
client = new Socket();
client.setOOBInline(true);
client.connect(serverAddress);
worker = server.accept();
worker.setTcpNoDelay(true);
theOutput = worker.getOutputStream();
// Send the regular data
sendBytes = "Test - Urgent Data".getBytes();
theOutput.write(sendBytes);
// Send the urgent data (one byte) which should be received
client.setOOBInline(true);
byte urgentByte1 = "UrgentData".getBytes()[0];
byte urgentByte2 = "UrgentData".getBytes()[1];
worker.sendUrgentData(urgentByte1);
worker.sendUrgentData(urgentByte2);
// Send more data, the urgent byte must stay in position
theOutput.write(sendBytes);
worker.shutdownOutput();
worker.close();
// Try to read the bytes back
totalBytesRead = 0;
myBytes = new byte[100];
theInput = client.getInputStream();
while (true) {
int bytesRead = theInput.read(myBytes, totalBytesRead,
myBytes.length - totalBytesRead);
if (bytesRead == -1) {
break;
}
totalBytesRead = totalBytesRead + bytesRead;
}
client.close();
server.close();
expectBytes = new byte[2 * sendBytes.length + 2];
System.arraycopy(sendBytes, 0, expectBytes, 0, sendBytes.length);
expectBytes[sendBytes.length] = urgentByte1;
expectBytes[sendBytes.length + 1] = urgentByte2;
System.arraycopy(sendBytes, 0, expectBytes, sendBytes.length + 2,
sendBytes.length);
resultBytes = new byte[totalBytesRead];
System.arraycopy(myBytes, 0, resultBytes, 0, totalBytesRead);
assertTrue("Urgent data was not received with two urgent bytes", Arrays
.equals(expectBytes, resultBytes));
/*
* Test 4: Now test the case where there is only urgent data.
*/
server = new ServerSocket(0, 5, localHost);
serverAddress = new InetSocketAddress(localHost, server.getLocalPort());
client = new Socket();
client.setOOBInline(true);
client.connect(serverAddress);
worker = server.accept();
worker.setTcpNoDelay(true);
// Send the urgent data (one byte) which should be received
client.setOOBInline(true);
urgentByte = "UrgentData".getBytes()[0];
worker.sendUrgentData(urgentByte);
worker.close();
// Try to read the bytes back
theInput = client.getInputStream();
int byteRead = theInput.read();
client.close();
server.close();
assertEquals("Sole urgent data was not received",
(int) (urgentByte & 0xff), byteRead);
}
/**
* java.net.Socket#setKeepAlive(boolean)
*/
public void test_setKeepAliveZ() throws IOException {
class TestSocket extends Socket {
public TestSocket(SocketImpl impl) throws SocketException {
super(impl);
}
}
// There is not really a good test for this as it is there to detect
// crashed machines. Just make sure we can set it
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setKeepAlive(true);
client.setKeepAlive(false);
client.close();
server.close();
// Regression test for HARMONY-1136
new TestSocket(null).setKeepAlive(true);
}
public void test_setOOBInlineZ() throws Exception {
Socket theSocket = new Socket();
theSocket.setOOBInline(true);
assertTrue("expected OOBIline to be true", theSocket.getOOBInline());
}
public void test_setPerformancePreference_Int_Int_Int() throws IOException {
Socket theSocket = new Socket();
theSocket.setPerformancePreferences(1, 1, 1);
}
public void test_setReceiveBufferSizeI() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setReceiveBufferSize(130);
assertTrue("Incorrect buffer size", client.getReceiveBufferSize() >= 130);
client.close();
server.close();
}
public void test_setReuseAddressZ() throws Exception {
Socket theSocket = new Socket();
theSocket.setReuseAddress(false);
// Bind to any available port on the given address
theSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 0));
InetSocketAddress localAddress1 = new InetSocketAddress(theSocket.getLocalAddress(), theSocket.getLocalPort());
Socket theSocket2 = new Socket();
theSocket2.setReuseAddress(false);
/*
* Try to invoke a bind while the port is busy (TIME_WAIT). Note
* that we may not succeed, which will cause the test to pass
* without testing the reuseaddr behavior.
*/
theSocket.close();
theSocket2.bind(localAddress1);
theSocket2.close();
}
public void test_setSendBufferSizeI() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSendBufferSize(134);
assertTrue("Incorrect buffer size", client.getSendBufferSize() >= 134);
client.close();
server.close();
}
public void test_setSocketImplFactoryLjava_net_SocketImplFactory() {
// Cannot test as setting will cause the factory to be changed for
// all subsequent sockets
}
public void test_setSoLingerZI() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSoLinger(true, 500);
assertEquals("Set incorrect linger", 500, client.getSoLinger());
client.setSoLinger(false, 0);
client.close();
server.close();
}
public void test_setSoTimeoutI() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
client.setSoTimeout(100);
assertEquals("Set incorrect sotimeout", 100, client.getSoTimeout());
client.close();
server.close();
}
public void test_setTcpNoDelayZ() throws Exception {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
boolean bool;
client.setTcpNoDelay(bool = !client.getTcpNoDelay());
assertTrue("Failed to set no delay setting: " + client.getTcpNoDelay(), client.getTcpNoDelay() == bool);
client.close();
server.close();
}
public void test_setTrafficClassI() throws Exception {
int IPTOS_LOWCOST = 0x2;
int IPTOS_RELIABILTY = 0x4;
int IPTOS_THROUGHPUT = 0x8;
int IPTOS_LOWDELAY = 0x10;
Socket theSocket = new Socket();
// validate that value set must be between 0 and 255
try {
theSocket.setTrafficClass(256);
fail("No exception was thrown when traffic class set to 256");
} catch (IllegalArgumentException expected) {
}
try {
theSocket.setTrafficClass(-1);
fail("No exception was thrown when traffic class set to -1");
} catch (IllegalArgumentException expected) {
}
// now validate that we can set it to some good values
theSocket.setTrafficClass(IPTOS_LOWCOST);
theSocket.setTrafficClass(IPTOS_RELIABILTY);
theSocket.setTrafficClass(IPTOS_THROUGHPUT);
theSocket.setTrafficClass(IPTOS_LOWDELAY);
}
@SuppressWarnings("deprecation")
public void test_shutdownInput() throws IOException {
ServerSocket server = new ServerSocket(0);
int port = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost(), port);
Socket worker = server.accept();
worker.setTcpNoDelay(true);
InputStream theInput = client.getInputStream();
OutputStream theOutput = worker.getOutputStream();
// shutdown the input
client.shutdownInput();
// send the regular data
String sendString = "Test";
theOutput.write(sendString.getBytes());
theOutput.flush();
// RI fails here. It is a RI bug not to return 0 to indicate EOF
assertEquals(0, theInput.available());
client.close();
server.close();
// Regression test for HARMONY-2944
// Port 0 is not allowed to be used in connect() on some platforms,
// Since server has been closed here, so the port is free now
Socket s = new Socket("0.0.0.0", port, false);
s.shutdownInput();
try {
s.shutdownInput();
fail("should throw SocketException");
} catch (SocketException se) {
// Expected
}
s.close();
}
/**
* java.net.Socket#shutdownOutput()
*/
@SuppressWarnings("deprecation")
public void test_shutdownOutput() throws IOException {
ServerSocket server = new ServerSocket(0);
int port = server.getLocalPort();
Socket client = new Socket(InetAddress.getLocalHost(), port);
Socket worker = server.accept();
OutputStream theOutput = worker.getOutputStream();
// shutdown the output
worker.shutdownOutput();
// send the regular data
String sendString = "Test";
try {
theOutput.write(sendString.getBytes());
theOutput.flush();
fail("No exception when writing on socket with output shutdown");
} catch (IOException e) {
// Expected
}
client.close();
server.close();
// Regression test for HARMONY-2944
// Port 0 is not allowed to be used in connect() on some platforms,
// Since server has been closed here, so the port is free now
Socket s = new Socket("0.0.0.0", port, false);
s.shutdownOutput();
try {
s.shutdownOutput();
fail("should throw SocketException");
} catch (SocketException se) {
// Expected
}
s.close();
}
public void test_toString() throws IOException {
ServerSocket server = new ServerSocket(0);
Socket client = new Socket(InetAddress.getLocalHost(), server.getLocalPort());
// RI has "addr" and "localport" instead of "address" and "localPort".
String expected = "Socket[address=" + InetAddress.getLocalHost()
+ ",port=" + client.getPort() + ",localPort="
+ client.getLocalPort() + "]";
assertEquals(expected, client.toString());
client.close();
server.close();
}
}