package org.playorm.nio.test; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import junit.framework.TestCase; import org.playorm.nio.api.channels.TCPChannel; import org.playorm.nio.api.deprecated.ChannelManager; import org.playorm.nio.api.deprecated.ChannelService; import org.playorm.nio.api.deprecated.ChannelServiceFactory; import org.playorm.nio.api.deprecated.ConnectionCallback; import org.playorm.nio.api.deprecated.Settings; import org.playorm.nio.api.handlers.DataListener; import org.playorm.nio.api.libs.BufferFactory; import org.playorm.nio.api.libs.BufferHelper; import org.playorm.nio.api.libs.FactoryCreator; import org.playorm.nio.api.libs.PacketProcessorFactory; import org.playorm.nio.api.testutil.CloneByteBuffer; import org.playorm.nio.api.testutil.HandlerForTests; import biz.xsoftware.mock.CalledMethod; import biz.xsoftware.mock.MockObject; import biz.xsoftware.mock.MockObjectFactory; public class XTestDelayServer extends TestCase { private static final Logger log = Logger.getLogger(XTestDelayServer.class.getName()); private static final BufferHelper HELPER = ChannelServiceFactory.bufferHelper(null); private ChannelServiceFactory factory; private BufferFactory bufFactory; private ChannelService chanMgr; private InetSocketAddress delaySvrAddr; private DelayServer delayServer; private EchoServer echoServer; private MockObject mockHandler; private MockObject mockConnect; private PacketProcessorFactory procFactory; private Settings factoryHolder; public XTestDelayServer(String arg0) { super(arg0); if(bufFactory == null) { Map<String, Object> map = new HashMap<String, Object>(); map.put(FactoryCreator.KEY_IS_DIRECT, false); FactoryCreator creator = FactoryCreator.createFactory(null); bufFactory = creator.createBufferFactory(map); } ChannelServiceFactory basic = ChannelServiceFactory.createFactory(null); Map<String, Object> props = new HashMap<String, Object>(); props.put(ChannelServiceFactory.KEY_IMPLEMENTATION_CLASS, ChannelServiceFactory.VAL_PACKET_CHANNEL_MGR); props.put(ChannelServiceFactory.KEY_CHILD_CHANNELMGR_FACTORY, basic); ChannelServiceFactory packetFactory = ChannelServiceFactory.createFactory(props); Map<String, Object> props2 = new HashMap<String, Object>(); props2.put(ChannelServiceFactory.KEY_IMPLEMENTATION_CLASS, ChannelServiceFactory.VAL_EXCEPTION_CHANNEL_MGR); props2.put(ChannelServiceFactory.KEY_CHILD_CHANNELMGR_FACTORY, packetFactory); factory = ChannelServiceFactory.createFactory(props2); } protected void setUp() throws Exception { FactoryCreator creator = FactoryCreator.createFactory(null); procFactory = creator.createPacketProcFactory(null); factoryHolder = new Settings(null, procFactory); HandlerForTests.setupLogging(); Logger.getLogger("").setLevel(Level.INFO); //here I keep using the same channel manager on purpose, just //so we get testing between tests that the channel manager shutdown //and started back up cleanly..... if(chanMgr == null) { chanMgr = createClientChanMgr("[client]"); } if(echoServer == null) { ChannelService svrChanMgr = createSvrChanMgr("[echoServer]"); echoServer = new EchoServer(svrChanMgr, factoryHolder); } if(delayServer == null) { delayServer = new DelayServer(); } chanMgr.start(); InetSocketAddress echoSvrAddr = echoServer.start(); log.fine("echo server port ="+echoSvrAddr); delaySvrAddr = delayServer.start(echoSvrAddr); log.fine("delay server port ="+delaySvrAddr); mockHandler = MockObjectFactory.createMock(DataListener.class); mockHandler.setDefaultBehavior("incomingData", new CloneByteBuffer()); mockConnect = MockObjectFactory.createMock(ConnectionCallback.class); } protected void tearDown() throws Exception { chanMgr.stop(); chanMgr = null; delayServer.stop(); echoServer.stop(); HandlerForTests.checkForWarnings(); Logger.getLogger("").setLevel(Level.FINEST); } protected ChannelService createClientChanMgr(String name) { Map<String, Object> p = new HashMap<String, Object>(); p.put(ChannelManager.KEY_ID, name); p.put(ChannelManager.KEY_BUFFER_FACTORY, bufFactory); return factory.createChannelManager(p); } protected ChannelService createSvrChanMgr(String name) { Map<String, Object> p = new HashMap<String, Object>(); p.put(ChannelManager.KEY_ID, name); p.put(ChannelManager.KEY_BUFFER_FACTORY, bufFactory); return factory.createChannelManager(p); } public void testVerySmallReadWrite() throws Exception { ByteBuffer b = ByteBuffer.allocate(4000); log.info("getting all proper connections"); int size = 40; String[] methodNames = new String[size]; for(int i = 0; i < size; i++) { methodNames[i] = "connected"; } TCPChannel[] clients = new TCPChannel[size]; for(int i = 0; i < size; i++) { clients[i] = chanMgr.createTCPChannel("Client["+i+"]", factoryHolder); log.fine("starting connect"); Thread.sleep(100); clients[i].oldConnect(delaySvrAddr, (ConnectionCallback)mockConnect); } mockConnect.expect(methodNames); log.info("done getting all connections"); for(TCPChannel client : clients) { client.registerForReads((DataListener)mockHandler); } int numWrites = 200; String payload = "hello"; HELPER.putString(b, payload); HELPER.doneFillingBuffer(b); methodNames = new String[size*numWrites]; for(int i = 0; i < size*numWrites; i++) { methodNames[i] = "incomingData"; } PerfTimer timer = new PerfTimer(); PerfTimer timer2 = new PerfTimer(); timer.start(); timer2.start(); for(TCPChannel client : clients) { for(int i = 0; i < numWrites; i++) { client.oldWrite(b); b.rewind(); } } mockHandler.setExpectTimeout(10000); long result2 = timer2.stop(); CalledMethod[] methods = mockHandler.expect(methodNames); long result = timer.stop(); //pick a method and verify right data came back for performance test //to make sure performance test is valid.... ByteBuffer actualBuf = (ByteBuffer)methods[0].getAllParams()[1]; String actual = HELPER.readString(actualBuf, actualBuf.remaining()); assertEquals(payload, actual); log.info("payload="+actual); long readWriteTime = result/size; log.info("total write time ="+result2); log.info("total write/read time ="+result); log.info("--time per write/read ="+readWriteTime); } }