You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2017/03/21 12:37:48 UTC

qpid-proton-j git commit: PROTON-1441 : Incorrect sizes calculated for arrays of lists/maps using the Data API

Repository: qpid-proton-j
Updated Branches:
  refs/heads/master 8929454ce -> b49969c1f


PROTON-1441 : Incorrect sizes calculated for arrays of lists/maps using the Data API


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/b49969c1
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/tree/b49969c1
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton-j/diff/b49969c1

Branch: refs/heads/master
Commit: b49969c1ff22ee76d37705c463091b3d935b1c43
Parents: 8929454
Author: rgodfrey <rg...@apache.org>
Authored: Tue Mar 21 13:28:03 2017 +0100
Committer: rgodfrey <rg...@apache.org>
Committed: Tue Mar 21 13:28:03 2017 +0100

----------------------------------------------------------------------
 .../qpid/proton/codec/impl/ListElement.java     |   5 +-
 .../qpid/proton/codec/impl/MapElement.java      |   6 +-
 .../qpid/proton/codec/impl/DataImplTest.java    | 126 +++++++++++++++++++
 3 files changed, 134 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/b49969c1/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/ListElement.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/ListElement.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/ListElement.java
index 6b2dde1..c9eddc8 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/ListElement.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/ListElement.java
@@ -83,7 +83,10 @@ class ListElement extends AbstractElement<List<Object>>
                     size += 2;
                 }
             }
-            size += 8;
+            else
+            {
+                size += 8;
+            }
 
         }
         else

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/b49969c1/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/MapElement.java
----------------------------------------------------------------------
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/MapElement.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/MapElement.java
index 710e9f0..eec3c60 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/MapElement.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/MapElement.java
@@ -76,8 +76,10 @@ class MapElement extends AbstractElement<Map<Object,Object>>
                     size += 2;
                 }
             }
-            size += 8;
-
+            else
+            {
+                size += 8;
+            }
         }
         else
         {

http://git-wip-us.apache.org/repos/asf/qpid-proton-j/blob/b49969c1/proton-j/src/test/java/org/apache/qpid/proton/codec/impl/DataImplTest.java
----------------------------------------------------------------------
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/codec/impl/DataImplTest.java b/proton-j/src/test/java/org/apache/qpid/proton/codec/impl/DataImplTest.java
index 5799f17..b650aed 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/codec/impl/DataImplTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/codec/impl/DataImplTest.java
@@ -86,6 +86,132 @@ public class DataImplTest
     }
 
     @Test
+    public void testEncodeArrayOfLists()
+    {
+        // encode an array of two empty lists
+        Data data = new DataImpl();
+        data.putArray(false, Data.DataType.LIST);
+        data.enter();
+        data.putList();
+        data.putList();
+        data.exit();
+
+        int expectedEncodedSize = 4; // 1b type + 1b size + 1b length + 1b element constructor
+
+
+        Binary encoded = data.encode();
+        assertEquals("unexpected encoding size", expectedEncodedSize, encoded.getLength());
+
+        ByteBuffer expectedEncoding = ByteBuffer.allocate(expectedEncodedSize);
+        expectedEncoding.put((byte)0xe0);   // constructor
+        expectedEncoding.put((byte)2);   // size
+        expectedEncoding.put((byte)2);   // count
+        expectedEncoding.put((byte)0x45);   // element constructor
+
+        assertEquals("unexpected encoding", new Binary(expectedEncoding.array()), encoded);
+
+        data = new DataImpl();
+        data.putArray(false, Data.DataType.LIST);
+        data.enter();
+        data.putList();
+        data.putList();
+        data.putList();
+        data.enter();
+        data.putNull();
+        data.exit();
+        data.exit();
+
+        expectedEncodedSize = 11; // 1b type + 1b size + 1b length + 1b element constructor + 3 * (1b size + 1b count) + 1b null elt
+
+        encoded = data.encode();
+        assertEquals("unexpected encoding size", expectedEncodedSize, encoded.getLength());
+
+        expectedEncoding = ByteBuffer.allocate(expectedEncodedSize);
+        expectedEncoding.put((byte)0xe0);   // constructor
+        expectedEncoding.put((byte)9);   // size
+        expectedEncoding.put((byte)3);   // count
+        expectedEncoding.put((byte)0xc0);   // element constructor
+        expectedEncoding.put((byte)1);   // size
+        expectedEncoding.put((byte)0);   // count
+        expectedEncoding.put((byte)1);   // size
+        expectedEncoding.put((byte)0);   // count
+        expectedEncoding.put((byte)2);   // size
+        expectedEncoding.put((byte)1);   // count
+        expectedEncoding.put((byte)0x40);   // null value
+
+        assertEquals("unexpected encoding", new Binary(expectedEncoding.array()), encoded);
+
+        data = new DataImpl();
+        data.putArray(false, Data.DataType.LIST);
+        data.enter();
+        data.putList();
+        data.putList();
+        data.putList();
+        data.enter();
+        for(int i = 0; i < 256; i++)
+        {
+            data.putNull();
+        }
+        data.exit();
+        data.exit();
+
+        expectedEncodedSize = 290; // 1b type + 4b size + 4b length + 1b element constructor + 3 * (4b size + 4b count) + (256 * 1b) null elt
+        encoded = data.encode();
+        assertEquals("unexpected encoding size", expectedEncodedSize, encoded.getLength());
+
+        expectedEncoding = ByteBuffer.allocate(expectedEncodedSize);
+        expectedEncoding.put((byte)0xf0);   // constructor
+        expectedEncoding.putInt(285);   // size
+        expectedEncoding.putInt(3);   // count
+        expectedEncoding.put((byte)0xd0);   // element constructor
+        expectedEncoding.putInt(4);   // size
+        expectedEncoding.putInt(0);   // count
+        expectedEncoding.putInt(4);   // size
+        expectedEncoding.putInt(0);   // count
+        expectedEncoding.putInt(260);   // size
+        expectedEncoding.putInt(256);   // count
+        for(int i = 0; i < 256; i++)
+        {
+            expectedEncoding.put((byte)0x40);   // null value
+        }
+
+        assertEquals("unexpected encoding", new Binary(expectedEncoding.array()), encoded);
+
+    }
+
+    @Test
+    public void testEncodeArrayOfMaps()
+    {
+        // encode an array of two empty maps
+        Data data = new DataImpl();
+        data.putArray(false, Data.DataType.MAP);
+        data.enter();
+        data.putMap();
+        data.putMap();
+        data.exit();
+
+        int expectedEncodedSize = 8; // 1b type + 1b size + 1b length + 1b element constructor + 2 * (1b size + 1b count)
+
+
+        Binary encoded = data.encode();
+        assertEquals("unexpected encoding size", expectedEncodedSize, encoded.getLength());
+
+        ByteBuffer expectedEncoding = ByteBuffer.allocate(expectedEncodedSize);
+        expectedEncoding.put((byte) 0xe0);   // constructor
+        expectedEncoding.put((byte) 6);   // size
+        expectedEncoding.put((byte) 2);   // count
+        expectedEncoding.put((byte) 0xc1);   // element constructor
+        expectedEncoding.put((byte)1);   // size
+        expectedEncoding.put((byte)0);   // count
+        expectedEncoding.put((byte)1);   // size
+        expectedEncoding.put((byte)0);   // count
+
+
+        assertEquals("unexpected encoding", new Binary(expectedEncoding.array()), encoded);
+
+    }
+
+        @Test
     public void testEncodeString32()
     {
         byte[] strPayload = createStringPayloadBytes(256);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org