Updated publish message parto to conform to 3.1.1 specification
This commit is contained in:
+61
-13
@@ -17,6 +17,9 @@ package org.dna.mqtt.moquette.parser.netty;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.CorruptedFrameException;
|
||||
import io.netty.util.AttributeMap;
|
||||
import io.netty.util.DefaultAttributeMap;
|
||||
import java.nio.Buffer;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
@@ -38,11 +41,15 @@ public class PublishDecoderTest {
|
||||
ByteBuf m_buff;
|
||||
PublishDecoder m_msgdec;
|
||||
List<Object> m_results;
|
||||
AttributeMap m_attrMap;
|
||||
|
||||
private static final int MESSAGE_ID = 123;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
m_msgdec = new PublishDecoder();
|
||||
m_results = new ArrayList<Object >();
|
||||
m_attrMap = new DefaultAttributeMap();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -51,7 +58,7 @@ public class PublishDecoderTest {
|
||||
initHeader(m_buff);
|
||||
|
||||
//Excercise
|
||||
m_msgdec.decode(null, m_buff, m_results);
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
@@ -64,40 +71,67 @@ public class PublishDecoderTest {
|
||||
@Test
|
||||
public void testHeaderWithMessageID() throws Exception {
|
||||
m_buff = Unpooled.buffer(14);
|
||||
int messageID = 123;
|
||||
initHeaderWithMessageID(m_buff, messageID);
|
||||
initHeaderWithMessageID(m_buff, MESSAGE_ID);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(null, m_buff, m_results);
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
assertNotNull(message);
|
||||
assertEquals("Fake Topic", message.getTopicName());
|
||||
assertEquals(messageID, (int) message.getMessageID());
|
||||
assertEquals(MESSAGE_ID, (int) message.getMessageID());
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testHeaderWithMessageID_Payload() throws Exception {
|
||||
m_buff = Unpooled.buffer(14);
|
||||
int messageID = 123;
|
||||
// byte[] payload = new byte[]{0x0A, 0x0B, 0x0C};
|
||||
ByteBuffer payload = ByteBuffer.allocate(3).put(new byte[]{0x0A, 0x0B, 0x0C});
|
||||
initHeaderWithMessageID_Payload(m_buff, messageID, payload);
|
||||
initHeaderWithMessageID_Payload(m_buff, MESSAGE_ID, payload);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(null, m_buff, m_results);
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
assertNotNull(message);
|
||||
assertEquals("Fake Topic", message.getTopicName());
|
||||
assertEquals(messageID, (int) message.getMessageID());
|
||||
assertEquals(MESSAGE_ID, (int) message.getMessageID());
|
||||
// TestUtils.verifyEquals(payload, message.getPayload());
|
||||
assertEquals(payload, message.getPayload());
|
||||
}
|
||||
|
||||
@Test(expected = CorruptedFrameException.class)
|
||||
public void testDup0WithQoS0_3_1_1() throws Exception {
|
||||
m_buff = m_buff = preparePubclishWithQosFlags((byte) 0x08);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
}
|
||||
|
||||
@Test(expected = CorruptedFrameException.class)
|
||||
public void testReservedQoS3_3_1_1() throws Exception {
|
||||
m_buff = preparePubclishWithQosFlags((byte) 0x0E);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
}
|
||||
|
||||
@Test(expected = CorruptedFrameException.class)
|
||||
public void testTopicWithWildCards() throws Exception {
|
||||
byte[] overallMessage = new byte[]{0x30, 0x17, //fixed header, 25 byte lenght
|
||||
0x00, 0x06, 0x2f, 0x74, 0x6f, 0x70, 0x2B /*+*/, 0x23 /*#*/, //[/top+#] string 2 len + 6 content
|
||||
0x54, 0x65, 0x73, 0x74, 0x20, 0x6d, 0x79, // [Test my payload] encoding
|
||||
0x20, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64};
|
||||
m_buff = Unpooled.buffer(overallMessage.length);
|
||||
m_buff.writeBytes(overallMessage);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBugOnRealCase() throws Exception {
|
||||
byte[] overallMessage = new byte[]{0x30, 0x17, //fixed header, 25 byte lenght
|
||||
@@ -108,7 +142,7 @@ public class PublishDecoderTest {
|
||||
m_buff.writeBytes(overallMessage);
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(null, m_buff, m_results);
|
||||
m_msgdec.decode(m_attrMap, m_buff, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
@@ -128,14 +162,14 @@ public class PublishDecoderTest {
|
||||
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(null, doubleMessageBuf, m_results);
|
||||
m_msgdec.decode(m_attrMap, doubleMessageBuf, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
assertNotNull(message);
|
||||
m_results.clear();
|
||||
|
||||
m_msgdec.decode(null, doubleMessageBuf, m_results);
|
||||
m_msgdec.decode(m_attrMap, doubleMessageBuf, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
message = (PublishMessage)m_results.get(0);
|
||||
@@ -154,7 +188,7 @@ public class PublishDecoderTest {
|
||||
msgBuf.readByte(); //to simulate the reading of messageType done by MQTTDecoder dispatcher
|
||||
|
||||
//Exercise
|
||||
m_msgdec.decode(null, msgBuf, m_results);
|
||||
m_msgdec.decode(m_attrMap, msgBuf, m_results);
|
||||
|
||||
assertFalse(m_results.isEmpty());
|
||||
PublishMessage message = (PublishMessage)m_results.get(0);
|
||||
@@ -216,4 +250,18 @@ public class PublishDecoderTest {
|
||||
|
||||
return completeMsg;
|
||||
}
|
||||
|
||||
private ByteBuf preparePubclishWithQosFlags(byte flags) {
|
||||
ByteBuf buff = Unpooled.buffer(14);
|
||||
ByteBuffer payload = ByteBuffer.allocate(3).put(new byte[]{0x0A, 0x0B, 0x0C});
|
||||
ByteBuf tmp = Unpooled.buffer(4).writeBytes(Utils.encodeString("Fake Topic"));
|
||||
tmp.writeShort(MESSAGE_ID);
|
||||
tmp.writeBytes(payload);
|
||||
buff.clear().writeByte(AbstractMessage.PUBLISH << 4 | flags) //set DUP=1 Qos to 11 => b1110
|
||||
.writeBytes(Utils.encodeRemainingLength(tmp.readableBytes()));
|
||||
//topic name
|
||||
buff.writeBytes(tmp);
|
||||
|
||||
return buff;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user