From cb666c116921cdfe13daa5274e4822486904da8d Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 15 Aug 2014 12:12:57 +0200 Subject: [PATCH] [#2771] Correctly handle constructing of EmbeddedChannel Motivation: Because of an incorrect logic in teh EmbeddedChannel constructor it is not possible to use EmbeddedChannel with a ChannelInitializer as constructor argument. This is because it adds the internal LastInboundHandler to its ChannelPipeline before it register itself to the EventLoop. Modifications: First register self to EventLoop before add LastInboundHandler to the ChannelPipeline. Result: It's now possible to use EmbeddedChannel with ChannelInitializer. --- .../channel/embedded/EmbeddedChannel.java | 2 +- .../channel/embedded/EmbeddedChannelTest.java | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 transport/src/test/java/io/netty/channel/embedded/EmbeddedChannelTest.java diff --git a/transport/src/main/java/io/netty/channel/embedded/EmbeddedChannel.java b/transport/src/main/java/io/netty/channel/embedded/EmbeddedChannel.java index 6fde4e7e06..96019ae381 100644 --- a/transport/src/main/java/io/netty/channel/embedded/EmbeddedChannel.java +++ b/transport/src/main/java/io/netty/channel/embedded/EmbeddedChannel.java @@ -88,8 +88,8 @@ public class EmbeddedChannel extends AbstractChannel { p.addLast(h); } - p.addLast(new LastInboundHandler()); loop.register(this); + p.addLast(new LastInboundHandler()); } @Override diff --git a/transport/src/test/java/io/netty/channel/embedded/EmbeddedChannelTest.java b/transport/src/test/java/io/netty/channel/embedded/EmbeddedChannelTest.java new file mode 100644 index 0000000000..68b801ec8b --- /dev/null +++ b/transport/src/test/java/io/netty/channel/embedded/EmbeddedChannelTest.java @@ -0,0 +1,55 @@ +/* + * 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.channel.embedded; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import org.junit.Assert; +import org.junit.Test; + +public class EmbeddedChannelTest { + + @Test + public void testConstructWithChannelInitializer() { + final Integer first = 1; + final Integer second = 2; + + final ChannelHandler handler = new ChannelInboundHandlerAdapter() { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + ctx.fireChannelRead(first); + ctx.fireChannelRead(second); + } + }; + EmbeddedChannel channel = new EmbeddedChannel(new ChannelInitializer() { + @Override + protected void initChannel(Channel ch) throws Exception { + ch.pipeline().addLast(handler); + } + }); + ChannelPipeline pipeline = channel.pipeline(); + Assert.assertSame(handler, pipeline.firstContext().handler()); + Assert.assertTrue(channel.writeInbound(3)); + Assert.assertTrue(channel.finish()); + Assert.assertSame(first, channel.readInbound()); + Assert.assertSame(second, channel.readInbound()); + Assert.assertNull(channel.readInbound()); + } +}