package org.corfudb.runtime.clients; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.util.Attribute; import io.netty.util.AttributeKey; import io.netty.util.concurrent.EventExecutor; import lombok.extern.slf4j.Slf4j; import org.corfudb.protocols.wireprotocol.CorfuMsg; import java.net.SocketAddress; import java.util.concurrent.CompletableFuture; /** * Created by mwei on 7/6/16. */ @Slf4j public class TestChannelContext implements ChannelHandlerContext { @FunctionalInterface interface HandleMessageFunction { void handleMessage(Object o); } HandleMessageFunction hmf; public TestChannelContext(HandleMessageFunction hmf) { this.hmf = hmf; } void sendMessageAsync(Object o, Object orig) { CompletableFuture.runAsync(() -> { try { Object origCapture = orig; //for debugging if (o instanceof ByteBuf) { CorfuMsg m = CorfuMsg.deserialize((ByteBuf) o); hmf.handleMessage(m); ((ByteBuf) o).release(); } } catch (Exception e) { log.warn("Error during deserialization", e); } }); } @Override public Channel channel() { return null; } @Override public EventExecutor executor() { return null; } @Override public String name() { return null; } @Override public ChannelHandler handler() { return null; } @Override public boolean isRemoved() { return false; } @Override public ChannelHandlerContext fireChannelRegistered() { return null; } @Override public ChannelHandlerContext fireChannelUnregistered() { return null; } @Override public ChannelHandlerContext fireChannelActive() { return null; } @Override public ChannelHandlerContext fireChannelInactive() { return null; } @Override public ChannelHandlerContext fireExceptionCaught(Throwable throwable) { return null; } @Override public ChannelHandlerContext fireUserEventTriggered(Object o) { return null; } @Override public ChannelHandlerContext fireChannelRead(Object o) { return null; } @Override public ChannelHandlerContext fireChannelReadComplete() { return null; } @Override public ChannelHandlerContext fireChannelWritabilityChanged() { return null; } @Override public ChannelFuture bind(SocketAddress socketAddress) { return null; } @Override public ChannelFuture connect(SocketAddress socketAddress) { return null; } @Override public ChannelFuture connect(SocketAddress socketAddress, SocketAddress socketAddress1) { return null; } @Override public ChannelFuture disconnect() { return null; } @Override public ChannelFuture close() { return null; } @Override public ChannelFuture deregister() { return null; } @Override public ChannelFuture bind(SocketAddress socketAddress, ChannelPromise channelPromise) { return null; } @Override public ChannelFuture connect(SocketAddress socketAddress, ChannelPromise channelPromise) { return null; } @Override public ChannelFuture connect(SocketAddress socketAddress, SocketAddress socketAddress1, ChannelPromise channelPromise) { return null; } @Override public ChannelFuture disconnect(ChannelPromise channelPromise) { return null; } @Override public ChannelFuture close(ChannelPromise channelPromise) { return null; } @Override public ChannelFuture deregister(ChannelPromise channelPromise) { return null; } @Override public ChannelHandlerContext read() { return null; } @Override public ChannelFuture write(Object o) { ByteBuf b = simulateSerialization(o); sendMessageAsync(b,o); return null; } @Override public ChannelFuture write(Object o, ChannelPromise channelPromise) { ByteBuf b = simulateSerialization(o); sendMessageAsync(b,o); return null; } @Override public ChannelHandlerContext flush() { return null; } @Override public ChannelFuture writeAndFlush(Object o, ChannelPromise channelPromise) { ByteBuf b = simulateSerialization(o); sendMessageAsync(b,o); return null; } @Override public ChannelFuture writeAndFlush(Object o) { ByteBuf b = simulateSerialization(o); sendMessageAsync(b,o); return null; } public ByteBuf simulateSerialization(Object message) { if (message instanceof CorfuMsg) { /* simulate serialization/deserialization */ ByteBuf oBuf = Unpooled.buffer(); ((CorfuMsg) message).serialize(oBuf); oBuf.resetReaderIndex(); return oBuf; } throw new UnsupportedOperationException("Test framework does not support serialization of object type " + message.getClass()); } @Override public ChannelPipeline pipeline() { return null; } @Override public ByteBufAllocator alloc() { return null; } @Override public ChannelPromise newPromise() { return null; } @Override public ChannelProgressivePromise newProgressivePromise() { return null; } @Override public ChannelFuture newSucceededFuture() { return null; } @Override public ChannelFuture newFailedFuture(Throwable throwable) { return null; } @Override public ChannelPromise voidPromise() { return null; } @Override public <T> Attribute<T> attr(AttributeKey<T> attributeKey) { return null; } /** * @param attributeKey * @deprecated */ @Override public <T> boolean hasAttr(AttributeKey<T> attributeKey) { return false; } }