From 54e0b1520d9c451ba832df7fb0abfea2e570e861 Mon Sep 17 00:00:00 2001 From: andrea Date: Sun, 19 Aug 2012 12:16:44 +0200 Subject: [PATCH] Fixes for remaining length calculation for unsubscribe encoder --- .../moquette/proto/UnsubscribeEncoder.java | 2 +- .../proto/UnsubscribeDecoderTest.java | 41 +++++++++++++++++++ .../proto/UnsubscribeEncoderTest.java | 5 ++- 3 files changed, 45 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 407722ca..4017d9eb 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 @@ -35,7 +35,7 @@ public class UnsubscribeEncoder implements MessageEncoder { IoBuffer buff = IoBuffer.allocate(2 + variableHeaderSize); buff.put((byte) (AbstractMessage.UNSUBSCRIBE << 4 | flags)); - buff.put(Utils.encodeRemainingLength(2 + variableHeaderSize)); + buff.put(Utils.encodeRemainingLength(variableHeaderSize)); buff.put(variableHeaderBuff).flip(); out.write(buff); diff --git a/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeDecoderTest.java b/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeDecoderTest.java index ca56daf9..5032ce2e 100644 --- a/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeDecoderTest.java +++ b/parser/src/test/java/org/dna/mqtt/moquette/proto/UnsubscribeDecoderTest.java @@ -58,6 +58,47 @@ public class UnsubscribeDecoderTest { assertEquals(AbstractMessage.UNSUBSCRIBE, m_mockProtoDecoder.getMessage().getMessageType()); } + + @Test + public void testDecodeSingleTopic_bug() throws Exception { + //A2 0C 00 01 00 06 2F 74 6F 70 69 63 //12 byte + byte[] overallMessage = new byte[] {(byte)0xA2, 0x0A, //fixed header + 0x00, 0x01, //MSG ID + 0x00, 0x06, 0x2F, 0x74, 0x6F, 0x70, 0x69, 0x63}; //"/topic" string + m_buff = IoBuffer.allocate(overallMessage.length).setAutoExpand(true); + m_buff.put(overallMessage); + m_buff.flip(); + + MessageDecoderResult res = m_msgdec.decode(null, m_buff, m_mockProtoDecoder); + + assertNotNull(m_mockProtoDecoder.getMessage()); + UnsubscribeMessage message = (UnsubscribeMessage) m_mockProtoDecoder.getMessage(); +// assertEquals(0x0A, message.getMessageID()); +// assertEquals(1, message.types().size()); +// assertEquals(AbstractMessage.QOSType.LEAST_ONE, message.types().get(0)); + + } + +// @Test +// public void testDecodeSingleTopic_BadFormat() throws Exception { +// //A2 0C 00 01 00 06 2F 74 6F 70 69 63 //10 byte of content, but lenght says 12!! +// byte[] overallMessage = new byte[] {(byte)0xA2, 0x0C, //fixed header +// 0x00, 0x01, //MSG ID +// 0x00, 0x06, 0x2F, 0x74, 0x6F, 0x70, 0x69, 0x63}; //"/topic" string +// m_buff = IoBuffer.allocate(overallMessage.length).setAutoExpand(true); +// m_buff.put(overallMessage); +// m_buff.flip(); +// +// MessageDecoderResult res = m_msgdec.decode(null, m_buff, m_mockProtoDecoder); +// +// assertNotNull(m_mockProtoDecoder.getMessage()); +// UnsubscribeMessage message = (UnsubscribeMessage) m_mockProtoDecoder.getMessage(); +//// assertEquals(0x0A, message.getMessageID()); +//// assertEquals(1, message.types().size()); +//// assertEquals(AbstractMessage.QOSType.LEAST_ONE, message.types().get(0)); +// +// } + private void initHeaderBadQos(IoBuffer buff) { buff.clear().put((byte)(AbstractMessage.UNSUBSCRIBE << 4)).put((byte)0); } 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 ca29136f..4a4fb114 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 @@ -38,7 +38,8 @@ public class UnsubscribeEncoderTest { //Verify assertEquals((byte)0xA2, (byte)m_mockProtoEncoder.getBuffer().get()); //1 byte - assertEquals(12, m_mockProtoEncoder.getBuffer().get()); //remaining length + //2 messageID + 2 length + 6 chars = 10 + assertEquals(10, m_mockProtoEncoder.getBuffer().get()); //remaining length //verify M1ssageID assertEquals((byte)0xAA, m_mockProtoEncoder.getBuffer().get()); @@ -64,7 +65,7 @@ public class UnsubscribeEncoderTest { //Verify assertEquals((byte)0xA2, (byte)m_mockProtoEncoder.getBuffer().get()); //1 byte - assertEquals(16, m_mockProtoEncoder.getBuffer().get()); //remaining length + assertEquals(14, m_mockProtoEncoder.getBuffer().get()); //remaining length //verify M1ssageID assertEquals((byte)0xAA, m_mockProtoEncoder.getBuffer().get());