Fixing exception in StreamBufferingEncoderTest.
Motivation: NPE doesn't cause the tests to fail but should get fixed. Modifications: Modified the StreamBufferingEncoderTest to mock the ctx to return a promise. Result: Fixes #3905
This commit is contained in:
parent
0433c61674
commit
b5337abe2a
@ -15,6 +15,24 @@
|
|||||||
|
|
||||||
package io.netty.handler.codec.http2;
|
package io.netty.handler.codec.http2;
|
||||||
|
|
||||||
|
import static io.netty.buffer.Unpooled.EMPTY_BUFFER;
|
||||||
|
import static io.netty.handler.codec.http2.Http2CodecUtil.DEFAULT_MAX_FRAME_SIZE;
|
||||||
|
import static io.netty.handler.codec.http2.Http2CodecUtil.DEFAULT_PRIORITY_WEIGHT;
|
||||||
|
import static io.netty.handler.codec.http2.Http2CodecUtil.SMALLEST_MAX_CONCURRENT_STREAMS;
|
||||||
|
import static io.netty.handler.codec.http2.Http2Error.CANCEL;
|
||||||
|
import static io.netty.handler.codec.http2.Http2Stream.State.HALF_CLOSED_LOCAL;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Matchers.anyBoolean;
|
||||||
|
import static org.mockito.Matchers.anyInt;
|
||||||
|
import static org.mockito.Matchers.anyLong;
|
||||||
|
import static org.mockito.Matchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.buffer.UnpooledByteBufAllocator;
|
import io.netty.buffer.UnpooledByteBufAllocator;
|
||||||
@ -24,7 +42,10 @@ import io.netty.channel.ChannelHandlerContext;
|
|||||||
import io.netty.channel.ChannelPromise;
|
import io.netty.channel.ChannelPromise;
|
||||||
import io.netty.channel.DefaultChannelPromise;
|
import io.netty.channel.DefaultChannelPromise;
|
||||||
import io.netty.handler.codec.http2.StreamBufferingEncoder.GoAwayException;
|
import io.netty.handler.codec.http2.StreamBufferingEncoder.GoAwayException;
|
||||||
|
import io.netty.util.ReferenceCountUtil;
|
||||||
|
import io.netty.util.ReferenceCounted;
|
||||||
import io.netty.util.concurrent.ImmediateEventExecutor;
|
import io.netty.util.concurrent.ImmediateEventExecutor;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
@ -34,22 +55,6 @@ import org.mockito.invocation.InvocationOnMock;
|
|||||||
import org.mockito.stubbing.Answer;
|
import org.mockito.stubbing.Answer;
|
||||||
import org.mockito.verification.VerificationMode;
|
import org.mockito.verification.VerificationMode;
|
||||||
|
|
||||||
import static io.netty.handler.codec.http2.Http2CodecUtil.DEFAULT_MAX_FRAME_SIZE;
|
|
||||||
import static io.netty.handler.codec.http2.Http2CodecUtil.DEFAULT_PRIORITY_WEIGHT;
|
|
||||||
import static io.netty.handler.codec.http2.Http2CodecUtil.SMALLEST_MAX_CONCURRENT_STREAMS;
|
|
||||||
import static io.netty.handler.codec.http2.Http2Error.CANCEL;
|
|
||||||
import static io.netty.handler.codec.http2.Http2Stream.State.HALF_CLOSED_LOCAL;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.mockito.Matchers.any;
|
|
||||||
import static org.mockito.Matchers.anyInt;
|
|
||||||
import static org.mockito.Matchers.anyLong;
|
|
||||||
import static org.mockito.Matchers.eq;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.never;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link StreamBufferingEncoder}.
|
* Tests for {@link StreamBufferingEncoder}.
|
||||||
*/
|
*/
|
||||||
@ -83,6 +88,8 @@ public class StreamBufferingEncoderTest {
|
|||||||
when(writer.configuration()).thenReturn(configuration);
|
when(writer.configuration()).thenReturn(configuration);
|
||||||
when(configuration.frameSizePolicy()).thenReturn(frameSizePolicy);
|
when(configuration.frameSizePolicy()).thenReturn(frameSizePolicy);
|
||||||
when(frameSizePolicy.maxFrameSize()).thenReturn(DEFAULT_MAX_FRAME_SIZE);
|
when(frameSizePolicy.maxFrameSize()).thenReturn(DEFAULT_MAX_FRAME_SIZE);
|
||||||
|
when(writer.writeData(eq(ctx), anyInt(), any(ByteBuf.class), anyInt(), anyBoolean(),
|
||||||
|
eq(promise))).thenAnswer(successAnswer());
|
||||||
when(writer.writeRstStream(eq(ctx), anyInt(), anyLong(), eq(promise))).thenAnswer(
|
when(writer.writeRstStream(eq(ctx), anyInt(), anyLong(), eq(promise))).thenAnswer(
|
||||||
successAnswer());
|
successAnswer());
|
||||||
when(writer.writeGoAway(eq(ctx), anyInt(), anyLong(), any(ByteBuf.class),
|
when(writer.writeGoAway(eq(ctx), anyInt(), anyLong(), any(ByteBuf.class),
|
||||||
@ -102,10 +109,17 @@ public class StreamBufferingEncoderTest {
|
|||||||
// Set LifeCycleManager on encoder and decoder
|
// Set LifeCycleManager on encoder and decoder
|
||||||
when(ctx.channel()).thenReturn(channel);
|
when(ctx.channel()).thenReturn(channel);
|
||||||
when(ctx.alloc()).thenReturn(UnpooledByteBufAllocator.DEFAULT);
|
when(ctx.alloc()).thenReturn(UnpooledByteBufAllocator.DEFAULT);
|
||||||
|
when(ctx.newPromise()).thenReturn(promise);
|
||||||
when(channel.isActive()).thenReturn(false);
|
when(channel.isActive()).thenReturn(false);
|
||||||
handler.handlerAdded(ctx);
|
handler.handlerAdded(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void teardown() {
|
||||||
|
// Close and release any buffered frames.
|
||||||
|
encoder.close();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void multipleWritesToActiveStream() {
|
public void multipleWritesToActiveStream() {
|
||||||
encoder.writeSettingsAck(ctx, promise);
|
encoder.writeSettingsAck(ctx, promise);
|
||||||
@ -163,9 +177,9 @@ public class StreamBufferingEncoderTest {
|
|||||||
assertEquals(1, connection.numActiveStreams());
|
assertEquals(1, connection.numActiveStreams());
|
||||||
assertEquals(1, encoder.numBufferedStreams());
|
assertEquals(1, encoder.numBufferedStreams());
|
||||||
|
|
||||||
encoder.writeData(ctx, 3, Unpooled.buffer(0), 0, false, promise);
|
encoder.writeData(ctx, 3, EMPTY_BUFFER, 0, false, promise);
|
||||||
writeVerifyWriteHeaders(times(1), 3, promise);
|
writeVerifyWriteHeaders(times(1), 3, promise);
|
||||||
encoder.writeData(ctx, 5, Unpooled.buffer(0), 0, false, promise);
|
encoder.writeData(ctx, 5, EMPTY_BUFFER, 0, false, promise);
|
||||||
verify(writer, never())
|
verify(writer, never())
|
||||||
.writeData(eq(ctx), eq(5), any(ByteBuf.class), eq(0), eq(false), eq(promise));
|
.writeData(eq(ctx), eq(5), any(ByteBuf.class), eq(0), eq(false), eq(promise));
|
||||||
}
|
}
|
||||||
@ -230,8 +244,7 @@ public class StreamBufferingEncoderTest {
|
|||||||
encoderWriteHeaders(3, promise);
|
encoderWriteHeaders(3, promise);
|
||||||
assertEquals(1, encoder.numBufferedStreams());
|
assertEquals(1, encoder.numBufferedStreams());
|
||||||
|
|
||||||
ByteBuf empty = Unpooled.buffer(0);
|
encoder.writeData(ctx, 3, EMPTY_BUFFER, 0, true, promise);
|
||||||
encoder.writeData(ctx, 3, empty, 0, true, promise);
|
|
||||||
|
|
||||||
assertEquals(0, connection.numActiveStreams());
|
assertEquals(0, connection.numActiveStreams());
|
||||||
assertEquals(1, encoder.numBufferedStreams());
|
assertEquals(1, encoder.numBufferedStreams());
|
||||||
@ -428,10 +441,8 @@ public class StreamBufferingEncoderTest {
|
|||||||
return new Answer<ChannelFuture>() {
|
return new Answer<ChannelFuture>() {
|
||||||
@Override
|
@Override
|
||||||
public ChannelFuture answer(InvocationOnMock invocation) throws Throwable {
|
public ChannelFuture answer(InvocationOnMock invocation) throws Throwable {
|
||||||
for (Object a: invocation.getArguments()) {
|
for (Object a : invocation.getArguments()) {
|
||||||
if (a instanceof ByteBuf) {
|
ReferenceCountUtil.safeRelease(a);
|
||||||
((ByteBuf) a).release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ChannelPromise future =
|
ChannelPromise future =
|
||||||
|
Loading…
Reference in New Issue
Block a user