diff --git a/src/subs.c b/src/subs.c index 9fe52d52..ad71b73f 100644 --- a/src/subs.c +++ b/src/subs.c @@ -263,6 +263,7 @@ static int sub__add_recurse(struct mosquitto_db *db, struct mosquitto *context, * need to update QoS. Return MOSQ_ERR_SUB_EXISTS to * indicate this to the calling function. */ leaf->qos = qos; + leaf->identifier = identifier; if(context->protocol == mosq_p_mqtt31 || context->protocol == mosq_p_mqtt5){ return MOSQ_ERR_SUB_EXISTS; }else{ diff --git a/test/broker/02-subpub-qos0-subscription-id.py b/test/broker/02-subpub-qos0-subscription-id.py index 4f9c1a1d..c25dda54 100755 --- a/test/broker/02-subpub-qos0-subscription-id.py +++ b/test/broker/02-subpub-qos0-subscription-id.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -# Do subscription identifiers work as expected? +# Does setting and updating subscription identifiers work as expected? # MQTT v5 from mosq_test_helper import * @@ -24,6 +24,24 @@ mid = 3 subscribe3_packet = mosq_test.gen_subscribe(mid, "subpub/noid", 0, proto_ver=5) suback3_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) +# Updated version of subscribe1, now without a subscription identifier +mid = 4 +subscribe1u_packet = mosq_test.gen_subscribe(mid, "subpub/id1", 0, proto_ver=5) +suback1u_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) + +# Updated version of subscribe2, with a new subscription identifier +mid = 5 +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 19) +subscribe2u_packet = mosq_test.gen_subscribe(mid, "subpub/+/id2", 0, proto_ver=5, properties=props) +suback2u_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) + +# Updated version of subscribe3, now with a subscription identifier +mid = 6 +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 21) +subscribe3u_packet = mosq_test.gen_subscribe(mid, "subpub/noid", 0, proto_ver=5, properties=props) +suback3u_packet = mosq_test.gen_suback(mid, 0, proto_ver=5) + + publish1_packet = mosq_test.gen_publish("subpub/id1", qos=0, payload="message1", proto_ver=5) props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 1) @@ -36,6 +54,18 @@ publish2r_packet = mosq_test.gen_publish("subpub/test/id2", qos=0, payload="mess publish3_packet = mosq_test.gen_publish("subpub/noid", qos=0, payload="message3", proto_ver=5) +# Updated version of publish1r, now with no id +publish1ru_packet = mosq_test.gen_publish("subpub/id1", qos=0, payload="message1", proto_ver=5) + +# Updated verison of publish2r, with updated id +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 19) +publish2ru_packet = mosq_test.gen_publish("subpub/test/id2", qos=0, payload="message2", proto_ver=5, properties=props) + +# Updated version of publish3r, now with an id +props = mqtt5_props.gen_varint_prop(mqtt5_props.PROP_SUBSCRIPTION_IDENTIFIER, 21) +publish3ru_packet = mosq_test.gen_publish("subpub/noid", qos=0, payload="message3", proto_ver=5, properties=props) + + port = mosq_test.get_port() broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) @@ -50,6 +80,15 @@ try: mosq_test.do_send_receive(sock, publish2_packet, publish2r_packet, "publish2") mosq_test.do_send_receive(sock, publish1_packet, publish1r_packet, "publish1") + # Now update the subscription identifiers + mosq_test.do_send_receive(sock, subscribe1u_packet, suback1u_packet, "suback1u") + mosq_test.do_send_receive(sock, subscribe2u_packet, suback2u_packet, "suback2u") + mosq_test.do_send_receive(sock, subscribe3u_packet, suback3u_packet, "suback3u") + + mosq_test.do_send_receive(sock, publish2_packet, publish2ru_packet, "publish2u") + mosq_test.do_send_receive(sock, publish3_packet, publish3ru_packet, "publish3u") + mosq_test.do_send_receive(sock, publish1_packet, publish1ru_packet, "publish1u") + rc = 0 sock.close()