static void dissectUntetheredSubscriptionStateChange(
        final MutableDirectBuffer buffer, final int offset, final StringBuilder builder)
    {
        int absoluteOffset = offset;
        absoluteOffset += dissectLogHeader(
            CONTEXT, UNTETHERED_SUBSCRIPTION_STATE_CHANGE, buffer, absoluteOffset, builder);

        builder.append(": subscriptionId=").append(buffer.getLong(absoluteOffset, LITTLE_ENDIAN));
        absoluteOffset += SIZE_OF_LONG;

        builder.append(" streamId=").append(buffer.getInt(absoluteOffset, LITTLE_ENDIAN));
        absoluteOffset += SIZE_OF_INT;

        builder.append(" sessionId=").append(buffer.getInt(absoluteOffset, LITTLE_ENDIAN));
        absoluteOffset += SIZE_OF_INT;

        builder.append(" ");
        buffer.getStringAscii(absoluteOffset, builder);
    }
@Test
    void dissectUntetheredSubscriptionStateChange()
    {
        final int offset = 12;
        internalEncodeLogHeader(buffer, offset, 22, 88, () -> 1_500_000_000L);
        buffer.putLong(offset + LOG_HEADER_LENGTH, 88, LITTLE_ENDIAN);
        buffer.putInt(offset + LOG_HEADER_LENGTH + SIZE_OF_LONG, 123, LITTLE_ENDIAN);
        buffer.putInt(offset + LOG_HEADER_LENGTH + SIZE_OF_LONG + SIZE_OF_INT, 777, LITTLE_ENDIAN);
        buffer.putStringAscii(offset + LOG_HEADER_LENGTH + SIZE_OF_LONG + 2 * SIZE_OF_INT, "state changed");

        DriverEventDissector.dissectUntetheredSubscriptionStateChange(buffer, offset, builder);

        assertEquals("[1.500000000] " + CONTEXT + ": " + UNTETHERED_SUBSCRIPTION_STATE_CHANGE.name() +
            " [22/88]: subscriptionId=88 streamId=123 sessionId=777 state changed",
            builder.toString());
    }