1 /*
   2  * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /* @test
  25  * @bug 8195160
  26  * @summary Test ready for connect followed by ready for write
  27  * @requires (os.family == "linux")
  28  * @library .. /test/lib
  29  * @build jdk.test.lib.Utils TestServers
  30  * @build RsocketTest
  31  * @run main/othervm -Djava.net.preferIPv4Stack=true ConnectWrite
  32  */
  33 
  34 import java.net.*;
  35 import java.nio.channels.*;
  36 import java.nio.channels.spi.SelectorProvider;
  37 import java.util.*;
  38 import jdk.net.Sockets;
  39 
  40 public class ConnectWrite {
  41 
  42     public static void main(String[] args) throws Exception {
  43         if (!RsocketTest.isRsocketAvailable())
  44             return;
  45 
  46         try (TestServers.DayTimeServer daytimeServer
  47                 = TestServers.DayTimeServer.startNewServer(25)) {
  48             test1(daytimeServer);
  49         }
  50     }
  51 
  52     static void test1(TestServers.DayTimeServer daytimeServer) throws Exception {
  53         Selector selector = Sockets.openRdmaSelector();
  54         InetAddress myAddress = daytimeServer.getAddress();
  55         InetSocketAddress isa
  56             = new InetSocketAddress(myAddress, daytimeServer.getPort());
  57 
  58         SocketChannel sc = Sockets.openRdmaSocketChannel();
  59 
  60         try {
  61             sc.configureBlocking(false);
  62             SelectionKey key = sc.register(selector, SelectionKey.OP_CONNECT);
  63             boolean result = sc.connect(isa);
  64 
  65             while (!result) {
  66                 int keysAdded = selector.select(1000);
  67                 if (keysAdded > 0) {
  68                     Set readyKeys = selector.selectedKeys();
  69                     Iterator i = readyKeys.iterator();
  70                     while (i.hasNext()) {
  71                         SelectionKey sk = (SelectionKey)i.next();
  72                         readyKeys.remove(sk);
  73                         SocketChannel nextReady = (SocketChannel)sk.channel();
  74                         result = nextReady.finishConnect();
  75                     }
  76                 }
  77             }
  78             if (key != null) {
  79                 key.interestOps(SelectionKey.OP_WRITE);
  80                 int keysAdded = selector.select(1000);
  81                 if (keysAdded <= 0)
  82                     throw new Exception("connect->write failed");
  83                 if (keysAdded > 0) {
  84                     Set readyKeys = selector.selectedKeys();
  85                     Iterator i = readyKeys.iterator();
  86                     while (i.hasNext()) {
  87                         SelectionKey sk = (SelectionKey)i.next();
  88                         if (!sk.isWritable())
  89                             throw new Exception("connect->write failed");
  90                     }
  91                 }
  92             }
  93         } finally {
  94             sc.close();
  95             selector.close();
  96         }
  97     }
  98 }