PROTON-1672 Fix CompositeReadableBuffer arrayOffset
The arrayOffset should return a fixed position based on the state of the
buffer (slices will normally have a non-zero value)
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
index 388d140..5ab0348 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
@@ -103,7 +103,7 @@
@Override
public int arrayOffset() {
if (hasArray()) {
- return currentOffset;
+ return currentOffset - position;
}
throw new UnsupportedOperationException("Buffer not backed by a single array");
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
index 298d01c..99a0ced 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
@@ -989,6 +989,63 @@
}
}
+ //----- Test arrayOffset method ------------------------------------------//
+
+ @Test
+ public void testArrayOffsetIsZeroRegardlessOfPositionOnNonSlicedBuffer() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+
+ byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+
+ buffer.append(data);
+
+ assertTrue(buffer.hasArray());
+ assertEquals(0, buffer.arrayOffset());
+
+ buffer.position(1);
+
+ assertEquals(0, buffer.arrayOffset());
+
+ buffer.position(buffer.limit());
+
+ assertEquals(0, buffer.arrayOffset());
+
+ buffer.position(0);
+
+ assertEquals(0, buffer.arrayOffset());
+ }
+
+ @Test
+ public void testArrayOffsetIsFixedOnSliceRegardlessOfPosition() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+
+ byte[] data = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+
+ buffer.append(data);
+
+ assertTrue(buffer.hasArray());
+ assertEquals(0, buffer.arrayOffset());
+
+ buffer.position(1);
+ ReadableBuffer slice = buffer.slice();
+
+ assertEquals(1, slice.arrayOffset());
+
+ slice.position(slice.limit());
+
+ assertEquals(1, slice.arrayOffset());
+
+ slice.position(0);
+
+ assertEquals(1, slice.arrayOffset());
+
+ slice.position(1);
+
+ ReadableBuffer anotherSlice = slice.slice();
+
+ assertEquals(2, anotherSlice.arrayOffset());
+ }
+
//----- Test appending data to the buffer --------------------------------//
@Test