From 1a515475a69d42bd4a311a5e38a655631848647a Mon Sep 17 00:00:00 2001 From: at055612 Date: Thu, 12 Nov 2020 09:06:43 +0000 Subject: [PATCH] gh-169 Fix AbsatractByteBufferProxy.compareBuff, improve ComparatorTest --- .../java/org/lmdbjava/ByteBufferProxy.java | 4 +-- .../java/org/lmdbjava/ComparatorTest.java | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/lmdbjava/ByteBufferProxy.java b/src/main/java/org/lmdbjava/ByteBufferProxy.java index 9d1b0f8..5ded7b7 100644 --- a/src/main/java/org/lmdbjava/ByteBufferProxy.java +++ b/src/main/java/org/lmdbjava/ByteBufferProxy.java @@ -133,7 +133,7 @@ public static int compareBuff(final ByteBuffer o1, final ByteBuffer o2) { final int minWords = minLength / Long.BYTES; final boolean reverse1 = o1.order() == LITTLE_ENDIAN; - final boolean reverse2 = o1.order() == LITTLE_ENDIAN; + final boolean reverse2 = o2.order() == LITTLE_ENDIAN; for (int i = 0; i < minWords * Long.BYTES; i += Long.BYTES) { final long lw = reverse1 ? reverseBytes(o1.getLong(i)) : o1.getLong(i); final long rw = reverse2 ? reverseBytes(o2.getLong(i)) : o2.getLong(i); @@ -152,7 +152,7 @@ public static int compareBuff(final ByteBuffer o1, final ByteBuffer o2) { } } - return o1.capacity() - o2.capacity(); + return o1.remaining() - o2.remaining(); } static Field findField(final Class c, final String name) { diff --git a/src/test/java/org/lmdbjava/ComparatorTest.java b/src/test/java/org/lmdbjava/ComparatorTest.java index e849983..44d40cf 100644 --- a/src/test/java/org/lmdbjava/ComparatorTest.java +++ b/src/test/java/org/lmdbjava/ComparatorTest.java @@ -33,6 +33,7 @@ import static org.lmdbjava.DirectBufferProxy.PROXY_DB; import java.nio.ByteBuffer; +import java.util.Arrays; import java.util.Comparator; import com.google.common.primitives.SignedBytes; @@ -156,9 +157,38 @@ private static class ByteBufferRunner implements ComparatorRunner { @Override public int compare(final byte[] o1, final byte[] o2) { - final ByteBuffer o1b = ByteBuffer.wrap(o1); - final ByteBuffer o2b = ByteBuffer.wrap(o2); - return PROXY_OPTIMAL.compare(o1b, o2b); + // Convert arrays to buffers that are larger than the array, with + // limit set at the array length. One buffer bigger than the other. + ByteBuffer o1b = arrayToBuffer(o1, o1.length * 3); + ByteBuffer o2b = arrayToBuffer(o2, o2.length * 2); + final int result = PROXY_OPTIMAL.compare(o1b, o2b); + + // Now swap which buffer is bigger + o1b = arrayToBuffer(o1, o1.length * 2); + o2b = arrayToBuffer(o2, o2.length * 3); + final int result2 = PROXY_OPTIMAL.compare(o1b, o2b); + + assertThat(result2, is(result)); + + // Now try with buffers sized to the array. + o1b = ByteBuffer.wrap(o1); + o2b = ByteBuffer.wrap(o2); + final int result3 = PROXY_OPTIMAL.compare(o1b, o2b); + + assertThat(result3, is(result)); + + return result; + } + + private ByteBuffer arrayToBuffer(final byte[] arr, final int bufferCapacity) { + if (bufferCapacity < arr.length) { + throw new IllegalArgumentException("bufferCapacity < arr.length"); + } + final byte[] newArr = Arrays.copyOf(arr, bufferCapacity); + final ByteBuffer byteBuffer = ByteBuffer.wrap(newArr); + byteBuffer.limit(arr.length); + byteBuffer.position(0); + return byteBuffer; } }