static void dissectControlResponse(final MutableDirectBuffer buffer, final int offset, final StringBuilder builder)
    {
        int encodedLength = dissectLogHeader(CONTEXT, CMD_OUT_RESPONSE, buffer, offset, builder);

        HEADER_DECODER.wrap(buffer, offset + encodedLength);
        encodedLength += MessageHeaderDecoder.ENCODED_LENGTH;

        CONTROL_RESPONSE_DECODER.wrap(
            buffer,
            offset + encodedLength,
            HEADER_DECODER.blockLength(),
            HEADER_DECODER.version());

        builder.append(": controlSessionId=").append(CONTROL_RESPONSE_DECODER.controlSessionId())
            .append(" correlationId=").append(CONTROL_RESPONSE_DECODER.correlationId())
            .append(" relevantId=").append(CONTROL_RESPONSE_DECODER.relevantId())
            .append(" code=").append(CONTROL_RESPONSE_DECODER.code())
            .append(" version=").append(CONTROL_RESPONSE_DECODER.version())
            .append(" errorMessage=");

        CONTROL_RESPONSE_DECODER.getErrorMessage(builder);
    }
@Test
    void controlResponse()
    {
        internalEncodeLogHeader(buffer, 0, 100, 100, () -> 1_250_000_000);
        final ControlResponseEncoder responseEncoder = new ControlResponseEncoder();
        responseEncoder.wrapAndApplyHeader(buffer, LOG_HEADER_LENGTH, headerEncoder)
            .controlSessionId(13)
            .correlationId(42)
            .relevantId(8)
            .code(NULL_VAL)
            .version(111)
            .errorMessage("the %ERR% msg");

        dissectControlResponse(buffer, 0, builder);

        assertEquals("[1.250000000] " + CONTEXT + ": " + CMD_OUT_RESPONSE.name() + " [100/100]: " +
            "controlSessionId=13" +
            " correlationId=42" +
            " relevantId=8" +
            " code=" + NULL_VAL +
            " version=111" +
            " errorMessage=the %ERR% msg",
            builder.toString());
    }