ESP-MQTT
This commit is contained in:
@@ -1,355 +0,0 @@
|
||||
#include <unity.h>
|
||||
|
||||
#include <Packets/Parser.h>
|
||||
|
||||
using espMqttClientInternals::Parser;
|
||||
using espMqttClientInternals::ParserResult;
|
||||
using espMqttClientInternals::IncomingPacket;
|
||||
|
||||
void setUp() {}
|
||||
void tearDown() {}
|
||||
|
||||
Parser parser;
|
||||
|
||||
void test_Connack() {
|
||||
const uint8_t stream[] = {
|
||||
0b00100000, // header
|
||||
0b00000010, // flags
|
||||
0b00000001, // session present
|
||||
0b00000000 // reserved
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(4, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT8(1, parser.getPacket().variableHeader.fixed.connackVarHeader.sessionPresent);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().variableHeader.fixed.connackVarHeader.returnCode);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_Empty() {
|
||||
const uint8_t stream[] = {
|
||||
0x00
|
||||
};
|
||||
const size_t length = 0;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_UINT8(ParserResult::awaitData, result);
|
||||
TEST_ASSERT_EQUAL_INT32(0, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_Header() {
|
||||
const uint8_t stream[] = {
|
||||
0x12,
|
||||
0x13,
|
||||
0x14
|
||||
};
|
||||
const size_t length = 3;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::protocolError, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(1, bytesRead);
|
||||
}
|
||||
|
||||
void test_Publish() {
|
||||
uint8_t stream[] = {
|
||||
0b00110010, // header
|
||||
0x0B, // remaining length
|
||||
0x00, 0x03, 'a', '/', 'b', // topic
|
||||
0x00, 0x0A, // packet id
|
||||
0x01, 0x02 // payload
|
||||
};
|
||||
size_t length = 11;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBLISH, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_STRING("a/b", parser.getPacket().variableHeader.topic);
|
||||
TEST_ASSERT_EQUAL_UINT16(10, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.index);
|
||||
TEST_ASSERT_EQUAL_UINT32(2, parser.getPacket().payload.length);
|
||||
TEST_ASSERT_EQUAL_UINT32(4, parser.getPacket().payload.total);
|
||||
TEST_ASSERT_EQUAL_UINT8(1, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
|
||||
stream[0] = 0x03;
|
||||
stream[1] = 0x04;
|
||||
length = 2;
|
||||
|
||||
bytesRead = 0;
|
||||
result = parser.parse(stream, length, &bytesRead);
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_STRING("a/b", parser.getPacket().variableHeader.topic);
|
||||
TEST_ASSERT_EQUAL_UINT16(10, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT32(2, parser.getPacket().payload.index);
|
||||
TEST_ASSERT_EQUAL_UINT32(2, parser.getPacket().payload.length);
|
||||
TEST_ASSERT_EQUAL_UINT32(4, parser.getPacket().payload.total);
|
||||
TEST_ASSERT_EQUAL_UINT8(1, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_Publish_empty() {
|
||||
uint8_t stream0[] = {
|
||||
0b00110000, // header
|
||||
0x05, // remaining length
|
||||
0x00, 0x03, 'a', '/', 'b', // topic
|
||||
};
|
||||
size_t length0 = 7;
|
||||
|
||||
size_t bytesRead0 = 0;
|
||||
ParserResult result0 = parser.parse(stream0, length0, &bytesRead0);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result0);
|
||||
TEST_ASSERT_EQUAL_UINT32(length0, bytesRead0);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBLISH, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_STRING("a/b", parser.getPacket().variableHeader.topic);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.index);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.length);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.total);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
|
||||
uint8_t stream1[] = {
|
||||
0b00110000, // header
|
||||
0x05, // remaining length
|
||||
0x00, 0x03, 'a', '/', 'b', // topic
|
||||
};
|
||||
size_t length1 = 7;
|
||||
|
||||
size_t bytesRead1 = 0;
|
||||
ParserResult result1 = parser.parse(stream1, length1, &bytesRead1);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result1);
|
||||
TEST_ASSERT_EQUAL_UINT32(length1, bytesRead1);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBLISH, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_STRING("a/b", parser.getPacket().variableHeader.topic);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.index);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.length);
|
||||
TEST_ASSERT_EQUAL_UINT32(0, parser.getPacket().payload.total);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
|
||||
}
|
||||
|
||||
void test_PubAck() {
|
||||
const uint8_t stream[] = {
|
||||
0b01000000,
|
||||
0b00000010,
|
||||
0x12,
|
||||
0x34
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBACK, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT16(4660, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_PubRec() {
|
||||
const uint8_t stream[] = {
|
||||
0b01010000,
|
||||
0b00000010,
|
||||
0x56,
|
||||
0x78
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_BITS(0xF0, espMqttClientInternals::PacketType.PUBREC, parser.getPacket().fixedHeader.packetType);
|
||||
TEST_ASSERT_EQUAL_UINT16(22136, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_PubRel() {
|
||||
const uint8_t stream[] = {
|
||||
0b01100010,
|
||||
0b00000010,
|
||||
0x9A,
|
||||
0xBC
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBREL, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT16(0x9ABC, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_PubComp() {
|
||||
const uint8_t stream[] = {
|
||||
0b01110000,
|
||||
0b00000010,
|
||||
0xDE,
|
||||
0xF0
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBCOMP, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT16(0xDEF0, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_SubAck() {
|
||||
const uint8_t stream[] = {
|
||||
0b10010000,
|
||||
0b00000100,
|
||||
0x00,
|
||||
0x0A,
|
||||
0x02,
|
||||
0x01
|
||||
};
|
||||
const size_t length = 6;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.SUBACK, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT16(10, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8_ARRAY(&stream[4], parser.getPacket().payload.data,2);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_UnsubAck() {
|
||||
const uint8_t stream[] = {
|
||||
0b10110000,
|
||||
0b00000010,
|
||||
0x00,
|
||||
0x0A
|
||||
};
|
||||
const size_t length = 4;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.UNSUBACK, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT16(10, parser.getPacket().variableHeader.fixed.packetId);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
|
||||
void test_PingResp() {
|
||||
const uint8_t stream[] = {
|
||||
0b11010000,
|
||||
0x00
|
||||
};
|
||||
const size_t length = 2;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(stream, length, &bytesRead);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT32(length, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PINGRESP, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
void test_longStream() {
|
||||
const uint8_t stream[] = {
|
||||
0x90, 0x03, 0x00, 0x01, 0x00, 0x31, 0x0F, 0x00, 0x09, 0x66, 0x6F, 0x6F, 0x2F, 0x62, 0x61, 0x72,
|
||||
0x2F, 0x30, 0x74, 0x65, 0x73, 0x74, 0x90, 0x03, 0x00, 0x02, 0x01, 0x33, 0x11, 0x00, 0x09, 0x66,
|
||||
0x6F, 0x6F, 0x2F, 0x62, 0x61, 0x72, 0x2F, 0x31, 0x00, 0x01, 0x74, 0x65, 0x73, 0x74, 0x90, 0x03,
|
||||
0x00, 0x03, 0x02, 0x30, 0x0F, 0x00, 0x09, 0x66, 0x6F, 0x6F, 0x2F, 0x62, 0x61, 0x72, 0x2F, 0x30,
|
||||
0x74, 0x65, 0x73, 0x74, 0x32, 0x11, 0x00, 0x09, 0x66, 0x6F, 0x6F, 0x2F, 0x62, 0x61, 0x72, 0x2F,
|
||||
0x31, 0x00, 0x02, 0x74, 0x65, 0x73, 0x74, 0x40, 0x02, 0x00, 0x04, 0x50, 0x02, 0x00, 0x05
|
||||
};
|
||||
const size_t length = 94;
|
||||
|
||||
size_t bytesRead = 0;
|
||||
ParserResult result = parser.parse(&stream[bytesRead], length - bytesRead, &bytesRead);
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.SUBACK, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT32(5, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
|
||||
result = parser.parse(&stream[bytesRead], length - bytesRead, &bytesRead);
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.PUBLISH, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT32(5 + 17, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_TRUE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
|
||||
result = parser.parse(&stream[bytesRead], length - bytesRead, &bytesRead);
|
||||
TEST_ASSERT_EQUAL_INT32(ParserResult::packet, result);
|
||||
TEST_ASSERT_EQUAL_UINT8(espMqttClientInternals::PacketType.SUBACK, parser.getPacket().fixedHeader.packetType & 0xF0);
|
||||
TEST_ASSERT_EQUAL_UINT32(5 + 17 + 5, bytesRead);
|
||||
TEST_ASSERT_EQUAL_UINT8(0, parser.getPacket().qos());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().retain());
|
||||
TEST_ASSERT_FALSE(parser.getPacket().dup());
|
||||
}
|
||||
|
||||
int main() {
|
||||
UNITY_BEGIN();
|
||||
RUN_TEST(test_Connack);
|
||||
RUN_TEST(test_Empty);
|
||||
RUN_TEST(test_Header);
|
||||
RUN_TEST(test_Publish);
|
||||
RUN_TEST(test_Publish_empty);
|
||||
RUN_TEST(test_PubAck);
|
||||
RUN_TEST(test_PubRec);
|
||||
RUN_TEST(test_PubRel);
|
||||
RUN_TEST(test_PubComp);
|
||||
RUN_TEST(test_SubAck);
|
||||
RUN_TEST(test_UnsubAck);
|
||||
RUN_TEST(test_PingResp);
|
||||
RUN_TEST(test_longStream);
|
||||
return UNITY_END();
|
||||
}
|
||||
Reference in New Issue
Block a user