@Test
 public void testLateRegisterSuccess() throws Exception {
   TestEventLoopGroup group = new TestEventLoopGroup();
   try {
     ServerBootstrap bootstrap = new ServerBootstrap();
     bootstrap.group(group);
     bootstrap.channel(LocalServerChannel.class);
     bootstrap.childHandler(new DummyHandler());
     bootstrap.localAddress(new LocalAddress("1"));
     ChannelFuture future = bootstrap.bind();
     assertFalse(future.isDone());
     group.promise.setSuccess();
     final BlockingQueue<Boolean> queue = new LinkedBlockingQueue<Boolean>();
     future.addListener(
         new ChannelFutureListener() {
           @Override
           public void operationComplete(ChannelFuture future) throws Exception {
             queue.add(future.channel().eventLoop().inEventLoop(Thread.currentThread()));
             queue.add(future.isSuccess());
           }
         });
     assertTrue(queue.take());
     assertTrue(queue.take());
   } finally {
     group.shutdownGracefully();
     group.terminationFuture().sync();
   }
 }
  @Test
  public void testLateRegisterSuccessBindFailed() throws Exception {
    TestEventLoopGroup group = new TestEventLoopGroup();
    try {
      ServerBootstrap bootstrap = new ServerBootstrap();
      bootstrap.group(group);
      bootstrap.channelFactory(
          new ChannelFactory<ServerChannel>() {
            @Override
            public ServerChannel newChannel() {
              return new LocalServerChannel() {
                @Override
                public ChannelFuture bind(SocketAddress localAddress) {
                  // Close the Channel to emulate what NIO and others impl do on bind failure
                  // See https://github.com/netty/netty/issues/2586
                  close();
                  return newFailedFuture(new SocketException());
                }

                @Override
                public ChannelFuture bind(SocketAddress localAddress, ChannelPromise promise) {
                  // Close the Channel to emulate what NIO and others impl do on bind failure
                  // See https://github.com/netty/netty/issues/2586
                  close();
                  return promise.setFailure(new SocketException());
                }
              };
            }
          });
      bootstrap.childHandler(new DummyHandler());
      bootstrap.localAddress(new LocalAddress("1"));
      ChannelFuture future = bootstrap.bind();
      assertFalse(future.isDone());
      group.promise.setSuccess();
      final BlockingQueue<Boolean> queue = new LinkedBlockingQueue<Boolean>();
      future.addListener(
          new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
              queue.add(future.channel().eventLoop().inEventLoop(Thread.currentThread()));
              queue.add(future.isSuccess());
            }
          });
      assertTrue(queue.take());
      assertFalse(queue.take());
    } finally {
      group.shutdownGracefully();
      group.terminationFuture().sync();
    }
  }