From 9896e617277dccc219a5afd7a2977ec50cd195c0 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 6 Dec 2018 09:29:25 +0000 Subject: [PATCH] Test and small fix for response-topic and correlation-data props. --- src/handle_publish.c | 10 +-- ...12-prop-response-topic-correlation-data.py | 61 +++++++++++++++++++ test/broker/12-prop-response-topic.py | 60 ++++++++++++++++++ test/broker/Makefile | 2 + test/broker/ptest.py | 2 + 5 files changed, 128 insertions(+), 7 deletions(-) create mode 100755 test/broker/12-prop-response-topic-correlation-data.py create mode 100755 test/broker/12-prop-response-topic.py diff --git a/src/handle_publish.c b/src/handle_publish.c index 8cb11449..f328a77e 100644 --- a/src/handle_publish.c +++ b/src/handle_publish.c @@ -158,10 +158,11 @@ int handle__publish(struct mosquitto_db *db, struct mosquitto *context) msg_properties_last = NULL; while(p){ switch(p->identifier){ - case MQTT_PROP_PAYLOAD_FORMAT_INDICATOR: + case MQTT_PROP_CONTENT_TYPE: case MQTT_PROP_CORRELATION_DATA: + case MQTT_PROP_PAYLOAD_FORMAT_INDICATOR: + case MQTT_PROP_RESPONSE_TOPIC: case MQTT_PROP_USER_PROPERTY: - case MQTT_PROP_CONTENT_TYPE: if(msg_properties){ msg_properties_last->next = p; msg_properties_last = p; @@ -184,11 +185,6 @@ int handle__publish(struct mosquitto_db *db, struct mosquitto *context) p = p->next; break; - case MQTT_PROP_RESPONSE_TOPIC: - p_prev = p; - p = p->next; - break; - case MQTT_PROP_MESSAGE_EXPIRY_INTERVAL: message_expiry_interval = p->value.i32; p_prev = p; diff --git a/test/broker/12-prop-response-topic-correlation-data.py b/test/broker/12-prop-response-topic-correlation-data.py new file mode 100755 index 00000000..9a043825 --- /dev/null +++ b/test/broker/12-prop-response-topic-correlation-data.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +# client 1 subscribes to normal-topic +# client 2 susbscribes to response-topic +# client 2 publishes message to normal-topic with response-topic property and correlation-data property +# client 1 receives message, publishes a response on response-topic +# client 2 receives message, checks payload + +from mosq_test_helper import * + +rc = 1 + +keepalive = 10 + +connect_packet1 = mosq_test.gen_connect("client1", proto_ver=5, keepalive=keepalive) +connect_packet2 = mosq_test.gen_connect("client2", proto_ver=5, keepalive=keepalive) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +subscribe_packet1 = mosq_test.gen_subscribe(mid=1, topic="normal/topic", qos=0, proto_ver=5) +subscribe_packet2 = mosq_test.gen_subscribe(mid=1, topic="response/topic", qos=0, proto_ver=5) +suback_packet = mosq_test.gen_suback(mid=1, qos=0, proto_ver=5) + +props = mqtt5_props.gen_string_prop(mqtt5_props.PROP_RESPONSE_TOPIC, "response/topic") +props = mqtt5_props.gen_string_prop(mqtt5_props.PROP_CORRELATION_DATA, "45vyvynq30q3vt4 nuy893b4v3") +props = mqtt5_props.prop_finalise(props) +publish_packet2 = mosq_test.gen_publish(topic="normal/topic", qos=0, payload="2", proto_ver=5, properties=props) + +publish_packet1 = mosq_test.gen_publish(topic="response/topic", qos=0, payload="22", proto_ver=5) + +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: + sock1 = mosq_test.do_client_connect(connect_packet1, connack_packet, port=port) + sock2 = mosq_test.do_client_connect(connect_packet2, connack_packet, port=port) + + mosq_test.do_send_receive(sock1, subscribe_packet1, suback_packet, "subscribe1") + mosq_test.do_send_receive(sock2, subscribe_packet2, suback_packet, "subscribe2") + + sock2.send(publish_packet2) + if mosq_test.expect_packet(sock1, "publish1", publish_packet2): + # FIXME - it would be better to extract the property and payload, even though we know them + sock1.send(publish_packet1) + if mosq_test.expect_packet(sock2, "publish2", publish_packet1): + rc = 0 + + sock1.close() + sock2.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/12-prop-response-topic.py b/test/broker/12-prop-response-topic.py new file mode 100755 index 00000000..3b9c3e8b --- /dev/null +++ b/test/broker/12-prop-response-topic.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +# client 1 subscribes to normal-topic +# client 2 susbscribes to response-topic +# client 2 publishes message to normal-topic with response-topic property +# client 1 receives message, publishes a response on response-topic +# client 2 receives message, checks payload + +from mosq_test_helper import * + +rc = 1 + +keepalive = 10 + +connect_packet1 = mosq_test.gen_connect("client1", proto_ver=5, keepalive=keepalive) +connect_packet2 = mosq_test.gen_connect("client2", proto_ver=5, keepalive=keepalive) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +subscribe_packet1 = mosq_test.gen_subscribe(mid=1, topic="normal/topic", qos=0, proto_ver=5) +subscribe_packet2 = mosq_test.gen_subscribe(mid=1, topic="response/topic", qos=0, proto_ver=5) +suback_packet = mosq_test.gen_suback(mid=1, qos=0, proto_ver=5) + +props = mqtt5_props.gen_string_prop(mqtt5_props.PROP_RESPONSE_TOPIC, "response/topic") +props = mqtt5_props.prop_finalise(props) +publish_packet2 = mosq_test.gen_publish(topic="normal/topic", qos=0, payload="2", proto_ver=5, properties=props) + +publish_packet1 = mosq_test.gen_publish(topic="response/topic", qos=0, payload="22", proto_ver=5) + +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: + sock1 = mosq_test.do_client_connect(connect_packet1, connack_packet, port=port) + sock2 = mosq_test.do_client_connect(connect_packet2, connack_packet, port=port) + + mosq_test.do_send_receive(sock1, subscribe_packet1, suback_packet, "subscribe1") + mosq_test.do_send_receive(sock2, subscribe_packet2, suback_packet, "subscribe2") + + sock2.send(publish_packet2) + if mosq_test.expect_packet(sock1, "publish1", publish_packet2): + # FIXME - it would be better to extract the property and payload, even though we know them + sock1.send(publish_packet1) + if mosq_test.expect_packet(sock2, "publish2", publish_packet1): + rc = 0 + + sock1.close() + sock2.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index 0b9bf169..3105c62a 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -141,3 +141,5 @@ endif ./12-prop-subpub-content-type.py ./12-prop-assigned-client-identifier.py ./12-prop-server-keepalive.py + ./12-prop-response-topic.py + ./12-prop-response-topic-correlation-data.py diff --git a/test/broker/ptest.py b/test/broker/ptest.py index a9772aa5..2804dfd8 100755 --- a/test/broker/ptest.py +++ b/test/broker/ptest.py @@ -110,6 +110,8 @@ tests = [ (1, './12-prop-subpub-content-type.py'), (1, './12-prop-assigned-client-identifier.py'), (1, './12-prop-server-keepalive.py'), + (1, './12-prop-response-topic.py'), + (1, './12-prop-response-topic-correlation-data.py'), ] minport = 1888