From 0fb5d8f7a04fee222f66cdc4accb37ecf8f22d40 Mon Sep 17 00:00:00 2001 From: andrea Date: Sun, 19 Aug 2012 11:58:33 +0200 Subject: [PATCH] Fixed calculation of remaining length bug in Unsubscribe encoder --- .../moquette/proto/UnsubscribeEncoder.java | 4 +-- .../proto/UnsubscribeEncoderTest.java | 26 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/parser/src/main/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoder.java b/parser/src/main/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoder.java index a57f979f..407722ca 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoder.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoder.java @@ -32,10 +32,10 @@ public class UnsubscribeEncoder implements MessageEncoder { variableHeaderBuff.flip(); int variableHeaderSize = variableHeaderBuff.remaining(); byte flags = Utils.encodeFlags(message); - IoBuffer buff = IoBuffer.allocate(4 + variableHeaderSize); + IoBuffer buff = IoBuffer.allocate(2 + variableHeaderSize); buff.put((byte) (AbstractMessage.UNSUBSCRIBE << 4 | flags)); - buff.put(Utils.encodeRemainingLength(4 + variableHeaderSize)); + buff.put(Utils.encodeRemainingLength(2 + variableHeaderSize)); buff.put(variableHeaderBuff).flip(); out.write(buff); diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoderTest.java index 701edfb2..ca29136f 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeEncoderTest.java @@ -24,6 +24,30 @@ public class UnsubscribeEncoderTest { m_msg = new UnsubscribeMessage(); m_msg.setMessageID(0xAABB); } + + @Test + public void testEncodeWithSingleTopic() throws Exception { + m_msg.setQos(QOSType.LEAST_ONE); + + //variable part + String topic1 = "/topic"; + m_msg.addTopic(topic1); + + //Exercise + m_encoder.encode(null, m_msg, m_mockProtoEncoder); + + //Verify + assertEquals((byte)0xA2, (byte)m_mockProtoEncoder.getBuffer().get()); //1 byte + assertEquals(12, m_mockProtoEncoder.getBuffer().get()); //remaining length + + //verify M1ssageID + assertEquals((byte)0xAA, m_mockProtoEncoder.getBuffer().get()); + assertEquals((byte)0xBB, m_mockProtoEncoder.getBuffer().get()); + + //Variable part + verifyString(topic1, m_mockProtoEncoder.getBuffer()); + } + @Test public void testEncodeWithMultiTopic() throws Exception { @@ -40,7 +64,7 @@ public class UnsubscribeEncoderTest { //Verify assertEquals((byte)0xA2, (byte)m_mockProtoEncoder.getBuffer().get()); //1 byte - assertEquals(18, m_mockProtoEncoder.getBuffer().get()); //remaining length + assertEquals(16, m_mockProtoEncoder.getBuffer().get()); //remaining length //verify M1ssageID assertEquals((byte)0xAA, m_mockProtoEncoder.getBuffer().get());