diff --git a/test/broker/02-subpub-qos0-payload-format-v5.py b/test/broker/02-subpub-qos0-payload-format-v5.py deleted file mode 100755 index 8fa7aae2..00000000 --- a/test/broker/02-subpub-qos0-payload-format-v5.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python - -# Test whether a client subscribed to a topic receives its own message sent to that topic. -# Does the Payload Format Indicator property get sent through? -# MQTT v5 - -from mosq_test_helper import * - -rc = 1 -mid = 53 -keepalive = 60 -connect_packet = mosq_test.gen_connect("subpub-qos0-test", keepalive=keepalive, proto_ver=5) -connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) - -subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos0", 0, proto_ver=5) -suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) - -props = mqtt5_props.gen_byte_prop(mqtt5_props.PROP_PAYLOAD_FORMAT_INDICATOR, 0xed) -props = props+mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, 1) -props = mqtt5_props.prop_finalise(props) -publish_packet_out = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5, properties=props) - -props = mqtt5_props.gen_byte_prop(mqtt5_props.PROP_PAYLOAD_FORMAT_INDICATOR, 0xed) -props = mqtt5_props.prop_finalise(props) -publish_packet_expected = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5, 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, 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") - - rc = 0 - - sock.close() -finally: - broker.terminate() - broker.wait() - (stdo, stde) = broker.communicate() - if rc: - print(stde) - -exit(rc) - diff --git a/test/broker/12-prop-subpub-content-type.py b/test/broker/12-prop-subpub-content-type.py new file mode 100755 index 00000000..43ec811d --- /dev/null +++ b/test/broker/12-prop-subpub-content-type.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# Does the Content Type property get sent through? +# MQTT v5 + +import prop_subpub_helper as helper +from mosq_test_helper import * + +props_out = mqtt5_props.gen_string_prop(mqtt5_props.PROP_CONTENT_TYPE, "text") +props_out = props_out+mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, 1) +props_out = mqtt5_props.prop_finalise(props_out) + +props_in = mqtt5_props.gen_string_prop(mqtt5_props.PROP_CONTENT_TYPE, "text") +props_in = mqtt5_props.prop_finalise(props_in) + +helper.prop_subpub_helper(props_out, props_in) diff --git a/test/broker/12-prop-subpub-payload-format.py b/test/broker/12-prop-subpub-payload-format.py new file mode 100755 index 00000000..96d63afe --- /dev/null +++ b/test/broker/12-prop-subpub-payload-format.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# Does the Payload Format Indicator property get sent through? +# MQTT v5 + +import prop_subpub_helper as helper +from mosq_test_helper import * + +props_out = mqtt5_props.gen_byte_prop(mqtt5_props.PROP_PAYLOAD_FORMAT_INDICATOR, 0xed) +props_out = props_out+mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_TOPIC_ALIAS, 1) +props_out = mqtt5_props.prop_finalise(props_out) + +props_in = mqtt5_props.gen_byte_prop(mqtt5_props.PROP_PAYLOAD_FORMAT_INDICATOR, 0xed) +props_in = mqtt5_props.prop_finalise(props_in) + +helper.prop_subpub_helper(props_out, props_in) diff --git a/test/broker/Makefile b/test/broker/Makefile index 0a90db09..f19566ea 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -53,7 +53,6 @@ endif ./02-unsubscribe-qos1.py ./02-unsubscribe-qos2.py ./02-unsubscribe-qos2-v5.py - ./02-subpub-qos0-payload-format-v5.py ./02-unsubscribe-invalid-no-topic.py ./02-subscribe-invalid-utf8.py ./02-subscribe-persistence-flipflop.py @@ -138,3 +137,5 @@ endif 12 : ./12-prop-session-expiry-invalid.py + ./12-prop-subpub-payload-format.py + ./12-prop-subpub-content-type.py diff --git a/test/broker/prop_subpub_helper.py b/test/broker/prop_subpub_helper.py new file mode 100755 index 00000000..212e4d7e --- /dev/null +++ b/test/broker/prop_subpub_helper.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# Does a given property get sent through? +# MQTT v5 + +from mosq_test_helper import * + +def prop_subpub_helper(props_out, props_in): + rc = 1 + mid = 53 + keepalive = 60 + connect_packet = mosq_test.gen_connect("subpub-qos0-test", keepalive=keepalive, proto_ver=5) + connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + + subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos0", 0, proto_ver=5) + suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) + + publish_packet_out = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5, properties=props_out) + + publish_packet_expected = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5, properties=props_in) + + 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_out, publish_packet_expected, "publish") + + rc = 0 + + sock.close() + finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + + exit(rc) + diff --git a/test/broker/ptest.py b/test/broker/ptest.py index ffb7b3ed..5d9fb0a3 100755 --- a/test/broker/ptest.py +++ b/test/broker/ptest.py @@ -32,7 +32,6 @@ tests = [ (1, './02-subpub-qos0-v5.py'), (1, './02-subpub-qos1-v5.py'), (1, './02-subpub-qos2-v5.py'), - (1, './02-subpub-qos0-payload-format-v5.py'), (1, './02-unsubscribe-qos0.py'), (1, './02-unsubscribe-qos1.py'), (1, './02-unsubscribe-qos2.py'), @@ -105,7 +104,10 @@ tests = [ (2, './10-listener-mount-point.py'), (1, './11-persistent-subscription.py'), + (1, './12-prop-session-expiry-invalid.py'), + (1, './12-prop-subpub-payload-format.py'), + (1, './12-prop-subpub-content-type.py'), ] minport = 1888 diff --git a/test/lib/11-prop-send-content-type.py b/test/lib/11-prop-send-content-type.py new file mode 100755 index 00000000..f78bb3a6 --- /dev/null +++ b/test/lib/11-prop-send-content-type.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +from mosq_test_helper import * + +port = mosq_test.get_lib_port() + +rc = 1 +keepalive = 60 +connect_packet = mosq_test.gen_connect("prop-test", keepalive=keepalive, proto_ver=5) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +props = mqtt5_props.gen_string_prop(mqtt5_props.PROP_CONTENT_TYPE, "application/json") +props = mqtt5_props.prop_finalise(props) +publish_packet = mosq_test.gen_publish("prop/qos0", qos=0, payload="message", proto_ver=5, properties=props) + +disconnect_packet = mosq_test.gen_disconnect(proto_ver=5) + +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) +sock.settimeout(10) +sock.bind(('', port)) +sock.listen(5) + +client_args = sys.argv[1:] +env = dict(os.environ) +env['LD_LIBRARY_PATH'] = '../../lib:../../lib/cpp' +try: + pp = env['PYTHONPATH'] +except KeyError: + pp = '' +env['PYTHONPATH'] = '../../lib/python:'+pp +client = mosq_test.start_client(filename=sys.argv[1].replace('/', '-'), cmd=client_args, env=env, port=port) + +try: + (conn, address) = sock.accept() + conn.settimeout(10) + + if mosq_test.expect_packet(conn, "connect", connect_packet): + conn.send(connack_packet) + + if mosq_test.expect_packet(conn, "publish", publish_packet): + if mosq_test.expect_packet(conn, "disconnect", disconnect_packet): + rc = 0 + + conn.close() +finally: + client.terminate() + client.wait() + if rc: + (stdo, stde) = client.communicate() + print(stde) + sock.close() + +exit(rc) diff --git a/test/lib/Makefile b/test/lib/Makefile index b1ef54f4..e9b0c54c 100644 --- a/test/lib/Makefile +++ b/test/lib/Makefile @@ -50,6 +50,7 @@ ifeq ($(WITH_TLS),yes) endif ./09-util-topic-tokenise.py $@/09-util-topic-tokenise.test ./11-prop-send-payload-format.py $@/11-prop-send-payload-format.test + ./11-prop-send-content-type.py $@/11-prop-send-content-type.test clean : $(MAKE) -C c clean diff --git a/test/lib/c/11-prop-send-content-type.c b/test/lib/c/11-prop-send-content-type.c new file mode 100644 index 00000000..d60c8b5a --- /dev/null +++ b/test/lib/c/11-prop-send-content-type.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include + +static int run = -1; +static int sent_mid = -1; + +void on_connect(struct mosquitto *mosq, void *obj, int rc) +{ + int rc2; + mosquitto_property *proplist = NULL; + + if(rc){ + exit(1); + }else{ + rc2 = mosquitto_property_add_string(&proplist, MQTT_PROP_CONTENT_TYPE, "application/json"); + mosquitto_publish_v5(mosq, &sent_mid, "prop/qos0", strlen("message"), "message", 0, false, proplist); + } +} + +void on_publish(struct mosquitto *mosq, void *obj, int mid) +{ + if(mid == sent_mid){ + mosquitto_disconnect(mosq); + run = 0; + }else{ + exit(1); + } +} + +int main(int argc, char *argv[]) +{ + int rc; + int tmp; + struct mosquitto *mosq; + + int port = atoi(argv[1]); + + mosquitto_lib_init(); + + mosq = mosquitto_new("prop-test", true, NULL); + mosquitto_connect_callback_set(mosq, on_connect); + mosquitto_publish_callback_set(mosq, on_publish); + tmp = MQTT_PROTOCOL_V5; + mosquitto_opts_set(mosq, MOSQ_OPT_PROTOCOL_VERSION, &tmp); + + rc = mosquitto_connect(mosq, "localhost", port, 60); + + while(run == -1){ + rc = mosquitto_loop(mosq, -1, 1); + } + + mosquitto_lib_cleanup(); + return run; +} diff --git a/test/lib/c/Makefile b/test/lib/c/Makefile index 45a6c7e7..4727680f 100644 --- a/test/lib/c/Makefile +++ b/test/lib/c/Makefile @@ -89,6 +89,9 @@ all : 01 02 03 04 08 09 11 11-prop-send-payload-format.test : 11-prop-send-payload-format.c $(CC) $< -o $@ $(CFLAGS) $(LIBS) +11-prop-send-content-type.test : 11-prop-send-content-type.c + $(CC) $< -o $@ $(CFLAGS) $(LIBS) + 01 : 01-con-discon-success.test 01-will-set.test 01-unpwd-set.test 01-will-unpwd-set.test 01-no-clean-session.test 01-keepalive-pingreq.test 02 : 02-subscribe-qos0.test 02-subscribe-qos1.test 02-subscribe-qos2.test 02-unsubscribe.test @@ -101,7 +104,7 @@ all : 01 02 03 04 08 09 11 09 : 09-util-topic-tokenise.test -11 : 11-prop-send-payload-format.test +11 : 11-prop-send-payload-format.test 11-prop-send-content-type.test reallyclean : clean -rm -f *.orig diff --git a/test/lib/ptest.py b/test/lib/ptest.py index d3981a7c..64990e5e 100755 --- a/test/lib/ptest.py +++ b/test/lib/ptest.py @@ -32,6 +32,7 @@ tests = [ ('./08-ssl-connect-no-auth.py', 'c/08-ssl-connect-no-auth.test'), ('./09-util-topic-tokenise.py', 'c/09-util-topic-tokenise.test'), ('./11-prop-send-payload-format.py', 'c/11-prop-send-payload-format.test'), + ('./11-prop-send-content-type.py', 'c/11-prop-send-content-type.test'), ('./01-con-discon-success.py', 'cpp/01-con-discon-success.test'), ('./01-keepalive-pingreq.py', 'cpp/01-keepalive-pingreq.test'),