From ba2ca336713bfac1b971e6101e75b114b49ab05f Mon Sep 17 00:00:00 2001 From: Roger Light Date: Wed, 16 Jun 2021 21:48:57 +0100 Subject: [PATCH] Strict protocol compliance fixes, and extensive test suite. --- ChangeLog.txt | 1 + lib/handle_auth.c | 3 + lib/handle_connack.c | 4 + lib/handle_disconnect.c | 3 + lib/handle_ping.c | 8 +- lib/handle_pubackcomp.c | 53 +- lib/handle_pubrec.c | 23 + lib/handle_pubrel.c | 14 + lib/handle_suback.c | 7 + lib/handle_unsuback.c | 7 + lib/packet_datatypes.c | 18 +- lib/packet_mosq.c | 33 +- lib/property_mosq.c | 5 +- src/handle_auth.c | 3 + src/handle_connack.c | 8 +- src/handle_connect.c | 5 +- src/handle_disconnect.c | 7 +- src/handle_publish.c | 14 +- src/handle_subscribe.c | 3 + src/handle_unsubscribe.c | 3 + src/loop.c | 2 +- src/read_handle.c | 36 +- test/broker/01-connect-bad-packet.py | 43 -- test/broker/01-connect-connack-2163.py | 50 -- test/broker/01-connect-disconnect-v5.py | 1 - test/broker/01-connect-duplicate.py | 39 -- test/broker/01-connect-invalid-id-0.py | 37 -- test/broker/01-connect-invalid-id-missing.py | 28 - test/broker/01-connect-invalid-id-utf8.py | 39 -- test/broker/01-connect-invalid-protonum.py | 30 - test/broker/01-connect-invalid-reserved.py | 32 - test/broker/01-connect-success.py | 35 -- test/broker/01-connect-uname-invalid-utf8.py | 39 -- test/broker/01-connect-uname-no-flag.py | 39 -- test/broker/01-connect-uname-pwd-no-flag.py | 40 -- test/broker/02-subpub-qos0.py | 45 -- test/broker/02-subpub-qos1-bad-pubcomp.py | 76 --- test/broker/02-subpub-qos1-bad-pubrec.py | 73 --- test/broker/02-subpub-qos2-bad-puback-1.py | 76 --- test/broker/02-subpub-qos2-bad-puback-2.py | 75 --- test/broker/02-subpub-qos2-bad-pubcomp.py | 76 --- test/broker/02-subscribe-qos0.py | 43 -- test/broker/02-subscribe-qos1.py | 41 -- test/broker/02-subscribe-qos2.py | 41 -- .../broker/02-unsubscribe-invalid-no-topic.py | 48 -- test/broker/02-unsubscribe-qos0.py | 45 -- test/broker/02-unsubscribe-qos1.py | 44 -- test/broker/02-unsubscribe-qos2-multiple.py | 50 -- test/broker/02-unsubscribe-qos2.py | 44 -- test/broker/03-publish-long-topic.py | 2 +- test/broker/09-extended-auth-unsupported.py | 35 -- .../12-prop-maximum-packet-size-connect.py | 32 - .../12-prop-maximum-packet-size-publish.py | 44 -- test/broker/12-prop-session-expiry-invalid.py | 39 -- test/broker/12-prop-subpub-content-type.py | 2 +- test/broker/12-prop-subpub-payload-format.py | 2 +- test/broker/12-prop-topic-alias-invalid.py | 39 -- test/broker/13-malformed-publish-v5.py | 4 +- test/broker/Makefile | 40 +- test/broker/data/AUTH.json | 40 ++ test/broker/data/CONNACK.json | 529 ++++++++++++++++ test/broker/data/CONNECT.json | 202 ++++++ test/broker/data/DISCONNECT.json | 431 +++++++++++++ test/broker/data/FLOW.json | 211 +++++++ test/broker/data/FORBIDDEN.json | 52 ++ test/broker/data/PINGREQ.json | 38 ++ test/broker/data/PINGRESP.json | 41 ++ test/broker/data/PUBACK.json | 398 ++++++++++++ test/broker/data/PUBCOMP.json | 432 +++++++++++++ test/broker/data/PUBLISH.json | 574 ++++++++++++++++++ test/broker/data/PUBREC.json | 419 +++++++++++++ test/broker/data/PUBREL.json | 426 +++++++++++++ test/broker/data/SUBACK.json | 450 ++++++++++++++ test/broker/data/SUBSCRIBE.json | 476 +++++++++++++++ test/broker/data/UNSUBACK.json | 417 +++++++++++++ test/broker/data/UNSUBSCRIBE.json | 357 +++++++++++ test/broker/data/ZZ-broker-check.json | 8 + test/broker/msg_sequence_test.py | 223 +++++++ test/broker/prop_subpub_helper.py | 9 +- test/broker/test.py | 31 - test/mosq_test.py | 23 +- test/unit/datatype_read.c | 60 +- test/unit/property_read.c | 16 +- 83 files changed, 6023 insertions(+), 1568 deletions(-) delete mode 100755 test/broker/01-connect-bad-packet.py delete mode 100755 test/broker/01-connect-connack-2163.py delete mode 100755 test/broker/01-connect-duplicate.py delete mode 100755 test/broker/01-connect-invalid-id-0.py delete mode 100755 test/broker/01-connect-invalid-id-missing.py delete mode 100755 test/broker/01-connect-invalid-id-utf8.py delete mode 100755 test/broker/01-connect-invalid-protonum.py delete mode 100755 test/broker/01-connect-invalid-reserved.py delete mode 100755 test/broker/01-connect-success.py delete mode 100755 test/broker/01-connect-uname-invalid-utf8.py delete mode 100755 test/broker/01-connect-uname-no-flag.py delete mode 100755 test/broker/01-connect-uname-pwd-no-flag.py delete mode 100755 test/broker/02-subpub-qos0.py delete mode 100755 test/broker/02-subpub-qos1-bad-pubcomp.py delete mode 100755 test/broker/02-subpub-qos1-bad-pubrec.py delete mode 100755 test/broker/02-subpub-qos2-bad-puback-1.py delete mode 100755 test/broker/02-subpub-qos2-bad-puback-2.py delete mode 100755 test/broker/02-subpub-qos2-bad-pubcomp.py delete mode 100755 test/broker/02-subscribe-qos0.py delete mode 100755 test/broker/02-subscribe-qos1.py delete mode 100755 test/broker/02-subscribe-qos2.py delete mode 100755 test/broker/02-unsubscribe-invalid-no-topic.py delete mode 100755 test/broker/02-unsubscribe-qos0.py delete mode 100755 test/broker/02-unsubscribe-qos1.py delete mode 100755 test/broker/02-unsubscribe-qos2-multiple.py delete mode 100755 test/broker/02-unsubscribe-qos2.py delete mode 100755 test/broker/09-extended-auth-unsupported.py delete mode 100755 test/broker/12-prop-maximum-packet-size-connect.py delete mode 100755 test/broker/12-prop-maximum-packet-size-publish.py delete mode 100755 test/broker/12-prop-session-expiry-invalid.py delete mode 100755 test/broker/12-prop-topic-alias-invalid.py create mode 100644 test/broker/data/AUTH.json create mode 100644 test/broker/data/CONNACK.json create mode 100644 test/broker/data/CONNECT.json create mode 100644 test/broker/data/DISCONNECT.json create mode 100644 test/broker/data/FLOW.json create mode 100644 test/broker/data/FORBIDDEN.json create mode 100644 test/broker/data/PINGREQ.json create mode 100644 test/broker/data/PINGRESP.json create mode 100644 test/broker/data/PUBACK.json create mode 100644 test/broker/data/PUBCOMP.json create mode 100644 test/broker/data/PUBLISH.json create mode 100644 test/broker/data/PUBREC.json create mode 100644 test/broker/data/PUBREL.json create mode 100644 test/broker/data/SUBACK.json create mode 100644 test/broker/data/SUBSCRIBE.json create mode 100644 test/broker/data/UNSUBACK.json create mode 100644 test/broker/data/UNSUBSCRIBE.json create mode 100644 test/broker/data/ZZ-broker-check.json create mode 100755 test/broker/msg_sequence_test.py diff --git a/ChangeLog.txt b/ChangeLog.txt index c65c01be..f60ec06e 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -28,6 +28,7 @@ Broker: directory. Closes #2241. - Fix listener mount_point not being removed on outgoing messages. Closes #2244. +- Strict protocol compliance fixes, plus test suite. Client library: - If a client uses TLS-PSK then force the default cipher list to use "PSK" diff --git a/lib/handle_auth.c b/lib/handle_auth.c index 61f3bb4f..c1cc6f28 100644 --- a/lib/handle_auth.c +++ b/lib/handle_auth.c @@ -41,6 +41,9 @@ int handle__auth(struct mosquitto *mosq) if(mosq->protocol != mosq_p_mqtt5){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_AUTH){ + return MOSQ_ERR_MALFORMED_PACKET; + } if(packet__read_byte(&mosq->in_packet, &reason_code)) return 1; diff --git a/lib/handle_connack.c b/lib/handle_connack.c index 5380243d..4d77e46d 100644 --- a/lib/handle_connack.c +++ b/lib/handle_connack.c @@ -65,6 +65,10 @@ int handle__connack(struct mosquitto *mosq) char *clientid = NULL; assert(mosq); + if(mosq->in_packet.command != CMD_CONNACK){ + return MOSQ_ERR_MALFORMED_PACKET; + } + rc = packet__read_byte(&mosq->in_packet, &connect_flags); if(rc) return rc; rc = packet__read_byte(&mosq->in_packet, &reason_code); diff --git a/lib/handle_disconnect.c b/lib/handle_disconnect.c index 28c51845..e5191b22 100644 --- a/lib/handle_disconnect.c +++ b/lib/handle_disconnect.c @@ -44,6 +44,9 @@ int handle__disconnect(struct mosquitto *mosq) if(mosq->protocol != mosq_p_mqtt5){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_DISCONNECT){ + return MOSQ_ERR_MALFORMED_PACKET; + } rc = packet__read_byte(&mosq->in_packet, &reason_code); if(rc) return rc; diff --git a/lib/handle_ping.c b/lib/handle_ping.c index 24a9e4e5..8ca3646e 100644 --- a/lib/handle_ping.c +++ b/lib/handle_ping.c @@ -44,11 +44,14 @@ int handle__pingreq(struct mosquitto *mosq) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_PINGREQ){ + return MOSQ_ERR_MALFORMED_PACKET; + } #ifdef WITH_BROKER log__printf(NULL, MOSQ_LOG_DEBUG, "Received PINGREQ from %s", mosq->id); #else - log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received PINGREQ", mosq->id); + return MOSQ_ERR_PROTOCOL; #endif return send__pingresp(mosq); } @@ -63,6 +66,9 @@ int handle__pingresp(struct mosquitto *mosq) mosq->ping_t = 0; /* No longer waiting for a PINGRESP. */ #ifdef WITH_BROKER + if(mosq->bridge == NULL){ + return MOSQ_ERR_PROTOCOL; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received PINGRESP from %s", mosq->id); #else log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received PINGRESP", mosq->id); diff --git a/lib/handle_pubackcomp.c b/lib/handle_pubackcomp.c index 5755708e..2bc808cd 100644 --- a/lib/handle_pubackcomp.c +++ b/lib/handle_pubackcomp.c @@ -51,6 +51,11 @@ int handle__pubackcomp(struct mosquitto *mosq, const char *type) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->protocol != mosq_p_mqtt31){ + if((mosq->in_packet.command&0x0F) != 0x00){ + return MOSQ_ERR_MALFORMED_PACKET; + } + } pthread_mutex_lock(&mosq->msgs_out.mutex); util__increment_send_quota(mosq); @@ -58,17 +63,59 @@ int handle__pubackcomp(struct mosquitto *mosq, const char *type) rc = packet__read_uint16(&mosq->in_packet, &mid); if(rc) return rc; - qos = type[3] == 'A'?1:2; /* pubAck or pubComp */ - if(mid == 0) return MOSQ_ERR_PROTOCOL; + if(type[3] == 'A'){ /* pubAck or pubComp */ + if(mosq->in_packet.command != CMD_PUBACK){ + return MOSQ_ERR_MALFORMED_PACKET; + } + qos = 1; + }else{ + if(mosq->in_packet.command != CMD_PUBCOMP){ + return MOSQ_ERR_MALFORMED_PACKET; + } + qos = 2; + } + if(mid == 0){ + return MOSQ_ERR_PROTOCOL; + } if(mosq->protocol == mosq_p_mqtt5 && mosq->in_packet.remaining_length > 2){ rc = packet__read_byte(&mosq->in_packet, &reason_code); - if(rc) return rc; + if(rc){ + return rc; + } if(mosq->in_packet.remaining_length > 3){ rc = property__read_all(CMD_PUBACK, &mosq->in_packet, &properties); if(rc) return rc; } + if(type[3] == 'A'){ /* pubAck or pubComp */ + if(reason_code != MQTT_RC_SUCCESS + && reason_code != MQTT_RC_NO_MATCHING_SUBSCRIBERS + && reason_code != MQTT_RC_UNSPECIFIED + && reason_code != MQTT_RC_IMPLEMENTATION_SPECIFIC + && reason_code != MQTT_RC_NOT_AUTHORIZED + && reason_code != MQTT_RC_TOPIC_NAME_INVALID + && reason_code != MQTT_RC_PACKET_ID_IN_USE + && reason_code != MQTT_RC_QUOTA_EXCEEDED + && reason_code != MQTT_RC_PAYLOAD_FORMAT_INVALID + ){ + + return MOSQ_ERR_PROTOCOL; + } + }else{ + if(reason_code != MQTT_RC_SUCCESS + && reason_code != MQTT_RC_PACKET_ID_NOT_FOUND + ){ + + return MOSQ_ERR_PROTOCOL; + } + } + } + if(mosq->in_packet.pos < mosq->in_packet.remaining_length){ +#ifdef WITH_BROKER + mosquitto_property_free_all(&properties); +#endif + return MOSQ_ERR_MALFORMED_PACKET; } #ifdef WITH_BROKER diff --git a/lib/handle_pubrec.c b/lib/handle_pubrec.c index b741a076..b94ca009 100644 --- a/lib/handle_pubrec.c +++ b/lib/handle_pubrec.c @@ -49,6 +49,9 @@ int handle__pubrec(struct mosquitto *mosq) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_PUBREC){ + return MOSQ_ERR_MALFORMED_PACKET; + } rc = packet__read_uint16(&mosq->in_packet, &mid); if(rc) return rc; @@ -58,14 +61,34 @@ int handle__pubrec(struct mosquitto *mosq) rc = packet__read_byte(&mosq->in_packet, &reason_code); if(rc) return rc; + if(reason_code != MQTT_RC_SUCCESS + && reason_code != MQTT_RC_NO_MATCHING_SUBSCRIBERS + && reason_code != MQTT_RC_UNSPECIFIED + && reason_code != MQTT_RC_IMPLEMENTATION_SPECIFIC + && reason_code != MQTT_RC_NOT_AUTHORIZED + && reason_code != MQTT_RC_TOPIC_NAME_INVALID + && reason_code != MQTT_RC_PACKET_ID_IN_USE + && reason_code != MQTT_RC_QUOTA_EXCEEDED){ + + return MOSQ_ERR_PROTOCOL; + } + if(mosq->in_packet.remaining_length > 3){ rc = property__read_all(CMD_PUBREC, &mosq->in_packet, &properties); if(rc) return rc; + /* Immediately free, we don't do anything with Reason String or User Property at the moment */ mosquitto_property_free_all(&properties); } } + if(mosq->in_packet.pos < mosq->in_packet.remaining_length){ +#ifdef WITH_BROKER + mosquitto_property_free_all(&properties); +#endif + return MOSQ_ERR_MALFORMED_PACKET; + } + #ifdef WITH_BROKER log__printf(NULL, MOSQ_LOG_DEBUG, "Received PUBREC from %s (Mid: %d)", mosq->id, mid); diff --git a/lib/handle_pubrel.c b/lib/handle_pubrel.c index b52e631c..cdbebf4a 100644 --- a/lib/handle_pubrel.c +++ b/lib/handle_pubrel.c @@ -53,6 +53,9 @@ int handle__pubrel(struct mosquitto *mosq) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->protocol != mosq_p_mqtt31 && mosq->in_packet.command != (CMD_PUBREL|2)){ + return MOSQ_ERR_MALFORMED_PACKET; + } if(mosq->protocol != mosq_p_mqtt31){ if((mosq->in_packet.command&0x0F) != 0x02){ @@ -67,12 +70,23 @@ int handle__pubrel(struct mosquitto *mosq) rc = packet__read_byte(&mosq->in_packet, &reason_code); if(rc) return rc; + if(reason_code != MQTT_RC_SUCCESS && reason_code != MQTT_RC_PACKET_ID_NOT_FOUND){ + return MOSQ_ERR_PROTOCOL; + } + if(mosq->in_packet.remaining_length > 3){ rc = property__read_all(CMD_PUBREL, &mosq->in_packet, &properties); if(rc) return rc; } } + if(mosq->in_packet.pos < mosq->in_packet.remaining_length){ +#ifdef WITH_BROKER + mosquitto_property_free_all(&properties); +#endif + return MOSQ_ERR_MALFORMED_PACKET; + } + #ifdef WITH_BROKER log__printf(NULL, MOSQ_LOG_DEBUG, "Received PUBREL from %s (Mid: %d)", mosq->id, mid); diff --git a/lib/handle_suback.c b/lib/handle_suback.c index 770558be..5d3a4051 100644 --- a/lib/handle_suback.c +++ b/lib/handle_suback.c @@ -50,8 +50,15 @@ int handle__suback(struct mosquitto *mosq) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_SUBACK){ + return MOSQ_ERR_MALFORMED_PACKET; + } #ifdef WITH_BROKER + if(mosq->bridge == NULL){ + /* Client is not a bridge, so shouldn't be sending SUBACK */ + return MOSQ_ERR_PROTOCOL; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received SUBACK from %s", mosq->id); #else log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received SUBACK", mosq->id); diff --git a/lib/handle_unsuback.c b/lib/handle_unsuback.c index fd32d486..5b004046 100644 --- a/lib/handle_unsuback.c +++ b/lib/handle_unsuback.c @@ -50,8 +50,15 @@ int handle__unsuback(struct mosquitto *mosq) if(mosquitto__get_state(mosq) != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(mosq->in_packet.command != CMD_UNSUBACK){ + return MOSQ_ERR_MALFORMED_PACKET; + } #ifdef WITH_BROKER + if(mosq->bridge == NULL){ + /* Client is not a bridge, so shouldn't be sending SUBACK */ + return MOSQ_ERR_PROTOCOL; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received UNSUBACK from %s", mosq->id); #else log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received UNSUBACK", mosq->id); diff --git a/lib/packet_datatypes.c b/lib/packet_datatypes.c index e13d9489..57a1bc90 100644 --- a/lib/packet_datatypes.c +++ b/lib/packet_datatypes.c @@ -49,7 +49,7 @@ Contributors: int packet__read_byte(struct mosquitto__packet *packet, uint8_t *byte) { assert(packet); - if(packet->pos+1 > packet->remaining_length) return MOSQ_ERR_PROTOCOL; + if(packet->pos+1 > packet->remaining_length) return MOSQ_ERR_MALFORMED_PACKET; *byte = packet->payload[packet->pos]; packet->pos++; @@ -71,7 +71,7 @@ void packet__write_byte(struct mosquitto__packet *packet, uint8_t byte) int packet__read_bytes(struct mosquitto__packet *packet, void *bytes, uint32_t count) { assert(packet); - if(packet->pos+count > packet->remaining_length) return MOSQ_ERR_PROTOCOL; + if(packet->pos+count > packet->remaining_length) return MOSQ_ERR_MALFORMED_PACKET; memcpy(bytes, &(packet->payload[packet->pos]), count); packet->pos += count; @@ -105,7 +105,7 @@ int packet__read_binary(struct mosquitto__packet *packet, uint8_t **data, uint16 return MOSQ_ERR_SUCCESS; } - if(packet->pos+slen > packet->remaining_length) return MOSQ_ERR_PROTOCOL; + if(packet->pos+slen > packet->remaining_length) return MOSQ_ERR_MALFORMED_PACKET; *data = mosquitto__malloc(slen+1U); if(*data){ @@ -153,7 +153,7 @@ int packet__read_uint16(struct mosquitto__packet *packet, uint16_t *word) uint8_t msb, lsb; assert(packet); - if(packet->pos+2 > packet->remaining_length) return MOSQ_ERR_PROTOCOL; + if(packet->pos+2 > packet->remaining_length) return MOSQ_ERR_MALFORMED_PACKET; msb = packet->payload[packet->pos]; packet->pos++; @@ -179,7 +179,7 @@ int packet__read_uint32(struct mosquitto__packet *packet, uint32_t *word) int i; assert(packet); - if(packet->pos+4 > packet->remaining_length) return MOSQ_ERR_PROTOCOL; + if(packet->pos+4 > packet->remaining_length) return MOSQ_ERR_MALFORMED_PACKET; for(i=0; i<4; i++){ val = (val << 8) + packet->payload[packet->pos]; @@ -219,7 +219,7 @@ int packet__read_varint(struct mosquitto__packet *packet, uint32_t *word, uint8_ if((byte & 128) == 0){ if(lbytes > 1 && byte == 0){ /* Catch overlong encodings */ - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; }else{ *word = lword; if(bytes) (*bytes) = lbytes; @@ -227,10 +227,10 @@ int packet__read_varint(struct mosquitto__packet *packet, uint32_t *word, uint8_ } } }else{ - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; } } - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; } @@ -251,7 +251,7 @@ int packet__write_varint(struct mosquitto__packet *packet, uint32_t word) }while(word > 0 && count < 5); if(count == 5){ - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; } return MOSQ_ERR_SUCCESS; } diff --git a/lib/packet_mosq.c b/lib/packet_mosq.c index 43611bcd..f65769f6 100644 --- a/lib/packet_mosq.c +++ b/lib/packet_mosq.c @@ -423,7 +423,7 @@ int packet__read(struct mosquitto *mosq) * Anything more likely means a broken/malicious client. */ if(mosq->in_packet.remaining_count < -4){ - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; } G_BYTES_RECEIVED_INC(1); @@ -455,6 +455,37 @@ int packet__read(struct mosquitto *mosq) mosq->in_packet.remaining_count = (int8_t)(mosq->in_packet.remaining_count * -1); #ifdef WITH_BROKER + switch(mosq->in_packet.command & 0xF0){ + case CMD_CONNECT: + if(mosq->in_packet.remaining_length > 100000){ /* Arbitrary limit, make configurable */ + return MOSQ_ERR_MALFORMED_PACKET; + } + break; + + case CMD_PUBACK: + case CMD_PUBREC: + case CMD_PUBREL: + case CMD_PUBCOMP: + case CMD_UNSUBACK: + if(mosq->protocol != mosq_p_mqtt5 && mosq->in_packet.remaining_length != 2){ + return MOSQ_ERR_MALFORMED_PACKET; + } + break; + + case CMD_PINGREQ: + case CMD_PINGRESP: + if(mosq->in_packet.remaining_length != 0){ + return MOSQ_ERR_MALFORMED_PACKET; + } + break; + + case CMD_DISCONNECT: + if(mosq->protocol != mosq_p_mqtt5 && mosq->in_packet.remaining_length != 0){ + return MOSQ_ERR_MALFORMED_PACKET; + } + break; + } + if(db.config->max_packet_size > 0 && mosq->in_packet.remaining_length+1 > db.config->max_packet_size){ if(mosq->protocol == mosq_p_mqtt5){ send__disconnect(mosq, MQTT_RC_PACKET_TOO_LARGE, NULL); diff --git a/lib/property_mosq.c b/lib/property_mosq.c index 0cfc9f9c..b4dc73dc 100644 --- a/lib/property_mosq.c +++ b/lib/property_mosq.c @@ -48,7 +48,9 @@ static int property__read(struct mosquitto__packet *packet, uint32_t *len, mosqu if(!property) return MOSQ_ERR_INVAL; rc = packet__read_varint(packet, &property_identifier, NULL); - if(rc) return rc; + if(rc){ + return rc; + } *len -= 1; memset(property, 0, sizeof(mosquitto_property)); @@ -932,6 +934,7 @@ int mosquitto_property_check_all(int command, const mosquitto_property *properti while(p){ /* Validity checks */ if(p->identifier == MQTT_PROP_REQUEST_PROBLEM_INFORMATION + || p->identifier == MQTT_PROP_PAYLOAD_FORMAT_INDICATOR || p->identifier == MQTT_PROP_REQUEST_RESPONSE_INFORMATION || p->identifier == MQTT_PROP_MAXIMUM_QOS || p->identifier == MQTT_PROP_RETAIN_AVAILABLE diff --git a/src/handle_auth.c b/src/handle_auth.c index 299e0a64..c2908f84 100644 --- a/src/handle_auth.c +++ b/src/handle_auth.c @@ -47,6 +47,9 @@ int handle__auth(struct mosquitto *context) if(context->protocol != mosq_p_mqtt5 || context->auth_method == NULL){ return MOSQ_ERR_PROTOCOL; } + if(context->in_packet.command != CMD_AUTH){ + return MOSQ_ERR_MALFORMED_PACKET; + } if(context->in_packet.remaining_length > 0){ if(packet__read_byte(&context->in_packet, &reason_code)) return MOSQ_ERR_MALFORMED_PACKET; diff --git a/src/handle_connack.c b/src/handle_connack.c index 573a0ab0..18e40fb8 100644 --- a/src/handle_connack.c +++ b/src/handle_connack.c @@ -39,9 +39,15 @@ int handle__connack(struct mosquitto *context) uint16_t server_keepalive; uint8_t max_qos = 255; - if(context == NULL || context->bridge == NULL){ + if(context == NULL){ return MOSQ_ERR_INVAL; } + if(context->bridge == NULL){ + return MOSQ_ERR_PROTOCOL; + } + if(context->in_packet.command != CMD_CONNACK){ + return MOSQ_ERR_MALFORMED_PACKET; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received CONNACK on connection %s.", context->id); if(packet__read_byte(&context->in_packet, &connect_acknowledge)) return MOSQ_ERR_MALFORMED_PACKET; if(packet__read_byte(&context->in_packet, &reason_code)) return MOSQ_ERR_MALFORMED_PACKET; diff --git a/src/handle_connect.c b/src/handle_connect.c index 3643caea..29877e9d 100644 --- a/src/handle_connect.c +++ b/src/handle_connect.c @@ -445,6 +445,9 @@ int handle__connect(struct mosquitto *context) rc = MOSQ_ERR_PROTOCOL; goto handle_connect_error; } + if(context->in_packet.command != CMD_CONNECT){ + return MOSQ_ERR_MALFORMED_PACKET; + } /* Read protocol name as length then bytes rather than with read_string * because the length is fixed and we can check that. Removes the need @@ -673,7 +676,7 @@ int handle__connect(struct mosquitto *context) if(rc == MOSQ_ERR_NOMEM){ rc = MOSQ_ERR_NOMEM; goto handle_connect_error; - }else if(rc == MOSQ_ERR_PROTOCOL){ + }else if(rc == MOSQ_ERR_MALFORMED_PACKET){ if(context->protocol == mosq_p_mqtt31){ /* Password flag given, but no password. Ignore. */ }else{ diff --git a/src/handle_disconnect.c b/src/handle_disconnect.c index 2beb676a..4de8bdc7 100644 --- a/src/handle_disconnect.c +++ b/src/handle_disconnect.c @@ -37,6 +37,10 @@ int handle__disconnect(struct mosquitto *context) return MOSQ_ERR_INVAL; } + if(context->in_packet.command != CMD_DISCONNECT){ + return MOSQ_ERR_MALFORMED_PACKET; + } + if(context->protocol == mosq_p_mqtt5 && context->in_packet.remaining_length > 0){ /* FIXME - must handle reason code */ rc = packet__read_byte(&context->in_packet, &reason_code); @@ -49,9 +53,6 @@ int handle__disconnect(struct mosquitto *context) } rc = property__process_disconnect(context, &properties); if(rc){ - if(rc == MOSQ_ERR_PROTOCOL){ - send__disconnect(context, MQTT_RC_PROTOCOL_ERROR, NULL); - } mosquitto_property_free_all(&properties); return rc; } diff --git a/src/handle_publish.c b/src/handle_publish.c index aa3f8798..111f0316 100644 --- a/src/handle_publish.c +++ b/src/handle_publish.c @@ -64,6 +64,12 @@ int handle__publish(struct mosquitto *context) dup = (header & 0x08)>>3; msg->qos = (header & 0x06)>>1; + if(dup == 1 && msg->qos == 0){ + log__printf(NULL, MOSQ_LOG_INFO, + "Invalid PUBLISH (QoS=0 and DUP=1) from %s, disconnecting.", context->id); + db__msg_store_free(msg); + return MOSQ_ERR_MALFORMED_PACKET; + } if(msg->qos == 3){ log__printf(NULL, MOSQ_LOG_INFO, "Invalid QoS in PUBLISH from %s, disconnecting.", context->id); @@ -112,11 +118,7 @@ int handle__publish(struct mosquitto *context) rc = property__read_all(CMD_PUBLISH, &context->in_packet, &properties); if(rc){ db__msg_store_free(msg); - if(rc == MOSQ_ERR_PROTOCOL){ - return MOSQ_ERR_MALFORMED_PACKET; - }else{ - return rc; - } + return rc; } p = properties; @@ -202,7 +204,7 @@ int handle__publish(struct mosquitto *context) if(mosquitto_pub_topic_check(msg->topic) != MOSQ_ERR_SUCCESS){ /* Invalid publish topic, just swallow it. */ db__msg_store_free(msg); - return MOSQ_ERR_PROTOCOL; + return MOSQ_ERR_MALFORMED_PACKET; } msg->payloadlen = context->in_packet.remaining_length - context->in_packet.pos; diff --git a/src/handle_subscribe.c b/src/handle_subscribe.c index 2a72c597..24dc4eec 100644 --- a/src/handle_subscribe.c +++ b/src/handle_subscribe.c @@ -52,6 +52,9 @@ int handle__subscribe(struct mosquitto *context) if(context->state != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(context->in_packet.command != (CMD_SUBSCRIBE|2)){ + return MOSQ_ERR_MALFORMED_PACKET; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received SUBSCRIBE from %s", context->id); diff --git a/src/handle_unsubscribe.c b/src/handle_unsubscribe.c index 2162b465..603e0cde 100644 --- a/src/handle_unsubscribe.c +++ b/src/handle_unsubscribe.c @@ -45,6 +45,9 @@ int handle__unsubscribe(struct mosquitto *context) if(context->state != mosq_cs_active){ return MOSQ_ERR_PROTOCOL; } + if(context->in_packet.command != (CMD_UNSUBSCRIBE|2)){ + return MOSQ_ERR_MALFORMED_PACKET; + } log__printf(NULL, MOSQ_LOG_DEBUG, "Received UNSUBSCRIBE from %s", context->id); if(context->protocol != mosq_p_mqtt31){ diff --git a/src/loop.c b/src/loop.c index 34d00493..3a770ca1 100644 --- a/src/loop.c +++ b/src/loop.c @@ -348,7 +348,7 @@ void do_disconnect(struct mosquitto *context, int reason) log__printf(NULL, MOSQ_LOG_NOTICE, "Client %s disconnected due to out of memory.", id); break; case MOSQ_ERR_NOT_SUPPORTED: - log__printf(NULL, MOSQ_LOG_NOTICE, "Client %s disconnected due to QoS too high or retain not supported.", id); + log__printf(NULL, MOSQ_LOG_NOTICE, "Client %s disconnected due to using not allowed feature (QoS too high, retain not supported, or bad AUTH method).", id); break; case MOSQ_ERR_ADMINISTRATIVE_ACTION: log__printf(NULL, MOSQ_LOG_NOTICE, "Client %s been disconnected by administrative action.", id); diff --git a/src/read_handle.c b/src/read_handle.c index 416c32ab..c143d7e2 100644 --- a/src/read_handle.c +++ b/src/read_handle.c @@ -40,24 +40,31 @@ int handle__packet(struct mosquitto *context) switch((context->in_packet.command)&0xF0){ case CMD_PINGREQ: - return handle__pingreq(context); + rc = handle__pingreq(context); + break; case CMD_PINGRESP: - return handle__pingresp(context); + rc = handle__pingresp(context); + break; case CMD_PUBACK: - return handle__pubackcomp(context, "PUBACK"); + rc = handle__pubackcomp(context, "PUBACK"); + break; case CMD_PUBCOMP: - return handle__pubackcomp(context, "PUBCOMP"); + rc = handle__pubackcomp(context, "PUBCOMP"); + break; case CMD_PUBLISH: rc = handle__publish(context); break; case CMD_PUBREC: - return handle__pubrec(context); + rc = handle__pubrec(context); + break; case CMD_PUBREL: - return handle__pubrel(context); + rc = handle__pubrel(context); + break; case CMD_CONNECT: return handle__connect(context); case CMD_DISCONNECT: - return handle__disconnect(context); + rc = handle__disconnect(context); + break; case CMD_SUBSCRIBE: rc = handle__subscribe(context); break; @@ -66,20 +73,24 @@ int handle__packet(struct mosquitto *context) break; #ifdef WITH_BRIDGE case CMD_CONNACK: - return handle__connack(context); + rc = handle__connack(context); + break; case CMD_SUBACK: - return handle__suback(context); + rc = handle__suback(context); + break; case CMD_UNSUBACK: - return handle__unsuback(context); + rc = handle__unsuback(context); + break; #endif case CMD_AUTH: - return handle__auth(context); + rc = handle__auth(context); + break; default: rc = MOSQ_ERR_PROTOCOL; } if(context->protocol == mosq_p_mqtt5){ - if(rc == MOSQ_ERR_PROTOCOL){ + if(rc == MOSQ_ERR_PROTOCOL || rc == MOSQ_ERR_DUPLICATE_PROPERTY){ send__disconnect(context, MQTT_RC_PROTOCOL_ERROR, NULL); }else if(rc == MOSQ_ERR_MALFORMED_PACKET){ send__disconnect(context, MQTT_RC_MALFORMED_PACKET, NULL); @@ -95,4 +106,3 @@ int handle__packet(struct mosquitto *context) } return rc; } - diff --git a/test/broker/01-connect-bad-packet.py b/test/broker/01-connect-bad-packet.py deleted file mode 100755 index 8d3506b7..00000000 --- a/test/broker/01-connect-bad-packet.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a first packet of non-CONNECT is rejected. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 2 - publish_packet = mosq_test.gen_publish("pub/qos1/test", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - puback_packet = mosq_test.gen_puback(mid, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(5) - sock.connect(("localhost", port)) - sock.send(publish_packet) - data = sock.recv(1) - sock.close() - if len(data) == 0: - rc = 0 - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-connack-2163.py b/test/broker/01-connect-connack-2163.py deleted file mode 100755 index 8f0297f1..00000000 --- a/test/broker/01-connect-connack-2163.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 - -# Test https://github.com/eclipse/mosquitto/issues/2163 -# Does the broker cope with a malformed CONNACK sent to it after a valid CONNECT? - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("connect-connack-2163", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - connack_malformed = struct.pack("BBBBB", 0x02, 0x00, 0x01, 0xE0, 0x00) - connack_malformed = struct.pack("BBBB", 0x29, 0x02, 0x00, 0x01) - pingreq_packet = mosq_test.gen_pingreq() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.send(connack_malformed) - try: - mosq_test.do_send_receive(sock, pingreq_packet, b"", "pingreq") - except ConnectionResetError: - pass - sock.close() - - # Does the broker still exist? - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_ping(sock) - sock.close() - - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=3) -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-disconnect-v5.py b/test/broker/01-connect-disconnect-v5.py index 0f677573..01a3c928 100755 --- a/test/broker/01-connect-disconnect-v5.py +++ b/test/broker/01-connect-disconnect-v5.py @@ -65,5 +65,4 @@ finally: print(stde.decode('utf-8')) if rc != 0: - print(test) exit(rc) diff --git a/test/broker/01-connect-duplicate.py b/test/broker/01-connect-duplicate.py deleted file mode 100755 index 70ec7d2c..00000000 --- a/test/broker/01-connect-duplicate.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a duplicate CONNECT is rejected. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("connect-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.settimeout(3) - sock.send(connect_packet) - data = sock.recv(1) - if len(data) == 0: - rc = 0 - except socket.error: - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-invalid-id-0.py b/test/broker/01-connect-invalid-id-0.py deleted file mode 100755 index 2ef6556b..00000000 --- a/test/broker/01-connect-invalid-id-0.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a CONNECT with a zero length client id results in the correct CONNACK packet. -# MQTT V3.1 only - zero length is invalid. -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("", keepalive=keepalive, proto_ver=proto_ver) - if proto_ver == 3: - connack_packet = mosq_test.gen_connack(rc=2, proto_ver=proto_ver) - elif proto_ver == 4: - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver, properties=None) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.close() - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=3) -do_test(proto_ver=4) -exit(0) diff --git a/test/broker/01-connect-invalid-id-missing.py b/test/broker/01-connect-invalid-id-missing.py deleted file mode 100755 index 8e46a6c5..00000000 --- a/test/broker/01-connect-invalid-id-missing.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a CONNECT with a zero length client id results in the correct CONNACK packet. - -from mosq_test_helper import * - -rc = 1 -keepalive = 10 -connect_packet = mosq_test.gen_connect(None, keepalive=keepalive, proto_ver=3) -connack_packet = mosq_test.gen_connack(rc=2) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.close() - rc = 0 -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) diff --git a/test/broker/01-connect-invalid-id-utf8.py b/test/broker/01-connect-invalid-id-utf8.py deleted file mode 100755 index cce4c9c8..00000000 --- a/test/broker/01-connect-invalid-id-utf8.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a client id with invalid UTF-8 fails. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - connect_packet = mosq_test.gen_connect("connect-invalid-utf8", keepalive=keepalive, proto_ver=proto_ver) - b = list(struct.unpack("B"*len(connect_packet), connect_packet)) - b[21] = 0 # Client id should never have a 0x0000 - connect_packet = struct.pack("B"*len(b), *b) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - time.sleep(0.5) - - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - # Exception occurs if connack packet returned - rc = 0 - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-invalid-protonum.py b/test/broker/01-connect-invalid-protonum.py deleted file mode 100755 index 22d6d186..00000000 --- a/test/broker/01-connect-invalid-protonum.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a CONNECT with an invalid protocol number results in the correct CONNACK packet. - -from mosq_test_helper import * - -rc = 1 -keepalive = 10 -connect_packet = mosq_test.gen_connect("connect-invalid-test", keepalive=keepalive, proto_ver=0) -connack_packet = mosq_test.gen_connack(rc=1) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.close() - rc = 0 - -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) - diff --git a/test/broker/01-connect-invalid-reserved.py b/test/broker/01-connect-invalid-reserved.py deleted file mode 100755 index 7e2e2ace..00000000 --- a/test/broker/01-connect-invalid-reserved.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a CONNECT with reserved set to 1 results in a disconnect. MQTT-3.1.2-3 - -from mosq_test_helper import * - -rc = 1 -keepalive = 10 -connect_packet = mosq_test.gen_connect("connect-invalid-test", keepalive=keepalive, connect_reserved=True, proto_ver=4) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - sock.close() - rc = 0 -except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) - diff --git a/test/broker/01-connect-success.py b/test/broker/01-connect-success.py deleted file mode 100755 index dde9ca1e..00000000 --- a/test/broker/01-connect-success.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a valid CONNECT results in the correct CONNACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("connect-success-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.close() - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=3) -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-uname-invalid-utf8.py b/test/broker/01-connect-uname-invalid-utf8.py deleted file mode 100755 index ddf1461b..00000000 --- a/test/broker/01-connect-uname-invalid-utf8.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a username with invalid UTF-8 fails. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - connect_packet = mosq_test.gen_connect("connect-invalid-utf8", keepalive=keepalive, username="invalid/utf8", proto_ver=proto_ver) - b = list(struct.unpack("B"*len(connect_packet), connect_packet)) - b[43] = 0 # Username should never have a 0x0000 - connect_packet = struct.pack("B"*len(b), *b) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - time.sleep(0.5) - - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - # Exception occurs if connack packet returned - rc = 0 - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-uname-no-flag.py b/test/broker/01-connect-uname-no-flag.py deleted file mode 100755 index f9abd117..00000000 --- a/test/broker/01-connect-uname-no-flag.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a connection is disconnected if it provides a username but the -# username flag is 0. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("connect-uname-test", keepalive=keepalive, username="user", proto_ver=proto_ver) - b = list(struct.unpack("B"*len(connect_packet), connect_packet)) - b[9] = 2 # Remove username flag - connect_packet = struct.pack("B"*len(b), *b) - - connack_packet = mosq_test.gen_connack(rc=5) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - sock.close() - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/01-connect-uname-pwd-no-flag.py b/test/broker/01-connect-uname-pwd-no-flag.py deleted file mode 100755 index ce444441..00000000 --- a/test/broker/01-connect-uname-pwd-no-flag.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a connection is disconnected if it provides a password but the -# password flag is 0. - -from mosq_test_helper import * - - -def do_test(proto_ver): - rc = 1 - keepalive = 10 - connect_packet = mosq_test.gen_connect("connect-uname-test", keepalive=keepalive, username="user", password="pw", proto_ver=proto_ver) - b = list(struct.unpack("B"*len(connect_packet), connect_packet)) - b[9] = 66 # Remove password flag - connect_packet = struct.pack("B"*len(b), *b) - - connack_packet = mosq_test.gen_connack(rc=5) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - sock.close() - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos0.py b/test/broker/02-subpub-qos0.py deleted file mode 100755 index 00983404..00000000 --- a/test/broker/02-subpub-qos0.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a client subscribed to a topic receives its own message sent to that topic. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 53 - keepalive = 60 - connect_packet = mosq_test.gen_connect("subpub-qos0-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos0", 0, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=proto_ver) - - publish_packet = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - mosq_test.do_send_receive(sock, publish_packet, publish_packet, "publish") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos1-bad-pubcomp.py b/test/broker/02-subpub-qos1-bad-pubcomp.py deleted file mode 100755 index 8fbdfdd8..00000000 --- a/test/broker/02-subpub-qos1-bad-pubcomp.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -# Test what the broker does if receiving a PUBCOMP in response to a QoS 1 PUBLISH. - -from mosq_test_helper import * - -def helper(port, proto_ver): - connect_packet = mosq_test.gen_connect("helper", keepalive=60, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - publish1s_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - puback1s_packet = mosq_test.gen_puback(mid, proto_ver=proto_ver) - - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, publish1s_packet, puback1s_packet, "puback 1s") - sock.close() - - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - - connect_packet = mosq_test.gen_connect("subpub-qos1-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos1", 1, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 1, proto_ver=proto_ver) - - mid = 1 - publish_packet2 = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - - mid = 1 - publish1r_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - pubcomp1r_packet = mosq_test.gen_pubcomp(mid, proto_ver=proto_ver) - - pingreq_packet = mosq_test.gen_pingreq() - pingresp_packet = mosq_test.gen_pingresp() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - helper(port, proto_ver) - - mosq_test.expect_packet(sock, "publish 1r", publish1r_packet) - sock.send(pubcomp1r_packet) - sock.send(pingreq_packet) - p = sock.recv(len(pingresp_packet)) - if len(p) == 0: - rc = 0 - - sock.close() - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos1-bad-pubrec.py b/test/broker/02-subpub-qos1-bad-pubrec.py deleted file mode 100755 index 008da1ba..00000000 --- a/test/broker/02-subpub-qos1-bad-pubrec.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python3 - -# Test what the broker does if receiving a PUBREC in response to a QoS 1 PUBLISH. - -from mosq_test_helper import * - -def helper(port, proto_ver): - connect_packet = mosq_test.gen_connect("helper", keepalive=60, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - publish1s_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - puback1s_packet = mosq_test.gen_puback(mid, proto_ver=proto_ver) - - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, publish1s_packet, puback1s_packet, "puback 1s") - sock.close() - - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - - connect_packet = mosq_test.gen_connect("subpub-qos1-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos1", 1, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 1, proto_ver=proto_ver) - - mid = 1 - publish1r_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=proto_ver) - pubrec1r_packet = mosq_test.gen_pubrec(mid, proto_ver=proto_ver) - - pingreq_packet = mosq_test.gen_pingreq() - pingresp_packet = mosq_test.gen_pingresp() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - helper(port, proto_ver) - - mosq_test.expect_packet(sock, "publish 1r", publish1r_packet) - sock.send(pubrec1r_packet) - sock.send(pingreq_packet) - p = sock.recv(len(pingresp_packet)) - if len(p) == 0: - rc = 0 - - sock.close() - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos2-bad-puback-1.py b/test/broker/02-subpub-qos2-bad-puback-1.py deleted file mode 100755 index 72f00003..00000000 --- a/test/broker/02-subpub-qos2-bad-puback-1.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -# Test what the broker does if receiving a PUBACK in response to a QoS 2 PUBLISH. - -from mosq_test_helper import * - -def helper(port, proto_ver): - connect_packet = mosq_test.gen_connect("helper", keepalive=60, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - publish1s_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - pubrec1s_packet = mosq_test.gen_pubrec(mid, proto_ver=proto_ver) - pubrel1s_packet = mosq_test.gen_pubrel(mid, proto_ver=proto_ver) - pubcomp1s_packet = mosq_test.gen_pubcomp(mid, proto_ver=proto_ver) - - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, publish1s_packet, pubrec1s_packet, "pubrec 1s") - mosq_test.do_send_receive(sock, pubrel1s_packet, pubcomp1s_packet, "pubcomp 1s") - sock.close() - - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - - connect_packet = mosq_test.gen_connect("subpub-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos2", 2, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=proto_ver) - - mid = 1 - publish1r_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - puback1r_packet = mosq_test.gen_puback(mid, proto_ver=proto_ver) - - pingreq_packet = mosq_test.gen_pingreq() - pingresp_packet = mosq_test.gen_pingresp() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - helper(port, proto_ver) - - mosq_test.expect_packet(sock, "publish 1r", publish1r_packet) - sock.send(puback1r_packet) - sock.send(pingreq_packet) - p = sock.recv(len(pingresp_packet)) - if len(p) == 0: - rc = 0 - - sock.close() - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos2-bad-puback-2.py b/test/broker/02-subpub-qos2-bad-puback-2.py deleted file mode 100755 index 76c4905c..00000000 --- a/test/broker/02-subpub-qos2-bad-puback-2.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python3 - -# Test what the broker does if receiving a PUBACK in response to a QoS 2 PUBREL. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - - connect_packet = mosq_test.gen_connect("subpub-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos2", 2, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=proto_ver) - - helper_connect = mosq_test.gen_connect("helper", keepalive=keepalive, proto_ver=proto_ver) - helper_connack = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - publish1s_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - pubrec1s_packet = mosq_test.gen_pubrec(mid, proto_ver=proto_ver) - pubrel1s_packet = mosq_test.gen_pubrel(mid, proto_ver=proto_ver) - pubcomp1s_packet = mosq_test.gen_pubcomp(mid, proto_ver=proto_ver) - - mid = 1 - publish1r_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - pubrec1r_packet = mosq_test.gen_pubrec(mid, proto_ver=proto_ver) - pubrel1r_packet = mosq_test.gen_pubrel(mid, proto_ver=proto_ver) - puback1r_packet = mosq_test.gen_puback(mid, proto_ver=proto_ver) - - pingreq_packet = mosq_test.gen_pingreq() - pingresp_packet = mosq_test.gen_pingresp() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - helper = mosq_test.do_client_connect(helper_connect, helper_connack, timeout=20, port=port) - mosq_test.do_send_receive(helper, publish1s_packet, pubrec1s_packet, "pubrec 1s") - mosq_test.do_send_receive(helper, pubrel1s_packet, pubcomp1s_packet, "pubcomp 1s") - helper.close() - - mosq_test.expect_packet(sock, "publish 1r", publish1r_packet) - mosq_test.do_send_receive(sock, pubrec1s_packet, pubrel1s_packet, "pubrel 1r") - sock.send(puback1r_packet) - sock.send(pingreq_packet) - p = sock.recv(len(pingresp_packet)) - if len(p) == 0: - rc = 0 - - sock.close() - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subpub-qos2-bad-pubcomp.py b/test/broker/02-subpub-qos2-bad-pubcomp.py deleted file mode 100755 index 02df03de..00000000 --- a/test/broker/02-subpub-qos2-bad-pubcomp.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env python3 - -# Test what the broker does if receiving a PUBCOMP in response to a QoS 2 PUBLISH. - -from mosq_test_helper import * - -def helper(port, proto_ver): - connect_packet = mosq_test.gen_connect("helper", keepalive=60, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - publish1s_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - pubrec1s_packet = mosq_test.gen_pubrec(mid, proto_ver=proto_ver) - pubrel1s_packet = mosq_test.gen_pubrel(mid, proto_ver=proto_ver) - pubcomp1s_packet = mosq_test.gen_pubcomp(mid, proto_ver=proto_ver) - - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, publish1s_packet, pubrec1s_packet, "pubrec 1s") - mosq_test.do_send_receive(sock, pubrel1s_packet, pubcomp1s_packet, "pubcomp 1s") - sock.close() - - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - - connect_packet = mosq_test.gen_connect("subpub-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos2", 2, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=proto_ver) - - mid = 1 - publish1r_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=proto_ver) - pubcomp1r_packet = mosq_test.gen_pubcomp(mid, proto_ver=proto_ver) - - pingreq_packet = mosq_test.gen_pingreq() - pingresp_packet = mosq_test.gen_pingresp() - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - helper(port, proto_ver) - - mosq_test.expect_packet(sock, "publish 1r", publish1r_packet) - sock.send(pubcomp1r_packet) - sock.send(pingreq_packet) - p = sock.recv(len(pingresp_packet)) - if len(p) == 0: - rc = 0 - - sock.close() - except socket.error as e: - if e.errno == errno.ECONNRESET: - # Connection has been closed by peer, this is the expected behaviour - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subscribe-qos0.py b/test/broker/02-subscribe-qos0.py deleted file mode 100755 index 4bc3b95b..00000000 --- a/test/broker/02-subscribe-qos0.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a SUBSCRIBE to a topic with QoS 0 results in the correct SUBACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 53 - keepalive = 60 - connect_packet = mosq_test.gen_connect("subscribe-qos0-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - subscribe_packet = mosq_test.gen_subscribe(mid, "qos0/test", 0, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - time.sleep(0.5) - - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subscribe-qos1.py b/test/broker/02-subscribe-qos1.py deleted file mode 100755 index 498cc3ce..00000000 --- a/test/broker/02-subscribe-qos1.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a SUBSCRIBE to a topic with QoS 1 results in the correct SUBACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 79 - keepalive = 60 - connect_packet = mosq_test.gen_connect("subscribe-qos1-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - subscribe_packet = mosq_test.gen_subscribe(mid, "qos1/test", 1, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 1, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-subscribe-qos2.py b/test/broker/02-subscribe-qos2.py deleted file mode 100755 index 2c96beac..00000000 --- a/test/broker/02-subscribe-qos2.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a SUBSCRIBE to a topic with QoS 2 results in the correct SUBACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 3 - keepalive = 60 - connect_packet = mosq_test.gen_connect("subscribe-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - subscribe_packet = mosq_test.gen_subscribe(mid, "qos2/test", 2, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-unsubscribe-invalid-no-topic.py b/test/broker/02-unsubscribe-invalid-no-topic.py deleted file mode 100755 index bb5653a8..00000000 --- a/test/broker/02-unsubscribe-invalid-no-topic.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a UNSUBSCRIBE with no topic results in a disconnect. MQTT-3.10.3-2 - -from mosq_test_helper import * - -def gen_unsubscribe_invalid_no_topic(mid): - pack_format = "!BBH" - return struct.pack(pack_format, 162, 2, mid) - -def do_test(proto_ver): - rc = 1 - mid = 3 - keepalive = 60 - connect_packet = mosq_test.gen_connect("unsubscribe-invalid-no-topic-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - unsubscribe_packet = gen_unsubscribe_invalid_no_topic(mid) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - if proto_ver == 4: - mosq_test.do_send_receive(sock, unsubscribe_packet, b"", "disconnect") - else: - disconnect_packet = mosq_test.gen_disconnect(proto_ver=5, reason_code=mqtt5_rc.MQTT_RC_MALFORMED_PACKET) - mosq_test.do_send_receive(sock, unsubscribe_packet, disconnect_packet, "disconnect") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-unsubscribe-qos0.py b/test/broker/02-unsubscribe-qos0.py deleted file mode 100755 index 8307c1b8..00000000 --- a/test/broker/02-unsubscribe-qos0.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a UNSUBSCRIBE to a topic with QoS 0 results in the correct UNSUBACK packet. -# This doesn't assume a subscription exists. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 53 - keepalive = 60 - connect_packet = mosq_test.gen_connect("unsubscribe-qos0-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - unsubscribe_packet = mosq_test.gen_unsubscribe(mid, "qos0/test", proto_ver=proto_ver) - if proto_ver == 5: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver, reason_code=17) - else: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, unsubscribe_packet, unsuback_packet, "unsuback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-unsubscribe-qos1.py b/test/broker/02-unsubscribe-qos1.py deleted file mode 100755 index 1757495f..00000000 --- a/test/broker/02-unsubscribe-qos1.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a SUBSCRIBE to a topic with QoS 1 results in the correct SUBACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 79 - keepalive = 60 - connect_packet = mosq_test.gen_connect("unsubscribe-qos1-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - unsubscribe_packet = mosq_test.gen_unsubscribe(mid, "qos1/test", proto_ver=proto_ver) - if proto_ver == 5: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver, reason_code=17) - else: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, unsubscribe_packet, unsuback_packet, "unsuback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-unsubscribe-qos2-multiple.py b/test/broker/02-unsubscribe-qos2-multiple.py deleted file mode 100755 index 76886725..00000000 --- a/test/broker/02-unsubscribe-qos2-multiple.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a UNSUBSCRIBE to multiple topics with QoS 2 results in the -# correct UNSUBACK packet, when one subscription exists and the other does not. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - keepalive = 60 - connect_packet = mosq_test.gen_connect("unsubscribe-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - mid = 1 - subscribe_packet = mosq_test.gen_subscribe(mid, "qos2/two", 2, proto_ver=proto_ver) - suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=proto_ver) - - mid = 3 - unsubscribe_packet = mosq_test.gen_unsubscribe_multiple(mid, ["qos2/one", "qos2/two"], proto_ver=proto_ver) - if proto_ver == 5: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver, reason_code=[17, 0]) - else: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - mosq_test.do_send_receive(sock, unsubscribe_packet, unsuback_packet, "unsuback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/02-unsubscribe-qos2.py b/test/broker/02-unsubscribe-qos2.py deleted file mode 100755 index 8029141b..00000000 --- a/test/broker/02-unsubscribe-qos2.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether a SUBSCRIBE to a topic with QoS 2 results in the correct SUBACK packet. - -from mosq_test_helper import * - -def do_test(proto_ver): - rc = 1 - mid = 3 - keepalive = 60 - connect_packet = mosq_test.gen_connect("unsubscribe-qos2-test", keepalive=keepalive, proto_ver=proto_ver) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) - - unsubscribe_packet = mosq_test.gen_unsubscribe(mid, "qos2/test", proto_ver=proto_ver) - if proto_ver == 5: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver, reason_code=17) - else: - unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=proto_ver) - - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, unsubscribe_packet, unsuback_packet, "unsuback") - - rc = 0 - - sock.close() - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - print("proto_ver=%d" % (proto_ver)) - exit(rc) - - -do_test(proto_ver=4) -do_test(proto_ver=5) -exit(0) diff --git a/test/broker/03-publish-long-topic.py b/test/broker/03-publish-long-topic.py index 1e47ba31..76f07506 100755 --- a/test/broker/03-publish-long-topic.py +++ b/test/broker/03-publish-long-topic.py @@ -25,7 +25,7 @@ def do_test(proto_ver): if proto_ver == 4: mosq_test.do_send_receive(sock, publish_packet, b"", "puback") else: - disconnect_packet = mosq_test.gen_disconnect(proto_ver=5, reason_code=mqtt5_rc.MQTT_RC_PROTOCOL_ERROR) + disconnect_packet = mosq_test.gen_disconnect(proto_ver=5, reason_code=mqtt5_rc.MQTT_RC_MALFORMED_PACKET) mosq_test.do_send_receive(sock, publish_packet, disconnect_packet, "puback") rc = 0 diff --git a/test/broker/09-extended-auth-unsupported.py b/test/broker/09-extended-auth-unsupported.py deleted file mode 100755 index e154d287..00000000 --- a/test/broker/09-extended-auth-unsupported.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether an unsupported extended auth is rejected. - -from mosq_test_helper import * - -port = mosq_test.get_port() - -rc = 1 - -props = mqtt5_props.gen_string_prop(mqtt5_props.PROP_AUTHENTICATION_METHOD, "unsupported") -props += mqtt5_props.gen_string_prop(mqtt5_props.PROP_AUTHENTICATION_DATA, "test") -connect_packet = mosq_test.gen_connect("client-params-test", keepalive=42, proto_ver=5, properties=props) -connack_packet = mosq_test.gen_connack(rc=mqtt5_rc.MQTT_RC_BAD_AUTHENTICATION_METHOD, proto_ver=5, properties=None) - - -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) - rc = 0 - - sock.close() -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - - -exit(rc) - diff --git a/test/broker/12-prop-maximum-packet-size-connect.py b/test/broker/12-prop-maximum-packet-size-connect.py deleted file mode 100755 index e264dbab..00000000 --- a/test/broker/12-prop-maximum-packet-size-connect.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether setting maximum packet size to smaller than a CONNACK packet -# results in the CONNECT being rejected. -# MQTTv5 - -from mosq_test_helper import * - -rc = 1 - -keepalive = 5 -props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_MAXIMUM_PACKET_SIZE, 2) -connect_packet = mosq_test.gen_connect("test", proto_ver=5, keepalive=keepalive, properties=props) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, b"", port=port) - # Exception occurs if connack packet returned - rc = 0 -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) - diff --git a/test/broker/12-prop-maximum-packet-size-publish.py b/test/broker/12-prop-maximum-packet-size-publish.py deleted file mode 100755 index dde7a8da..00000000 --- a/test/broker/12-prop-maximum-packet-size-publish.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether maximum packet size is honoured on a PUBLISH to a client -# MQTTv5 - -from mosq_test_helper import * - -rc = 1 - -keepalive = 10 -props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_MAXIMUM_PACKET_SIZE, 20) -connect_packet = mosq_test.gen_connect("test", proto_ver=5, keepalive=keepalive, properties=props) -connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) - -mid = 1 -subscribe_packet = mosq_test.gen_subscribe(mid, "test/topic", 0, proto_ver=5) -suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) - -publish1_packet = mosq_test.gen_publish(topic="test/topic", qos=0, payload="12345678901234567890", proto_ver=5) -publish2_packet = mosq_test.gen_publish(topic="test/topic", qos=0, payload="67890", proto_ver=5) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, subscribe_packet, suback_packet) - sock.send(publish1_packet) - # We shouldn't receive the publish here because it is > MAXIMUM_PACKET_SIZE - mosq_test.do_ping(sock, "pingresp1") - mosq_test.do_send_receive(sock, publish2_packet, publish2_packet) - mosq_test.do_ping(sock, "pingresp2") - rc = 0 -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) - diff --git a/test/broker/12-prop-session-expiry-invalid.py b/test/broker/12-prop-session-expiry-invalid.py deleted file mode 100755 index d27b42b9..00000000 --- a/test/broker/12-prop-session-expiry-invalid.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether sending a non zero session expiry interval in DISCONNECT after -# having sent a zero session expiry interval is treated correctly in MQTT v5. - -from mosq_test_helper import * - -rc = 1 - -keepalive = 10 -props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 0) -connect_packet = mosq_test.gen_connect("test", proto_ver=5, keepalive=keepalive, properties=props) - -connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) - -props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 1) -disconnect_client_packet = mosq_test.gen_disconnect(proto_ver=5, properties=props) - -disconnect_server_packet = mosq_test.gen_disconnect(proto_ver=5, reason_code=130) - -port = mosq_test.get_port() -broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - -try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - mosq_test.do_send_receive(sock, disconnect_client_packet, disconnect_server_packet, "disconnect") - sock.close() - rc = 0 -except mosq_test.TestError: - pass -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - -exit(rc) - diff --git a/test/broker/12-prop-subpub-content-type.py b/test/broker/12-prop-subpub-content-type.py index 2fa453b6..dd5571aa 100755 --- a/test/broker/12-prop-subpub-content-type.py +++ b/test/broker/12-prop-subpub-content-type.py @@ -12,4 +12,4 @@ props_out = props_out+mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, props_in = mqtt5_props.gen_string_prop(mqtt5_props.PROP_CONTENT_TYPE, "text") -helper.prop_subpub_helper(props_out, props_in) +helper.prop_subpub_helper(props_out, props_in, expect_proto_error=False) diff --git a/test/broker/12-prop-subpub-payload-format.py b/test/broker/12-prop-subpub-payload-format.py index 99c6a6b9..678dd580 100755 --- a/test/broker/12-prop-subpub-payload-format.py +++ b/test/broker/12-prop-subpub-payload-format.py @@ -12,4 +12,4 @@ props_out = props_out+mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, props_in = mqtt5_props.gen_byte_prop(mqtt5_props.PROP_PAYLOAD_FORMAT_INDICATOR, 0xed) -helper.prop_subpub_helper(props_out, props_in) +helper.prop_subpub_helper(props_out, props_in, expect_proto_error=True) diff --git a/test/broker/12-prop-topic-alias-invalid.py b/test/broker/12-prop-topic-alias-invalid.py deleted file mode 100755 index 03ac6084..00000000 --- a/test/broker/12-prop-topic-alias-invalid.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Test whether the broker handles a topic alias of >max_topic_alias correctly. -# MQTTv5 - -from mosq_test_helper import * - -def do_test(value): - rc = 1 - - keepalive = 10 - connect_packet = mosq_test.gen_connect("test", proto_ver=5, keepalive=keepalive) - connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) - - props = mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, value) - publish_packet = mosq_test.gen_publish(topic="test/topic", qos=0, payload="12345678901234567890", proto_ver=5, properties=props) - - disconnect_packet = mosq_test.gen_disconnect(reason_code=mqtt5_rc.MQTT_RC_TOPIC_ALIAS_INVALID, proto_ver=5) - port = mosq_test.get_port() - broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) - - try: - sock = mosq_test.do_client_connect(connect_packet, connack_packet, port=port) - sock.send(publish_packet) - mosq_test.expect_packet(sock, "disconnect", disconnect_packet) - rc = 0 - except mosq_test.TestError: - pass - finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde.decode('utf-8')) - exit(rc) - - -do_test(11) - diff --git a/test/broker/13-malformed-publish-v5.py b/test/broker/13-malformed-publish-v5.py index ac24fc7f..8c6fde12 100755 --- a/test/broker/13-malformed-publish-v5.py +++ b/test/broker/13-malformed-publish-v5.py @@ -62,7 +62,7 @@ try: # Incorrect property props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 0) publish_packet = mosq_test.gen_publish(topic="test/topic", qos=1, mid=1, proto_ver=5, properties=props) - do_test(publish_packet, mqtt5_rc.MQTT_RC_MALFORMED_PACKET, "Incorrect property") + do_test(publish_packet, mqtt5_rc.MQTT_RC_PROTOCOL_ERROR, "Incorrect property") # Truncated packet, remaining length only publish_packet = struct.pack("!BB", 48, 0) @@ -86,7 +86,7 @@ try: # Bad topic publish_packet = mosq_test.gen_publish(topic="#/test/topic", qos=1, mid=1, proto_ver=5) - do_test(publish_packet, mqtt5_rc.MQTT_RC_PROTOCOL_ERROR, "Bad topic") + do_test(publish_packet, mqtt5_rc.MQTT_RC_MALFORMED_PACKET, "Bad topic") except mosq_test.TestError: pass finally: diff --git a/test/broker/Makefile b/test/broker/Makefile index e0b817fb..bfe99ae8 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -1,6 +1,6 @@ include ../../config.mk -.PHONY: all check clean test ptest +.PHONY: all check clean test ptest seqtest .NOTPARALLEL: all : @@ -14,32 +14,23 @@ clean : test-compile : $(MAKE) -C c -ptest : test-compile +ptest : test-compile msg_sequence_test ./test.py -test : test-compile 01 02 03 04 05 06 07 08 09 10 11 12 13 14 +test : test-compile msg_sequence_test 01 02 03 04 05 06 07 08 09 10 11 12 13 14 + +msg_sequence_test: + ./msg_sequence_test.py 01 : ./01-connect-allow-anonymous.py - ./01-connect-bad-packet.py - ./01-connect-connack-2163.py ./01-connect-disconnect-v5.py - ./01-connect-duplicate.py - ./01-connect-invalid-id-0.py - ./01-connect-invalid-id-missing.py - ./01-connect-invalid-id-utf8.py - ./01-connect-invalid-protonum.py - ./01-connect-invalid-reserved.py ./01-connect-max-connections.py ./01-connect-max-keepalive.py - ./01-connect-success.py - ./01-connect-uname-invalid-utf8.py - ./01-connect-uname-no-flag.py ./01-connect-uname-no-password-denied.py ./01-connect-uname-or-anon.py ./01-connect-uname-password-denied-no-will.py ./01-connect-uname-password-denied.py - ./01-connect-uname-pwd-no-flag.py ./01-connect-zero-length-id.py @@ -54,9 +45,6 @@ test : test-compile 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ./02-subpub-qos0-subscription-id.py ./02-subpub-qos0-topic-alias-unknown.py ./02-subpub-qos0-topic-alias.py - ./02-subpub-qos0.py - ./02-subpub-qos1-bad-pubcomp.py - ./02-subpub-qos1-bad-pubrec.py ./02-subpub-qos1-message-expiry-retain.py ./02-subpub-qos1-message-expiry-will.py ./02-subpub-qos1-message-expiry.py @@ -64,9 +52,6 @@ test : test-compile 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ./02-subpub-qos1-oversize-payload.py ./02-subpub-qos1.py ./02-subpub-qos2-1322.py - ./02-subpub-qos2-bad-puback-1.py - ./02-subpub-qos2-bad-puback-2.py - ./02-subpub-qos2-bad-pubcomp.py ./02-subpub-qos2-pubrec-error.py ./02-subpub-qos2-receive-maximum-1.py ./02-subpub-qos2-receive-maximum-2.py @@ -75,14 +60,6 @@ test : test-compile 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ./02-subscribe-invalid-utf8.py ./02-subscribe-long-topic.py ./02-subscribe-persistence-flipflop.py - ./02-subscribe-qos0.py - ./02-subscribe-qos1.py - ./02-subscribe-qos2.py - ./02-unsubscribe-invalid-no-topic.py - ./02-unsubscribe-qos0.py - ./02-unsubscribe-qos1.py - ./02-unsubscribe-qos2-multiple.py - ./02-unsubscribe-qos2.py 03 : #./03-publish-qos1-queued-bytes.py @@ -187,7 +164,6 @@ endif ./09-extended-auth-multistep-reauth.py ./09-extended-auth-multistep.py ./09-extended-auth-single.py - ./09-extended-auth-unsupported.py ./09-plugin-auth-acl-pub.py ./09-plugin-auth-acl-sub-denied.py ./09-plugin-auth-acl-sub.py @@ -216,17 +192,13 @@ endif 12 : ./12-prop-assigned-client-identifier.py ./12-prop-maximum-packet-size-broker.py - ./12-prop-maximum-packet-size-connect.py ./12-prop-maximum-packet-size-publish-qos1.py ./12-prop-maximum-packet-size-publish-qos2.py - ./12-prop-maximum-packet-size-publish.py ./12-prop-response-topic-correlation-data.py ./12-prop-response-topic.py ./12-prop-server-keepalive.py - ./12-prop-session-expiry-invalid.py ./12-prop-subpub-content-type.py ./12-prop-subpub-payload-format.py - ./12-prop-topic-alias-invalid.py 13 : ./13-malformed-publish-v5.py diff --git a/test/broker/data/AUTH.json b/test/broker/data/AUTH.json new file mode 100644 index 00000000..77dd2a73 --- /dev/null +++ b/test/broker/data/AUTH.json @@ -0,0 +1,40 @@ +[ + { + "comment": "AUTH TESTS ARE INCOMPLETE", + "group": "v3.1.1 AUTH", + "tests": [ + { "name": "F0 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"F0 00"}]}, + { "name": "F0 long", "ver":4, "msgs": [{"type":"send", "payload":"F0 01 00"}]}, + { "name": "F1", "ver":4, "msgs": [{"type":"send", "payload":"F1 00"}]}, + { "name": "F2", "ver":4, "msgs": [{"type":"send", "payload":"F2 00"}]}, + { "name": "F4", "ver":4, "msgs": [{"type":"send", "payload":"F4 00"}]}, + { "name": "F8", "ver":4, "msgs": [{"type":"send", "payload":"F8 00"}]} + ] + }, + { + "group": "v5.0 AUTH", + "tests": [ + { "name": "F0 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"F0 00"}]}, + { "name": "F0 long", "ver":5, "msgs": [ + {"type":"send", "payload":"F0 01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "F1", "ver":5, "msgs": [ + {"type":"send", "payload":"F1 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "F2", "ver":5, "msgs": [ + {"type":"send", "payload":"F2 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "F4", "ver":5, "msgs": [ + {"type":"send", "payload":"F4 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "F8", "ver":5, "msgs": [ + {"type":"send", "payload":"F8 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + } +] diff --git a/test/broker/data/CONNACK.json b/test/broker/data/CONNACK.json new file mode 100644 index 00000000..e85afe1f --- /dev/null +++ b/test/broker/data/CONNACK.json @@ -0,0 +1,529 @@ +[ + { + "group": "v3.1.1 CONNACK", + "tests": [ + { "name": "20 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"20 02 00 00"}]}, + { "name": "20 long", "ver":4, "msgs": [{"type":"send", "payload":"20 03 00 00 00"}]}, + { "name": "20 short 1", "ver":4, "msgs": [{"type":"send", "payload":"20 01 00"}]}, + { "name": "20 short 0", "ver":4, "msgs": [{"type":"send", "payload":"20 00"}]}, + { "name": "20", "ver":4, "msgs": [{"type":"send", "payload":"20 02 00 00"}]}, + { "name": "21", "ver":4, "msgs": [{"type":"send", "payload":"21 02 00 00"}]}, + { "name": "22", "ver":4, "msgs": [{"type":"send", "payload":"22 02 00 00"}]}, + { "name": "24", "ver":4, "msgs": [{"type":"send", "payload":"24 02 00 00"}]}, + { "name": "28", "ver":4, "msgs": [{"type":"send", "payload":"28 02 00 00"}]}, + { "name": "issue 2163 v3", "ver":3, "msgs": [{"type":"send", "payload":"29 02 00 01"}]}, + { "name": "issue 2163 v4", "ver":4, "msgs": [{"type":"send", "payload":"29 02 00 01"}]}, + { "name": "20 CAF=0x01", "ver":4, "msgs": [{"type":"send", "payload":"20 02 01 00"}]}, + { "name": "20 CAF=0x02", "ver":4, "msgs": [{"type":"send", "payload":"20 02 02 00"}]}, + { "name": "20 CAF=0x04", "ver":4, "msgs": [{"type":"send", "payload":"20 02 04 00"}]}, + { "name": "20 CAF=0x08", "ver":4, "msgs": [{"type":"send", "payload":"20 02 08 00"}]}, + { "name": "20 CAF=0x10", "ver":4, "msgs": [{"type":"send", "payload":"20 02 10 00"}]}, + { "name": "20 CAF=0x20", "ver":4, "msgs": [{"type":"send", "payload":"20 02 20 00"}]}, + { "name": "20 CAF=0x40", "ver":4, "msgs": [{"type":"send", "payload":"20 02 40 00"}]}, + { "name": "20 CAF=0x80", "ver":4, "msgs": [{"type":"send", "payload":"20 02 80 00"}]} + ] + }, + { + "group": "v5.0 CONNACK", + "comment": "CMD RL FLAG RC PROPLEN PROPS", + "tests": [ + { "name": "20 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"20 03 00 00 00"}]}, + { "name": "20 with properties", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 21000A"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 long", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 short 2", "ver":5, "msgs": [ + {"type":"send", "payload":"20 02 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"20 01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"20 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "21", "ver":5, "msgs": [ + {"type":"send", "payload":"21 03 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "22", "ver":5, "msgs": [ + {"type":"send", "payload":"22 03 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "24", "ver":5, "msgs": [ + {"type":"send", "payload":"24 03 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "28", "ver":5, "msgs": [ + {"type":"send", "payload":"28 03 00 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "issue 2163 v5", "ver":5, "msgs": [ + {"type":"send", "payload":"29 02 00 01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x01", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 01 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x02", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 02 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x04", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 04 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x08", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 08 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x10", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 10 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x20", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 20 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x40", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 40 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 CAF=0x80", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 80 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x01 (invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x80 (unspecified error)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 80 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x81 (malformed packet)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 81 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x82 (protocol error)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 82 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x83 (implementation specific error)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 83 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x84 (unsupported protocol version)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 84 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x85 (client identifier not valid)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 85 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x86 (bad user name or password)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 86 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x87 (not authorised)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 87 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x88 (server unavailable)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 88 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x89 (server busy)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 89 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x8A (banned)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 8A 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x8C (bad authentication method)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 8C 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x90 (topic name invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 90 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x95 (packet too large)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 95 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x97 (quota exceeded)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 97 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x99 (payload format invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 99 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x9A (retain not supported)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 9A 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x9B (qos not supported)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 9B 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x9C (use another server)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 9C 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x9D (server moved)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 9D 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0x9F (connection rate exceeded)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 9F 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 RC=0xFF (invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 03 00 FF 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + }, + { + "group": "v5.0 CONNACK PROPERTIES", + "comment": "CMD RL FLAG RC PROPLEN PROPS", + "tests": [ + { "name": "20 with reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 1F000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 1F"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with user-property", "ver":5, "msgs": [ + {"type":"send", "payload":"20 0A 00 00 07 26000170000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 23"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 17"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 24"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 25"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 28"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 29"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 2A"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 02"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 11"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 18"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 27"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 1C000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 03"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 08"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 12"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 15"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 1A"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 1C"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 09"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 16"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 0B"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 13"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 21"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 22"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"20 04 00 00 01 23"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "20 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0401"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0501"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0601"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0701"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1401"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 2001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 05 00 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 800001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 800101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 06 00 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 07 00 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "20 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"20 08 00 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + } +] diff --git a/test/broker/data/CONNECT.json b/test/broker/data/CONNECT.json new file mode 100644 index 00000000..a48306de --- /dev/null +++ b/test/broker/data/CONNECT.json @@ -0,0 +1,202 @@ +[ + { + "comment": "CONNECT TESTS ARE INCOMPLETE", + "group": "v3.1 CONNECT", + "tests": [ + { "name": "10 proto ver 2", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0F 0006 4D5149736470 02 00 000A 0001 70", "comment":"CONNECT"}, + {"type":"recv", "payload":"20 02 00 01", "comment": "CONNACK identifier rejected"} + ]}, + { "name": "10 proto ver 6", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0F 0006 4D5149736470 06 00 000A 0001 70", "comment":"CONNECT"}, + {"type":"recv", "payload":"20 02 00 01", "comment": "CONNACK identifier rejected"} + ]}, + { "name": "10 empty client ID", "ver":3, "connect":false, "msgs":[ + {"type":"send", "payload":"10 0E 0006 4D5149736470 03 02 000A 0000", "comment":"CONNECT clean session true, no client id"}, + {"type":"recv", "payload":"20 02 00 02", "comment": "CONNACK"} + ]}, + { "name": "10 ok", "ver":3, "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 0F 0006 4D5149736470 03 02 000A 0001 70", "comment":"CONNECT clean session true, no client id"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]} + ] + }, + { + "group": "v3.1.1 CONNECT", + "tests": [ + { "name": "10 ok ", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 04 02 000A 0001 70", "comment":"minimal valid CONNECT"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "10 [MQTT-3.1.0-2]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 04 02 000A 0001 70", "comment":"minimal valid CONNECT"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"}, + {"type":"send", "payload":"10 0D 0004 4D515454 04 02 000A 0001 70", "comment":"minimal valid CONNECT"} + ]}, + { "name": "10 missing client ID", "connect":false, "msgs":[{"type":"send", "payload":"10 08 0004 4D515454 04 02 000A"}]}, + { "name": "10 empty client ID", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 0C 0004 4D515454 04 02 000A 0000", "comment":"CONNECT clean session true, no client id"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "10 empty client ID clean false [MQTT-3.1.3-7]", "connect":false, "expect_disconnect":true, "msgs":[ + {"type":"send", "payload":"10 0C 0004 4D515454 04 00 000A 0000", "comment":"CONNECT clean session false, no client id"}, + {"type":"recv", "payload":"20 02 00 02", "comment": "CONNACK"} + ]}, + { "name": "10 proto ver 2 [MQTT-3.1.2-2]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 02 00 000A 0001 70", "comment":"CONNECT"}, + {"type":"recv", "payload":"20 02 00 01", "comment": "v3.1.1 CONNACK identifier rejected"} + ]}, + { "name": "10 proto ver 6 [MQTT-3.1.2-2]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 06 00 000A 0001 70", "comment":"CONNECT"}, + {"type":"recv", "payload":"20 02 00 01", "comment": "v3.1.1 CONNACK identifier rejected"} + ]}, + { "name": "10 remaining length 5 bytes", "connect":false, "msgs":[ + {"type":"send", "payload":"10 FFFFFFFF7F 0004 4D515454 06 00 000A 0001 70", "comment":"CONNECT"} + ]}, + { "name": "11", "connect":false, "msgs":[{"type":"send", "payload":"11 0D 0004 4D515454 04 02 000A 0001 70"}]}, + { "name": "12", "connect":false, "msgs":[{"type":"send", "payload":"12 0D 0004 4D515454 04 02 000A 0001 70"}]}, + { "name": "14", "connect":false, "msgs":[{"type":"send", "payload":"14 0D 0004 4D515454 04 02 000A 0001 70"}]}, + { "name": "18", "connect":false, "msgs":[{"type":"send", "payload":"18 0D 0004 4D515454 04 02 000A 0001 70"}]}, + { "name": "10 short proto", "connect":false, "msgs":[{"type":"send", "payload":"10 0C 0003 4D5154 04 02 000A 0001 70"}]}, + { "name": "10 zero proto", "connect":false, "msgs":[{"type":"send", "payload":"10 09 0000 04 02 000A 0001 70"}]}, + { "name": "10 long proto", "connect":false, "msgs":[{"type":"send", "payload":"10 0E 0005 4D51545454 04 02 000A 0001 70"}]}, + { "name": "10 [MQTT-3.1.2-1]", "connect":false, "msgs":[{"type":"send", "payload":"10 0D 0004 4D515455 04 02 000A 0001 70"}]}, + { "name": "10 [MQTT-3.1.2-3] ", "connect":false, "msgs":[{"type":"send", "payload":"10 0D 0004 4D515454 04 01 000A 0001 70"}]}, + { "name": "10 Will flag 0 Will QoS 1 [MQTT-3.1.2-11]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 04 0A 000A 0001 70"} + ]}, + { "name": "10 Will flag 0 Will retain 1 [MQTT-3.1.2-11]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 04 12 000A 0001 70"} + ]}, + { "name": "10 Will flag 1 no Will topic no Will message [MQTT-3.1.2-9]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0D 0004 4D515454 04 06 000A 0001 70"} + ]}, + { "name": "10 Will flag 1 no Will topic [MQTT-3.1.2-9]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 10 0004 4D515454 04 06 000A 0001 70 0001 70"} + ]}, + { "name": "10 Will flag 1 ok", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 13 0004 4D515454 04 06 000A 0001 70 0001 70 0001 70"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "10 Will flag 1 Will Qos 3 [MQTT-3.1.2-14]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 13 0004 4D515454 04 1E 000A 0001 70 0001 70 0001 70"} + ]}, + { "name": "10 Will topic with 0x0000", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746F700000 0001 70"}]}, + { "name": "10 Will topic with U+D800", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746FEDA080 0001 70"}]}, + { "name": "10 Will topic with U+0001", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746F700170 0001 70"}]}, + { "name": "10 Will topic with U+001F", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746F701F70 0001 70"}]}, + { "name": "10 Will topic with U+007F", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746F707F70 0001 70"}]}, + { "name": "10 Will topic with U+009F", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746FC29F70 0001 70"}]}, + { "name": "10 Will topic with U+FFFF", "connect":false, "msgs": [{"type":"send", "payload":"10 17 0004 4D515454 04 06 000A 0001 70 0005 746FEDBFBF 0001 70"}]}, + { "name": "10 Client ID with 0x0000", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746F700000"}]}, + { "name": "10 Client ID with U+D800", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746FEDA080"}]}, + { "name": "10 Client ID with U+0001", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746F700170"}]}, + { "name": "10 Client ID with U+001F", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746F701F70"}]}, + { "name": "10 Client ID with U+007F", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746F707F70"}]}, + { "name": "10 Client ID with U+009F", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746FC29F70"}]}, + { "name": "10 Client ID with U+FFFF", "connect":false, "msgs": [{"type":"send", "payload":"10 11 0004 4D515454 04 02 000A 0005 746FEDBFBF"}]}, + { "name": "10 [MQTT-3.1.2-18]", "connect":false, "msgs":[{"type":"send", "payload":"10 10 0004 4D515454 04 02 000A 0001 70 0001 70"}]}, + { "name": "10 [MQTT-3.1.2-19]", "connect":false, "msgs":[{"type":"send", "payload":"10 0D 0004 4D515454 04 82 000A 0001 70"}]}, + { "name": "10 Username with 0x0000", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746F700000"}]}, + { "name": "10 Username with 0xD800", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746FEDA080"}]}, + { "name": "10 Username with 0x0001", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746F700170"}]}, + { "name": "10 Username with 0x001F", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746F701F70"}]}, + { "name": "10 Username with 0x007F", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746F707F70"}]}, + { "name": "10 Username with 0x009F", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746FC29F70"}]}, + { "name": "10 Username with 0xFFFF", "connect":false, "msgs":[{"type":"send", "payload":"10 14 0004 4D515454 04 82 000A 0001 70 0005 746FEDBFBF"}]}, + { "name": "10 Username zero length ok", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 0F 0004 4D515454 04 82 000A 0001 70 0000"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "10 Username flag 1 Password flag 1 ok", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 13 0004 4D515454 04 C2 000A 0001 70 0001 70 0001 70"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "10 [MQTT-3.1.2-20]", "connect":false, "msgs":[{"type":"send", "payload":"10 13 0004 4D515454 04 82 000A 0001 70 0001 70 0001 70"}]}, + { "name": "10 [MQTT-3.1.2-21]", "connect":false, "msgs":[{"type":"send", "payload":"10 10 0004 4D515454 04 C2 000A 0001 70 0001 70"}]}, + { "name": "10 [MQTT-3.1.2-22]", "connect":false, "msgs":[{"type":"send", "payload":"10 10 0004 4D515454 04 42 000A 0001 70 0001 70"}]}, + { "name": "10 Password with 0x0000", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 17 00 04 4D515454 04 C2 000A 0001 70 0001 70 0005 746F700000"}, + {"type":"recv", "payload":"20 02 00 00", "comment": "CONNACK"} + ]}, + { "name": "duplicate CONNECT", "msgs":[{"type":"send", "payload":"10 0D 0004 4D515454 04 02 000A 0001 70", "comment":"minimal valid duplicate CONNECT"}]} + ] + }, + { + "group": "v5.0 CONNECT", + "tests": [ + { "name": "10 ok ", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 0E 0004 4D515454 05 02 000A 00 0001 70", "comment":"minimal valid CONNECT"}, + {"type":"recv", "payload":"20 09 00 00 06 22000A 210014", "comment": "CONNACK"} + ]}, + { "name": "10 Username flag 1 ok", "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 11 0004 4D515454 05 82 000A 00 0001 70 0001 70"}, + {"type":"recv", "payload":"20 09 00 00 06 22000A 210014", "comment": "CONNACK"} + ]}, + { "name": "10 Client ID with 0x0000", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746F700000"} + ]}, + { "name": "10 Client ID with U+D800", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746FEDA080"} + ]}, + { "name": "10 Client ID with U+0001", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746F700170"} + ]}, + { "name": "10 Client ID with U+001F", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746F701F70"} + ]}, + { "name": "10 Client ID with U+007F", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746F707F70"} + ]}, + { "name": "10 Client ID with U+009F", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746FC29F70"} + ]}, + { "name": "10 Client ID with U+FFFF", "connect":false, "msgs": [ + {"type":"send", "payload":"10 12 0004 4D515454 05 02 000A 00 0005 746FEDBFBF"} + ]}, + { "name": "10 [MQTT-3.1.2-16]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 11 0004 4D515454 05 02 000A 00 0001 70 0001 70"} + ]}, + { "name": "10 [MQTT-3.1.2-17]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 0E 0004 4D515454 05 82 000A 00 0001 70"} + ]}, + { "name": "10 Username with 0x0000", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746F700000"} + ]}, + { "name": "10 Username with 0xD800", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746FEDA080"} + ]}, + { "name": "10 Username with 0x0001", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746F700170"} + ]}, + { "name": "10 Username with 0x001F", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746F701F70"} + ]}, + { "name": "10 Username with 0x007F", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746F707F70"} + ]}, + { "name": "10 Username with 0x009F", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746FC29F70"} + ]}, + { "name": "10 Username with 0xFFFF", "connect":false, "msgs":[ + {"type":"send", "payload":"10 15 0004 4D515454 05 82 000A 00 0001 70 0005 746FEDBFBF"} + ]}, + { "name": "10 [MQTT-3.1.2-18]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 14 0004 4D515454 05 82 000A 00 0001 70 0001 70 0001 70"} + ]}, + { "name": "10 [MQTT-3.1.2-19]", "connect":false, "msgs":[ + {"type":"send", "payload":"10 11 0004 4D515454 05 C2 000A 00 0001 70 0001 70"} + ]}, + { "name": "tiny max packet", "connect":false, "msgs":[{"type":"send", "payload":"10 13 0004 4D515454 05 02 000A 05 2700000002 0001 70"}]} + ] + }, + { + "group": "v5.0 CONNECT EXTENDED AUTH", + "tests": [ + { "name": "unsupported authentication method", "connect":false, "msgs":[ + {"type":"send", "payload":"10 23 0004 4D515454 05 02 000A 15 15000B756E737570706F7274656416000474657374 0001 70", "comment":"auth-method:unsupported, auth-data:test"}, + {"type":"recv", "payload":"20 03 00 8C 00", "comment": "CONNACK Bad authentication method"} + ]} + ] + } +] diff --git a/test/broker/data/DISCONNECT.json b/test/broker/data/DISCONNECT.json new file mode 100644 index 00000000..18b28fe6 --- /dev/null +++ b/test/broker/data/DISCONNECT.json @@ -0,0 +1,431 @@ +[ + { + "group": "v3.1.1 DISCONNECT", + "tests": [ + { "name": "E0 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"E0 00"}]}, + { "name": "E0 long", "ver":4, "msgs": [{"type":"send", "payload":"E0 01 00"}]}, + { "name": "E0 valid", "ver":4, "msgs": [{"type":"send", "payload":"E0 00"}]}, + { "name": "E1 [MQTT-3.14.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"E1 00"}]}, + { "name": "E2 [MQTT-3.14.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"E2 00"}]}, + { "name": "E4 [MQTT-3.14.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"E4 00"}]}, + { "name": "E8 [MQTT-3.14.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"E8 00"}]} + ] + }, + { + "group": "v5.0 DISCONNECT", + "tests": [ + { "name": "E0 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"E0 00"}]}, + { "name": "E0 long", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 00"}]}, + { "name": "E0 valid", "ver":5, "msgs": [{"type":"send", "payload":"E0 00"}]}, + { "name": "E1 [MQTT-3.14.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"E1 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E2 [MQTT-3.14.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"E2 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E4 [MQTT-3.14.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"E4 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E8 [MQTT-3.14.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"E8 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 RC=0x00 (normal disconnection)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 00"}]}, + { "name": "E0 RC=0x01 (qos 1 - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 01"}]}, + { "name": "E0 RC=0x04 (disconnect with will)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 04"}]}, + { "name": "E0 RC=0x05 (invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 05"}]}, + { "name": "E0 RC=0x80 (unspecified error)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 80"}]}, + { "name": "E0 RC=0x81 (malformed packet)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 81"}]}, + { "name": "E0 RC=0x82 (protocol error)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 82"}]}, + { "name": "E0 RC=0x83 (implementation specific error)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 83"}]}, + { "name": "E0 RC=0x87 (not authorised - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 87"}]}, + { "name": "E0 RC=0x89 (server busy - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 89"}]}, + { "name": "E0 RC=0x8B (server shutting down - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 8B"}]}, + { "name": "E0 RC=0x8D (keep alive timeout - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 8D"}]}, + { "name": "E0 RC=0x8E (session taken over - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 8E"}]}, + { "name": "E0 RC=0x8F (topic filter invalid - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 8F"}]}, + { "name": "E0 RC=0x90 (topic name invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 90"}]}, + { "name": "E0 RC=0x93 (receive maximum exceeded)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 93"}]}, + { "name": "E0 RC=0x94 (topic alias invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 94"}]}, + { "name": "E0 RC=0x95 (packet too large)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 95"}]}, + { "name": "E0 RC=0x96 (message rate too high)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 96"}]}, + { "name": "E0 RC=0x97 (quota exceeded)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 97"}]}, + { "name": "E0 RC=0x98 (administrative action)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 98"}]}, + { "name": "E0 RC=0x99 (payload format invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 99"}]}, + { "name": "E0 RC=0x9A (retain not supported - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9A"}]}, + { "name": "E0 RC=0x9B (qos not supported - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9B"}]}, + { "name": "E0 RC=0x9C (use another server - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9C"}]}, + { "name": "E0 RC=0x9D (server moved - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9D"}]}, + { "name": "E0 RC=0x9E (shared subs not supported - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9E"}]}, + { "name": "E0 RC=0x9F (connection rate exceeded - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 9F"}]}, + { "name": "E0 RC=0xA0 (maximum connect time - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 A0"}]}, + { "name": "E0 RC=0xA1 (subscription ids not supported - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 A1"}]}, + { "name": "E0 RC=0xA2 (wildcard subs not supported - invalid)", "ver":5, "msgs": [{"type":"send", "payload":"E0 01 A2"}]}, + + { "name": "E0 RC=0x82 PL=0", "ver":5, "msgs": [{"type":"send", "payload":"E0 02 82 00"}]}, + { "name": "E0 RC=0x00 PL=1 P=0", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 RC=0x00 PL=1 P=0x11", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 RC=0x00 PL=2 P=0x11", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1100"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 RC=0x00 PL=3 P=0x11", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 110000"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 RC=0x00 PL=4 P=0x11", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 11000000"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 RC=0x00 PL=5 P=0x11", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 1100000000"} + ]}, + { "name": "E0 non-zero session expiry", "ver":5, "connect":false, "msgs": [ + {"type":"send", "payload":"101300044D5154540502000A051100000000000170", "comment":"CONNECT with session expiry=0"}, + {"type":"recv", "payload":"200900000622000A210014", "comment": "CONNACK"}, + {"type":"send", "payload":"E0 07 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + }, + { + "group": "v5.0 DISCONNECT ALLOWED PROPERTIES", + "tests": [ + { "name": "E0 with reason-string property", "ver":5, "msgs": [{"type":"send", "payload":"E0 06 00 04 1F000170"}]}, + { "name": "E0 with 2*reason-string property (invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 0A 00 08 1F000170 1F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 1F"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with user-property", "ver":5, "msgs": [{"type":"send", "payload":"E0 09 00 07 26000170000171"}]}, + { "name": "E0 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [{"type":"send", "payload":"E0 07 00 05 1100000000"}]}, + { "name": "E0 with 2*session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 0C 00 0A 1100000000 1100000000"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with server-reference (UTF-8 string)", "ver":5, "msgs": [{"type":"send", "payload":"E0 06 00 04 1C000170"}]}, + { "name": "E0 with 2*server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 0A 00 08 1C000170 1C000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 1C"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 DISCONNECT DISALLOWED PROPERTIES", + "tests": [ + { "name": "E0 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 17"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 24"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 25"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 28"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 29"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 2A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 02"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 18"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 27"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 08"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 15"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 1A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 0109"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 0116"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 0B"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "E0 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "E0 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 13"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 21"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 22"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 03 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "E0 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0501"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0601"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0701"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 2001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 04 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 800001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 05 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 06 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "E0 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"E0 07 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/FLOW.json b/test/broker/data/FLOW.json new file mode 100644 index 00000000..070c40f8 --- /dev/null +++ b/test/broker/data/FLOW.json @@ -0,0 +1,211 @@ +[ + { + "comment": "FLOW TESTS ARE INCOMPLETE", + "group": "v3.1.1 FLOW", + "tests": [ + { "name": "QoS 0 self receive ok", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 03 1234 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 0A 0001 70 6d657373616765", "comment":"PUBLISH send"}, + {"type":"recv", "payload":"30 0A 0001 70 6d657373616765", "comment":"PUBLISH receive"} + ]}, + { "name": "QoS 1 receive ok", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 03 1234 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"40 02 00 01", "comment":"PUBACK"} + ]}, + { "name": "QoS 1 PUBLISH-PUBREC", "ver":4, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 03 1234 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment":"PUBREC"} + ]}, + { "name": "QoS 1 PUBLISH-PUBCOMP", "ver":4, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 03 1234 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"70 02 0001", "comment":"PUBCOMP"} + ]}, + { "name": "QoS 2 receive ok", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 03 1234 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment":"PUBREC"}, + {"type":"recv", "payload":"62 02 0001", "comment":"PUBREL"}, + {"type":"send", "payload":"70 02 0001", "comment":"PUBCOMP"} + ]}, + { "name": "QoS 2 PUBLISH-PUBACK", "ver":4, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 03 1234 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"40 02 0001", "comment": "PUBACK (should be PUBREC)"} + ]}, + { "name": "QoS 2 PUBLISH-PUBCOMP", "ver":4, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 03 1234 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"70 02 0001", "comment": "PUBCOMP (should be PUBREC)"} + ]}, + { "name": "QoS 2 PUBLISH-PUBREC-PUBREL-PUBACK", "ver":4, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 03 1234 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC)"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"}, + {"type":"send", "payload":"40 02 0001", "comment": "PUBACK (should be PUBCOMP))"} + ]}, + { "name": "QoS 2 PUBLISH-PUBREC-PUBREL-PUBREC", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 03 1234 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0C 0001 70 0001 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC)"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC (should be PUBCOMP))"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"} + ]} + ] + }, + { + "group": "v5.0 FLOW", + "tests": [ + { "name": "QoS 0 self receive ok", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 0B 0001 70 00 6d657373616765", "comment":"PUBLISH send"}, + {"type":"recv", "payload":"30 0B 0001 70 00 6d657373616765", "comment":"PUBLISH receive"} + ]}, + { "name": "QoS 1 receive ok", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"40 02 0001", "comment":"PUBACK"} + ]}, + { "name": "QoS 1 PUBLISH-PUBREC", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment":"PUBREC"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "QoS 1 PUBLISH-PUBCOMP", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01", "comment":"SUBSCRIBE, 'p' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":1, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"32 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"70 02 0001", "comment":"PUBCOMP"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "QoS 2 receive ok", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 04 1234 00 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment":"PUBREC"}, + {"type":"recv", "payload":"62 02 0001", "comment":"PUBREL"}, + {"type":"send", "payload":"70 02 0001", "comment":"PUBCOMP"} + ]}, + { "name": "QoS 2 PUBLISH-PUBACK", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 04 1234 00 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"40 02 0001", "comment": "PUBACK (should be PUBREC)"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "QoS 2 PUBLISH-PUBCOMP", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 04 1234 00 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"70 02 0001", "comment": "PUBCOMP (should be PUBREC)"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "QoS 2 PUBLISH-PUBREC-PUBREL-PUBACK", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 04 1234 00 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC)"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"}, + {"type":"send", "payload":"40 02 0001", "comment": "PUBACK (should be PUBCOMP))"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "QoS 2 PUBLISH-PUBREC-PUBREL-PUBREC", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02", "comment":"SUBSCRIBE, 'p' qos2"}, + {"type":"recv", "payload":"90 04 1234 00 02", "comment":"SUBACK"}, + {"type":"publish", "topic":"p", "qos":2, "payload":"message", "comment":"helper"}, + {"type":"recv", "payload":"34 0D 0001 70 0001 00 6d657373616765", "comment":"PUBLISH receive"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC)"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"}, + {"type":"send", "payload":"50 02 0001", "comment": "PUBREC (should be PUBCOMP))"}, + {"type":"recv", "payload":"62 02 0001", "comment": "PUBREL)"} + ]} + ] + }, + { + "group": "v5.0 FLOW WITH PROPERTIES", + "tests": [ + { "name": "payload-format-indicator=1 (byte)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 11 0005 746F706963 02 0101 7061796C6F6164", "comment": "PUBLISH send"}, + {"type":"recv", "payload":"30 11 0005 746F706963 02 0101 7061796C6F6164", "comment": "PUBLISH recv"} + ]}, + { "name": "message-expiry-interval=1 (four byte integer)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 14 0005 746F706963 05 0200000001 7061796C6F6164"}, + {"type":"recv", "payload":"30 14 0005 746F706963 05 0200000001 7061796C6F6164"} + ]}, + { "name": "topic-alias", "expect_disconnect":false, "ver":5, "comment":"broker doesn't initiate topic alias", "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 12 0005 746F706963 03 230001 7061796C6F6164", "comment":"PUBLISH with topic alias 1"}, + {"type":"recv", "payload":"30 0F 0005 746F706963 00 7061796C6F6164", "comment":"PUBLISH receive 1"}, + {"type":"send", "payload":"30 0D 0000 03 230001 7061796C6F6164", "comment":"PUBLISH with topic alias 1, no topic"}, + {"type":"recv", "payload":"30 0F 0005 746F706963 00 7061796C6F6164", "comment":"PUBLISH receive 2"} + ]}, + { "name": "response-topic", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 13 0005 746F706963 04 08000170 7061796C6F6164"}, + {"type":"recv", "payload":"30 13 0005 746F706963 04 08000170 7061796C6F6164"} + ]}, + { "name": "correlation-data", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 13 0005 746F706963 04 09000170 7061796C6F6164"}, + {"type":"recv", "payload":"30 13 0005 746F706963 04 09000170 7061796C6F6164"} + ]}, + { "name": "user-property", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 16 0005 746F706963 07 26000170000171 7061796C6F6164"}, + {"type":"recv", "payload":"30 16 0005 746F706963 07 26000170000171 7061796C6F6164"} + ]}, + { "name": "subscription-identifier", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0D 1234 02 0B01 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 0F 0005 746F706963 00 7061796C6F6164"}, + {"type":"recv", "payload":"30 11 0005 746F706963 02 0B01 7061796C6F6164"} + ]}, + { "name": "content-type", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 01", "comment":"SUBSCRIBE, 'topic' qos1"}, + {"type":"recv", "payload":"90 04 1234 00 01", "comment":"SUBACK"}, + {"type":"send", "payload":"30 13 0005 746F706963 04 03000170 7061796C6F6164"}, + {"type":"recv", "payload":"30 13 0005 746F706963 04 03000170 7061796C6F6164"} + ]} + ] + } +] diff --git a/test/broker/data/FORBIDDEN.json b/test/broker/data/FORBIDDEN.json new file mode 100644 index 00000000..ceff5502 --- /dev/null +++ b/test/broker/data/FORBIDDEN.json @@ -0,0 +1,52 @@ +[ + { + "group": "v3.1.1 FORBIDDEN", + "tests": [ + { "name": "00 first packet", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"00 00"}]}, + { "name": "01 first packet", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"01 00"}]}, + { "name": "02 first packet", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"02 00"}]}, + { "name": "04 first packet", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"04 00"}]}, + { "name": "08 first packet", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"08 00"}]}, + { "name": "00 long", "ver":4, "msgs": [{"type":"send", "payload":"00 01 00"}]}, + { "name": "00", "ver":4, "msgs": [{"type":"send", "payload":"00 00"}]}, + { "name": "01", "ver":4, "msgs": [{"type":"send", "payload":"01 00"}]}, + { "name": "02", "ver":4, "msgs": [{"type":"send", "payload":"02 00"}]}, + { "name": "04", "ver":4, "msgs": [{"type":"send", "payload":"04 00"}]}, + { "name": "08", "ver":4, "msgs": [{"type":"send", "payload":"08 00"}]} + ] + }, + { + "group": "v5.0 FORBIDDEN", + "tests": [ + { "name": "00 first packet", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"00 00"}]}, + { "name": "01 first packet", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"01 00"}]}, + { "name": "02 first packet", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"02 00"}]}, + { "name": "04 first packet", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"04 00"}]}, + { "name": "08 first packet", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"08 00"}]}, + { "name": "00 long", "ver":5, "msgs": [ + {"type":"send", "payload":"00 01 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]}, + { "name": "00", "ver":5, "msgs": [ + {"type":"send", "payload":"00 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]}, + { "name": "01", "ver":5, "msgs": [ + {"type":"send", "payload":"01 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]}, + { "name": "02", "ver":5, "msgs": [ + {"type":"send", "payload":"02 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]}, + { "name": "04", "ver":5, "msgs": [ + {"type":"send", "payload":"04 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]}, + { "name": "08", "ver":5, "msgs": [ + {"type":"send", "payload":"08 00"}, + {"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"} + ]} + ] + } +] diff --git a/test/broker/data/PINGREQ.json b/test/broker/data/PINGREQ.json new file mode 100644 index 00000000..0c1e07e9 --- /dev/null +++ b/test/broker/data/PINGREQ.json @@ -0,0 +1,38 @@ +[ + { + "group": "v3.1.1 PINGREQ", + "tests": [ + { "name": "C0 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"C0 00"}]}, + { "name": "C0 long", "ver":4, "msgs": [{"type":"send", "payload":"C00100"}]}, + { "name": "C0 valid", "ver":4, "expect_disconnect": false, "msgs": [{"type":"send", "payload":"C0 00"}, {"type":"recv", "payload":"D0 00"}]}, + { "name": "C1", "ver":4, "msgs": [{"type":"send", "payload":"C1 00"}]}, + { "name": "C2", "ver":4, "msgs": [{"type":"send", "payload":"C2 00"}]}, + { "name": "C4", "ver":4, "msgs": [{"type":"send", "payload":"C4 00"}]}, + { "name": "C8", "ver":4, "msgs": [{"type":"send", "payload":"C8 00"}]} + ] + }, + { + "group": "v5.0 PINGREQ", + "tests": [ + { "name": "C0 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"C0 00"}]}, + { "name": "C0 long", "ver":5, "msgs": [{"type":"send", "payload":"C0 01 00"}]}, + { "name": "C0 valid", "ver":5, "expect_disconnect": false, "msgs": [{"type":"send", "payload":"C0 00"}, {"type":"recv", "payload":"D0 00"}]}, + { "name": "C1", "ver":5, "msgs": [ + {"type":"send", "payload":"C1 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "C2", "ver":5, "msgs": [ + {"type":"send", "payload":"C2 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "C4", "ver":5, "msgs": [ + {"type":"send", "payload":"C4 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "C8", "ver":5, "msgs": [ + {"type":"send", "payload":"C8 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/PINGRESP.json b/test/broker/data/PINGRESP.json new file mode 100644 index 00000000..6e3f4350 --- /dev/null +++ b/test/broker/data/PINGRESP.json @@ -0,0 +1,41 @@ +[ + { + "group": "v3.1.1 PINGRESP", + "tests": [ + { "name": "D0 [MQTT-3.1.0-1]", "ver":4, "connect": false, "msgs": [{"type":"send", "payload":"D0 00"}]}, + { "name": "D0 long", "ver":4, "msgs": [{"type":"send", "payload":"D0 01 00"}]}, + { "name": "D0", "ver":4, "msgs": [{"type":"send", "payload":"D0 00"}]}, + { "name": "D1", "ver":4, "msgs": [{"type":"send", "payload":"D1 00"}]}, + { "name": "D2", "ver":4, "msgs": [{"type":"send", "payload":"D2 00"}]}, + { "name": "D4", "ver":4, "msgs": [{"type":"send", "payload":"D4 00"}]}, + { "name": "D8", "ver":4, "msgs": [{"type":"send", "payload":"D8 00"}]} + ] + }, + { + "group": "v5.0 PINGRESP", + "tests": [ + { "name": "D0 [MQTT-3.1.0-1]", "ver":5, "connect": false, "msgs": [{"type":"send", "payload":"D0 00"}]}, + { "name": "D0 long", "ver":5, "msgs": [{"type":"send", "payload":"D0 01 00"}]}, + { "name": "D0", "ver":5, "msgs": [ + {"type":"send", "payload":"D0 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "D1", "ver":5, "msgs": [ + {"type":"send", "payload":"D1 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "D2", "ver":5, "msgs": [ + {"type":"send", "payload":"D2 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "D4", "ver":5, "msgs": [ + {"type":"send", "payload":"D4 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "D8", "ver":5, "msgs": [ + {"type":"send", "payload":"D8 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + } +] diff --git a/test/broker/data/PUBACK.json b/test/broker/data/PUBACK.json new file mode 100644 index 00000000..e2d8b888 --- /dev/null +++ b/test/broker/data/PUBACK.json @@ -0,0 +1,398 @@ +[ + { + "group": "v3.1.1 PUBACK", + "tests": [ + { "name": "40 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"40 02 0001"}]}, + { "name": "40 unsolicited long", "ver":4, "msgs": [{"type":"send", "payload":"40 03 0001 00"}]}, + { "name": "40 unsolicited mid 0", "ver":4, "msgs": [{"type":"send", "payload":"40 02 0000"}]}, + { "name": "40 unsolicited short 0", "ver":4, "msgs": [{"type":"send", "payload":"40 00"}]}, + { "name": "40 unsolicited short 1", "ver":4, "msgs": [{"type":"send", "payload":"40 01 01"}]}, + { "name": "40 unsolicited", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 02 0001"}]}, + { "name": "41 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"41 02 0001"}]}, + { "name": "42 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"42 02 0001"}]}, + { "name": "44 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"44 02 0001"}]}, + { "name": "48 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"48 02 0001"}]} + ] + }, + { + "group": "v5.0 PUBACK", + "tests": [ + { "name": "40 [MQTT-3.1.0-1] (no reason code)", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"40 02 0001"}]}, + { "name": "40 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"40 03 0001 00"}]}, + { "name": "40 unsolicited long", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 unsolicited mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"40 03 0000 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 unsolicited short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"40 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 unsolicited short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"40 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 unsolicited len=2", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 02 0001"}]}, + { "name": "40 unsolicited len=3", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 03 0001 00"}]}, + { "name": "40 unsolicited len=3 fail", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 03 0001 80"}]}, + { "name": "40 unsolicited len=4 ok", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 04 0001 00 00"}]}, + { "name": "40 unsolicited len=4 rc=fail", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 04 0001 80 00"}]}, + { "name": "40 unsolicited len=4 rc=unknown", "ver":5, "msgs": [ + {"type":"send", "payload":"40 04 0001 FF 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 unsolicited len=4 short", "ver":5, "msgs": [ + {"type":"send", "payload":"40 04 0001 00 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "41 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"41 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "42 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"42 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "44 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"44 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "48 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"48 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBACK ALLOWED PROPERTIES", + "tests": [ + { "name": "40 with reason-string property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 08 0001 00 04 1F000170"}]}, + { "name": "40 with 2*reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"40 0C 0001 00 08 1F000170 1F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 1F"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with user-property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 0B 0001 00 07 26000170000171"}]}, + { "name": "40 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"40 12 0001 00 0E 26000170000171 26000170000171"}]}, + { "name": "40 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBACK DISALLOWED PROPERTIES", + "tests": [ + { "name": "40 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 17"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 24"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 25"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 28"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 29"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 2A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 02"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 18"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 27"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 1C000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 08"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 15"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 1A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 1C"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 09"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 16"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 0B"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "40 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "40 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 13"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 21"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 22"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"40 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "40 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0501"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0601"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0701"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 2001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 06 0001 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 800001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 07 0001 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 08 0001 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "40 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"40 09 0001 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/PUBCOMP.json b/test/broker/data/PUBCOMP.json new file mode 100644 index 00000000..627b634b --- /dev/null +++ b/test/broker/data/PUBCOMP.json @@ -0,0 +1,432 @@ +[ + { + "group": "v3.1.1 PUBCOMP", + "tests": [ + { "name": "70 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"70 02 0001"}]}, + { "name": "70 unsolicited long", "ver":4, "msgs": [{"type":"send", "payload":"70 03 0001 00"}]}, + { "name": "70 unsolicited mid 0", "ver":4, "msgs": [{"type":"send", "payload":"70 02 0000"}]}, + { "name": "70 unsolicited short 0", "ver":4, "msgs": [{"type":"send", "payload":"70 00"}]}, + { "name": "70 unsolicited short 1", "ver":4, "msgs": [{"type":"send", "payload":"70 01 01"}]}, + { "name": "70 unsolicited", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 02 0001"}]}, + { "name": "71 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"71 02 0001"}]}, + { "name": "72 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"72 02 0001"}]}, + { "name": "74 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"74 02 0001"}]}, + { "name": "78 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"78 02 0001"}]} + ] + }, + { + "group": "v5.0 PUBCOMP", + "tests": [ + { "name": "70 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"70 02 0001"}]}, + { "name": "70 unsolicited long", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 unsolicited mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"70 02 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 unsolicited short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 unsolicited short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"70 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 unsolicited short 3", "ver":5, "FIXME":"strictly, a short 3 should be malformed", "msgs": [ + {"type":"send", "payload":"70 03 0001 80"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 unsolicited", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 02 0001"}]}, + { "name": "70 unsolicited rc", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 03 0001 00"}]}, + { "name": "70 unsolicited rc=92", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 03 0001 92"}]}, + { "name": "70 unsolicited rc=20", "ver":5, "msgs": [ + {"type":"send", "payload":"70 03 0001 20"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 unsolicited rc=FF", "ver":5, "msgs": [ + {"type":"send", "payload":"70 03 0001 FF"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 unsolicited rc,properties", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 04 0001 00 00"}]}, + { "name": "71 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"71 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "72 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"72 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "74 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"74 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "78 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"78 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "71 unsolicited rc", "ver":5, "msgs": [ + {"type":"send", "payload":"71 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "72 unsolicited rc", "ver":5, "msgs": [ + {"type":"send", "payload":"72 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "74 unsolicited rc", "ver":5, "msgs": [ + {"type":"send", "payload":"74 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "78 unsolicited rc", "ver":5, "msgs": [ + {"type":"send", "payload":"78 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "71 unsolicited rc,properties", "ver":5, "msgs": [ + {"type":"send", "payload":"71 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "72 unsolicited rc,properties", "ver":5, "msgs": [ + {"type":"send", "payload":"72 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "74 unsolicited rc,properties", "ver":5, "msgs": [ + {"type":"send", "payload":"74 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "78 unsolicited rc,properties", "ver":5, "msgs": [ + {"type":"send", "payload":"78 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBCOMP ALLOWED PROPERTIES", + "tests": [ + { "name": "70 with reason-string property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 08 0001 00 04 1F000170"}]}, + { "name": "70 with 2*reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"70 0C 0001 00 08 1F0001701 F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 1F"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with user-property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 0B 0001 00 07 26000170000171"}]}, + { "name": "70 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"70 12 0001 00 0E 26000170000171 26000170000171"}]}, + { "name": "70 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBCOMP DISALLOWED PROPERTIES", + "tests": [ + { "name": "70 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 17"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 24"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 25"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 28"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 29"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 2A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 02"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 18"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 27"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 1C000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 08"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 15"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 1A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 1C"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 0109"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 0116"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 0B"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "70 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "70 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 13"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 21"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 22"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"70 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "70 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0501"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0601"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0701"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 2001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 06 0001 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 800001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 07 0001 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 08 0001 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "70 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"70 09 0001 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/PUBLISH.json b/test/broker/data/PUBLISH.json new file mode 100644 index 00000000..b4d9863a --- /dev/null +++ b/test/broker/data/PUBLISH.json @@ -0,0 +1,574 @@ +[ + { + "group": "v3.1.1 PUBLISH", + "tests": [ + { "name": "30 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"30 0E 0005 746F706963 7061796C6F6164"}]}, + { "name": "30", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"30 0E 0005 746F706963 7061796C6F6164"}]}, + { "name": "31 retain 1", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"31 0E 0005 746F706963 7061796C6F6164"}]}, + { "name": "31 retain 1 zero length", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"31 07 0005 746F706963"}]}, + { "name": "30 topic 0", "ver":4, "msgs": [{"type":"send", "payload":"30 09 0000 7061796C6F6164"}]}, + { "name": "38 QoS 0 Dup 1", "ver":4, "msgs": [{"type":"send", "payload":"38 0E 0005 746F706963 7061796C6F6164"}]}, + { "name": "36 QoS 3 (no mid) [MQTT-3.3.1-4]", "ver":4, "msgs": [{"type":"send", "payload":"36 0E 0005 746F706963 7061796C6F6164"}]}, + { "name": "36 QoS 3 (with mid) [MQTT-3.3.1-4]", "ver":4, "msgs": [{"type":"send", "payload":"36 10 0005 746F706963 1234 7061796C6F6164"}]}, + { "name": "32 QoS 1 Mid 0", "ver":4, "msgs": [{"type":"send", "payload":"32 10 0005 746F706963 0000 7061796C6F6164"}]}, + { "name": "34 QoS 2 Mid 0", "ver":4, "msgs": [{"type":"send", "payload":"34 10 0005 746F706963 0000 7061796C6F6164"}]}, + { "name": "32 QoS 1 Dup 0", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 10 0005 746F706963 1234 7061796C6F6164"}, + {"type":"recv", "payload":"40 02 1234"} + ]}, + { "name": "3A QoS 1 Dup 1", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"3A 10 0005 746F706963 1234 7061796C6F6164"}, + {"type":"recv", "payload":"40 02 1234"} + ]}, + { "name": "34 QoS 2 Dup 0", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"34 10 0005 746F706963 1234 7061796C6F6164"}, + {"type":"recv", "payload":"50 02 1234"}, + {"type":"send", "payload":"62 02 1234"}, + {"type":"recv", "payload":"70 02 1234"} + ]}, + { "name": "3C QoS 2 Dup 1", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"3C 10 0005 746F706963 1234 7061796C6F6164"}, + {"type":"recv", "payload":"50 02 1234"}, + {"type":"send", "payload":"62 02 1234"}, + {"type":"recv", "payload":"70 02 1234"} + ]}, + { "name": "30 topic with 0x0000", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746F700000 7061796C6F6164"}]}, + { "name": "30 topic with U+D800", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746FEDA080 7061796C6F6164"}]}, + { "name": "30 topic with U+0001", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746F700170 7061796C6F6164"}]}, + { "name": "30 topic with U+001F", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746F701F70 7061796C6F6164"}]}, + { "name": "30 topic with U+007F", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746F707F70 7061796C6F6164"}]}, + { "name": "30 topic with U+009F", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746FC29F70 7061796C6F6164"}]}, + { "name": "30 topic with U+FFFF", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746FEDBFBF 7061796C6F6164"}]}, + { "name": "30 topic with U+2A6D4 (section 1.5.3.1)", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"30 0E 0005 41F0AA9B94 7061796C6F6164"}]}, + { "name": "30 topic with + [MQTT-3.3.2-2]", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 2B6F706963 7061796C6F6164"}]}, + { "name": "30 topic with # [MQTT-3.3.2-2]", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 236F706963 7061796C6F6164"}]} + ] + }, + { + "group": "v5.0 PUBLISH", + "tests": [ + { "name": "30 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"30 0F 0005 746F706963 00 7061796C6F6164"}]}, + { "name": "30", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"30 0F 0005 746F706963 00 7061796C6F6164"}]}, + { "name": "31 retain 1", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"31 0F 0005 746F706963 00 7061796C6F6164"}]}, + { "name": "31 retain 1 zero length", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"31 08 0005 746F706963 00"}]}, + { "name": "30 topic 0", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0A 0000 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "38 QoS 0 Dup 1", "ver":5, "msgs": [ + {"type":"send", "payload":"38 0F 0005 746F706963 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "36 QoS 3 (no mid) [MQTT-3.3.1-4]", "ver":5, "msgs": [ + {"type":"send", "payload":"36 0F 0005 746F706963 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "36 QoS 3 (with mid) [MQTT-3.3.1-4]", "ver":5, "msgs": [ + {"type":"send", "payload":"3611 0005 746F706963 1234 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "32 QoS 1 Mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"32 11 0005 746F706963 0000 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "34 QoS 2 Mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"34 11 0005 746F706963 0000 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "32 QoS 1 Dup 0", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 11 0005 746F706963 1234 00 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "3A QoS 1 Dup 1", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"3A11 0005 746F706963 1234 00 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "34 QoS 2 Dup 0", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"34 11 0005 746F706963 1234 00 7061796C6F6164"}, + {"type":"recv", "payload":"50 02 1234"}, + {"type":"send", "payload":"62 02 1234"}, + {"type":"recv", "payload":"70 02 1234"} + ]}, + { "name": "3C QoS 2 Dup 1", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"3C 11 0005 746F706963 1234 00 7061796C6F6164"}, + {"type":"recv", "payload":"50 02 1234"}, + {"type":"send", "payload":"62 02 1234"}, + {"type":"recv", "payload":"70 02 1234"} + ]}, + { "name": "30 topic with 0x0000", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746F700000 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+D800", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746FEDA080 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+0001", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746F700170 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+001F", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746F701F70 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+007F", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746F707F70 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+009F", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746FC29F70 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+FFFF", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 746FEDBFBF 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with U+2A6D4 (section 1.5.3.1)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"30 0F 0005 41F0AA9B94 00 7061796C6F6164"} + ]}, + { "name": "30 topic with + [MQTT-3.3.2-2]", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 2B6F706963 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "30 topic with # [MQTT-3.3.2-2]", "ver":5, "msgs": [ + {"type":"send", "payload":"30 0F 0005 236F706963 00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBLISH ALLOWED PROPERTIES", + "tests": [ + { "name": "maximum packet size", "ver":5, "connect":false, "expect_disconnect":false, "msgs":[ + {"type":"send", "payload":"10 13 0004 4D515454 05 02 000A 05 2700000014 0001 70", "comment":"CONNECT with max-packet-size 20"}, + {"type":"recv", "payload":"20 09 00 00 06 22000A210014", "comment": "CONNACK"}, + {"type":"send", "payload":"82 0B 1234 00 0005 746F706963 00", "comment":"SUBSCRIBE topic"}, + {"type":"recv", "payload":"90 04 1234 00 00", "comment":"SUBACK"}, + {"type":"send", "payload":"30 16 0005 746F706963 00 7061796C6F61647061796C6F6164", "comment":"PUBLISH with size > 20"}, + {"type":"send", "payload":"30 0F 0005 746F706963 00 7061796C6F6164", "comment":"PUBLISH with size < 20"}, + {"type":"recv", "payload":"30 0F 0005 746F706963 00 7061796C6F6164", "comment":"PUBLISH with size < 20, returned"} + ]}, + { "name": "payload-format-indicator=0 (byte)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0100 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "payload-format-indicator=1 (byte)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0101 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "payload-format-indicator=2 (byte, invalid)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0102 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "2*payload-format-indicator=1 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 0101 0101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "message-expiry-interval=0 (four byte integer)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 0200000000 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "message-expiry-interval=1 (four byte integer)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 0200000001 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + + { "name": "2*message-expiry-interval=1 (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 1A 0005 746F706963 1234 0A 0200000001 0200000001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 02 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "topic alias > max topic alias", "ver":5, "msgs": [ + {"type":"send", "payload":"30 12 0005 746F706963 03 23000B 7061796C6F6164", "comment":"PUBLISH with topic alias 11 (server has set max topic alias=10)"}, + {"type":"recv", "payload":"E0 01 94"} + ]}, + { "name": "topic-alias (two byte integer)", "expect_disconnect":false, "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 230001 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "2*topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 17 0005 746F706963 1234 06 230001 230001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "2*topic-alias different (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 17 0005 746F706963 1234 06 230001 230002 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 23 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "response-topic (UTF-8 string)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 08000170 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "2*response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 19 0005 746F706963 1234 08 08000170 08000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 08 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "correlation-data (binary data)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 09000170 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "2*correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 19 0005 746F706963 1234 08 09000170 09000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 09 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 18 0005 746F706963 1234 07 26000170000171 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "2*user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 1F 0005 746F706963 1234 0E 26000170000171 26000170000171 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 26000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 26 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "subscription-identifier=1 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0B01 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0x7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0B7F 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0x8000 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 0B8000 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "subscription-identifier=0x8001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 0B8001 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0xFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 0BFF7F 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0x808001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 0B808001 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0xFFFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 0BFFFF7F 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0x80808001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 0B80808001 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0xFFFFFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 0BFFFFFF7F 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "subscription-identifier=0x8080808001 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 17 0005 746F706963 1234 06 0B8080808001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "2*subscription-identifier=1 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 0B01 0B01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 0B 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "content-type (UTF-8 string)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 03000170 7061796C6F6164"}, + {"type":"recv", "payload":"40 03 1234 10"} + ]}, + { "name": "2*content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 19 0005 746F706963 1234 08 03000170 03000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 03 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBLISH DISALLOWED PROPERTIES", + "tests": [ + { "name": "reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 1F000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1700 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2400 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2500 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2800 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2900 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2A00 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 17 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 24 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 25 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 28 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 29 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 2A7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 1100000001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 1800000001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 2700000001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 04 11 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 04 18 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 04 27 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 12000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 15000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 1A000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 1C000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 12 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 15 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 1A7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 1C7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 16000170 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 16 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 130101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 210101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 220101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 13 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 21 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"32 12 0005 746F706963 1234 01 22 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0401 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0501 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0601 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0701 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0A01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0C01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0D01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0E01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 0F01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1401 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1B01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1D01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 1E01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 2001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 13 0005 746F706963 1234 02 7F01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 800001 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 800101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 14 0005 746F706963 1234 03 FF7F01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 80800101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 15 0005 746F706963 1234 04 FFFF7F01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 8080800101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 16 0005 746F706963 1234 05 FFFFFF7F01 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "unknown-property 0x8080808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"32 17 0005 746F706963 1234 06 808080800101 7061796C6F6164"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/PUBREC.json b/test/broker/data/PUBREC.json new file mode 100644 index 00000000..b2365f34 --- /dev/null +++ b/test/broker/data/PUBREC.json @@ -0,0 +1,419 @@ +[ + { + "group": "v3.1.1 PUBREC", + "tests": [ + { "name": "50 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"50 02 0001"}]}, + { "name": "50 unsolicited", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 02 0001"}, + {"type":"recv", "payload":"62 02 0001"} + ] }, + { "name": "50 unsolicited long", "ver":4, "msgs": [{"type":"send", "payload":"50 03 0001 00"}]}, + { "name": "50 unsolicited mid 0", "ver":4, "msgs": [{"type":"send", "payload":"50 02 0000"}]}, + { "name": "50 unsolicited short 0", "ver":4, "msgs": [{"type":"send", "payload":"50 00"}]}, + { "name": "50 unsolicited short 1", "ver":4, "msgs": [{"type":"send", "payload":"50 01 01"}]}, + { "name": "51 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"51 02 0001"}]}, + { "name": "52 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"52 02 0001"}]}, + { "name": "54 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"54 02 0001"}]}, + { "name": "58 unsolicited", "ver":4, "msgs": [{"type":"send", "payload":"58 02 0001"}]} + ] + }, + { + "group": "v5.0 PUBREC", + "tests": [ + { "name": "50 [MQTT-3.1.0-1] (no reason code)", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"50 02 0001"}]}, + { "name": "50 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"50 03 0001 00"}]}, + { "name": "50 unsolicited long", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 unsolicited mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"50 03 0000 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 unsolicited short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"50 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 unsolicited short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"50 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 unsolicited len=2", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 02 0001"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 unsolicited len=3", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 03 0001 00"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 unsolicited len=3 fail", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"50 03 0001 80"}]}, + { "name": "50 unsolicited len=4 ok", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 04 0001 00 00"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 unsolicited len=4 rc=fail", "ver":5, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"50 04 0001 80 00"}]}, + { "name": "50 unsolicited len=4 rc=unknown", "ver":5, "msgs": [ + {"type":"send", "payload":"50 04 0001 FF 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 unsolicited len=4 short", "ver":5, "msgs": [ + {"type":"send", "payload":"50 04 0001 00 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "51 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"51 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "52 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"52 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "54 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"54 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "58 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"58 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBREC ALLOWED PROPERTIES", + "tests": [ + { "name": "50 with reason-string property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 1F000170"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 with 2*reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"50 0C 0001 00 08 1F000170 1F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 1F"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 0B 0001 00 07 26000170000171"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"50 12 0001 00 0E 26000170000171 26000170000171"}, + {"type":"recv", "payload":"62 02 0001"} + ]}, + { "name": "50 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBREC DISALLOWED PROPERTIES", + "tests": [ + { "name": "50 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 17"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 24"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 25"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 28"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 29"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 2A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 02"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 18"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 27"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 1C000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 08"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 15"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 1A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 1C"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 09"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 16"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 0B"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "50 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "50 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 13"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 21"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 22"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"50 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "50 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0501"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0601"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0701"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 2001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 06 0001 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 800001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 07 0001 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 08 0001 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "50 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"50 09 0001 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/PUBREL.json b/test/broker/data/PUBREL.json new file mode 100644 index 00000000..8c3f0909 --- /dev/null +++ b/test/broker/data/PUBREL.json @@ -0,0 +1,426 @@ +[ + { + "group": "v3.1.1 PUBREL", + "tests": [ + { "name": "62 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"62 02 0001"}]}, + { "name": "62 unsolicited", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 02 0001"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited long", "ver":4, "msgs": [{"type":"send", "payload":"62 03 0001 00"}]}, + { "name": "62 unsolicited mid 0", "ver":4, "msgs": [{"type":"send", "payload":"62 02 0000"}]}, + { "name": "62 unsolicited short 0", "ver":4, "msgs": [{"type":"send", "payload":"62 00"}]}, + { "name": "62 unsolicited short 1", "ver":4, "msgs": [{"type":"send", "payload":"62 01 01"}]}, + { "name": "63 unsolicited [MQTT-3.6.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"63 02 0001"}]}, + { "name": "64 unsolicited [MQTT-3.6.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"64 02 0001"}]}, + { "name": "66 unsolicited [MQTT-3.6.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"66 02 0001"}]}, + { "name": "6A unsolicited [MQTT-3.6.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"6A 02 0001"}]} + ] + }, + { + "group": "v5.0 PUBREL", + "tests": [ + { "name": "62 [MQTT-3.1.0-1] (no reason code)", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"62 02 0001"}]}, + { "name": "62 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"62 03 0001 00"}]}, + { "name": "62 unsolicited long", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 unsolicited mid 0", "ver":5, "msgs": [ + {"type":"send", "payload":"62 03 0000 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 unsolicited short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"62 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 unsolicited short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"62 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 unsolicited len=2", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 02 0001"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited len=3", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 03 0001 00"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited len=3 fail", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 03 0001 92"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited len=4 ok", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 04 0001 00 00"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited len=4 rc=fail", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 04 0001 92 00"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 unsolicited len=4 rc=unknown", "ver":5, "msgs": [ + {"type":"send", "payload":"62 04 0001 FF 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 unsolicited len=4 short", "ver":5, "msgs": [ + {"type":"send", "payload":"62 04 0001 00 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "63 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"6303000100"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "64 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"6403000100"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "66 unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"6603000100"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "6A unsolicited", "ver":5, "msgs": [ + {"type":"send", "payload":"6A03000100"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBREL ALLOWED PROPERTIES", + "tests": [ + { "name": "62 with reason-string property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 1F000170"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 with 2*reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"62 0C 0001 00 081 F000170 1F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 1F"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 0B 0001 00 07 26000170000171"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"62 12 0001 00 0E 26000170000171 26000170000171"}, + {"type":"recv", "payload":"70 02 0001"} + ]}, + { "name": "62 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 23000170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 PUBREL DISALLOWED PROPERTIES", + "tests": [ + { "name": "62 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0100"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1700"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2400"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2500"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2800"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2900"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 17"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 24"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 25"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 28"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 29"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 2A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 0200000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 1100000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 1800000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 2700000001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 02"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 11"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 18"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 27"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 03000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 08000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 12000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 15000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 1A000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 1C000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 08"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 15"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 1A"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 1C"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 09000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 16000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 09"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 16"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 0B"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 130101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 210101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 220101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "62 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 230101"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "62 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 13"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 21"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 22"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"62 05 0001 00 01 23"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "62 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0501"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0601"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0701"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0A01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0C01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 0F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1401"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1B01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1D01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 1E01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 2001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 06 0001 00 02 7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 800001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 07 0001 00 03 FF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 80800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 08 0001 00 04 FFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 8080800101"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "62 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"62 09 0001 00 05 FFFFFF7F01"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/SUBACK.json b/test/broker/data/SUBACK.json new file mode 100644 index 00000000..416c677e --- /dev/null +++ b/test/broker/data/SUBACK.json @@ -0,0 +1,450 @@ +[ + { + "group": "v3.1.1 SUBACK", + "tests": [ + { "name": "90 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"90 03 0001 00"}]}, + { "name": "90 mid 0", "ver":4, "msgs": [{"type":"send", "payload":"90 03 0000 00"}]}, + { "name": "90", "ver":4, "msgs": [{"type":"send", "payload":"90 03 0001 00"}]}, + { "name": "90 short 0", "ver":4, "msgs": [{"type":"send", "payload":"90 00"}]}, + { "name": "90 short 1", "ver":4, "msgs": [{"type":"send", "payload":"90 01 01"}]}, + { "name": "90 short 2", "ver":4, "msgs": [{"type":"send", "payload":"90 02 0001"}]}, + { "name": "91", "ver":4, "msgs": [{"type":"send", "payload":"91 03 0001 00"}]}, + { "name": "92", "ver":4, "msgs": [{"type":"send", "payload":"92 03 0001 00"}]}, + { "name": "94", "ver":4, "msgs": [{"type":"send", "payload":"94 03 0001 00"}]}, + { "name": "98", "ver":4, "msgs": [{"type":"send", "payload":"98 03 0001 00"}]} + ] + }, + { + "group": "v5.0 SUBACK", + "tests": [ + { "name": "90 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"90 03 0001 00"}]}, + { "name": "90 long", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"90 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"90 01 01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 short 2", "ver":5, "msgs": [ + {"type":"send", "payload":"90 02 0001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 short 3", "ver":5, "msgs": [ + {"type":"send", "payload":"90 03 0001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90", "ver":5, "msgs": [ + {"type":"send", "payload":"90 03 0001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "91", "ver":5, "msgs": [ + {"type":"send", "payload":"91 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "92", "ver":5, "msgs": [ + {"type":"send", "payload":"92 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "94", "ver":5, "msgs": [ + {"type":"send", "payload":"94 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "98", "ver":5, "msgs": [ + {"type":"send", "payload":"98 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "90 with property", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 1F000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x01 qos 1", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x02 qos 2", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 02"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x11 no sub", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 11"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x80 unspecified error", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 80"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x83 implementation specific error", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 83"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x87 not authorised", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 87"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x8F topic filter invalid", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 8F"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x91 packet identifier in use", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 91"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x97 quota exceeded", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 97"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0x9E shared subs not supported", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 9E"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0xA1 sub ids not supported", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 A1"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0xA2 wildcards not supported", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 A2"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 reason code 0xFF unknown", "ver":5, "msgs": [ + {"type":"send", "payload":"90 04 0001 00 FF"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + }, + { + "group": "v5.0 SUBACK PROPERTIES", + "tests": [ + { "name": "90 with reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 1F000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with 2*reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"90 0C 0001 08 1F00017000 1F000171"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 1F 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with user-property", "ver":5, "msgs": [ + {"type":"send", "payload":"90 0B 0001 07 26000170000171 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 23000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 23 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0100 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1700 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2400 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2500 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2800 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2900 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2A00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 17 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 24 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 25 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 28 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 29 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 2A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 0200000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 1100000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 1800000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 2700000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 02 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 11 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 18 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 27 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 03000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 08000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 12000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 15000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 1A000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 1C000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 03 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 08 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 12 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 15 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 1A00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 1C00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 09000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 16000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 09 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 16 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0B01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 0B 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 130101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 210101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 220101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 230101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 13 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 21 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 22 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"90 05 0001 01 23 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "90 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0401 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0501 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0601 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0701 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0A01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0C01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0D01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0E01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 0F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1401 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1901 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1D01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 1E01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 2001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 06 0001 02 7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 800001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 07 0001 03 FF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 80800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 08 0001 04 FFFF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 8080800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "90 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"90 09 0001 05 FFFFFF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + } +] diff --git a/test/broker/data/SUBSCRIBE.json b/test/broker/data/SUBSCRIBE.json new file mode 100644 index 00000000..d2f76a34 --- /dev/null +++ b/test/broker/data/SUBSCRIBE.json @@ -0,0 +1,476 @@ +[ + { + "group": "v3.1.1 SUBSCRIBE", + "tests": [ + { "name": "82 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 00"}]}, + { "name": "80", "ver":4, "msgs": [{"type":"send", "payload":"80061234 0001 70 00"}]}, + { "name": "83 [MQTT-3.8.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"83 06 1234 0001 70 00"}]}, + { "name": "84 [MQTT-3.8.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"84 06 1234 0001 70 00"}]}, + { "name": "86 [MQTT-3.8.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"86 06 1234 0001 70 00"}]}, + { "name": "8A [MQTT-3.8.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"8A 06 1234 0001 70 00"}]}, + { "name": "82 QoS 3 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 03"}]}, + { "name": "82 QoS 0x04 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 04"}]}, + { "name": "82 QoS 0x08 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 08"}]}, + { "name": "82 QoS 0x10 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 10"}]}, + { "name": "82 QoS 0x20 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 20"}]}, + { "name": "82 QoS 0x40 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 40"}]}, + { "name": "82 QoS 0x80 [MQTT-3-8.3-4]", "ver":4, "msgs": [{"type":"send", "payload":"82 06 1234 0001 70 80"}]}, + { "name": "82 topic with 0x0000", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746F700000 00"} ] }, + { "name": "82 topic with U+D800", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746FEDA080 00"} ] }, + { "name": "82 topic with U+0001", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746F700170 00"} ] }, + { "name": "82 topic with U+001F", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746F701F70 00"} ] }, + { "name": "82 topic with U+007F", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746F707F70 00"} ] }, + { "name": "82 topic with U+009F", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746FC29F70 00"} ] }, + { "name": "82 topic with U+FFFF", "ver":4, "msgs": [{"type":"send", "payload":"82 0A 1234 0005 746FEDBFBF 00"} ] }, + { "name": "82 long", "ver":4, "msgs": [{"type":"send", "payload":"82 07 1234 0001 70 00 00"}]}, + { "name": "82 short 5 [MQTT-3.8.3-3]", "ver":4, "msgs": [{"type":"send", "payload":"82 05 1234 0001 70"}]}, + { "name": "82 short 4", "ver":4, "msgs": [{"type":"send", "payload":"82 04 1234 0000"}]}, + { "name": "82 short 3", "ver":4, "msgs": [{"type":"send", "payload":"82 03 1234 00"}]}, + { "name": "82 short 2", "ver":4, "msgs": [{"type":"send", "payload":"82 02 1234"}]}, + { "name": "82 short 1", "ver":4, "msgs": [{"type":"send", "payload":"82 01 12"}]}, + { "name": "82 short 0", "ver":4, "msgs": [{"type":"send", "payload":"82 00"}]}, + { "name": "82 single topic len 0", "ver":4, "msgs": [{"type":"send", "payload":"82 05 1234 0000 00"}]}, + { "name": "82 multiple topic 1 len 0", "ver":4, "msgs": [{"type":"send", "payload":"82 09 1234 0000 00 0001 71 00"}]}, + { "name": "82 multiple topic 2 len 0", "ver":4, "msgs": [{"type":"send", "payload":"82 09 1234 0001 71 00 0000 00"}]}, + { "name": "82 multiple topic 1,2 len 0", "ver":4, "msgs": [{"type":"send", "payload":"82 08 1234 0000 00 0000 00"}]}, + { "name": "82 single ok QoS 0 [MQTT-3.8.4-1]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 00"}, + {"type":"recv", "payload":"90 03 1234 00"} + ]}, + { "name": "82 single ok QoS 1 [MQTT-3.8.4-1]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 01"}, + {"type":"recv", "payload":"90 03 1234 01"} + ]}, + { "name": "82 single ok QoS 2 [MQTT-3.8.4-1]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 02"}, + {"type":"recv", "payload":"90 03 1234 02"} + ]}, + { "name": "82 multiple ok [MQTT-3.8.4-4]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0A 1234 0001 70 00 0001 71 00"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]} + ] + }, + { + "group": "v5.0 SUBSCRIBE", + "tests": [ + { "name": "82 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"82 07 1234 00 0001 70 00"}]}, + { "name": "82 single ok QoS 0 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 00"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 single ok QoS 1 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01"}, + {"type":"recv", "payload":"90 04 1234 0001"} + ]}, + { "name": "82 single ok QoS 2 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02"}, + {"type":"recv", "payload":"90 04 1234 00 02"} + ]}, + { "name": "80", "ver":5, "msgs": [ + {"type":"send", "payload":"8007123400 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "83 [MQTT-3.8.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"8307123400 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "84 [MQTT-3.8.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"8407123400 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "86 [MQTT-3.8.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"8607123400 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "8A [MQTT-3.8.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"8A 07 1234 00 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 QoS 3 [MQTT-3-8.3-4]", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 03"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 QoS 0 no local 0x04", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 04"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 QoS 0 retain as published 0x08", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 08"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 QoS 0 retain handling=1 0x10", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 10"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 QoS 0 retain handling=2 0x20", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 20"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 QoS 0 retain handling=3 0x30 [MQTT-3-8.3-4]", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 30"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 QoS 0x40 [MQTT-3-8.3-5]", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 40"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 QoS 0x80 [MQTT-3-8.3-5]", "ver":5, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 80"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with 0x0000", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746F7000007061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+D800", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746FEDA0807061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+0001", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746F7001707061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+001F", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746F701F707061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+007F", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746F707F707061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+009F", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746FC29F707061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 topic with U+FFFF", "ver":5, "msgs": [ + {"type":"send", "payload":"82121234000005746FEDBFBF7061796C6F616400"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 long", "ver":5, "msgs": [ + {"type":"send", "payload":"82 08 1234 00 0001 70 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 5 [MQTT-3.8.3-3]", "ver":5, "msgs": [ + {"type":"send", "payload":"82 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 5", "ver":5, "msgs": [ + {"type":"send", "payload":"82 05 1234 00 0000"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 4", "ver":5, "msgs": [ + {"type":"send", "payload":"82 04 1234 00 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 3", "ver":5, "msgs": [ + {"type":"send", "payload":"82 03 1234 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 2", "ver":5, "msgs": [ + {"type":"send", "payload":"82 02 1234"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"82 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"82 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 single topic len 0", "ver":5, "msgs": [ + {"type":"send", "payload":"82 06 1234 00 0000 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 multiple topic 1 len 0", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 1234 00 0000 00 0001 71 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 multiple topic 2 len 0", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 1234 00 0001 71 00 0000 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 multiple topic 1,2 len 0", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 1234 00 0000 00 0000 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 single ok QoS 0 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 00"}, + {"type":"recv", "payload":"90 04 1234 00 00"} + ]}, + { "name": "82 single ok QoS 1 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 01"}, + {"type":"recv", "payload":"90 04 1234 00 01"} + ]}, + { "name": "82 single ok QoS 2 [MQTT-3.8.4-1]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 02"}, + {"type":"recv", "payload":"90 04 1234 00 02"} + ]}, + { "name": "82 multiple ok [MQTT-3.8.4-4]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0B 1234 00 0001 70 00 0001 71 00"}, + {"type":"recv", "payload":"90 05 1234 00 00 00"} + ]} + ] + }, + { + "group": "v5.0 SUBSCRIBE ALLOWED PROPERTIES", + "tests": [ + { "name": "82 with user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0E 0001 07 26000170000171 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 15 0001 0E 26000170000171 26000170000171 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + + { "name": "82 with subscription-identifier=0 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0B00 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with subscription-identifier=1 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0B01 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with 2*subscription-identifier=1 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 0B010B01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "82 with subscription-identifier=0x7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0B7F 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0x8000 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 0B8000 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with subscription-identifier=0x8001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 0B8001 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0xFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 0BFF7F 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0x808001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 0B808001 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0xFFFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 0BFFFF7F 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0x80808001 (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 0B80808001 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0xFFFFFF7F (variable byte integer)", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 0BFFFFFF7F 0001 70 00"}, + {"type":"recv", "payload":"90 04 0001 00 00"} + ]}, + { "name": "82 with subscription-identifier=0x8080808001 (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0D 0001 06 0B8080808001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + }, + { + "group": "v5.0 SUBSCRIBE DISALLOWED PROPERTIES", + "tests": [ + { "name": "82 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0100 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1700 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2400 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2500 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2800 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2900 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2A00 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "82 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 0200000001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 1100000001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 1800000001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 052700000001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "82 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 03000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 08000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 12000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 15000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 1A000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 1C000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "82 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 09000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 16000170 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "82 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 130101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 210101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 220101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 230101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "82 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0401 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0501 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0601 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0701 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0A01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0C01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0D01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0E01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 0F01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1401 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1B01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1D01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 1E01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 2001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 09 0001 02 7F01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 800001 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 800101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0A 0001 03 FF7F01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 80800101 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0B 0001 04 FFFF7F 01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 80808001 01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "82 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"82 0C 0001 05 FFFFFF7F 01 0001 70 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/UNSUBACK.json b/test/broker/data/UNSUBACK.json new file mode 100644 index 00000000..e0098372 --- /dev/null +++ b/test/broker/data/UNSUBACK.json @@ -0,0 +1,417 @@ +[ + { + "group": "v3.1.1 UNSUBACK", + "tests": [ + { "name": "B0 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"B0 02 0001"}]}, + { "name": "B0 long", "ver":4, "msgs": [{"type":"send", "payload":"B0 03 0001 00"}]}, + { "name": "B0 short 0", "ver":4, "msgs": [{"type":"send", "payload":"B0 00"}]}, + { "name": "B0 short 1", "ver":4, "msgs": [{"type":"send", "payload":"B0 01 01"}]}, + { "name": "B0", "ver":4, "msgs": [{"type":"send", "payload":"B0 02 0001"}]}, + { "name": "B1", "ver":4, "msgs": [{"type":"send", "payload":"B1 02 0001"}]}, + { "name": "B2", "ver":4, "msgs": [{"type":"send", "payload":"B2 02 0001"}]}, + { "name": "B4", "ver":4, "msgs": [{"type":"send", "payload":"B4 02 0001"}]}, + { "name": "B8", "ver":4, "msgs": [{"type":"send", "payload":"B8 02 0001"}]} + ] + }, + { + "group": "v5.0 UNSUBACK", + "tests": [ + { "name": "B0 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"B0 03 0001 00"}]}, + { "name": "B0 long", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 01 01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 short 2", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 02 0001"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 03 0001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B1", "ver":5, "msgs": [ + {"type":"send", "payload":"B1 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "B2", "ver":5, "msgs": [ + {"type":"send", "payload":"B2 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "B4", "ver":5, "msgs": [ + {"type":"send", "payload":"B4 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "B8", "ver":5, "msgs": [ + {"type":"send", "payload":"B8 03 0001 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "B0 with property", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 04 1F000170"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x11 no sub", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 11"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x80 unspecified error", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 80"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x83 implementation specific error", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 83"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x87 not authorised", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 87"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x8F topic filter invalid", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 8F"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0x91 packet identifier in use", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 91"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 reason code 0xFF unknown", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 00 FF"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + }, + { + "group": "v5.0 UNSUBACK PROPERTIES", + "tests": [ + { "name": "B0 with reason-string property", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 1F000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with reason-string property missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 1F 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with user-property", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 0B 0001 07 26000170000171 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with user-property missing value", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 23000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with user-property missing key,value", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 23 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0100 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1700 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2400 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2500 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2800 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2900 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2A00 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with payload-format-indicator (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with request-problem-information (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 17 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with maximum-qos (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 24 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with retain-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 25 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with wildcard-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 28 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with subscription-identifier-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 29 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with shared-subscription-available (byte) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 2A 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 0200000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 1100000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 1800000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 2700000001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with message-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 02 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with session-expiry-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 11 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with will-delay-interval (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 18 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with maximum-packet-size (four byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 27 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 03000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 08000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 12000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 15000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 1A000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 1C000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with content-type (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 03 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with response-topic (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 08 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with assigned-client-identifier (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 12 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with authentication-method (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 15 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with response-information (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 1A 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with server-reference (UTF-8 string) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 1C 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 09000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 16000170 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with correlation-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 09 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with authentication-data (binary data) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 16 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 02 0B01"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with subscription-identifier (variable byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 04 0001 01 0B"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 130101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 210101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 220101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 230101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with server-keep-alive (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 13 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with receive-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 21 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with topic-alias-maximum (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 22 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with topic-alias (two byte integer) missing", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 05 0001 01 23 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + + { "name": "B0 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0401 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0501 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0601 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0701 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0A01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0C01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0D01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0E01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 0F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1401 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1B01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1D01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 1E01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 2001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 06 0001 02 7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 800001 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 07 0001 03 FF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 80800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 08 0001 04 FFFF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 8080800101 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]}, + { "name": "B0 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"B0 09 0001 05 FFFFFF7F01 00"}, + {"type":"recv", "payload":"E0 01 82"} + ]} + ] + } +] diff --git a/test/broker/data/UNSUBSCRIBE.json b/test/broker/data/UNSUBSCRIBE.json new file mode 100644 index 00000000..474f2323 --- /dev/null +++ b/test/broker/data/UNSUBSCRIBE.json @@ -0,0 +1,357 @@ +[ + { + "group": "v3.1.1 UNSUBSCRIBE", + "tests": [ + { "name": "A2 [MQTT-3.1.0-1]", "ver":4, "connect":false, "msgs": [{"type":"send", "payload":"A2 05 1234 0001 70"}]}, + { "name": "A2 (no subscribe) [MQTT-3.10.4-5]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 05 1234 0001 70"}, + {"type":"recv", "payload":"B0 02 1234"} + ]}, + { "name": "A2 (with subscribe) [MQTT-3.10.4-5]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 06 1234 0001 70 00"}, + {"type":"recv", "payload":"90 03 1234 00"}, + {"type":"send", "payload":"A2 05 1234 0001 70"}, + {"type":"recv", "payload":"B0 02 1234"} + ]}, + { "name": "A2 multiple [MQTT-3.10.4-6]", "ver":4, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 08 1234 0001 70 0001 71"}, + {"type":"recv", "payload":"B0 02 1234"} + ]}, + { "name": "A2 multiple zero 1st", "ver":4, "msgs": [{"type":"send", "payload":"A2 07 1234 0000 0001 71"}]}, + { "name": "A2 multiple zero 2nd", "ver":4, "msgs": [{"type":"send", "payload":"A2 07 1234 0001 71 0000"}]}, + { "name": "A2 short 4", "ver":4, "msgs": [{"type":"send", "payload":"A2 04 1234 0001"}]}, + { "name": "A2 short 3", "ver":4, "msgs": [{"type":"send", "payload":"A2 03 1234 01"}]}, + { "name": "A2 short 2 [MQTT-3.10.3-2]", "ver":4, "msgs": [{"type":"send", "payload":"A2 02 1234"}]}, + { "name": "A2 short 1", "ver":4, "msgs": [{"type":"send", "payload":"A2 01 12"}]}, + { "name": "A2 short 0", "ver":4, "msgs": [{"type":"send", "payload":"A2 00"}]}, + { "name": "A0 [MQTT-3.10.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"A0 05 1234 0001 70"}]}, + { "name": "A3 [MQTT-3.10.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"A3 05 1234 0001 70"}]}, + { "name": "A4 [MQTT-3.10.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"A4 05 1234 0001 70"}]}, + { "name": "A6 [MQTT-3.10.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"A6 05 1234 0001 70"}]}, + { "name": "AA [MQTT-3.10.1-1]", "ver":4, "msgs": [{"type":"send", "payload":"AA 05 1234 0001 70"}]}, + { "name": "A2 topic with 0x0000", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746F700000"}]}, + { "name": "A2 topic with U+D800", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746FEDA080"}]}, + { "name": "A2 topic with U+0001", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746F700170"}]}, + { "name": "A2 topic with U+001F", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746F701F70"}]}, + { "name": "A2 topic with U+007F", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746F707F70"}]}, + { "name": "A2 topic with U+009F", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746FC29F70"}]}, + { "name": "A2 topic with U+FFFF", "ver":4, "msgs": [{"type":"send", "payload":"A2 09 1234 0005 746FEDBFBF"}]} + ] + }, + { + "group": "v5.0 UNSUBSCRIBE", + "tests": [ + { "name": "A2 [MQTT-3.1.0-1]", "ver":5, "connect":false, "msgs": [{"type":"send", "payload":"A2 06 1234 00 0001 70"}]}, + { "name": "A2 (no subscribe) [MQTT-3.10.4-5]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 06 1234 00 0001 70"}, + {"type":"recv", "payload":"B0 04 1234 00 11"} + ]}, + { "name": "A2 (with subscribe) [MQTT-3.10.4-5]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"82 07 1234 00 0001 70 00"}, + {"type":"recv", "payload":"90 04 1234 00 00"}, + {"type":"send", "payload":"A2 06 1234 00 0001 70"}, + {"type":"recv", "payload":"B0 04 1234 00 00"} + ]}, + { "name": "A2 multiple zero 1st", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 1234 00 0000 0001 71"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 multiple zero 2nd", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 1234 00 0001 71 0000"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 5", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 05 1234 00 0001"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 4", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 04 1234 00 01"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 3 [MQTT-3.10.3-2]", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 03 1234 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 2", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 01 1234"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 1", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 01 12"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 short 0", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 00"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A0 [MQTT-3.10.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"A0 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A3 [MQTT-3.10.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"A3 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A4 [MQTT-3.10.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"A4 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A6 [MQTT-3.10.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"A6 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "AA [MQTT-3.10.1-1]", "ver":5, "msgs": [ + {"type":"send", "payload":"AA 06 1234 00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with 0x0000", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746F700000"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+D800", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746FEDA080"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+0001", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746F700170"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+001F", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746F701F70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+007F", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746F707F70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+009F", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746FC29F70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 topic with U+FFFF", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 1234 00 0005 746FEDBFBF"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 multiple [MQTT-3.10.4-6]", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 09 1234 00 0001 70 0001 71"}, + {"type":"recv", "payload":"B0 05 1234 00 11 11"} + ]} + ] + }, + { + "group": "v5.0 UNSUBSCRIBE ALLOWED PROPERTIES", + "tests": [ + { "name": "A2 with user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 0D 0001 07 26000170000171 0001 70"}, + {"type":"recv", "payload":"B0 04 0001 00 11"} + ]}, + { "name": "A2 with 2*user-property", "ver":5, "expect_disconnect":false, "msgs": [ + {"type":"send", "payload":"A2 14 0001 0E 26000170000171 26000170000171 0001 70"}, + {"type":"recv", "payload":"B0 04 0001 00 11"} + ]} + ] + }, + { + "group": "v5.0 UNSUBSCRIBE DISALLOWED PROPERTIES", + "tests": [ + { "name": "A2 with payload-format-indicator (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0100 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with request-problem-information (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1700 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with maximum-qos (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2400 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with retain-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2500 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with wildcard-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2800 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with subscription-identifier-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2900 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with shared-subscription-available (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2A00 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with message-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 0200000001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with session-expiry-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 1100000001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with will-delay-interval (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 1800000001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with maximum-packet-size (four byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 2700000001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with content-type (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 0001 04 03000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with response-topic (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 00 04 08000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with assigned-client-identifier (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 00 04 12000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with authentication-method (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 00 04 15000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with response-information (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 00 04 1A000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with server-reference (UTF-8 string)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 00 04 1C000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with correlation-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 0001 04 09000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with authentication-data (binary data)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 0001 04 16000170 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with subscription-identifier (variable byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0B01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with server-keep-alive (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 130101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with receive-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 210101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with topic-alias-maximum (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 220101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with topic-alias (two byte integer)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 230101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + + { "name": "A2 with invalid-property 0x00 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x04 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0401 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x05 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0501 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x06 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0601 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x07 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0701 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x0A (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0A01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x0C (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0C01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x0D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0D01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x0E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0E01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x0F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 0F01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x10 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x14 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1401 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x1B (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1B01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x1D (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1D01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x1E (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 1E01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x20 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 2001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 08 0001 02 7F01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with invalid-property 0x8000 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 800001 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x8001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 800101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0xFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 09 0001 03 FF7F01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 0001 04 80800101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0xFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0A 0001 04 FFFF7F01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0x80808001 (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 8080800101 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]}, + { "name": "A2 with unknown-property 0xFFFFFF7F (byte)", "ver":5, "msgs": [ + {"type":"send", "payload":"A2 0B 0001 05 FFFFFF7F01 0001 70"}, + {"type":"recv", "payload":"E0 01 81"} + ]} + ] + } +] diff --git a/test/broker/data/ZZ-broker-check.json b/test/broker/data/ZZ-broker-check.json new file mode 100644 index 00000000..f4156758 --- /dev/null +++ b/test/broker/data/ZZ-broker-check.json @@ -0,0 +1,8 @@ +[ + { + "group": "BROKER CHECK", + "tests": [ + { "name": "END OF TEST", "ver":4, "expect_disconnect": false, "msgs": []} + ] + } +] diff --git a/test/broker/msg_sequence_test.py b/test/broker/msg_sequence_test.py new file mode 100755 index 00000000..6bd3c9dc --- /dev/null +++ b/test/broker/msg_sequence_test.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 + +# Test whether a valid CONNECT results in the correct CONNACK packet. + +from mosq_test_helper import * +import importlib +from os import walk +import socket +import json +from collections import deque +import mosq_test + +send = 1 +recv = 2 +disconnected_check = 3 +connected_check = 4 +publish = 5 + + +class SingleMsg(object): + __slots__ = 'action', 'message', 'comment' + def __init__(self, action, message, comment=''): + self.action = action + self.message = message + self.comment = comment + +class MsgSequence(object): + __slots__ = 'name', 'msgs', 'expect_disconnect' + + def __init__(self, name, default_connect=True, proto_ver=4, expect_disconnect=True): + self.name = name + self.msgs = deque() + self.expect_disconnect = expect_disconnect + if default_connect: + self.add_default_connect(proto_ver=proto_ver) + + def add_default_connect(self, proto_ver): + self.add_send(mosq_test.gen_connect(self.name, keepalive=60, proto_ver=proto_ver)) + self.add_recv(mosq_test.gen_connack(rc=0, proto_ver=proto_ver), "default connack") + + def add_send(self, message): + self._add(send, message) + + def add_recv(self, message, comment): + self._add(recv, message, comment) + + def add_publish(self, message, comment): + self._add(publish, message, comment) + + def add_connected_check(self): + self._add(connected_check, b"") + + def add_disconnected_check(self): + self._add(disconnected_check, b"") + + def _add(self, action, message, comment=""): + msg = SingleMsg(action, message, comment) + self.msgs.append(msg) + + def _connected_check(self, sock): + try: + mosq_test.do_ping(sock) + except mosq_test.TestError: + raise ValueError("connection failed") + + def _send_message(self, sock, msg): + sock.send(msg.message) + + def _publish_message(self, msg): + sock = mosq_test.client_connect_only(hostname="localhost", port=1888, timeout=2) + sock.send(mosq_test.gen_connect("helper", keepalive=60)) + mosq_test.expect_packet(sock, "connack", mosq_test.gen_connack(rc=0)) + + m = msg.message + if m['qos'] == 0: + sock.send(mosq_test.gen_publish(topic=m['topic'], payload=m['payload'])) + elif m['qos'] == 1: + sock.send(mosq_test.gen_publish(mid=1, qos=1, topic=m['topic'], payload=m['payload'])) + mosq_test.expect_packet(sock, "helper puback", mosq_test.gen_puback(mid=1)) + elif m['qos'] == 2: + sock.send(mosq_test.gen_publish(mid=1, qos=2, topic=m['topic'], payload=m['payload'])) + mosq_test.expect_packet(sock, "helper pubrec", mosq_test.gen_pubrec(mid=1)) + sock.send(mosq_test.gen_pubrel(mid=1)) + mosq_test.expect_packet(sock, "helper pubcomp", mosq_test.gen_pubcomp(mid=1)) + sock.close() + + def _recv_message(self, sock, msg): + data = sock.recv(len(msg.message)) + if data != msg.message: + raise ValueError("Receive message %s | %s | %s" % (msg.comment, data, msg.message)) + + + def _disconnected_check(self, sock): + try: + data = sock.recv(1) + if len(data) == 1 and self.expect_disconnect: + raise ValueError("Still connected") + except ConnectionResetError: + if self.expect_disconnect: + pass + else: + raise + + def _process_message(self, sock, msg): + if msg.action == send: + self._send_message(sock, msg) + elif msg.action == recv: + self._recv_message(sock, msg) + elif msg.action == publish: + self._publish_message(msg) + elif msg.action == disconnected_check: + self._disconnected_check(sock) + elif msg.action == connected_check: + self._connected_check(sock) + + def process_next(self, sock): + msg = self.msgs.popleft() + self._process_message(sock, msg) + + def process_all(self, sock): + while len(self.msgs): + self.process_next(sock) + if self.expect_disconnect: + self._disconnected_check(sock) + else: + self._connected_check(sock) + + +def do_test(hostname, port): + rc = 0 + sequences = [] + for (_, _, filenames) in walk("data"): + sequences.extend(filenames) + break + + total = 0 + succeeded = 0 + test = None + for seq in sorted(sequences): + if seq[-5:] != ".json": + continue + + with open("data/"+seq, "r") as f: + test_file = json.load(f) + + for g in test_file: + group_name = g["group"] + try: + disabled = g["disable"] + if disabled: + continue + except KeyError: + pass + tests = g["tests"] + + for t in tests: + tname = group_name + " " + t["name"] + try: + proto_ver = t["ver"] + except KeyError: + proto_ver = 4 + try: + connect = t["connect"] + except KeyError: + connect = True + try: + expect_disconnect = t["expect_disconnect"] + except KeyError: + expect_disconnect = True + + this_test = MsgSequence(tname, + proto_ver=proto_ver, + expect_disconnect=expect_disconnect, + default_connect=connect) + + for m in t["msgs"]: + try: + c = m["comment"] + except KeyError: + c = "" + if m["type"] == "send": + this_test.add_send(bytes.fromhex(m["payload"].replace(" ", ""))) + elif m["type"] == "recv": + this_test.add_recv(bytes.fromhex(m["payload"].replace(" ", "")), c) + elif m["type"] == "publish": + this_test.add_publish(m, c) + + total += 1 + try: + sock = mosq_test.client_connect_only(hostname=hostname, port=port, timeout=2) + this_test.process_all(sock) + print("\033[32m" + tname + "\033[0m") + succeeded += 1 + except ValueError as e: + print("\033[31m" + tname + " failed: " + str(e) + "\033[0m") + rc = 1 + except ConnectionResetError as e: + print("\033[31m" + tname + " failed: " + str(e) + "\033[0m") + rc = 1 + except socket.timeout as e: + print("\033[31m" + tname + " failed: " + str(e) + "\033[0m") + rc = 1 + except mosq_test.TestError as e: + print("\033[31m" + tname + " failed: " + str(e) + "\033[0m") + rc = 1 + + print("%d tests total\n%d tests succeeded" % (total, succeeded)) + return rc + +hostname = "localhost" +port = mosq_test.get_port() +broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port, nolog=True) + +rc = 0 +try: + rc = do_test(hostname=hostname, port=port) +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() +if rc: + #print(stde.decode('utf-8')) + exit(rc) diff --git a/test/broker/prop_subpub_helper.py b/test/broker/prop_subpub_helper.py index e85348b9..df954643 100755 --- a/test/broker/prop_subpub_helper.py +++ b/test/broker/prop_subpub_helper.py @@ -6,7 +6,7 @@ from mosq_test_helper import * -def prop_subpub_helper(props_out, props_in): +def prop_subpub_helper(props_out, props_in, expect_proto_error=False): rc = 1 mid = 53 keepalive = 60 @@ -20,6 +20,8 @@ def prop_subpub_helper(props_out, props_in): publish_packet_expected = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5, properties=props_in) + disconnect_packet = mosq_test.gen_disconnect(reason_code=mqtt5_rc.MQTT_RC_PROTOCOL_ERROR, proto_ver=5) + port = mosq_test.get_port() broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) @@ -27,7 +29,10 @@ def prop_subpub_helper(props_out, props_in): sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) mosq_test.do_send_receive(sock, subscribe_packet, suback_packet, "suback") - mosq_test.do_send_receive(sock, publish_packet_out, publish_packet_expected, "publish") + if expect_proto_error: + mosq_test.do_send_receive(sock, publish_packet_out, disconnect_packet, "publish") + else: + mosq_test.do_send_receive(sock, publish_packet_out, publish_packet_expected, "publish") rc = 0 diff --git a/test/broker/test.py b/test/broker/test.py index 32ede2ea..52945497 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -6,25 +6,13 @@ import ptest tests = [ #(ports required, 'path'), (1, './01-connect-allow-anonymous.py'), - (1, './01-connect-bad-packet.py'), - (1, './01-connect-connack-2163.py'), (1, './01-connect-disconnect-v5.py'), - (1, './01-connect-duplicate.py'), - (1, './01-connect-invalid-id-0.py'), - (1, './01-connect-invalid-id-missing.py'), - (1, './01-connect-invalid-id-utf8.py'), - (1, './01-connect-invalid-protonum.py'), - (1, './01-connect-invalid-reserved.py'), (1, './01-connect-max-connections.py'), (1, './01-connect-max-keepalive.py'), - (1, './01-connect-success.py'), - (1, './01-connect-uname-invalid-utf8.py'), - (1, './01-connect-uname-no-flag.py'), (1, './01-connect-uname-no-password-denied.py'), (1, './01-connect-uname-or-anon.py'), (1, './01-connect-uname-password-denied-no-will.py'), (1, './01-connect-uname-password-denied.py'), - (1, './01-connect-uname-pwd-no-flag.py'), (2, './01-connect-zero-length-id.py'), (1, './02-shared-qos0-v5.py'), @@ -37,9 +25,6 @@ tests = [ (1, './02-subpub-qos0-subscription-id.py'), (1, './02-subpub-qos0-topic-alias-unknown.py'), (1, './02-subpub-qos0-topic-alias.py'), - (1, './02-subpub-qos0.py'), - (1, './02-subpub-qos1-bad-pubcomp.py'), - (1, './02-subpub-qos1-bad-pubrec.py'), (1, './02-subpub-qos1-message-expiry-retain.py'), (1, './02-subpub-qos1-message-expiry-will.py'), (1, './02-subpub-qos1-message-expiry.py'), @@ -47,9 +32,6 @@ tests = [ (1, './02-subpub-qos1-oversize-payload.py'), (1, './02-subpub-qos1.py'), (1, './02-subpub-qos2-1322.py'), - (1, './02-subpub-qos2-bad-puback-1.py'), - (1, './02-subpub-qos2-bad-puback-2.py'), - (1, './02-subpub-qos2-bad-pubcomp.py'), (1, './02-subpub-qos2-pubrec-error.py'), (1, './02-subpub-qos2-receive-maximum-1.py'), (1, './02-subpub-qos2-receive-maximum-2.py'), @@ -58,14 +40,6 @@ tests = [ (1, './02-subscribe-invalid-utf8.py'), (1, './02-subscribe-long-topic.py'), (1, './02-subscribe-persistence-flipflop.py'), - (1, './02-subscribe-qos0.py'), - (1, './02-subscribe-qos1.py'), - (1, './02-subscribe-qos2.py'), - (1, './02-unsubscribe-invalid-no-topic.py'), - (1, './02-unsubscribe-qos0.py'), - (1, './02-unsubscribe-qos1.py'), - (1, './02-unsubscribe-qos2-multiple.py'), - (1, './02-unsubscribe-qos2.py'), #(1, './03-publish-qos1-queued-bytes.py'), (1, './03-pattern-matching.py'), @@ -160,7 +134,6 @@ tests = [ (1, './09-extended-auth-multistep-reauth.py'), (1, './09-extended-auth-multistep.py'), (1, './09-extended-auth-single.py'), - (1, './09-extended-auth-unsupported.py'), (1, './09-plugin-auth-acl-pub.py'), (1, './09-plugin-auth-acl-sub-denied.py'), (1, './09-plugin-auth-acl-sub.py'), @@ -186,17 +159,13 @@ tests = [ (1, './12-prop-assigned-client-identifier.py'), (1, './12-prop-maximum-packet-size-broker.py'), - (1, './12-prop-maximum-packet-size-connect.py'), (1, './12-prop-maximum-packet-size-publish-qos1.py'), (1, './12-prop-maximum-packet-size-publish-qos2.py'), - (1, './12-prop-maximum-packet-size-publish.py'), (1, './12-prop-response-topic-correlation-data.py'), (1, './12-prop-response-topic.py'), (1, './12-prop-server-keepalive.py'), - (1, './12-prop-session-expiry-invalid.py'), (1, './12-prop-subpub-content-type.py'), (1, './12-prop-subpub-payload-format.py'), - (1, './12-prop-topic-alias-invalid.py'), (1, './13-malformed-publish-v5.py'), (1, './13-malformed-subscribe-v5.py'), diff --git a/test/mosq_test.py b/test/mosq_test.py index 890668f5..d9fe6970 100644 --- a/test/mosq_test.py +++ b/test/mosq_test.py @@ -19,7 +19,7 @@ class TestError(Exception): def __init__(self, message="Mismatched packets"): self.message = message -def start_broker(filename, cmd=None, port=0, use_conf=False, expect_fail=False): +def start_broker(filename, cmd=None, port=0, use_conf=False, expect_fail=False, nolog=False): global vg_index global vg_logfiles @@ -48,7 +48,10 @@ def start_broker(filename, cmd=None, port=0, use_conf=False, expect_fail=False): #print(port) #print(cmd) - broker = subprocess.Popen(cmd, stderr=subprocess.PIPE) + if nolog == False: + broker = subprocess.Popen(cmd, stderr=subprocess.PIPE) + else: + broker = subprocess.Popen(cmd, stderr=subprocess.DEVNULL) for i in range(0, 20): time.sleep(delay) c = None @@ -158,10 +161,14 @@ def do_receive_send(sock, receive_packet, send_packet, error_string="receive sen raise ValueError -def do_client_connect(connect_packet, connack_packet, hostname="localhost", port=1888, timeout=10, connack_error="connack"): +def client_connect_only(hostname="localhost", port=1888, timeout=10): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) sock.connect((hostname, port)) + return sock + +def do_client_connect(connect_packet, connack_packet, hostname="localhost", port=1888, timeout=10, connack_error="connack"): + sock = client_connect_only(hostname, port, timeout) return do_send_receive(sock, connect_packet, connack_packet, connack_error) @@ -416,6 +423,16 @@ def read_publish(sock, proto_ver=4): return payload +def gen_fixed_hdr(command, remaining_length): + return struct.pack("B", command) + pack_remaining_length(remaining_length) + +def gen_variable_hdr(mid=None): + if mid is not None: + return struct.pack("!H", mid) + else: + return b"" + + def gen_connect(client_id, clean_session=True, keepalive=60, username=None, password=None, will_topic=None, will_qos=0, will_retain=False, will_payload=b"", proto_ver=4, connect_reserved=False, properties=b"", will_properties=b"", session_expiry=-1): if (proto_ver&0x7F) == 3 or proto_ver == 0: remaining_length = 12 diff --git a/test/unit/datatype_read.c b/test/unit/datatype_read.c index a67db85a..42eab2ba 100644 --- a/test/unit/datatype_read.c +++ b/test/unit/datatype_read.c @@ -179,7 +179,7 @@ static void bytes_read_helper( static void TEST_byte_read_empty(void) { /* Empty packet */ - byte_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, 0); + byte_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, 0); } @@ -222,7 +222,7 @@ static void TEST_byte_read_success(void) static void TEST_uint16_read_empty(void) { /* Empty packet */ - uint16_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, 0); + uint16_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, 0); } @@ -238,7 +238,7 @@ static void TEST_uint16_read_truncated(void) /* 1 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x38; - uint16_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, 0); + uint16_read_helper(payload, 1, MOSQ_ERR_MALFORMED_PACKET, 0); } @@ -285,7 +285,7 @@ static void TEST_uint16_read_success(void) static void TEST_uint32_read_empty(void) { /* Empty packet */ - uint32_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, 0); + uint32_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, 0); } @@ -301,20 +301,20 @@ static void TEST_uint32_read_truncated(void) /* 1 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x38; - uint32_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, 0); + uint32_read_helper(payload, 1, MOSQ_ERR_MALFORMED_PACKET, 0); /* 2 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x38; payload[1] = 0x38; - uint32_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, 0); + uint32_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, 0); /* 3 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x38; payload[1] = 0x38; payload[2] = 0x38; - uint32_read_helper(payload, 3, MOSQ_ERR_PROTOCOL, 0); + uint32_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, 0); } @@ -367,7 +367,7 @@ static void TEST_uint32_read_success(void) static void TEST_varint_read_empty(void) { /* Empty packet */ - varint_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); } @@ -383,20 +383,20 @@ static void TEST_varint_read_truncated(void) /* Varint bigger than packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x80; - varint_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 1, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Varint bigger than packet */ memset(payload, 1, sizeof(payload)); payload[0] = 0x80; payload[1] = 0x80; - varint_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Varint bigger than packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x80; payload[1] = 0x80; payload[2] = 0x80; - varint_read_helper(payload, 3, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Varint bigger than packet */ memset(payload, 0, sizeof(payload)); @@ -404,7 +404,7 @@ static void TEST_varint_read_truncated(void) payload[1] = 0x80; payload[2] = 0x80; payload[3] = 0x80; - varint_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 4, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); } @@ -486,7 +486,7 @@ static void TEST_varint_read_5_bytes(void) payload[2] = 0x80; payload[3] = 0x80; payload[4] = 0x01; - varint_read_helper(payload, 5, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 5, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); } @@ -503,27 +503,27 @@ static void TEST_varint_read_overlong_encoding(void) memset(payload, 0, sizeof(payload)); payload[0] = 0x80; payload[1] = 0x00; - varint_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Overlong encoding of 127 (1 byte value encoded as 2 bytes) */ memset(payload, 0, sizeof(payload)); payload[0] = 0xFF; payload[1] = 0x00; - varint_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Overlong encoding of 128 (2 byte value encoded as 3 bytes) */ memset(payload, 0, sizeof(payload)); payload[0] = 0x80; payload[1] = 0x81; payload[2] = 0x00; - varint_read_helper(payload, 3, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Overlong encoding of 16,383 (2 byte value encoded as 3 bytes) */ memset(payload, 0, sizeof(payload)); payload[0] = 0xFF; payload[1] = 0xFF; payload[2] = 0x00; - varint_read_helper(payload, 3, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Overlong encoding of 16,384 (3 byte value encoded as 4 bytes) */ memset(payload, 0, sizeof(payload)); @@ -531,7 +531,7 @@ static void TEST_varint_read_overlong_encoding(void) payload[1] = 0x80; payload[2] = 0x81; payload[3] = 0x00; - varint_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 4, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); /* Overlong encoding of 2,097,151 (3 byte value encoded as 4 bytes) */ memset(payload, 0, sizeof(payload)); @@ -539,7 +539,7 @@ static void TEST_varint_read_overlong_encoding(void) payload[1] = 0xFF; payload[2] = 0xFF; payload[3] = 0x00; - varint_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, UINT32_MAX, UINT8_MAX); + varint_read_helper(payload, 4, MOSQ_ERR_MALFORMED_PACKET, UINT32_MAX, UINT8_MAX); } @@ -554,7 +554,7 @@ static void TEST_varint_read_overlong_encoding(void) */ static void TEST_string_read_empty(void) { - string_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + string_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); } /* This tests reading a UTF-8 Encoded String from an incoming packet. @@ -569,20 +569,20 @@ static void TEST_string_read_truncated(void) /* 1 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x02; - string_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + string_read_helper(payload, 1, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 2 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x02; payload[1] = 0x02; - string_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + string_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 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, UINT16_MAX); + string_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 3 byte packet */ memset(payload, 0, sizeof(payload)); @@ -590,7 +590,7 @@ static void TEST_string_read_truncated(void) payload[1] = 0x03; payload[2] = 'a'; payload[3] = 'b'; - string_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + string_read_helper(payload, 4, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); } @@ -697,7 +697,7 @@ static void TEST_string_read_mqtt_1_5_4_3(void) */ static void TEST_binary_data_read_empty(void) { - binary_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + binary_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); } @@ -713,20 +713,20 @@ static void TEST_binary_data_read_truncated(void) /* 1 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x02; - binary_read_helper(payload, 1, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + binary_read_helper(payload, 1, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 2 byte packet */ memset(payload, 0, sizeof(payload)); payload[0] = 0x02; payload[1] = 0x02; - binary_read_helper(payload, 2, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + binary_read_helper(payload, 2, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 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, UINT16_MAX); + binary_read_helper(payload, 3, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); /* 3 byte packet */ memset(payload, 0, sizeof(payload)); @@ -734,7 +734,7 @@ static void TEST_binary_data_read_truncated(void) payload[1] = 0x03; payload[2] = 'a'; payload[3] = 'b'; - binary_read_helper(payload, 4, MOSQ_ERR_PROTOCOL, NULL, UINT16_MAX); + binary_read_helper(payload, 4, MOSQ_ERR_MALFORMED_PACKET, NULL, UINT16_MAX); } @@ -760,7 +760,7 @@ static void TEST_bytes_read_empty(void) */ static void TEST_bytes_read_truncated(void) { - bytes_read_helper(NULL, 0, MOSQ_ERR_PROTOCOL, NULL, 1); + bytes_read_helper(NULL, 0, MOSQ_ERR_MALFORMED_PACKET, NULL, 1); } /* This tests reading multiple bytes from an incoming packet. diff --git a/test/unit/property_read.c b/test/unit/property_read.c index 0cb3c0fc..f692a57d 100644 --- a/test/unit/property_read.c +++ b/test/unit/property_read.c @@ -79,6 +79,9 @@ static void int32_prop_read_helper( rc = property__read_all(command, &packet, &properties); CU_ASSERT_EQUAL(rc, rc_expected); + if(rc != rc_expected){ + printf("%d / %d\n", rc, rc_expected); + } CU_ASSERT_EQUAL(packet.pos, remaining_length); if(properties){ CU_ASSERT_EQUAL(properties->identifier, identifier); @@ -323,6 +326,9 @@ static void varint_prop_read_helper( rc = property__read_all(CMD_PUBLISH, &packet, &properties); CU_ASSERT_EQUAL(rc, rc_expected); + if(rc != rc_expected){ + printf("%d / %d\n", rc, rc_expected); + } if(properties){ CU_ASSERT_EQUAL(properties->identifier, identifier); CU_ASSERT_EQUAL(properties->value.varint, value_expected); @@ -407,7 +413,7 @@ static void TEST_truncated(void) packet.payload = payload; packet.remaining_length = 0; rc = property__read_all(CMD_CONNECT, &packet, &properties); - CU_ASSERT_EQUAL(rc, MOSQ_ERR_PROTOCOL); + CU_ASSERT_EQUAL(rc, MOSQ_ERR_MALFORMED_PACKET); CU_ASSERT_PTR_EQUAL(properties, NULL); CU_ASSERT_EQUAL(packet.pos, 0); @@ -418,7 +424,7 @@ static void TEST_truncated(void) packet.payload = payload; packet.remaining_length = 1; rc = property__read_all(CMD_CONNECT, &packet, &properties); - CU_ASSERT_EQUAL(rc, MOSQ_ERR_PROTOCOL); + CU_ASSERT_EQUAL(rc, MOSQ_ERR_MALFORMED_PACKET); CU_ASSERT_PTR_EQUAL(properties, NULL); CU_ASSERT_EQUAL(packet.pos, 1); @@ -430,7 +436,7 @@ static void TEST_truncated(void) packet.payload = payload; packet.remaining_length = 2; rc = property__read_all(CMD_CONNECT, &packet, &properties); - CU_ASSERT_EQUAL(rc, MOSQ_ERR_PROTOCOL); + CU_ASSERT_EQUAL(rc, MOSQ_ERR_MALFORMED_PACKET); CU_ASSERT_PTR_EQUAL(properties, NULL); CU_ASSERT_EQUAL(packet.pos, 2); } @@ -1089,7 +1095,7 @@ static void TEST_duplicate_subscription_identifier(void) payload[4] = MQTT_PROP_SUBSCRIPTION_IDENTIFIER; payload[5] = 0x04; - varint_prop_read_helper(payload, 5, MOSQ_ERR_PROTOCOL, MQTT_PROP_SUBSCRIPTION_IDENTIFIER, 0); + varint_prop_read_helper(payload, 5, MOSQ_ERR_MALFORMED_PACKET, MQTT_PROP_SUBSCRIPTION_IDENTIFIER, 0); } /* ======================================================================== @@ -1190,7 +1196,7 @@ static void TEST_bad_subscription_identifier(void) payload[5] = 0xFF; payload[6] = 0x01; - varint_prop_read_helper(payload, 7, MOSQ_ERR_PROTOCOL, MQTT_PROP_SUBSCRIPTION_IDENTIFIER, 0); + varint_prop_read_helper(payload, 7, MOSQ_ERR_MALFORMED_PACKET, MQTT_PROP_SUBSCRIPTION_IDENTIFIER, 0); } /* ========================================================================