--- /dev/null 2018-06-30 13:49:24.634979840 -0700 +++ new/test/jdk/jdk/net/Sockets/rsocket/ServerSocketChannel/AdaptServerSocket.java 2018-06-30 14:07:37.050166360 -0700 @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2001, 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-channel adaptors + * @requires (os.family == "linux") + * @library .. /test/lib + * @build RsocketTest + * @run main/othervm -Djava.net.preferIPv4Stack=true AdaptServerSocket + */ + +import java.io.*; +import java.net.*; +import java.nio.*; +import java.nio.channels.*; +import java.nio.charset.*; +import jdk.net.Sockets; + +public class AdaptServerSocket { + + static java.io.PrintStream out = System.out; + static volatile boolean clientStarted = false; + static volatile Exception clientException = null; + static volatile Thread client = null; + + static void startClient(final int port, final int dally) + throws Exception + { + Thread t = new Thread() { + public void run() { + try { + Socket so = Sockets.openRdmaSocket(); + out.println("client: " + so); + clientStarted = true; + if (dally > 0) + Thread.sleep(dally); + so.connect(new InetSocketAddress(port)); + if (Thread.interrupted()) { + out.println("client interrupted"); + return; + } + out.println("client: " + so); + int a = so.getInputStream().read(); + out.println("client: read " + a); + a += 1; + so.getOutputStream().write(a); + out.println("client: wrote " + a); + } catch (Exception x) { + if (x instanceof InterruptedException) + return; + clientException = x; + x.printStackTrace(); + } + } + }; + t.setDaemon(true); + t.start(); + client = t; + } + + static void test(int clientDally, int timeout, boolean shouldTimeout) + throws Exception + { + boolean needClient = !shouldTimeout; + client = null; + clientException = null; + clientStarted = false; + out.println(); + + try { + ServerSocketChannel ssc = Sockets.openRdmaServerSocketChannel(); + ServerSocket sso = ssc.socket(); + out.println("created: " + ssc); + out.println(" " + sso); + if (timeout != 0) + sso.setSoTimeout(timeout); + out.println("timeout: " + sso.getSoTimeout()); + sso.bind(null); + out.println("bound: " + ssc); + out.println(" " + sso); + if (needClient) { + startClient(sso.getLocalPort(), clientDally); + while (!clientStarted) { + Thread.sleep(20); + } + } + Socket so = null; + try { + so = sso.accept(); + } catch (SocketTimeoutException x) { + if (shouldTimeout) + out.println("Accept timed out, as expected"); + else + throw x; + } + if (shouldTimeout && (so != null)) + throw new Exception("Accept did not time out"); + + if (so != null) { + int a = 42; + so.getOutputStream().write(a); + int b = so.getInputStream().read(); + if (b != a + 1) + throw new Exception("Read incorrect data"); + out.println("server: read " + b); + } + } catch (Exception e) { + e.printStackTrace(); + throw new Exception("Test Failed!"); + } + + if (needClient) { + client.interrupt(); + client.join(); + if (clientException != null) + throw clientException; + } + } + + public static void main(String[] args) throws Exception { + if (!RsocketTest.isRsocketAvailable()) + return; + + test(0, 0, false); + test(50, 5000, false); + test(500, 50, true); + } +}