package com.limegroup.gnutella.io;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.Selector;
import junit.framework.Test;
import com.limegroup.gnutella.util.BaseTestCase;
import com.limegroup.gnutella.util.PrivilegedAccessor;
public class NIOServerSocketTest extends BaseTestCase {
private final int LISTEN_PORT = 9999;
private final InetSocketAddress LISTEN_ADDR = new InetSocketAddress("127.0.0.1", LISTEN_PORT);
public NIOServerSocketTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(NIOServerSocketTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void testBlockingAccept() throws Exception {
NIOServerSocket server = new NIOServerSocket(LISTEN_PORT);
Socket c1 = connect();
Socket r1 = server.accept();
assertEquals(c1.getLocalPort(), r1.getPort());
assertTrue(r1.isConnected());
assertInstanceof(NIOSocket.class, r1);
assertEquals(0, interestOps(r1));
server.close();
r1.close();
Thread.sleep(100);
}
public void testNonBlockingAccept() throws Exception {
StubAcceptObserver observer = new StubAcceptObserver();
NIOServerSocket server = new NIOServerSocket(LISTEN_PORT, observer);
Socket c1 = connect();
Thread.sleep(200);
assertEquals(1, observer.getSockets().size());
Socket r1 = observer.getNextSocket();
assertEquals(c1.getLocalPort(), r1.getPort());
server.close();
r1.close();
Thread.sleep(100);
}
public void testMultipleNonBlockingAccepts() throws Exception {
StubAcceptObserver observer = new StubAcceptObserver();
NIOServerSocket server = new NIOServerSocket(LISTEN_PORT, observer);
Socket c1 = connect();
Socket c2 = connect();
Socket c3 = connect();
Thread.sleep(300);
assertEquals(3, observer.getSockets().size());
Socket r1 = observer.getNextSocket();
Socket r2 = observer.getNextSocket();
Socket r3 = observer.getNextSocket();
assertEquals(c1.getLocalPort(), r1.getPort());
assertEquals(c2.getLocalPort(), r2.getPort());
assertEquals(c3.getLocalPort(), r3.getPort());
server.close();
r1.close();
r2.close();
r3.close();
}
private Socket connect() throws Exception {
Socket socket = new Socket();
socket.connect(LISTEN_ADDR, 5000);
return socket;
}
private int interestOps(Socket socket) throws Exception {
// peeks into the NIODispatcher to get the Selector so we can assert the interetOps
Selector selector = (Selector)PrivilegedAccessor.getValue(NIODispatcher.instance(), "selector");
return socket.getChannel().keyFor(selector).interestOps();
}
}