Http2FrameCodec extends Http2ConnectionHandler { DefaultHttp2FrameStream newStream() { return new DefaultHttp2FrameStream(); } Http2FrameCodec(Http2ConnectionEncoder encoder, Http2ConnectionDecoder decoder, Http2Settings initialSettings); @Override final void handlerAdded(ChannelHandlerContext ctx); @Override final void userEventTriggered(ChannelHandlerContext ctx, Object evt); @Override void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise);  }
@Test(timeout = 1000) public void newOutboundStream() { final Http2FrameStream stream = frameCodec.newStream(); assertNotNull(stream); assertFalse(isStreamIdValid(stream.id())); final Promise<Void> listenerExecuted = new DefaultPromise<Void>(GlobalEventExecutor.INSTANCE); channel.writeAndFlush(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers(), false).stream(stream)) .addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { assertTrue(future.isSuccess()); assertTrue(isStreamIdValid(stream.id())); listenerExecuted.setSuccess(null); } } ); ByteBuf data = Unpooled.buffer().writeZero(100); ChannelFuture f = channel.writeAndFlush(new DefaultHttp2DataFrame(data).stream(stream)); assertTrue(f.isSuccess()); listenerExecuted.syncUninterruptibly(); assertTrue(listenerExecuted.isSuccess()); }
@Test public void newOutboundStreamsShouldBeBuffered() throws Exception { setUp(Http2FrameCodecBuilder.forServer().encoderEnforceMaxConcurrentStreams(true), new Http2Settings().maxConcurrentStreams(1)); Http2FrameStream stream1 = frameCodec.newStream(); Http2FrameStream stream2 = frameCodec.newStream(); ChannelPromise promise1 = channel.newPromise(); ChannelPromise promise2 = channel.newPromise(); channel.writeAndFlush(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers()).stream(stream1), promise1); channel.writeAndFlush(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers()).stream(stream2), promise2); assertTrue(isStreamIdValid(stream1.id())); channel.runPendingTasks(); assertTrue(isStreamIdValid(stream2.id())); assertTrue(promise1.syncUninterruptibly().isSuccess()); assertFalse(promise2.isDone()); frameListener.onSettingsRead(http2HandlerCtx, new Http2Settings().maxConcurrentStreams(2)); channel.flush(); assertTrue(promise2.syncUninterruptibly().isSuccess()); }
@Test public void streamIdentifiersExhausted() throws Http2Exception { int maxServerStreamId = Integer.MAX_VALUE - 1; assertNotNull(frameCodec.connection().local().createStream(maxServerStreamId, false)); Http2FrameStream stream = frameCodec.newStream(); assertNotNull(stream); ChannelPromise writePromise = channel.newPromise(); channel.writeAndFlush(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers()).stream(stream), writePromise); assertThat(writePromise.cause(), instanceOf(Http2NoMoreStreamIdsException.class)); }
@Test public void streamShouldBeOpenInListener() { final Http2FrameStream stream2 = frameCodec.newStream(); assertEquals(State.IDLE, stream2.state()); final AtomicBoolean listenerExecuted = new AtomicBoolean(); channel.writeAndFlush(new DefaultHttp2HeadersFrame(new DefaultHttp2Headers()).stream(stream2)) .addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { assertTrue(future.isSuccess()); assertEquals(State.OPEN, stream2.state()); listenerExecuted.set(true); } }); assertTrue(listenerExecuted.get()); }