PROTON-1384: make the Data utility encode str32 lengths using the required 4 bytes width
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/StringElement.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/StringElement.java
index e3be671..f5b3a5e 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/StringElement.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/impl/StringElement.java
@@ -127,7 +127,7 @@
else
{
b.put((byte)0xb1);
- b.put((byte)length);
+ b.putInt(length);
}
b.put(bytes);
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 6bb3f2c..5799f17 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
@@ -22,6 +22,9 @@
import static org.junit.Assert.*;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.codec.Data;
@@ -81,4 +84,68 @@
Object[] array = data2.getJavaArray();
assertArrayEquals("Array not as expected", input, array);
}
+
+ @Test
+ public void testEncodeString32()
+ {
+ byte[] strPayload = createStringPayloadBytes(256);
+ String content = new String(strPayload, StandardCharsets.UTF_8);
+ assertTrue("Length must be over 255 to ensure use of str32 encoding", content.length() > 255);
+
+ int encodedSize = 1 + 4 + strPayload.length; // 1b type + 4b length + content
+ ByteBuffer expectedEncoding = ByteBuffer.allocate(encodedSize);
+ expectedEncoding.put((byte) 0xB1);
+ expectedEncoding.putInt(strPayload.length);
+ expectedEncoding.put(strPayload);
+
+ Data data = new DataImpl();
+ data.putString(content);
+
+ Binary encoded = data.encode();
+
+ assertEquals("unexpected encoding", new Binary(expectedEncoding.array()), encoded);
+ }
+
+ @Test
+ public void testEncodeDecodeString32()
+ {
+ byte[] payload = createStringPayloadBytes(1025);
+ String content = new String(payload, StandardCharsets.UTF_8);
+ assertTrue("Length must be over 255 to ensure use of str32 encoding", content.length() > 255);
+
+ doEncodeDecodeStringTestImpl(content);
+ }
+
+ @Test
+ public void testEncodeDecodeString8()
+ {
+ String content = "testRoundTripString8";
+ assertTrue("Length must be <= 255 to allow use of str8 encoding", content.length() <= 255);
+
+ doEncodeDecodeStringTestImpl("testRoundTripString8");
+ }
+
+ private void doEncodeDecodeStringTestImpl(String string)
+ {
+ Data data = new DataImpl();
+ data.putString(string);
+
+ Binary encoded = data.encode();
+
+ Data data2 = new DataImpl();
+ data2.decode(encoded.asByteBuffer());
+
+ assertEquals("unexpected type", Data.DataType.STRING, data2.type());
+ assertEquals("unexpected string", string, data2.getString());
+ }
+
+ private byte[] createStringPayloadBytes(int length)
+ {
+ byte[] payload = new byte[length];
+ for (int i = 0; i < length; i++) {
+ payload[i] = (byte) ((i % 10) + 48);
+ }
+
+ return payload;
+ }
}