Binary data read functions and tests.

This commit is contained in:
Roger A. Light 2018-10-03 21:35:33 +01:00
parent 99e324e860
commit 72131c84ce
4 changed files with 104 additions and 8 deletions

View File

@ -88,7 +88,7 @@ void packet__write_bytes(struct mosquitto__packet *packet, const void *bytes, ui
}
int packet__read_string(struct mosquitto__packet *packet, char **str, int *length)
int packet__read_binary(struct mosquitto__packet *packet, void **data, int *length)
{
uint16_t slen;
int rc;
@ -99,22 +99,35 @@ int packet__read_string(struct mosquitto__packet *packet, char **str, int *lengt
if(packet->pos+slen > packet->remaining_length) return MOSQ_ERR_PROTOCOL;
*str = mosquitto__malloc(slen+1);
if(*str){
memcpy(*str, &(packet->payload[packet->pos]), slen);
(*str)[slen] = '\0';
*data = mosquitto__malloc(slen+1);
if(*data){
memcpy(*data, &(packet->payload[packet->pos]), slen);
((uint8_t *)(*data))[slen] = '\0';
packet->pos += slen;
}else{
return MOSQ_ERR_NOMEM;
}
if(mosquitto_validate_utf8(*str, slen)){
*length = slen;
return MOSQ_ERR_SUCCESS;
}
int packet__read_string(struct mosquitto__packet *packet, char **str, int *length)
{
int rc;
int len;
rc = packet__read_binary(packet, (void **)str, &len);
if(rc) return rc;
if(mosquitto_validate_utf8(*str, len)){
mosquitto__free(*str);
*str = NULL;
return MOSQ_ERR_MALFORMED_UTF8;
}
*length = slen;
*length = len;
return MOSQ_ERR_SUCCESS;
}

View File

@ -29,6 +29,7 @@ int packet__queue(struct mosquitto *mosq, struct mosquitto__packet *packet);
int packet__read_byte(struct mosquitto__packet *packet, uint8_t *byte);
int packet__read_bytes(struct mosquitto__packet *packet, void *bytes, uint32_t count);
int packet__read_binary(struct mosquitto__packet *packet, void **data, int *length);
int packet__read_string(struct mosquitto__packet *packet, char **str, int *length);
int packet__read_uint16(struct mosquitto__packet *packet, uint16_t *word);
int packet__read_uint32(struct mosquitto__packet *packet, uint32_t *word);

View File

@ -2,7 +2,7 @@ include ../../config.mk
.PHONY: all test clean coverage
CFLAGS=-I../.. -I../../lib -coverage -Wall
CFLAGS=-I../.. -I../../lib -coverage -Wall -ggdb
TEST_LDFLAGS=-lcunit -coverage
all : test

View File

@ -82,6 +82,34 @@ static void varint_read_helper(
}
static void binary_read_helper(
uint8_t *payload,
int remaining_length,
int rc_expected,
const uint8_t *value_expected,
int length_expected)
{
struct mosquitto__packet packet;
uint8_t *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_binary(&packet, (void **)&value, &length);
CU_ASSERT_EQUAL(rc, rc_expected);
if(value_expected){
/* FIXME - this should be a memcmp */
CU_ASSERT_NSTRING_EQUAL(value, value_expected, length_expected);
}else{
CU_ASSERT_EQUAL(value, NULL);
}
CU_ASSERT_EQUAL(length, length_expected);
free(value);
}
static void string_read_helper(
uint8_t *payload,
int remaining_length,
@ -628,6 +656,58 @@ static void TEST_string_read_mqtt_1_5_4_3(void)
}
/* ========================================================================
* BINARY DATA TESTS
* ======================================================================== */
/* This tests reading Binary Data from an incoming packet.
*
* It tests:
* * Empty packet
*/
static void TEST_binary_data_read_empty(void)
{
binary_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, NULL, -1);
}
/* This tests reading Binary Data from an incoming packet.
*
* It tests:
* * Truncated packets
*/
static void TEST_binary_data_read_truncated(void)
{
uint8_t payload[20];
/* 1 byte packet */
memset(payload, 0, sizeof(payload));
payload[0] = 0x02;
binary_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, NULL, -1);
/* 2 byte packet */
memset(payload, 0, sizeof(payload));
payload[0] = 0x02;
payload[1] = 0x02;
binary_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';
binary_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';
binary_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, NULL, -1);
}
/* ========================================================================
* TEST SUITE SETUP
* ======================================================================== */
@ -662,6 +742,8 @@ int init_datatype_read_tests(void)
|| !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)
|| !CU_add_test(test_suite, "Binary Data read (empty packet)", TEST_binary_data_read_empty)
|| !CU_add_test(test_suite, "Binary Data read (truncated packet)", TEST_binary_data_read_truncated)
){
printf("Error adding datatypes CUnit tests.\n");