PROTON-1551: Fix length encoding for binary over 255 bytes in length when using DataImpl
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/BinaryElement.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/BinaryElement.java
index fd05243..90bf5ee 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/BinaryElement.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/BinaryElement.java
@@ -119,7 +119,7 @@
         else
         {
             b.put((byte)0xb0);
-            b.put((byte)_value.getLength());
+            b.putInt(_value.getLength());
         }
         b.put(_value.getArray(),_value.getArrayOffset(),_value.getLength());
         return size;
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 b650aed..d02a088 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
@@ -274,4 +274,32 @@
 
         return payload;
     }
+
+    @Test
+    public void testEncodeDecodeBinary32()
+    {
+        byte[] initialPayload = createStringPayloadBytes(1025);
+        String initialContent = new String(initialPayload, StandardCharsets.UTF_8);
+        assertTrue("Length must be over 255 to ensure use of str32 encoding", initialContent.length() > 255);
+
+        byte[] bytesReadBack = doEncodeDecodeBinaryTestImpl(initialPayload);
+        String readBackContent = new String(bytesReadBack, StandardCharsets.UTF_8);
+        assertEquals(initialContent, readBackContent);
+    }
+
+    private byte[] doEncodeDecodeBinaryTestImpl(byte[] payload)
+    {
+        Data data = new DataImpl();
+        data.putBinary(payload);
+
+        Binary encoded = data.encode();
+
+        ByteBuffer byteBuffer = encoded.asByteBuffer();
+        Data data2 = new DataImpl();
+        long decodeResult = data2.decode(byteBuffer);
+        assertTrue(Long.toString(decodeResult), decodeResult > 0);
+
+        assertEquals("unexpected type", Data.DataType.BINARY, data2.type());
+        return data2.getBinary().getArray();
+    }
 }