From 7775924bae73a57b1745bd8793663933b2d2d563 Mon Sep 17 00:00:00 2001 From: Pierre Fersing Date: Wed, 3 Jan 2018 18:50:34 +0100 Subject: [PATCH] [534]Fix upgrade_outgoing_qos for retained message --- ChangeLog.txt | 1 + src/subs.c | 9 ++-- .../04-retain-upgrade-outgoing-qos.conf | 2 + test/broker/04-retain-upgrade-outgoing-qos.py | 48 +++++++++++++++++++ test/broker/Makefile | 1 + 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 test/broker/04-retain-upgrade-outgoing-qos.conf create mode 100755 test/broker/04-retain-upgrade-outgoing-qos.py diff --git a/ChangeLog.txt b/ChangeLog.txt index 7bb2e79e..510af8db 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -11,6 +11,7 @@ Broker: Closes #652. - Fix $SYS counters of messages and bytes sent when message is sent over a Websockets. Closes #250. +- Fix upgrade_outgoing_qos for retained message. Closes #534. Client library: - Fix incorrect PSK key being used if it had leading zeroes. diff --git a/src/subs.c b/src/subs.c index dcf1b3af..f1c55dea 100644 --- a/src/subs.c +++ b/src/subs.c @@ -681,9 +681,12 @@ static int _retain_process(struct mosquitto_db *db, struct mosquitto_msg_store * return rc; } - qos = retained->qos; - - if(qos > sub_qos) qos = sub_qos; + if (db->config->upgrade_outgoing_qos){ + qos = sub_qos; + } else { + qos = retained->qos; + if(qos > sub_qos) qos = sub_qos; + } if(qos > 0){ mid = _mosquitto_mid_generate(context); }else{ diff --git a/test/broker/04-retain-upgrade-outgoing-qos.conf b/test/broker/04-retain-upgrade-outgoing-qos.conf new file mode 100644 index 00000000..92f0ad4f --- /dev/null +++ b/test/broker/04-retain-upgrade-outgoing-qos.conf @@ -0,0 +1,2 @@ +port 1888 +upgrade_outgoing_qos true diff --git a/test/broker/04-retain-upgrade-outgoing-qos.py b/test/broker/04-retain-upgrade-outgoing-qos.py new file mode 100755 index 00000000..3ca5a74e --- /dev/null +++ b/test/broker/04-retain-upgrade-outgoing-qos.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +# Test whether a retained PUBLISH to a topic with QoS 0 is sent with subscriber QoS +# when upgrade_outgoing_qos is true + +import inspect, os, sys +# From http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder +cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],".."))) +if cmd_subfolder not in sys.path: + sys.path.insert(0, cmd_subfolder) + +import mosq_test + +rc = 1 +keepalive = 60 +mid = 16 +connect_packet = mosq_test.gen_connect("retain-qos0-test", keepalive=keepalive) +connack_packet = mosq_test.gen_connack(rc=0) + +publish_packet = mosq_test.gen_publish("retain/qos0/test", qos=0, payload="retained message", retain=True) +subscribe_packet = mosq_test.gen_subscribe(mid, "retain/qos0/test", 1) +suback_packet = mosq_test.gen_suback(mid, 1) + +publish_packet2 = mosq_test.gen_publish("retain/qos0/test", mid=1, qos=1, payload="retained message", retain=True) + +broker = mosq_test.start_broker(filename=os.path.basename(__file__)) + +try: + sock = mosq_test.do_client_connect(connect_packet, connack_packet) + sock.send(publish_packet) + + #sock.close() + #sock = mosq_test.do_client_connect(connect_packet, connack_packet) + sock.send(subscribe_packet) + + if mosq_test.expect_packet(sock, "suback", suback_packet): + if mosq_test.expect_packet(sock, "publish", publish_packet2): + rc = 0 + sock.close() +finally: + broker.terminate() + broker.wait() + if rc: + (stdo, stde) = broker.communicate() + print(stde) + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index 68426510..808de106 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -59,6 +59,7 @@ endif ./04-retain-qos0-repeated.py ./04-retain-qos1-qos0.py ./04-retain-qos0-clear.py + ./04-retain-upgrade-outgoing-qos.py 05 : ./05-clean-session-qos1.py