--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/nio/channels/etc/NetworkChannelTests.java Sun Aug 31 18:39:01 2008 +0100
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2007-2008 Sun Microsystems, Inc. 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.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4640544
+ * @summary Unit test for channels that implement NetworkChannel
+ */
+
+import java.nio.*;
+import java.nio.channels.*;
+import java.net.*;
+import java.io.IOException;
+import java.util.*;
+
+public class NetworkChannelTests {
+
+ static interface ChannelFactory {
+ NetworkChannel open() throws IOException;
+ }
+
+ static class BogusSocketAddress extends SocketAddress {
+ }
+
+ /**
+ * Exercise bind method.
+ */
+ static void bindTests(ChannelFactory factory) throws IOException {
+ NetworkChannel ch;
+
+ // AlreadyBoundException
+ ch = factory.open().bind(new InetSocketAddress(0));
+ try {
+ ch.bind(new InetSocketAddress(0));
+ throw new RuntimeException("AlreadyBoundException not thrown");
+ } catch (AlreadyBoundException x) {
+ }
+ ch.close();
+
+ // bind(null)
+ ch = factory.open().bind(null);
+ if (ch.getLocalAddress() == null)
+ throw new RuntimeException("socket not found");
+ ch.close();
+
+ // UnsupportedAddressTypeException
+ ch = factory.open();
+ try {
+ ch.bind(new BogusSocketAddress());
+ throw new RuntimeException("UnsupportedAddressTypeException not thrown");
+ } catch (UnsupportedAddressTypeException x) {
+ }
+ ch.close();
+
+ // ClosedChannelException
+ try {
+ ch.bind(new InetSocketAddress(0));
+ throw new RuntimeException("ClosedChannelException not thrown");
+ } catch (ClosedChannelException x) {
+ }
+ }
+
+ /**
+ * Exercise getLocalAddress method.
+ */
+ static void localAddressTests(ChannelFactory factory) throws IOException {
+ NetworkChannel ch;
+
+ // not bound
+ ch = factory.open();
+ if (ch.getLocalAddress() != null) {
+ throw new RuntimeException("Local address returned when not bound");
+ }
+
+ // bound
+ InetSocketAddress local =
+ (InetSocketAddress)(ch.bind(new InetSocketAddress(0)).getLocalAddress());
+ if (!local.getAddress().isAnyLocalAddress()) {
+ if (NetworkInterface.getByInetAddress(local.getAddress()) == null)
+ throw new RuntimeException("not bound to local address");
+ }
+ if (local.getPort() <= 0)
+ throw new RuntimeException("not bound to local port");
+
+ // closed
+ ch.close();
+ if (ch.getLocalAddress() != null) {
+ throw new RuntimeException("Local address return when closed");
+ }
+ }
+
+ /**
+ * Exercise getConnectedAddress method (SocketChannel only)
+ */
+ static void connectedAddressTests() throws IOException {
+ ServerSocketChannel ssc = ServerSocketChannel.open()
+ .bind(new InetSocketAddress(0));
+ InetSocketAddress local = (InetSocketAddress)(ssc.getLocalAddress());
+ int port = local.getPort();
+ InetSocketAddress server = new InetSocketAddress(InetAddress.getLocalHost(), port);
+
+ SocketChannel sc = SocketChannel.open();
+
+ // not connected
+ if (sc.getConnectedAddress() != null)
+ throw new RuntimeException("getConnectedAddress returned address when not connected");
+
+ // connected
+ sc.connect(server);
+ SocketAddress remote = sc.getConnectedAddress();
+ if (!remote.equals(server))
+ throw new RuntimeException("getConnectedAddress returned incorrect address");
+
+ // closed
+ sc.close();
+ if (sc.getConnectedAddress() != null)
+ throw new RuntimeException("getConnectedAddress returned address when closed");
+
+ ssc.close();
+ }
+
+ public static void main(String[] args) throws IOException {
+ ChannelFactory factory;
+
+ // -- SocketChannel --
+
+ factory = new ChannelFactory() {
+ public NetworkChannel open() throws IOException {
+ return SocketChannel.open();
+ }
+ };
+
+ bindTests(factory);
+ localAddressTests(factory);
+ connectedAddressTests();
+
+ // -- ServerSocketChannel --
+
+ factory = new ChannelFactory() {
+ public NetworkChannel open() throws IOException {
+ return ServerSocketChannel.open();
+ }
+ };
+
+ bindTests(factory);
+ localAddressTests(factory);
+
+ // backlog values
+ ServerSocketChannel.open()
+ .bind(new InetSocketAddress(0), 100).close();
+ ServerSocketChannel.open()
+ .bind(new InetSocketAddress(0), 0).close();
+ ServerSocketChannel.open()
+ .bind(new InetSocketAddress(0), -1).close();
+
+ // -- DatagramChannel --
+
+ factory = new ChannelFactory() {
+ public NetworkChannel open() throws IOException {
+ return DatagramChannel.open();
+ }
+ };
+
+ bindTests(factory);
+ localAddressTests(factory);
+ }
+
+}