--- /dev/null 2018-09-16 08:14:05.604314476 -0700 +++ new/test/jdk/jdk/net/Sockets/rsocket/ServerSocketChannel/Basic.java 2018-10-05 14:15:04.496757281 -0700 @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2018, 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8195160 + * @summary Unit test for server-socket channels + * @requires (os.family == "linux") + * @library .. /test/lib /test/jdk/java/nio/channels + * @build RsocketTest + * @run main/othervm -Djava.net.preferIPv4Stack=true Basic + */ + +import java.io.IOException; +import java.io.PrintStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Random; +import jdk.net.Sockets; + +public class Basic { + + static PrintStream log = System.err; + + static class Server + extends TestThread + { + ServerSocketChannel ssc; + boolean block; + + Server(ServerSocketChannel ssc, boolean block) { + super("Server", Basic.log); + this.ssc = ssc; + this.block = block; + } + + void go() throws Exception { + log.println("Server: Listening " + + (block ? "(blocking)" : "(non-blocking)")); + if (!block) + ssc.configureBlocking(false); + log.println(" " + ssc); + SocketChannel sc = null; + for (;;) { + sc = ssc.accept(); + if (sc != null) { + break; + } + log.println("Server: Sleeping..."); + Thread.sleep(50); + } + log.println("Server: Accepted " + sc); + ByteBuffer bb = ByteBuffer.allocateDirect(100); + if (sc.read(bb) != 1) + throw new Exception("Read failed"); + bb.flip(); + byte b = bb.get(); + log.println("Server: Read " + b + ", writing " + (b + 1)); + bb.clear(); + bb.put((byte)43); + bb.flip(); + if (sc.write(bb) != 1) + throw new Exception("Write failed"); + sc.close(); + ssc.close(); + log.println("Server: Finished"); + } + + } + + static class Client + extends TestThread + { + int port; + boolean dally; + + Client(int port, boolean block) { + super("Client", Basic.log); + this.port = port; + this.dally = !block; + } + + public void go() throws Exception { + if (dally) + Thread.sleep(200); + InetSocketAddress isa + = new InetSocketAddress(InetAddress.getLocalHost(), port); + log.println("Client: Connecting to " + isa); + SocketChannel sc = Sockets.openRdmaSocketChannel(); + sc.connect(isa); + log.println("Client: Connected"); + ByteBuffer bb = ByteBuffer.allocateDirect(512); + bb.put((byte)42).flip(); + log.println("Client: Writing " + bb.get(0)); + if (sc.write(bb) != 1) + throw new Exception("Write failed"); + bb.clear(); + if (sc.read(bb) != 1) + throw new Exception("Read failed"); + bb.flip(); + if (bb.get() != 43) + throw new Exception("Read " + bb.get(bb.position() - 1)); + log.println("Client: Read " + bb.get(0)); + sc.close(); + log.println("Client: Finished"); + } + + } + + static void test(boolean block) throws Exception { + ServerSocketChannel ssc = Sockets.openRdmaServerSocketChannel(); + ssc.socket().setReuseAddress(true); + InetAddress lh = InetAddress.getLocalHost(); + int port; + Random r = new Random(); + for (;;) { + port = r.nextInt((1 << 16) - 1024) + 1024; + InetSocketAddress isa = new InetSocketAddress(lh, port); + try { + ssc.socket().bind(isa); + } catch (IOException x) { + continue; + } + break; + } + + Server server = new Server(ssc, block); + Client client = new Client(port, block); + server.start(); + client.start(); + if ((server.finish(0) & client.finish(0)) == 0) + throw new Exception("Failure"); + log.println(); + } + + public static void main(String[] args) throws Exception { + if (!RsocketTest.isRsocketAvailable()) + return; + + log.println(); + test(true); + test(false); + } + +}