test/java/nio/channels/SocketChannel/ConnectState.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2001, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2001, 2012, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 28,51 ****
import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
public class ConnectState {
static PrintStream log = System.err;
- static String REMOTE_HOST = TestUtil.HOST;
- static int REMOTE_PORT = 7; // echo
static InetSocketAddress remote;
final static int ST_UNCONNECTED = 0;
final static int ST_PENDING = 1;
final static int ST_CONNECTED = 2;
final static int ST_CLOSED = 3;
static abstract class Test {
abstract String go(SocketChannel sc) throws Exception;
--- 28,70 ----
import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.HashSet;
public class ConnectState {
static PrintStream log = System.err;
static InetSocketAddress remote;
final static int ST_UNCONNECTED = 0;
final static int ST_PENDING = 1;
final static int ST_CONNECTED = 2;
final static int ST_CLOSED = 3;
+ final static int ST_PENDING_OR_CONNECTED = 4;
+ // NO exceptions expected
+ final static Collection<Class<?>> NONE = Collections.emptySet();
+
+ // make a set of expected exception.
+ static Collection<Class<?>> expectedExceptions(Class<?>... expected) {
+ final Collection<Class<?>> exceptions;
+ if (expected.length == 0) {
+ exceptions = NONE;
+ } else if (expected.length == 1) {
+ assert expected[0] != null;
+ exceptions = Collections.<Class<?>>singleton(expected[0]);
+ } else {
+ exceptions = new HashSet<>(Arrays.asList(expected));
+ }
+ return exceptions;
+ }
static abstract class Test {
abstract String go(SocketChannel sc) throws Exception;
*** 74,114 ****
case ST_CLOSED:
check(sc.isConnected(), "isConnected");
check(!sc.isConnectionPending(), "!isConnectionPending");
check(sc.isOpen(), "isOpen");
break;
}
}
! Test(String name, Class exception, int state) throws Exception {
SocketChannel sc = SocketChannel.open();
! String note = null;
try {
try {
note = go(sc);
} catch (Exception x) {
! if (exception != null) {
if (exception.isInstance(x)) {
log.println(name + ": As expected: "
+ x);
check(sc, state);
! return;
! } else {
throw new Exception(name
+ ": Incorrect exception",
x);
! }
! } else {
throw new Exception(name
+ ": Unexpected exception",
x);
}
}
! if (exception != null)
throw new Exception(name
+ ": Expected exception not thrown: "
! + exception);
check(sc, state);
log.println(name + ": Returned normally"
+ ((note != null) ? ": " + note : ""));
} finally {
if (sc.isOpen())
--- 93,160 ----
case ST_CLOSED:
check(sc.isConnected(), "isConnected");
check(!sc.isConnectionPending(), "!isConnectionPending");
check(sc.isOpen(), "isOpen");
break;
+ case ST_PENDING_OR_CONNECTED:
+ check(sc.isConnected() || sc.isConnectionPending(),
+ "isConnected || isConnectionPending");
+ check(sc.isOpen(), "isOpen");
+ break;
}
}
! Test(String name, Class<?> exception, int state) throws Exception {
! this(name, expectedExceptions(exception), state);
! }
!
! // On some architecture we may need to accept several exceptions.
! // For instance on Solaris, when using a server colocated on the
! // machine we cannot guarantee that we will get a ConnectionPending
! // exception when connecting twice on the same non-blocking socket.
! // We may get a an AlreadyConnected exception, which is also valid: it
! // simply means that the first connection as been immediately accepted.
! Test(String name, Collection<Class<?>> exceptions, int state)
! throws Exception {
SocketChannel sc = SocketChannel.open();
! String note;
try {
try {
note = go(sc);
} catch (Exception x) {
! Class<?> expectedExceptionClass = null;
! for (Class<?> exception : exceptions) {
if (exception.isInstance(x)) {
log.println(name + ": As expected: "
+ x);
+ expectedExceptionClass = exception;
check(sc, state);
! break;
! }
! }
! if (expectedExceptionClass == null
! && !exceptions.isEmpty()) {
! // we had an exception, but it's not of the set of
! // exceptions we expected.
throw new Exception(name
+ ": Incorrect exception",
x);
! } else if (exceptions.isEmpty()) {
! // we didn't expect any exception
throw new Exception(name
+ ": Unexpected exception",
x);
}
+ // if we reach here, we have our expected exception
+ assert expectedExceptionClass != null;
+ return;
}
! if (!exceptions.isEmpty()) {
throw new Exception(name
+ ": Expected exception not thrown: "
! + exceptions.iterator().next());
! }
check(sc, state);
log.println(name + ": Returned normally"
+ ((note != null) ? ": " + note : ""));
} finally {
if (sc.isOpen())
*** 121,174 ****
static void tests() throws Exception {
log.println(remote);
new Test("Read unconnected", NotYetConnectedException.class,
ST_UNCONNECTED) {
String go(SocketChannel sc) throws Exception {
ByteBuffer b = ByteBuffer.allocateDirect(1024);
sc.read(b);
return null;
}};
new Test("Write unconnected", NotYetConnectedException.class,
ST_UNCONNECTED) {
String go(SocketChannel sc) throws Exception {
ByteBuffer b = ByteBuffer.allocateDirect(1024);
sc.write(b);
return null;
}};
! new Test("Simple connect", null, ST_CONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
return null;
}};
! new Test("Simple connect & finish", null, ST_CONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
if (!sc.finishConnect())
throw new Exception("finishConnect returned false");
return null;
}};
new Test("Double connect",
AlreadyConnectedException.class, ST_CONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
sc.connect(remote);
return null;
}};
new Test("Finish w/o start",
NoConnectionPendingException.class, ST_UNCONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.finishConnect();
return null;
}};
! new Test("NB simple connect", null, ST_CONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
int n = 0;
while (!sc.finishConnect()) {
--- 167,229 ----
static void tests() throws Exception {
log.println(remote);
new Test("Read unconnected", NotYetConnectedException.class,
ST_UNCONNECTED) {
+ @Override
String go(SocketChannel sc) throws Exception {
ByteBuffer b = ByteBuffer.allocateDirect(1024);
sc.read(b);
return null;
}};
new Test("Write unconnected", NotYetConnectedException.class,
ST_UNCONNECTED) {
+ @Override
String go(SocketChannel sc) throws Exception {
ByteBuffer b = ByteBuffer.allocateDirect(1024);
sc.write(b);
return null;
}};
! new Test("Simple connect", NONE, ST_CONNECTED) {
! @Override
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
return null;
}};
! new Test("Simple connect & finish", NONE, ST_CONNECTED) {
! @Override
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
if (!sc.finishConnect())
throw new Exception("finishConnect returned false");
return null;
}};
new Test("Double connect",
AlreadyConnectedException.class, ST_CONNECTED) {
+ @Override
String go(SocketChannel sc) throws Exception {
sc.connect(remote);
sc.connect(remote);
return null;
}};
new Test("Finish w/o start",
NoConnectionPendingException.class, ST_UNCONNECTED) {
+ @Override
String go(SocketChannel sc) throws Exception {
sc.finishConnect();
return null;
}};
! // Note: using our local EchoServer rather than echo on a distant
! // host - we see that Tries to finish = 0 (instead of ~ 18).
! new Test("NB simple connect", NONE, ST_CONNECTED) {
! @Override
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
int n = 0;
while (!sc.finishConnect()) {
*** 177,204 ****
}
sc.finishConnect(); // Check redundant invocation
return ("Tries to finish = " + n);
}};
new Test("NB double connect",
! ConnectionPendingException.class, ST_PENDING) {
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
sc.connect(remote);
return null;
}};
new Test("NB finish w/o start",
NoConnectionPendingException.class, ST_UNCONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.finishConnect();
return null;
}};
! new Test("NB connect, B finish", null, ST_CONNECTED) {
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
sc.configureBlocking(true);
sc.finishConnect();
--- 232,268 ----
}
sc.finishConnect(); // Check redundant invocation
return ("Tries to finish = " + n);
}};
+ // Note: using our local EchoServer rather than echo on a distant
+ // host - we cannot guarantee that this test will get a
+ // a ConnectionPendingException: it may get an
+ // AlreadyConnectedException, so we should allow for both.
new Test("NB double connect",
! expectedExceptions(ConnectionPendingException.class,
! AlreadyConnectedException.class),
! ST_PENDING_OR_CONNECTED) {
! @Override
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
sc.connect(remote);
return null;
}};
new Test("NB finish w/o start",
NoConnectionPendingException.class, ST_UNCONNECTED) {
+ @Override
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.finishConnect();
return null;
}};
! new Test("NB connect, B finish", NONE, ST_CONNECTED) {
! @Override
String go(SocketChannel sc) throws Exception {
sc.configureBlocking(false);
sc.connect(remote);
sc.configureBlocking(true);
sc.finishConnect();
*** 206,216 ****
}};
}
public static void main(String[] args) throws Exception {
! remote = new InetSocketAddress(InetAddress.getByName(REMOTE_HOST),
! REMOTE_PORT);
tests();
}
}
--- 270,283 ----
}};
}
public static void main(String[] args) throws Exception {
! try (TestClass.EchoServer echoServer
! = TestClass.EchoServer.startNewServer(500)) {
! remote = new InetSocketAddress(echoServer.getAddress(),
! echoServer.getPort());
tests();
}
+ }
}