From 61fe26474e230bbde65d175400b4f5c224473dad Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Mon, 25 Mar 2019 06:55:45 +0000 Subject: [PATCH] Test and fix for client message prop persistence. --- src/mosquitto.c | 2 +- test/broker/11-subscription-id.py | 84 +++++++++++++++++++++++++++++++ test/broker/Makefile | 1 + test/broker/test.py | 1 + 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100755 test/broker/11-subscription-id.py diff --git a/src/mosquitto.c b/src/mosquitto.c index ab1df130..8969f03f 100644 --- a/src/mosquitto.c +++ b/src/mosquitto.c @@ -384,13 +384,13 @@ int main(int argc, char *argv[]) context__send_will(&int_db, ctxt); } will_delay__send_all(&int_db); - session_expiry__remove_all(&int_db); #ifdef WITH_PERSISTENCE if(config.persistence){ persist__backup(&int_db, true); } #endif + session_expiry__remove_all(&int_db); HASH_ITER(hh_id, int_db.contexts_by_id, ctxt, ctxt_tmp){ #ifdef WITH_WEBSOCKETS diff --git a/test/broker/11-subscription-id.py b/test/broker/11-subscription-id.py new file mode 100755 index 00000000..ed0ea67e --- /dev/null +++ b/test/broker/11-subscription-id.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +# Test whether a client message maintains its subscription id when persisted and restored. + +from mosq_test_helper import * + +def write_config(filename, port): + with open(filename, 'w') as f: + f.write("port %d\n" % (port)) + f.write("persistence true\n") + f.write("persistence_file mosquitto-%d.db\n" % (port)) + +port = mosq_test.get_port() +conf_file = os.path.basename(__file__).replace('.py', '.conf') +write_config(conf_file, port) + +rc = 1 +keepalive = 60 + +props = mqtt5_props.gen_uint32_prop(mqtt5_props.PROP_SESSION_EXPIRY_INTERVAL, 100) +connect_packet = mosq_test.gen_connect( + "persistent-subscription-test", keepalive=keepalive, clean_session=False, proto_ver=5, properties=props +) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) +connack_packet2 = mosq_test.gen_connack(rc=0, flags=1, proto_ver=5) # session present + +mid = 1 +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 53) +subscribe_packet = mosq_test.gen_subscribe(mid, "subpub/qos1", 1, proto_ver=5, properties=props) +suback_packet = mosq_test.gen_suback(mid, 1, proto_ver=5) + +mid = 1 +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 53) +publish_packet2 = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=5, properties=props) + + +helper_connect_packet = mosq_test.gen_connect("helper", keepalive=keepalive, clean_session=True, proto_ver=5) +helper_connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +mid = 1 +helper_publish_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=5) +helper_puback_packet = mosq_test.gen_puback(mid, proto_ver=5) + + +if os.path.exists('mosquitto-%d.db' % (port)): + os.unlink('mosquitto-%d.db' % (port)) + +broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port) + +(stdo1, stde1) = ("", "") +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") + sock.close() + + sock = mosq_test.do_client_connect(helper_connect_packet, helper_connack_packet, timeout=20, port=port) + mosq_test.do_send_receive(sock, helper_publish_packet, helper_puback_packet, "helper puback") + sock.close() + + broker.terminate() + broker.wait() + (stdo1, stde1) = broker.communicate() + broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port) + + sock = mosq_test.do_client_connect(connect_packet, connack_packet2, timeout=20, port=port) + + if mosq_test.expect_packet(sock, "publish2", publish_packet2): + rc = 0 + + sock.close() +finally: + os.remove(conf_file) + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde1 + stde) + if os.path.exists('mosquitto-%d.db' % (port)): + os.unlink('mosquitto-%d.db' % (port)) + pass + + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index 5c312386..3b15a867 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -182,6 +182,7 @@ endif ./11-persistent-subscription-v5.py ./11-persistent-subscription-no-local.py ./11-pub-props.py + ./11-subscription-id.py 12 : ./12-prop-assigned-client-identifier.py diff --git a/test/broker/test.py b/test/broker/test.py index bb7628c9..211237e0 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -150,6 +150,7 @@ tests = [ (1, './11-persistent-subscription-v5.py'), (1, './11-persistent-subscription-no-local.py'), (1, './11-pub-props.py'), + (1, './11-subscription-id.py'), (1, './12-prop-assigned-client-identifier.py'), (1, './12-prop-maximum-packet-size-broker.py'),