1/* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package org.apache.harmony.tests.java.nio.channels; 18 19import java.net.InetSocketAddress; 20import java.net.ServerSocket; 21import java.nio.channels.SelectableChannel; 22import java.nio.channels.SelectionKey; 23import java.nio.channels.Selector; 24import java.nio.channels.ServerSocketChannel; 25import java.nio.channels.SocketChannel; 26 27import junit.framework.TestCase; 28 29public class UnixSelectorTest extends TestCase { 30 static class Server { 31 ServerSocketChannel serverChannel = ServerSocketChannel.open(); 32 ServerSocket socket = null; 33 34 Server() throws Exception { 35 serverChannel.configureBlocking(false); 36 } 37 38 public void initialize() throws Exception { 39 this.socket = serverChannel.socket(); 40 socket.bind(null); 41 } 42 43 public void accept() { 44 Thread serverThread = new Thread(new Runnable() { 45 public void run() { 46 try { 47 while (serverChannel.accept() == null) { 48 Thread.sleep(1000); 49 } 50 } catch (Exception e) {} 51 } 52 }); 53 serverThread.start(); 54 } 55 56 public void close() throws Exception{ 57 serverChannel.close(); 58 } 59 } 60 61 public void testSelectorAcceptAndRead() throws Exception { 62 Selector sel0 = Selector.open(); 63 Selector sel1 = Selector.open(); 64 Server server = new Server(); 65 SelectionKey mkey0 = server.serverChannel.register(sel0, SelectionKey.OP_ACCEPT); 66 server.serverChannel.register(sel1, SelectionKey.OP_ACCEPT); 67 68 // HUP is treating as acceptable 69 assertEquals(1, sel0.select(100)); 70 assertEquals(true, sel0.selectedKeys().contains(mkey0)); 71 server.initialize(); 72 // after bind can not accept 73 assertEquals(0, sel1.select(100)); 74 server.accept(); 75 Thread.sleep(1000); 76 SocketChannel socketChannel = SocketChannel.open(); 77 socketChannel.configureBlocking(false); 78 Selector sel2 = Selector.open(); 79 socketChannel.register(sel2, SelectionKey.OP_WRITE); 80 boolean isConnected = socketChannel.connect(server.socket.getLocalSocketAddress()); 81 if (!isConnected) { 82 socketChannel.finishConnect(); 83 } 84 85 assertEquals(true, socketChannel.isConnected()); 86 server.close(); 87 Thread.sleep(3000); 88 assertEquals(true, socketChannel.isConnected()); 89 assertEquals(1, sel2.select(100)); 90 } 91 92 public void testSelectUnConnectedChannel() throws Exception { 93 SocketChannel socketChannel2 = SocketChannel.open(); 94 socketChannel2.configureBlocking(false); 95 Selector sel3 = Selector.open(); 96 SelectionKey mkey3 = socketChannel2.register(sel3, SelectionKey.OP_WRITE); 97 // HUP is also treating as writable 98 assertEquals(1, sel3.select(100)); 99 assertEquals(false, mkey3.isConnectable()); 100 // even the channel is not connected, the selector could be writable 101 assertEquals(false, socketChannel2.isConnected()); 102 assertEquals(true, mkey3.isWritable()); 103 104 Selector sel4 = Selector.open(); 105 SelectionKey mkey4 = socketChannel2.register(sel4, SelectionKey.OP_CONNECT); 106 assertEquals(1, sel4.select(100)); 107 assertEquals(false, mkey4.isWritable()); 108 assertEquals(true, mkey4.isConnectable()); 109 110 Selector sel5 = Selector.open(); 111 SelectionKey mkey5 = socketChannel2.register(sel5, SelectionKey.OP_CONNECT | SelectionKey.OP_WRITE); 112 assertEquals(1, sel5.select(100)); 113 assertEquals(true, mkey5.isWritable()); 114 assertEquals(true, mkey5.isConnectable()); 115 } 116} 117