|
|
|
@ -82,6 +82,33 @@ static void varint_read_helper(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void string_read_helper(
|
|
|
|
|
uint8_t *payload,
|
|
|
|
|
int remaining_length,
|
|
|
|
|
int rc_expected,
|
|
|
|
|
const char *value_expected,
|
|
|
|
|
int length_expected)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
char *value = NULL;
|
|
|
|
|
int length = -1;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
memset(&packet, 0, sizeof(struct mosquitto__packet));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
packet.remaining_length = remaining_length;
|
|
|
|
|
rc = packet__read_string(&packet, &value, &length);
|
|
|
|
|
CU_ASSERT_EQUAL(rc, rc_expected);
|
|
|
|
|
if(value_expected){
|
|
|
|
|
CU_ASSERT_NSTRING_EQUAL(value, value_expected, length_expected);
|
|
|
|
|
}else{
|
|
|
|
|
CU_ASSERT_EQUAL(value, NULL);
|
|
|
|
|
}
|
|
|
|
|
CU_ASSERT_EQUAL(length, length_expected);
|
|
|
|
|
free(value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ========================================================================
|
|
|
|
|
* BYTE INTEGER TESTS
|
|
|
|
|
* ======================================================================== */
|
|
|
|
@ -105,9 +132,7 @@ static void TEST_byte_read_empty(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_byte_read_success(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* 0 value */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -138,9 +163,6 @@ static void TEST_byte_read_success(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint16_read_empty(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Empty packet */
|
|
|
|
|
uint16_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, 0);
|
|
|
|
|
}
|
|
|
|
@ -153,9 +175,7 @@ static void TEST_uint16_read_empty(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint16_read_truncated(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* 1 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -172,9 +192,7 @@ static void TEST_uint16_read_truncated(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint16_read_success(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* 0 value */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -208,9 +226,6 @@ static void TEST_uint16_read_success(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint32_read_empty(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Empty packet */
|
|
|
|
|
uint32_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, 0);
|
|
|
|
|
}
|
|
|
|
@ -223,9 +238,7 @@ static void TEST_uint32_read_empty(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint32_read_truncated(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* 1 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -255,9 +268,7 @@ static void TEST_uint32_read_truncated(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_uint32_read_success(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* 0 value */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -297,9 +308,6 @@ static void TEST_uint32_read_success(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_varint_read_empty(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Empty packet */
|
|
|
|
|
varint_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, -1, -1);
|
|
|
|
|
}
|
|
|
|
@ -312,9 +320,7 @@ static void TEST_varint_read_empty(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_varint_read_truncated(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Varint bigger than packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -351,9 +357,7 @@ static void TEST_varint_read_truncated(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_varint_read_boundaries(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Value = 0 */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
@ -367,21 +371,18 @@ static void TEST_varint_read_boundaries(void)
|
|
|
|
|
|
|
|
|
|
/* Value = 128 (just after the crossover to two bytes */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x01;
|
|
|
|
|
varint_read_helper(payload, 2, MOSQ_ERR_SUCCESS, 128, 2);
|
|
|
|
|
|
|
|
|
|
/* Value = 16383 (just before the crossover to three bytes */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0x7F;
|
|
|
|
|
varint_read_helper(payload, 2, MOSQ_ERR_SUCCESS, 16383, 2);
|
|
|
|
|
|
|
|
|
|
/* Value = 16384 (just after the crossover to three bytes */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x80;
|
|
|
|
|
payload[2] = 0x01;
|
|
|
|
@ -389,7 +390,6 @@ static void TEST_varint_read_boundaries(void)
|
|
|
|
|
|
|
|
|
|
/* Value = 2,097,151 (just before the crossover to four bytes */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0xFF;
|
|
|
|
|
payload[2] = 0x7F;
|
|
|
|
@ -397,7 +397,6 @@ static void TEST_varint_read_boundaries(void)
|
|
|
|
|
|
|
|
|
|
/* Value = 2,097,152 (just after the crossover to four bytes */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x80;
|
|
|
|
|
payload[2] = 0x80;
|
|
|
|
@ -406,7 +405,6 @@ static void TEST_varint_read_boundaries(void)
|
|
|
|
|
|
|
|
|
|
/* Value = 268,435,455 (highest value allowed) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0xFF;
|
|
|
|
|
payload[2] = 0xFF;
|
|
|
|
@ -421,13 +419,10 @@ static void TEST_varint_read_boundaries(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_varint_read_5_bytes(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Value = 268,435,456 (one higher than highest value allowed) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x80;
|
|
|
|
|
payload[2] = 0x80;
|
|
|
|
@ -444,27 +439,22 @@ static void TEST_varint_read_5_bytes(void)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_varint_read_overlong_encoding(void)
|
|
|
|
|
{
|
|
|
|
|
struct mosquitto__packet packet;
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 0 (1 byte value encoded as 2 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x00;
|
|
|
|
|
varint_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, -1, -1);
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 127 (1 byte value encoded as 2 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0x00;
|
|
|
|
|
varint_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, -1, -1);
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 128 (2 byte value encoded as 3 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x81;
|
|
|
|
|
payload[2] = 0x00;
|
|
|
|
@ -472,7 +462,6 @@ static void TEST_varint_read_overlong_encoding(void)
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 16,383 (2 byte value encoded as 3 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0xFF;
|
|
|
|
|
payload[2] = 0x00;
|
|
|
|
@ -480,7 +469,6 @@ static void TEST_varint_read_overlong_encoding(void)
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 16,384 (3 byte value encoded as 4 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0x80;
|
|
|
|
|
payload[1] = 0x80;
|
|
|
|
|
payload[2] = 0x81;
|
|
|
|
@ -489,7 +477,6 @@ static void TEST_varint_read_overlong_encoding(void)
|
|
|
|
|
|
|
|
|
|
/* Overlong encoding of 2,097,151 (3 byte value encoded as 4 bytes) */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
packet.payload = payload;
|
|
|
|
|
payload[0] = 0xFF;
|
|
|
|
|
payload[1] = 0xFF;
|
|
|
|
|
payload[2] = 0xFF;
|
|
|
|
@ -498,6 +485,149 @@ static void TEST_varint_read_overlong_encoding(void)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ========================================================================
|
|
|
|
|
* UTF-8 STRING TESTS
|
|
|
|
|
* ======================================================================== */
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * Empty packet
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_empty(void)
|
|
|
|
|
{
|
|
|
|
|
string_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, NULL, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * Truncated packets
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_truncated(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
|
|
|
|
|
/* 1 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x02;
|
|
|
|
|
string_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, NULL, -1);
|
|
|
|
|
|
|
|
|
|
/* 2 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x02;
|
|
|
|
|
payload[1] = 0x02;
|
|
|
|
|
string_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, NULL, -1);
|
|
|
|
|
|
|
|
|
|
/* 3 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x02;
|
|
|
|
|
payload[2] = 'a';
|
|
|
|
|
string_read_helper(payload, 3, MOSQ_ERR_PROTOCOL, NULL, -1);
|
|
|
|
|
|
|
|
|
|
/* 3 byte packet */
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x03;
|
|
|
|
|
payload[2] = 'a';
|
|
|
|
|
payload[3] = 'b';
|
|
|
|
|
string_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, NULL, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * Empty string
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_empty_string(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x00;
|
|
|
|
|
string_read_helper(payload, 2, MOSQ_ERR_SUCCESS, "", 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * Valid string
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_valid_string(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x0b;
|
|
|
|
|
payload[2] = 't';
|
|
|
|
|
payload[3] = 'e';
|
|
|
|
|
payload[4] = 's';
|
|
|
|
|
payload[5] = 't';
|
|
|
|
|
payload[6] = ' ';
|
|
|
|
|
payload[7] = 's';
|
|
|
|
|
payload[8] = 't';
|
|
|
|
|
payload[9] = 'r';
|
|
|
|
|
payload[10] = 'i';
|
|
|
|
|
payload[11] = 'n';
|
|
|
|
|
payload[12] = 'g';
|
|
|
|
|
string_read_helper(payload, 13, MOSQ_ERR_SUCCESS, "test string", 11);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * Malformed UTF-8 (note, comprehensive UTF-8 tests are elsewhere)
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_malformed_string(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x07;
|
|
|
|
|
payload[2] = 't';
|
|
|
|
|
payload[3] = 'e';
|
|
|
|
|
payload[4] = 's';
|
|
|
|
|
payload[5] = 't';
|
|
|
|
|
payload[6] = 0xED; /* U+D800 - single UTF-16 surrogate */
|
|
|
|
|
payload[7] = 0xA0;
|
|
|
|
|
payload[8] = 0x80;
|
|
|
|
|
string_read_helper(payload, 9, MOSQ_ERR_MALFORMED_UTF8, NULL, -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This tests reading a UTF-8 Encoded String from an incoming packet.
|
|
|
|
|
*
|
|
|
|
|
* It tests:
|
|
|
|
|
* * MQTT-1.5.4-3 - Is 0xEF 0xBB 0xBF treated correctly.
|
|
|
|
|
*/
|
|
|
|
|
static void TEST_string_read_mqtt_1_5_4_3(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t payload[20];
|
|
|
|
|
|
|
|
|
|
memset(payload, 0, sizeof(payload));
|
|
|
|
|
payload[0] = 0x00;
|
|
|
|
|
payload[1] = 0x0b;
|
|
|
|
|
payload[2] = 't';
|
|
|
|
|
payload[3] = 'e';
|
|
|
|
|
payload[4] = 's';
|
|
|
|
|
payload[5] = 't';
|
|
|
|
|
payload[6] = 0xEF; /* U+FEFF - zero with no-break space */
|
|
|
|
|
payload[7] = 0xBB;
|
|
|
|
|
payload[8] = 0xBF;
|
|
|
|
|
payload[9] = 't';
|
|
|
|
|
payload[10] = 'e';
|
|
|
|
|
payload[11] = 's';
|
|
|
|
|
payload[12] = 't';
|
|
|
|
|
string_read_helper(payload, 13, MOSQ_ERR_SUCCESS, &payload[2], 11);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ========================================================================
|
|
|
|
|
* TEST SUITE SETUP
|
|
|
|
|
* ======================================================================== */
|
|
|
|
@ -526,6 +656,12 @@ int init_datatype_tests(void)
|
|
|
|
|
|| !CU_add_test(test_suite, "Variable Byte Integer read (encoding boundaries)", TEST_varint_read_boundaries)
|
|
|
|
|
|| !CU_add_test(test_suite, "Variable Byte Integer read (five byte encoding)", TEST_varint_read_5_bytes)
|
|
|
|
|
|| !CU_add_test(test_suite, "Variable Byte Integer read (overlong encodings)", TEST_varint_read_overlong_encoding)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (empty packet)", TEST_string_read_empty)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (truncated packet)", TEST_string_read_truncated)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (empty string)", TEST_string_read_empty_string)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (valid string)", TEST_string_read_valid_string)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (malformed string)", TEST_string_read_malformed_string)
|
|
|
|
|
|| !CU_add_test(test_suite, "UTF-8 string read (MQTT-1.5.4-3)", TEST_string_read_mqtt_1_5_4_3)
|
|
|
|
|
){
|
|
|
|
|
|
|
|
|
|
printf("Error adding datatypes CUnit tests.\n");
|
|
|
|
|