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();
+ }
}