diff --git a/pbj-core/pbj-runtime/src/main/java/com/hedera/pbj/runtime/io/buffer/DirectBufferedData.java b/pbj-core/pbj-runtime/src/main/java/com/hedera/pbj/runtime/io/buffer/DirectBufferedData.java index 205c778b..39672e81 100644 --- a/pbj-core/pbj-runtime/src/main/java/com/hedera/pbj/runtime/io/buffer/DirectBufferedData.java +++ b/pbj-core/pbj-runtime/src/main/java/com/hedera/pbj/runtime/io/buffer/DirectBufferedData.java @@ -159,6 +159,7 @@ public long readBytes(@NonNull final ByteBuffer dst) { @Override public Bytes readBytes(final int len) { validateLen(len); + if (len == 0) return Bytes.EMPTY; final int pos = buffer.position(); validateCanRead(pos, len); final byte[] res = new byte[len]; diff --git a/pbj-core/pbj-runtime/src/test/java/com/hedera/pbj/runtime/io/buffer/BufferedDataTestBase.java b/pbj-core/pbj-runtime/src/test/java/com/hedera/pbj/runtime/io/buffer/BufferedDataTestBase.java index 6e375c1f..2ee0859d 100644 --- a/pbj-core/pbj-runtime/src/test/java/com/hedera/pbj/runtime/io/buffer/BufferedDataTestBase.java +++ b/pbj-core/pbj-runtime/src/test/java/com/hedera/pbj/runtime/io/buffer/BufferedDataTestBase.java @@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; import com.hedera.pbj.runtime.io.ReadableSequentialData; import com.hedera.pbj.runtime.io.ReadableSequentialTestBase; @@ -293,6 +294,15 @@ void readBytesCopies() { assertArrayEquals(bytesOrig, readBytes.toByteArray()); } + @Test + void readBytesReturnsConstantEmptyForZeroLength() { + byte[] bytes = new byte[] {1, 2, 3, 4, 5}; + final var buf = wrap(bytes); + final Bytes readBytes = buf.readBytes(0); + // NOTE: assertSame and not assertEquals, by design: + assertSame(Bytes.EMPTY, readBytes); + } + @Test void getBytesLeavesPositionBufferedData() { final var buf = wrap(new byte[] {0, 1, 2, 3, 4, 5, 6, 7});