package org.webpieces.nio.test.udp;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import org.webpieces.util.logging.Logger;
import org.webpieces.nio.api.channels.DatagramChannel;
import org.webpieces.nio.api.deprecated.ChannelManagerOld;
import org.webpieces.nio.api.deprecated.ChannelService;
import org.webpieces.nio.api.deprecated.ChannelServiceFactory;
import org.webpieces.nio.api.handlers.DatagramListener;
import org.webpieces.nio.api.libs.BufferFactory;
import org.webpieces.nio.api.libs.BufferHelper;
import org.webpieces.nio.api.libs.FactoryCreator;
import org.webpieces.nio.api.testutil.CloneByteBuffer;
import biz.xsoftware.mock.CalledMethod;
import biz.xsoftware.mock.MockObject;
import biz.xsoftware.mock.testcase.MockTestCase;
/**
*/
public class TestDatagramChannel extends MockTestCase
{
private static final BufferHelper HELPER = ChannelServiceFactory.bufferHelper(null);
private static final Logger log = LoggerFactory.getLogger(TestDatagramChannel.class);
private ChannelService svc;
private DatagramChannel client;
private DatagramChannel server;
private MockObject clientHandler;
private MockObject svrHandler;
private BufferFactory bufFactory;
private DatagramChannel client2;
public TestDatagramChannel(String name) {
super(name);
}
/*
* @see TestCase#setUp()
*/
protected void setUpImpl() throws Exception
{
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> props2 = new HashMap<String, Object>();
props2.put(ChannelServiceFactory.KEY_IMPLEMENTATION_CLASS, ChannelServiceFactory.VAL_EXCEPTION_CHANNEL_MGR);
props2.put(ChannelServiceFactory.KEY_CHILD_CHANNELMGR_FACTORY, basic);
ChannelServiceFactory factory = ChannelServiceFactory.createFactory(props2);
Map<String, Object> map = new HashMap<String, Object>();
map.put(ChannelManagerOld.KEY_BUFFER_FACTORY, bufFactory);
map.put(ChannelManagerOld.KEY_ID, "server+client");
svc = factory.createChannelManager(map);
svc.start();
client = svc.createDatagramChannel("client", 100);
client2 = svc.createDatagramChannel("client2", 100);
server = svc.createDatagramChannel("server", 100);
clientHandler = createMock(DatagramListener.class);
svrHandler = createMock(DatagramListener.class);
clientHandler.setDefaultBehavior("incomingData", new CloneByteBuffer());
svrHandler.setDefaultBehavior("incomingData", new CloneByteBuffer());
}
/*
* @see TestCase#tearDown()
*/
protected void tearDownImpl() throws Exception
{
svc.stop();
client.close();
client2.close();
server.close();
clientHandler.expect(MockObject.NONE);
svrHandler.expect(MockObject.NONE);
}
public void testBasic() throws IOException, InterruptedException {
client.registerForReads((DatagramListener)clientHandler);
server.registerForReads((DatagramListener)svrHandler);
InetSocketAddress anyPort = new InetSocketAddress(0);
client.bind(anyPort);
client2.bind(anyPort);
server.bind(anyPort);
InetSocketAddress clientAddr = client.getLocalAddress();
InetSocketAddress client2Addr = client2.getLocalAddress();
InetSocketAddress svrAddr = server.getLocalAddress();
log.info("client="+clientAddr);
log.info("client2="+client2Addr);
log.info("server="+svrAddr);
InetAddress localHost = InetAddress.getLocalHost();
InetSocketAddress serverAddr = new InetSocketAddress(localHost, svrAddr.getPort());
String payload = "payload";
ByteBuffer b = ByteBuffer.allocate(100);
HELPER.putString(b, payload);
HELPER.doneFillingBuffer(b);
client.oldWrite(serverAddr, b);
verifyPacket(clientAddr, localHost, payload);
b.rewind();
client2.oldWrite(serverAddr, b);
verifyPacket(client2Addr, localHost, payload);
}
/**
* @param clientAddr
* @param localHost
* @param payload
*/
private void verifyPacket(InetSocketAddress clientAddr, InetAddress localHost, String payload)
{
CalledMethod m = svrHandler.expect("incomingData");
InetSocketAddress remoteAddr = (InetSocketAddress)m.getAllParams()[1];
ByteBuffer buf1 = (ByteBuffer)m.getAllParams()[2];
assertEquals(localHost, remoteAddr.getAddress());
assertEquals(clientAddr.getPort(), remoteAddr.getPort());
String actual = HELPER.readString(buf1, buf1.remaining());
//log.info("payload='"+payload+"' act='"+actual+"'");
assertEquals(payload, actual);
}
}