You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2018/04/18 16:50:39 UTC

qpid-proton-j git commit: PROTON-1672: fix issue with sending offset and/or partial content ReadableBuffer, plus additional arrayOffset tests

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 <ro...@apache.org>
Authored: Wed Apr 18 17:49:25 2018 +0100
Committer: Robbie Gemmell <ro...@apache.org>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org