package io.datakernel.eventloop; import io.datakernel.async.ConnectCallback; import io.datakernel.async.IgnoreCompletionCallback; import io.datakernel.bytebuf.ByteBuf; import io.datakernel.bytebuf.ByteBufStrings; import io.datakernel.eventloop.AsyncTcpSocket.EventHandler; import io.datakernel.net.SocketSettings; import org.junit.Test; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SocketChannel; import static io.datakernel.bytebuf.ByteBufPool.*; import static io.datakernel.eventloop.FatalErrorHandlers.rethrowOnAnyError; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class AbstractServerTest { @Test public void testTimeouts() throws IOException { final Eventloop eventloop = Eventloop.create().withFatalErrorHandler(rethrowOnAnyError()); InetSocketAddress address = new InetSocketAddress(5588); final SocketSettings settings = SocketSettings.create().withImplReadTimeout(100000L).withImplWriteTimeout(100000L); SimpleServer.SocketHandlerProvider socketHandlerProvider = new SimpleServer.SocketHandlerProvider() { @Override public EventHandler createSocketHandler(final AsyncTcpSocket asyncTcpSocket) { return new EventHandler() { @Override public void onRegistered() { asyncTcpSocket.read(); } @Override public void onRead(final ByteBuf buf) { eventloop.schedule(eventloop.currentTimeMillis() + 5, new Runnable() { @Override public void run() { asyncTcpSocket.write(buf); } }); } @Override public void onReadEndOfStream() { asyncTcpSocket.close(); } @Override public void onWrite() { asyncTcpSocket.close(); } @Override public void onClosedWithError(Exception e) { asyncTcpSocket.close(); } }; } }; final SimpleServer server = SimpleServer.create(eventloop, socketHandlerProvider) .withSocketSettings(settings) .withListenAddress(address); server.listen(); eventloop.connect(address, new ConnectCallback() { @Override public void onConnect(SocketChannel socketChannel) { final AsyncTcpSocketImpl asyncTcpSocket = AsyncTcpSocketImpl.wrapChannel(eventloop, socketChannel, settings); asyncTcpSocket.setEventHandler(new EventHandler() { @Override public void onRegistered() { asyncTcpSocket.write(ByteBufStrings.wrapAscii("Hello!")); } @Override public void onRead(ByteBuf buf) { buf.recycle(); asyncTcpSocket.close(); server.close(IgnoreCompletionCallback.create()); } @Override public void onReadEndOfStream() { asyncTcpSocket.close(); } @Override public void onWrite() { asyncTcpSocket.read(); } @Override public void onClosedWithError(Exception e) { asyncTcpSocket.close(); server.close(IgnoreCompletionCallback.create()); } }); asyncTcpSocket.register(); } @Override public void onException(Exception e) { e.printStackTrace(); fail(); } }); eventloop.run(); assertEquals(getPoolItemsString(), getCreatedItems(), getPoolItems()); } }