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());
}
}