package org.webpieces.nio.test;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import org.webpieces.util.logging.Logger;
import org.webpieces.nio.api.ChannelManager;
import org.webpieces.nio.api.ChannelManagerFactory;
import org.webpieces.nio.api.channels.Channel;
import org.webpieces.nio.api.channels.TCPChannel;
import org.webpieces.nio.api.channels.TCPServerChannel;
import org.webpieces.nio.api.deprecated.ChannelServiceFactory;
import org.webpieces.nio.api.handlers.ConnectionListener;
import org.webpieces.nio.api.handlers.DataListener;
import org.webpieces.nio.api.handlers.FutureOperation;
import org.webpieces.nio.api.handlers.OperationCallback;
import org.webpieces.nio.api.libs.BufferHelper;
import org.webpieces.nio.api.testutil.HandlerForTests;
import org.webpieces.nio.api.testutil.MockDataHandler;
import org.webpieces.nio.api.testutil.MockNIOServer;
import biz.xsoftware.mock.CalledMethod;
import biz.xsoftware.mock.MockObject;
import biz.xsoftware.mock.MockObjectFactory;
import junit.framework.TestCase;
public class TestNewChannelManager extends TestCase {
private static final Logger log = LoggerFactory.getLogger(TestNewChannelManager.class);
private ChannelManager server;
private ChannelManager client;
private TCPChannel client1;
private InetAddress loopBack;
private InetSocketAddress loopBackAnyPort;
private MockObject clientHandler;
private MockObject clientConnect;
private TCPServerChannel srvrChannel;
private MockObject serverAccept;
private BufferHelper helper = ChannelServiceFactory.bufferHelper(null);
private Channel serverTcpChannel;
private MockObject serverHandler;
protected void setUp() throws Exception {
HandlerForTests.setupLogging();
server = ChannelManagerFactory.createChannelManager("server", null);
client = ChannelManagerFactory.createChannelManager("client", null);
loopBack = InetAddress.getByName("127.0.0.1");
loopBackAnyPort = new InetSocketAddress(loopBack, 0);
serverAccept = MockObjectFactory.createMock(ConnectionListener.class);
srvrChannel = server.createTCPServerChannel("jmxServer");
srvrChannel.setReuseAddress(true);
srvrChannel.bind(loopBackAnyPort);
srvrChannel.registerServerSocketChannel((ConnectionListener) serverAccept);
clientHandler = MockObjectFactory.createMock(DataListener.class);
clientConnect = MockObjectFactory.createMock(OperationCallback.class);
client1 = client.createTCPChannel("ClientChannel");
}
protected void tearDown() throws Exception {
HandlerForTests.checkForWarnings();
}
public void testBasic() throws Exception {
client1.bind(loopBackAnyPort);
InetSocketAddress remoteAddr = new InetSocketAddress(loopBack, srvrChannel.getLocalAddress().getPort());
FutureOperation future = client1.connect(remoteAddr);
future.setListener((OperationCallback) clientConnect);
clientConnect.expect("finished");
client1.registerForReads((DataListener)clientHandler);
future.waitForOperation(); //should return immediately since listener fired
serverHandler = MockObjectFactory.createMock(DataListener.class);
CalledMethod m = serverAccept.expect("connected");
serverTcpChannel = (Channel)m.getAllParams()[0];
serverTcpChannel.registerForReads((DataListener) serverHandler);
boolean isConnected = client1.isConnected();
assertTrue("Client should be connected", isConnected);
verifyDataPassing();
verifyTearDown();
}
private ByteBuffer verifyDataPassing() throws Exception {
ByteBuffer b = ByteBuffer.allocate(10);
helper.putString(b, "de");
helper.doneFillingBuffer(b);
log.trace("***********************************************");
FutureOperation write = client1.write(b);
write.waitForOperation(5000);
CalledMethod m = serverHandler.expect("incomingData");
TCPChannel actualChannel = (TCPChannel)m.getAllParams()[0];
ByteBuffer actualBuf = (ByteBuffer)m.getAllParams()[1];
String result = helper.readString(actualBuf, actualBuf.remaining());
assertEquals("de", result);
b.rewind();
FutureOperation future = actualChannel.write(b);
future.waitForOperation(5000); //synchronously wait for write to happen
m = clientHandler.expect(MockDataHandler.INCOMING_DATA);
actualBuf = (ByteBuffer) m.getAllParams()[1];
result = helper.readString(actualBuf, actualBuf.remaining());
assertEquals("de", result);
b.rewind();
FutureOperation future2 = actualChannel.write(b);
future2.waitForOperation(5000); //synchronously wait for write to happen
m = clientHandler.expect(MockDataHandler.INCOMING_DATA);
actualBuf = (ByteBuffer) m.getAllParams()[1];
result = helper.readString(actualBuf, actualBuf.remaining());
assertEquals("de", result);
return b;
}
private void verifyTearDown() throws IOException {
log.info("local="+client1.getLocalAddress()+" remote="+client1.getRemoteAddress());
log.info("CLIENT1 CLOSE");
FutureOperation future = client1.close();
serverHandler.expect(MockNIOServer.FAR_END_CLOSED);
future.setListener((OperationCallback) clientConnect);
clientConnect.expect("finished");
}
}