Repository: qpid-proton-j Updated Branches: refs/heads/master 25bc3cfba -> 663365dd7
PROTON-1672: fix issue with sending offset and/or partial content ReadableBuffer, plus additional arrayOffset tests Project: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/commit/663365dd Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/tree/663365dd Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/diff/663365dd Branch: refs/heads/master Commit: 663365dd715f4241848804ca1022f031765c5d98 Parents: 25bc3cf Author: Robbie Gemmell <[email protected]> Authored: Wed Apr 18 17:49:25 2018 +0100 Committer: Robbie Gemmell <[email protected]> Committed: Wed Apr 18 17:49:25 2018 +0100 ---------------------------------------------------------------------- .../qpid/proton/engine/impl/DeliveryImpl.java | 2 +- .../codec/CompositeReadableBufferTest.java | 59 ++++++++++++++++++++ .../proton/engine/impl/DeliveryImplTest.java | 58 ++++++++++++++++++- 3 files changed, 116 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/663365dd/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java ---------------------------------------------------------------------- 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 @@ public class DeliveryImpl implements Delivery 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 http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/663365dd/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java ---------------------------------------------------------------------- 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 @@ public class CompositeReadableBufferTest { 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 http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/663365dd/proton-j/src/test/java/org/apache/qpid/proton/engine/impl/DeliveryImplTest.java ---------------------------------------------------------------------- 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 @@ public class DeliveryImplTest assertArrayEquals(data2, composite.getArrays().get(1)); } - //----- Test send with WritableBuffer ------------------------------------// + //----- Test send with ReadableBuffer ------------------------------------// @Test public void testSendSingleReadableBuffer() throws Exception @@ -462,6 +462,60 @@ public class DeliveryImplTest } @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 @@ public class DeliveryImplTest assertArrayEquals(data2, composite.getArrays().get(1)); } - //----- Test send with WritableBuffer ------------------------------------// + //----- Test send with ReadableBuffer ------------------------------------// @Test public void testSendNoCopySingleReadableBuffer() throws Exception --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
