From 0fad0bd02530ccdc5b15dbb1510de9b3466287a7 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 3 Oct 2018 15:04:55 +0100 Subject: [PATCH] UTF-8 String read tests. --- test/unit/Makefile | 13 ++- test/unit/datatypes.c | 216 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 184 insertions(+), 45 deletions(-) diff --git a/test/unit/Makefile b/test/unit/Makefile index 4d8d7388..e6e679c0 100644 --- a/test/unit/Makefile +++ b/test/unit/Makefile @@ -2,19 +2,22 @@ include ../../config.mk .PHONY: all test clean coverage -CFLAGS=-I../.. -I../../lib -coverage +CFLAGS=-I../.. -I../../lib -coverage -Wall TEST_LDFLAGS=-lcunit -coverage all : test -packet_datatypes.o : ../../lib/packet_datatypes.c - $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $^ +mosq_test : test.o datatypes.o memory_mosq.o packet_datatypes.o utf8_mosq.o + $(CROSS_COMPILE)$(CC) -o $@ $^ ${TEST_LDFLAGS} memory_mosq.o : ../../lib/memory_mosq.c $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $^ -mosq_test : test.o datatypes.o memory_mosq.o packet_datatypes.o - $(CROSS_COMPILE)$(CC) -o $@ $^ ${TEST_LDFLAGS} +packet_datatypes.o : ../../lib/packet_datatypes.c + $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $^ + +utf8_mosq.o : ../../lib/utf8_mosq.c + $(CROSS_COMPILE)$(CC) $(CFLAGS) -c -o $@ $^ test : mosq_test ./mosq_test diff --git a/test/unit/datatypes.c b/test/unit/datatypes.c index 25b3e0d7..05439e25 100644 --- a/test/unit/datatypes.c +++ b/test/unit/datatypes.c @@ -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");