PROTON-1672: fix issue with sending offset and/or partial content ReadableBuffer, plus additional arrayOffset tests
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java
index e0b82b2..14950a7 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java
@@ -369,7 +369,7 @@
if (buffer.hasArray())
{
- System.arraycopy(buffer.array(), buffer.arrayOffset(), copy, 0, buffer.remaining());
+ System.arraycopy(buffer.array(), buffer.arrayOffset() + buffer.position(), copy, 0, buffer.remaining());
buffer.position(buffer.limit());
}
else
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 99a0ced..45626bc 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
@@ -1046,6 +1046,65 @@
assertEquals(2, anotherSlice.arrayOffset());
}
+ @Test
+ public void testArrayOffset() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+ assertFalse(buffer.hasArray());
+ try {
+ buffer.arrayOffset();
+ fail("Should throw UnsupportedOperationException");
+ } catch (UnsupportedOperationException e) {
+ // Expected
+ }
+
+ buffer.append(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ assertTrue(buffer.hasArray());
+ assertEquals("Unexpected array offset", 0, buffer.arrayOffset());
+ }
+
+ @Test
+ public void testArrayOffsetAfterDuplicate() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+ buffer.append(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ assertEquals("Unexpected get result", 0, buffer.get());
+
+ CompositeReadableBuffer duplicate = buffer.duplicate();
+
+ assertTrue(duplicate.hasArray());
+ assertEquals("Unexpected array offset after duplication", 0, duplicate.arrayOffset());
+
+ assertEquals("Unexpected get result", 1, duplicate.get());
+
+ assertEquals("Unexpected array offset after duplicate use", 0, duplicate.arrayOffset());
+ assertEquals("Unexpected get result", 2, duplicate.get());
+
+ assertEquals("Unexpected array offset on original", 0, buffer.arrayOffset());
+ }
+
+ @Test
+ public void testArrayOffsetAfterSliceDuplicated() {
+ CompositeReadableBuffer buffer = new CompositeReadableBuffer();
+ buffer.append(new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
+
+ assertEquals("Unexpected get result", 0, buffer.get());
+
+ CompositeReadableBuffer slice = buffer.slice();
+ CompositeReadableBuffer sliceDuplicated = slice.duplicate();
+
+ assertTrue(sliceDuplicated.hasArray());
+ assertEquals("Unexpected array offset after duplication", 1, sliceDuplicated.arrayOffset());
+
+ assertEquals("Unexpected get result", 1, sliceDuplicated.get());
+
+ assertEquals("Unexpected array offset after duplicate use", 1, sliceDuplicated.arrayOffset());
+ assertEquals("Unexpected get result", 2, sliceDuplicated.get());
+
+ assertEquals("Unexpected array offset on original", 0, buffer.arrayOffset());
+ assertEquals("Unexpected array offset on slice", 1, slice.arrayOffset());
+ }
+
//----- Test appending data to the buffer --------------------------------//
@Test
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/DeliveryImplTest.java b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/DeliveryImplTest.java
index 6b7eac1..cd390ae 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/DeliveryImplTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/DeliveryImplTest.java
@@ -440,7 +440,7 @@
assertArrayEquals(data2, composite.getArrays().get(1));
}
- //----- Test send with WritableBuffer ------------------------------------//
+ //----- Test send with ReadableBuffer ------------------------------------//
@Test
public void testSendSingleReadableBuffer() throws Exception
@@ -462,6 +462,60 @@
}
@Test
+ public void testSendSingleReadableBufferWithPartialContent() throws Exception
+ {
+ DeliveryImpl delivery = createSenderDelivery();
+
+ byte[] data = new byte[] { 0, 1, 2, 3, 4, 5 };
+ byte[] expected = new byte[] { 3, 4, 5 };
+ ReadableBuffer buffer = ReadableBuffer.ByteBufferReader.wrap(data);
+ // Now move the position forward so we only send some of the data
+ buffer.position(3);
+
+ delivery.send(buffer);
+
+ assertEquals(expected.length, delivery.pending());
+ assertEquals(expected.length, delivery.getData().remaining());
+
+ CompositeReadableBuffer composite = (CompositeReadableBuffer) delivery.getData();
+
+ assertNotSame(data, composite.array());
+ assertNotSame(expected, composite.array());
+ assertArrayEquals(expected, composite.array());
+ }
+
+ @Test
+ public void testSendSingleReadableBufferWithOffsetAndPartialContent() throws Exception
+ {
+ DeliveryImpl delivery = createSenderDelivery();
+
+ byte[] bytes = new byte[] { 0, 1, 2, 3, 4, 5 };
+ ByteBuffer data = ByteBuffer.wrap(bytes, 0, 5); // Wrap, miss out the last byte from array
+ data.position(1); // Now move the position forward
+ ByteBuffer dataSlice = data.slice(); // Now slice, causing us to have an array offset at start of array
+
+ byte[] expected = new byte[] { 2, 3, 4 };
+
+ ReadableBuffer buffer = ReadableBuffer.ByteBufferReader.wrap(dataSlice);
+ // Now move the position forward so we only send some of the data
+ buffer.position(1);
+
+ assertEquals("Unexpected array offset", 1, buffer.arrayOffset());
+ assertEquals("Unexpected remaining", 3, buffer.remaining());
+
+ delivery.send(buffer);
+
+ assertEquals(expected.length, delivery.pending());
+ assertEquals(expected.length, delivery.getData().remaining());
+
+ CompositeReadableBuffer composite = (CompositeReadableBuffer) delivery.getData();
+
+ assertNotSame(bytes, composite.array());
+ assertNotSame(expected, composite.array());
+ assertArrayEquals(expected, composite.array());
+ }
+
+ @Test
public void testSendMultipleReadableBuffers() throws Exception
{
DeliveryImpl delivery = createSenderDelivery();
@@ -489,7 +543,7 @@
assertArrayEquals(data2, composite.getArrays().get(1));
}
- //----- Test send with WritableBuffer ------------------------------------//
+ //----- Test send with ReadableBuffer ------------------------------------//
@Test
public void testSendNoCopySingleReadableBuffer() throws Exception