package cloudeventbus.test; import cloudeventbus.Constants; import cloudeventbus.server.ClusterManager; import cloudeventbus.server.GlobalHub; import cloudeventbus.server.ServerChannelInitializer; import cloudeventbus.server.ServerConfig; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.channel.ChannelStateHandlerAdapter; import io.netty.channel.group.ChannelGroup; import io.netty.channel.group.DefaultChannelGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetSocketAddress; /** * @author Mike Heath <elcapo@gmail.com> */ // TODO Write clustering tests public class TestServer implements AutoCloseable { private final Logger LOGGER = LoggerFactory.getLogger(TestServer.class); public static final String SERVER_AGENT = "test-server-0.1"; private final ServerConfig serverConfig; private final ClusterManager clusterManager; private final GlobalHub globalHub; final ServerBootstrap bootstrap = new ServerBootstrap(); private final ChannelGroup channels = new DefaultChannelGroup(); @ChannelHandler.Sharable class ConnectionCounterHandler extends ChannelStateHandlerAdapter { @Override public void channelActive(ChannelHandlerContext context) throws Exception { context.channel().closeFuture().addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { LOGGER.debug("Channel closed"); } }); LOGGER.debug("Adding channel to TestServer group"); channels.add(context.channel()); super.channelActive(context); } @Override public void inboundBufferUpdated(ChannelHandlerContext ctx) throws Exception { ctx.fireInboundBufferUpdated(); } } private ConnectionCounterHandler connectionCounter = new ConnectionCounterHandler(); public TestServer() { this(SERVER_AGENT, Constants.DEFAULT_PORT); } public TestServer(String agent, int port) { this(new ServerConfig(port, agent, null, null, null)); } public TestServer(ServerConfig serverConfig) { this.serverConfig = serverConfig; final NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); globalHub = new GlobalHub(); clusterManager = new ClusterManager(serverConfig, globalHub, eventLoopGroup); bootstrap .group(eventLoopGroup, new NioEventLoopGroup()) .channel(NioServerSocketChannel.class) .localAddress(new InetSocketAddress(serverConfig.getPort())) .childHandler(new ServerChannelInitializer(serverConfig, clusterManager, globalHub) { @Override public void initChannel(SocketChannel channel) throws Exception { super.initChannel(channel); final ChannelPipeline pipeline = channel.pipeline(); pipeline.addFirst("counter", connectionCounter); } }) .bind().awaitUninterruptibly(); System.out.println("Server listening on port " + serverConfig.getPort()); } public int getConnectionCount() { return channels.size(); } @Override public void close() { bootstrap.shutdown(); } public long getId() { return serverConfig.getId(); } }