package org.jooby.netty.issues;
import static io.netty.channel.ChannelFutureListener.CLOSE;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import org.jooby.internal.netty.NettyRequest;
import org.jooby.internal.netty.NettyResponse;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.DefaultHttpHeaders;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.util.Attribute;
@RunWith(PowerMockRunner.class)
@PrepareForTest({NettyResponse.class, DefaultFullHttpResponse.class, Unpooled.class,
DefaultHttpHeaders.class })
public class Issue67 {
@SuppressWarnings("unchecked")
@Test
public void shouldCloseChannelIfHttpKeepAliveIsOff() throws Exception {
byte[] bytes = "Hello World!".getBytes();
new MockUnit(ChannelHandlerContext.class, Channel.class)
.expect(unit -> {
ByteBuf buff = unit.mock(ByteBuf.class);
expect(buff.readableBytes()).andReturn(bytes.length);
unit.mockStatic(Unpooled.class);
expect(Unpooled.wrappedBuffer(bytes)).andReturn(buff);
HttpHeaders headers = unit.mock(HttpHeaders.class);
expect(headers.set(isA(HttpHeaders.class))).andReturn(headers);
DefaultFullHttpResponse rsp = unit.mockConstructor(DefaultFullHttpResponse.class,
new Class[]{HttpVersion.class, HttpResponseStatus.class, ByteBuf.class },
HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buff);
expect(rsp.headers()).andReturn(headers);
ChannelFuture rspfuture = unit.mock(ChannelFuture.class);
expect(rspfuture.addListener(CLOSE)).andReturn(rspfuture);
Attribute<Boolean> async = unit.mock(Attribute.class);
expect(async.get()).andReturn(true);
Channel channel = unit.get(Channel.class);
expect(channel.attr(NettyRequest.ASYNC)).andReturn(async);
ChannelHandlerContext ctx = unit.get(ChannelHandlerContext.class);
expect(ctx.channel()).andReturn(channel);
expect(ctx.writeAndFlush(rsp)).andReturn(rspfuture);
})
.run(unit -> {
new NettyResponse(unit.get(ChannelHandlerContext.class), 8192,
false).send(bytes);
});
}
}