1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.nio.tests.java.nio.channels; 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.InetSocketAddress; 20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.net.ServerSocket; 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.channels.SelectableChannel; 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.channels.SelectionKey; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.channels.Selector; 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.channels.ServerSocketChannel; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.channels.SocketChannel; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class UnixSelectorTest extends TestCase { 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static class Server { 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private ServerSocketChannel serverChannel = ServerSocketChannel.open(); 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private ServerSocket socket = null; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Server() throws Exception { 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverChannel.configureBlocking(false); 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void initialize() throws Exception { 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes this.socket = serverChannel.socket(); 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socket.bind(new InetSocketAddress("localhost", 0)); 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public int getPort() { 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return socket.getLocalPort(); 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public boolean isOpen() { 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return !socket.isClosed(); 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public ServerSocketChannel getServerChannel() { 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return serverChannel; 53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void accept() { 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread serverThread = new Thread(new Runnable() { 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void run() { 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes while (serverChannel.accept() == null) { 60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread.sleep(1000); 61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (Exception e) {} 63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes }); 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverThread.start(); 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void close() throws Exception{ 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverChannel.close(); 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testSelectorAcceptAndRead() throws Exception { 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel0 = Selector.open(); 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel1 = Selector.open(); 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Server server = new Server(); 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SelectableChannel serverChannel = server.getServerChannel(); 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SelectionKey mkey0 = serverChannel.register(sel0, SelectionKey.OP_ACCEPT); 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes serverChannel.register(sel1, SelectionKey.OP_ACCEPT); 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // HUP is treating as acceptable 82e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(1, sel0.select(100)); 83e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, sel0.selectedKeys().contains(mkey0)); 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.initialize(); 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // after bind can not accept 86e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(0, sel1.select(100)); 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.accept(); 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread.sleep(1000); 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int port = server.getPort(); 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SocketChannel socketChannel = SocketChannel.open(); 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socketChannel.configureBlocking(false); 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel2 = Selector.open(); 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socketChannel.register(sel2, SelectionKey.OP_WRITE); 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes boolean isConnected = socketChannel.connect(new InetSocketAddress("localhost", port)); 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes if (!isConnected) { 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socketChannel.finishConnect(); 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 99e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, socketChannel.isConnected()); 100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes server.close(); 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Thread.sleep(3000); 102e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, socketChannel.isConnected()); 103e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(1, sel2.select(100)); 104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testSelectUnConnectedChannel() throws Exception { 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SocketChannel socketChannel2 = SocketChannel.open(); 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes socketChannel2.configureBlocking(false); 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel3 = Selector.open(); 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SelectionKey mkey3 = socketChannel2.register(sel3, SelectionKey.OP_WRITE); 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // HUP is also treating as writable 112e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(1, sel3.select(100)); 113e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(false, mkey3.isConnectable()); 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes // even the channel is not connected, the selector could be writable 115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(false, socketChannel2.isConnected()); 116e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, mkey3.isWritable()); 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel4 = Selector.open(); 119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SelectionKey mkey4 = socketChannel2.register(sel4, SelectionKey.OP_CONNECT); 120e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(1, sel4.select(100)); 121e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(false, mkey4.isWritable()); 122e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, mkey4.isConnectable()); 123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Selector sel5 = Selector.open(); 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes SelectionKey mkey5 = socketChannel2.register(sel5, SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE); 126e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(1, sel5.select(100)); 127e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, mkey5.isWritable()); 128e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes assertEquals(true, mkey5.isConnectable()); 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 131