### Question:
NettyServerHandler extends AbstractNettyHandler { @Override public void handleProtocolNegotiationCompleted( Attributes attrs, InternalChannelz.Security securityInfo) { negotiationAttributes = attrs; this.securityInfo = securityInfo; } private  NettyServerHandler(
      ChannelPromise channelUnused,
      final Http2Connection connection,
      ServerTransportListener transportListener,
      List<ServerStreamTracer.Factory> streamTracerFactories,
      TransportTracer transportTracer,
      Http2ConnectionDecoder decoder,
      Http2ConnectionEncoder encoder,
      Http2Settings settings,
      int maxMessageSize,
      long keepAliveTimeInNanos,
      long keepAliveTimeoutInNanos,
      long maxConnectionIdleInNanos,
      long maxConnectionAgeInNanos,
      long maxConnectionAgeGraceInNanos,
      final KeepAliveEnforcer keepAliveEnforcer); @Override void handlerAdded(final ChannelHandlerContext ctx); @Override void handleProtocolNegotiationCompleted(
      Attributes attrs, InternalChannelz.Security securityInfo); @Override void channelInactive(ChannelHandlerContext ctx); @Override void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise);  }### Answer:
@Test public void transportReadyDelayedUntilConnectionPreface() throws Exception { initChannel(new GrpcHttp2ServerHeadersDecoder(GrpcUtil.DEFAULT_MAX_HEADER_LIST_SIZE)); handler().handleProtocolNegotiationCompleted(Attributes.EMPTY, null); verify(transportListener, never()).transportReady(any(Attributes.class)); channelRead(Http2CodecUtil.connectionPrefaceBuf()); channelRead(serializeSettings(new Http2Settings())); verify(transportListener).transportReady(any(Attributes.class)); }