|
Java example source code file (Http2ConnectionHandlerTest.java)
The Http2ConnectionHandlerTest.java Java example source code/* * Copyright 2014 The Netty Project * * The Netty Project licenses this file to you under the Apache License, version 2.0 (the * "License"); you may not use this file except in compliance with the License. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package io.netty.handler.codec.http2; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.buffer.UnpooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPromise; import io.netty.channel.DefaultChannelPromise; import io.netty.util.ReferenceCountUtil; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.GenericFutureListener; import io.netty.util.concurrent.Promise; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import java.util.List; import static io.netty.buffer.Unpooled.copiedBuffer; import static io.netty.handler.codec.http2.Http2CodecUtil.connectionPrefaceBuf; import static io.netty.handler.codec.http2.Http2Error.PROTOCOL_ERROR; import static io.netty.handler.codec.http2.Http2Error.STREAM_CLOSED; import static io.netty.handler.codec.http2.Http2Stream.State.CLOSED; import static io.netty.handler.codec.http2.Http2Stream.State.IDLE; import static io.netty.util.CharsetUtil.UTF_8; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; 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.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; /** * Tests for {@link Http2ConnectionHandler} */ public class Http2ConnectionHandlerTest { private static final int STREAM_ID = 1; private static final int NON_EXISTANT_STREAM_ID = 13; private Http2ConnectionHandler handler; private ChannelPromise promise; @Mock private Http2Connection connection; @Mock private Http2RemoteFlowController remoteFlow; @Mock private Http2LocalFlowController localFlow; @Mock private Http2Connection.Endpoint<Http2RemoteFlowController> remote; @Mock private Http2RemoteFlowController remoteFlowController; @Mock private Http2Connection.Endpoint<Http2LocalFlowController> local; @Mock private Http2LocalFlowController localFlowController; @Mock private ChannelHandlerContext ctx; @Mock private EventExecutor executor; @Mock private Channel channel; @Mock private ChannelFuture future; @Mock private Http2Stream stream; @Mock private Http2ConnectionDecoder decoder; @Mock private Http2ConnectionEncoder encoder; @Mock private Http2FrameWriter frameWriter; @SuppressWarnings("unchecked") @Before public void setup() throws Exception { MockitoAnnotations.initMocks(this); promise = new DefaultChannelPromise(channel); Throwable fakeException = new RuntimeException("Fake exception"); when(encoder.connection()).thenReturn(connection); when(decoder.connection()).thenReturn(connection); when(encoder.frameWriter()).thenReturn(frameWriter); when(encoder.flowController()).thenReturn(remoteFlow); when(decoder.flowController()).thenReturn(localFlow); doAnswer(new Answer<ChannelFuture>() { @Override public ChannelFuture answer(InvocationOnMock invocation) throws Throwable { ByteBuf buf = invocation.getArgumentAt(3, ByteBuf.class); buf.release(); return future; } }).when(frameWriter).writeGoAway( any(ChannelHandlerContext.class), anyInt(), anyInt(), any(ByteBuf.class), any(ChannelPromise.class)); doAnswer(new Answer<ChannelFuture>() { @Override public ChannelFuture answer(InvocationOnMock invocation) throws Throwable { Object o = invocation.getArguments()[0]; if (o instanceof ChannelFutureListener) { ((ChannelFutureListener) o).operationComplete(future); } return future; } }).when(future).addListener(any(GenericFutureListener.class)); when(future.cause()).thenReturn(fakeException); when(future.channel()).thenReturn(channel); when(channel.isActive()).thenReturn(true); when(connection.remote()).thenReturn(remote); when(remote.flowController()).thenReturn(remoteFlowController); when(connection.local()).thenReturn(local); when(local.flowController()).thenReturn(localFlowController); doAnswer(new Answer<Http2Stream>() { @Override public Http2Stream answer(InvocationOnMock in) throws Throwable { Http2StreamVisitor visitor = in.getArgumentAt(0, Http2StreamVisitor.class); if (!visitor.visit(stream)) { return stream; } return null; } }).when(connection).forEachActiveStream(any(Http2StreamVisitor.class)); when(connection.stream(NON_EXISTANT_STREAM_ID)).thenReturn(null); when(connection.numActiveStreams()).thenReturn(1); when(connection.stream(STREAM_ID)).thenReturn(stream); when(stream.open(anyBoolean())).thenReturn(stream); when(encoder.writeSettings(eq(ctx), any(Http2Settings.class), eq(promise))).thenReturn(future); when(ctx.alloc()).thenReturn(UnpooledByteBufAllocator.DEFAULT); when(ctx.channel()).thenReturn(channel); when(ctx.newSucceededFuture()).thenReturn(future); when(ctx.newPromise()).thenReturn(promise); when(ctx.write(any())).thenReturn(future); when(ctx.executor()).thenReturn(executor); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock in) throws Throwable { Object msg = in.getArgumentAt(0, Object.class); ReferenceCountUtil.release(msg); return null; } }).when(ctx).fireChannelRead(any()); } private Http2ConnectionHandler newHandler() throws Exception { Http2ConnectionHandler handler = new Http2ConnectionHandlerBuilder().codec(decoder, encoder).build(); handler.handlerAdded(ctx); return handler; } @After public void tearDown() throws Exception { if (handler != null) { handler.handlerRemoved(ctx); } } @Test public void clientShouldSendClientPrefaceStringWhenActive() throws Exception { when(connection.isServer()).thenReturn(false); when(channel.isActive()).thenReturn(false); handler = newHandler(); when(channel.isActive()).thenReturn(true); handler.channelActive(ctx); verify(ctx).write(eq(connectionPrefaceBuf())); } @Test public void serverShouldNotSendClientPrefaceStringWhenActive() throws Exception { when(connection.isServer()).thenReturn(true); when(channel.isActive()).thenReturn(false); handler = newHandler(); when(channel.isActive()).thenReturn(true); handler.channelActive(ctx); verify(ctx, never()).write(eq(connectionPrefaceBuf())); } @Test public void serverReceivingInvalidClientPrefaceStringShouldHandleException() throws Exception { when(connection.isServer()).thenReturn(true); handler = newHandler(); handler.channelRead(ctx, copiedBuffer("BAD_PREFACE", UTF_8)); ArgumentCaptor<ByteBuf> captor = ArgumentCaptor.forClass(ByteBuf.class); verify(frameWriter).writeGoAway(eq(ctx), eq(0), eq(PROTOCOL_ERROR.code()), captor.capture(), eq(promise)); assertEquals(0, captor.getValue().refCnt()); } @Test public void serverReceivingClientPrefaceStringFollowedByNonSettingsShouldHandleException() throws Exception { when(connection.isServer()).thenReturn(true); handler = newHandler(); // Create a connection preface followed by a bunch of zeros (i.e. not a settings frame). ByteBuf buf = Unpooled.buffer().writeBytes(connectionPrefaceBuf()).writeZero(10); handler.channelRead(ctx, buf); ArgumentCaptor<ByteBuf> captor = ArgumentCaptor.forClass(ByteBuf.class); verify(frameWriter, atLeastOnce()).writeGoAway(eq(ctx), eq(0), eq(PROTOCOL_ERROR.code()), captor.capture(), eq(promise)); assertEquals(0, captor.getValue().refCnt()); } @Test public void serverReceivingValidClientPrefaceStringShouldContinueReadingFrames() throws Exception { when(connection.isServer()).thenReturn(true); handler = newHandler(); ByteBuf prefacePlusSome = addSettingsHeader(Unpooled.buffer().writeBytes(connectionPrefaceBuf())); handler.channelRead(ctx, prefacePlusSome); verify(decoder, atLeastOnce()).decodeFrame(any(ChannelHandlerContext.class), any(ByteBuf.class), Matchers.<List Other Java examples (source code examples)Here is a short list of links related to this Java Http2ConnectionHandlerTest.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.