diff --git a/ChangeLog.txt b/ChangeLog.txt
index 4d4a50af..873b3a42 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -3,6 +3,20 @@
Broker:
- Reduce calls to malloc through the use of UHPA.
+- Outgoing messages with QoS>1 are no longer retried after a timeout period.
+ Messages will be retried when a client reconnects. This change in behaviour
+ can be justified by considering when the timeout may have occurred.
+ * If a connection is unreliable and has dropped, but without one end
+ noticing, the messages will be retried on reconnection. Sending
+ additional PUBLISH or PUBREL would not have changed anything.
+ * If a client is overloaded/unable to respond/has a slow connection then
+ sending additional PUBLISH or PUBREL would not help the client catch
+ up. Once the backlog has cleared the client will respond. If it is not
+ able to catch up, sending additional duplicates would not help either.
+
+Client library:
+- Outgoing messages with QoS>1 are no longer retried after a timeout period.
+ Messages will be retried when a client reconnects.
Client:
- Add -x to mosquitto_sub for printing the payload in hexadecimal format.
diff --git a/lib/messages_mosq.c b/lib/messages_mosq.c
index 7451c3e4..fad3f5fd 100644
--- a/lib/messages_mosq.c
+++ b/lib/messages_mosq.c
@@ -182,8 +182,13 @@ void message__reconnect_reset(struct mosquitto *mosq)
}
if(mosq->max_inflight_messages == 0 || mosq->inflight_messages < mosq->max_inflight_messages){
if(message->msg.qos == 1){
- message->state = mosq_ms_wait_for_puback;
+ message->state = mosq_ms_publish_qos1;
}else if(message->msg.qos == 2){
+ if(message->state == mosq_ms_wait_for_pubrec){
+ message->state = mosq_ms_publish_qos2;
+ }else if(message->state == mosq_ms_wait_for_pubcomp){
+ message->state = mosq_ms_resend_pubrel;
+ }
/* Should be able to preserve state. */
}
}else{
@@ -307,27 +312,26 @@ void message__retry_check_actual(struct mosquitto *mosq, struct mosquitto_messag
#endif
while(messages){
- if(messages->timestamp + mosq->message_retry < now){
- switch(messages->state){
- case mosq_ms_wait_for_puback:
- case mosq_ms_wait_for_pubrec:
- messages->timestamp = now;
- messages->dup = true;
- send__publish(mosq, messages->msg.mid, messages->msg.topic, messages->msg.payloadlen, messages->msg.payload, messages->msg.qos, messages->msg.retain, messages->dup);
- break;
- case mosq_ms_wait_for_pubrel:
- messages->timestamp = now;
- messages->dup = true;
- send__pubrec(mosq, messages->msg.mid);
- break;
- case mosq_ms_wait_for_pubcomp:
- messages->timestamp = now;
- messages->dup = true;
- send__pubrel(mosq, messages->msg.mid);
- break;
- default:
- break;
- }
+ switch(messages->state){
+ case mosq_ms_publish_qos1:
+ case mosq_ms_publish_qos2:
+ messages->timestamp = now;
+ messages->dup = true;
+ send__publish(mosq, messages->msg.mid, messages->msg.topic, messages->msg.payloadlen, messages->msg.payload, messages->msg.qos, messages->msg.retain, messages->dup);
+ break;
+ case mosq_ms_wait_for_pubrel:
+ messages->timestamp = now;
+ messages->dup = true;
+ send__pubrec(mosq, messages->msg.mid);
+ break;
+ case mosq_ms_resend_pubrel:
+ case mosq_ms_wait_for_pubcomp:
+ messages->timestamp = now;
+ messages->dup = true;
+ send__pubrel(mosq, messages->msg.mid);
+ break;
+ default:
+ break;
}
messages = messages->next;
}
@@ -340,17 +344,13 @@ void message__retry_check(struct mosquitto *mosq)
{
#ifdef WITH_THREADING
message__retry_check_actual(mosq, mosq->out_messages, &mosq->out_message_mutex);
- message__retry_check_actual(mosq, mosq->in_messages, &mosq->in_message_mutex);
#else
message__retry_check_actual(mosq, mosq->out_messages);
- message__retry_check_actual(mosq, mosq->in_messages);
#endif
}
void mosquitto_message_retry_set(struct mosquitto *mosq, unsigned int message_retry)
{
- assert(mosq);
- if(mosq) mosq->message_retry = message_retry;
}
int message__out_update(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_state state)
diff --git a/lib/mosquitto.c b/lib/mosquitto.c
index 655c3111..dcf4c906 100644
--- a/lib/mosquitto.c
+++ b/lib/mosquitto.c
@@ -145,8 +145,6 @@ int mosquitto_reinitialise(struct mosquitto *mosq, const char *id, bool clean_se
mosq->sockpairR = INVALID_SOCKET;
mosq->sockpairW = INVALID_SOCKET;
mosq->keepalive = 60;
- mosq->message_retry = 20;
- mosq->last_retry_check = 0;
mosq->clean_session = clean_session;
if(id){
if(strlen(id) == 0){
@@ -1060,10 +1058,6 @@ int mosquitto_loop_misc(struct mosquitto *mosq)
mosquitto__check_keepalive(mosq);
now = mosquitto_time();
- if(mosq->last_retry_check+1 < now){
- message__retry_check(mosq);
- mosq->last_retry_check = now;
- }
if(mosq->ping_t && now - mosq->ping_t >= mosq->keepalive){
/* mosq->ping_t != 0 means we are waiting for a pingresp.
* This hasn't happened in the keepalive time so we should disconnect.
diff --git a/lib/mosquitto.h b/lib/mosquitto.h
index a0ac2a65..2b7a6dc8 100644
--- a/lib/mosquitto.h
+++ b/lib/mosquitto.h
@@ -1297,13 +1297,7 @@ libmosq_EXPORT int mosquitto_max_inflight_messages_set(struct mosquitto *mosq, u
/*
* Function: mosquitto_message_retry_set
*
- * Set the number of seconds to wait before retrying messages. This applies to
- * publish messages with QoS>0. May be called at any time.
- *
- * Parameters:
- * mosq - a valid mosquitto instance.
- * message_retry - the number of seconds to wait for a response before
- * retrying. Defaults to 20.
+ * This function now has no effect.
*/
libmosq_EXPORT void mosquitto_message_retry_set(struct mosquitto *mosq, unsigned int message_retry);
diff --git a/lib/mosquitto_internal.h b/lib/mosquitto_internal.h
index f6117238..f47c571d 100644
--- a/lib/mosquitto_internal.h
+++ b/lib/mosquitto_internal.h
@@ -219,8 +219,6 @@ struct mosquitto {
# endif
void *userdata;
bool in_callback;
- unsigned int message_retry;
- time_t last_retry_check;
struct mosquitto_message_all *in_messages;
struct mosquitto_message_all *in_messages_last;
struct mosquitto_message_all *out_messages;
diff --git a/lib/read_handle_client.c b/lib/read_handle_client.c
index 2b22b9ed..57c8c41f 100644
--- a/lib/read_handle_client.c
+++ b/lib/read_handle_client.c
@@ -19,6 +19,7 @@ Contributors:
#include "mosquitto.h"
#include "logging_mosq.h"
#include "memory_mosq.h"
+#include "messages_mosq.h"
#include "net_mosq.h"
#include "packet_mosq.h"
#include "read_handle.h"
@@ -47,6 +48,7 @@ int handle__connack(struct mosquitto *mosq)
if(mosq->state != mosq_cs_disconnecting){
mosq->state = mosq_cs_connected;
}
+ message__retry_check(mosq);
return MOSQ_ERR_SUCCESS;
case 1:
case 2:
diff --git a/man/libmosquitto.3.xml b/man/libmosquitto.3.xml
index 6a04888c..7ef873be 100644
--- a/man/libmosquitto.3.xml
+++ b/man/libmosquitto.3.xml
@@ -279,11 +279,6 @@
unsigned int max_inflight_messages
- int mosquitto_message_retry_set
- struct mosquitto *mosq
- unsigned int message_retry
-
-
int mosquitto_reconnect_delay_set
struct mosquitto *mosq
unsigned int reconnect_delay
diff --git a/man/mosquitto.conf.5.xml b/man/mosquitto.conf.5.xml
index 59b4c8e7..be6866e2 100644
--- a/man/mosquitto.conf.5.xml
+++ b/man/mosquitto.conf.5.xml
@@ -525,16 +525,6 @@
Reloaded on reload signal.
-
- seconds
-
- The integer number of seconds after a QoS=1 or QoS=2
- message has been sent that mosquitto will wait before
- retrying when no response is received. If unset,
- defaults to 20 seconds.
- Reloaded on reload signal.
-
-
seconds
diff --git a/mosquitto.conf b/mosquitto.conf
index df1aa8ba..3488b4a3 100644
--- a/mosquitto.conf
+++ b/mosquitto.conf
@@ -11,10 +11,6 @@
# General configuration
# =================================================================
-# Time in seconds to wait before resending an outgoing QoS=1 or
-# QoS=2 message.
-#retry_interval 20
-
# Time in seconds between updates of the $SYS tree.
# Set to 0 to disable the publishing of the $SYS tree.
#sys_interval 10
diff --git a/src/conf.c b/src/conf.c
index 5145712e..e4e3e6d2 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -154,7 +154,6 @@ static void config__init_reload(struct mosquitto__config *config)
if(config->psk_file) mosquitto__free(config->psk_file);
config->psk_file = NULL;
config->queue_qos0_messages = false;
- config->retry_interval = 20;
config->sys_interval = 10;
config->upgrade_outgoing_qos = false;
if(config->auth_options){
@@ -1613,11 +1612,7 @@ int config__read_file_core(struct mosquitto__config *config, bool reload, const
log__printf(NULL, MOSQ_LOG_WARNING, "Warning: Bridge support not available.");
#endif
}else if(!strcmp(token, "retry_interval")){
- if(conf__parse_int(&token, "retry_interval", &config->retry_interval, saveptr)) return MOSQ_ERR_INVAL;
- if(config->retry_interval < 1 || config->retry_interval > 3600){
- log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid retry_interval value (%d).", config->retry_interval);
- return MOSQ_ERR_INVAL;
- }
+ log__printf(NULL, MOSQ_LOG_WARNING, "Warning: The retry_interval option is no longer available.");
}else if(!strcmp(token, "round_robin")){
#ifdef WITH_BRIDGE
if(reload) continue; // FIXME
diff --git a/src/database.c b/src/database.c
index 133c2fce..0235d443 100644
--- a/src/database.c
+++ b/src/database.c
@@ -675,48 +675,6 @@ int db__message_reconnect_reset(struct mosquitto_db *db, struct mosquitto *conte
return MOSQ_ERR_SUCCESS;
}
-int db__message_timeout_check(struct mosquitto_db *db, unsigned int timeout)
-{
- time_t threshold;
- enum mosquitto_msg_state new_state;
- struct mosquitto *context, *ctxt_tmp;
- struct mosquitto_client_msg *msg;
-
- threshold = mosquitto_time() - timeout;
-
- HASH_ITER(hh_sock, db->contexts_by_sock, context, ctxt_tmp){
- msg = context->msgs;
- while(msg){
- new_state = mosq_ms_invalid;
- if(msg->timestamp < threshold && msg->state != mosq_ms_queued){
- switch(msg->state){
- case mosq_ms_wait_for_puback:
- new_state = mosq_ms_publish_qos1;
- break;
- case mosq_ms_wait_for_pubrec:
- new_state = mosq_ms_publish_qos2;
- break;
- case mosq_ms_wait_for_pubrel:
- new_state = mosq_ms_send_pubrec;
- break;
- case mosq_ms_wait_for_pubcomp:
- new_state = mosq_ms_resend_pubrel;
- break;
- default:
- break;
- }
- if(new_state != mosq_ms_invalid){
- msg->timestamp = mosquitto_time();
- msg->state = new_state;
- msg->dup = true;
- }
- }
- msg = msg->next;
- }
- }
-
- return MOSQ_ERR_SUCCESS;
-}
int db__message_release(struct mosquitto_db *db, struct mosquitto *context, uint16_t mid, enum mosquitto_msg_direction dir)
{
diff --git a/src/loop.c b/src/loop.c
index 35e30df0..dcf1368a 100644
--- a/src/loop.c
+++ b/src/loop.c
@@ -304,8 +304,6 @@ int mosquitto_main_loop(struct mosquitto_db *db, int *listensock, int listensock
expiration_check_time = time(NULL) + 3600;
}
- db__message_timeout_check(db, db->config->retry_interval);
-
#ifndef WIN32
sigprocmask(SIG_SETMASK, &sigblock, &origsig);
fdcount = poll(pollfds, pollfd_index, 100);
diff --git a/src/mosquitto_broker.h b/src/mosquitto_broker.h
index 02a69689..6fe0bf6c 100644
--- a/src/mosquitto_broker.h
+++ b/src/mosquitto_broker.h
@@ -183,7 +183,6 @@ struct mosquitto__config {
char *pid_file;
char *psk_file;
bool queue_qos0_messages;
- int retry_interval;
int sys_interval;
bool upgrade_outgoing_qos;
char *user;
@@ -477,8 +476,6 @@ void db__msg_store_add(struct mosquitto_db *db, struct mosquitto_msg_store *stor
void db__msg_store_remove(struct mosquitto_db *db, struct mosquitto_msg_store *store);
void db__msg_store_deref(struct mosquitto_db *db, struct mosquitto_msg_store **store);
void db__msg_store_clean(struct mosquitto_db *db);
-/* Check all messages waiting on a client reply and resend if timeout has been exceeded. */
-int db__message_timeout_check(struct mosquitto_db *db, unsigned int timeout);
int db__message_reconnect_reset(struct mosquitto_db *db, struct mosquitto *context);
void db__vacuum(void);
void sys__update(struct mosquitto_db *db, int interval, time_t start_time);
diff --git a/test/broker/03-publish-b2c-timeout-qos1-helper.py b/test/broker/03-publish-b2c-timeout-qos1-helper.py
deleted file mode 100755
index 6d783568..00000000
--- a/test/broker/03-publish-b2c-timeout-qos1-helper.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a PUBLISH to a topic with QoS 2 results in the correct packet flow.
-
-import subprocess
-import socket
-import time
-
-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
-connect_packet = mosq_test.gen_connect("test-helper", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-mid = 128
-publish_packet = mosq_test.gen_publish("qos1/timeout/test", qos=1, mid=mid, payload="timeout-message")
-puback_packet = mosq_test.gen_puback(mid)
-
-sock = mosq_test.do_client_connect(connect_packet, connack_packet, connack_error="helper connack")
-sock.send(publish_packet)
-
-if mosq_test.expect_packet(sock, "helper puback", puback_packet):
- rc = 0
-
-sock.close()
-
-exit(rc)
-
diff --git a/test/broker/03-publish-b2c-timeout-qos1.conf b/test/broker/03-publish-b2c-timeout-qos1.conf
deleted file mode 100644
index 425d6679..00000000
--- a/test/broker/03-publish-b2c-timeout-qos1.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-retry_interval 10
-port 1888
-log_type debug
diff --git a/test/broker/03-publish-b2c-timeout-qos1.py b/test/broker/03-publish-b2c-timeout-qos1.py
deleted file mode 100755
index cc319596..00000000
--- a/test/broker/03-publish-b2c-timeout-qos1.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a SUBSCRIBE to a topic with QoS 2 results in the correct SUBACK packet.
-
-import subprocess
-import socket
-import time
-from os import environ
-
-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
-mid = 3265
-keepalive = 60
-connect_packet = mosq_test.gen_connect("pub-qos1-timeout-test", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-subscribe_packet = mosq_test.gen_subscribe(mid, "qos1/timeout/test", 1)
-suback_packet = mosq_test.gen_suback(mid, 1)
-
-mid = 1
-publish_packet = mosq_test.gen_publish("qos1/timeout/test", qos=1, mid=mid, payload="timeout-message")
-publish_dup_packet = mosq_test.gen_publish("qos1/timeout/test", qos=1, mid=mid, payload="timeout-message", dup=True)
-puback_packet = mosq_test.gen_puback(mid)
-
-broker = mosq_test.start_broker(filename=os.path.basename(__file__))
-
-try:
- sock = mosq_test.do_client_connect(connect_packet, connack_packet)
- sock.send(subscribe_packet)
-
- if mosq_test.expect_packet(sock, "suback", suback_packet):
- pub = subprocess.Popen(['./03-publish-b2c-timeout-qos1-helper.py'])
- pub.wait()
- # Should have now received a publish command
-
- if mosq_test.expect_packet(sock, "publish", publish_packet):
- # Wait for longer than 5 seconds to get republish with dup set
- # This is covered by the 8 second timeout
-
- if mosq_test.expect_packet(sock, "dup publish", publish_dup_packet):
- sock.send(puback_packet)
- rc = 0
-
- sock.close()
-finally:
- broker.terminate()
- broker.wait()
- if rc:
- (stdo, stde) = broker.communicate()
- print(stde)
-
-exit(rc)
-
diff --git a/test/broker/03-publish-b2c-timeout-qos2-helper.py b/test/broker/03-publish-b2c-timeout-qos2-helper.py
deleted file mode 100755
index 9ccd5e72..00000000
--- a/test/broker/03-publish-b2c-timeout-qos2-helper.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a PUBLISH to a topic with QoS 2 results in the correct packet flow.
-
-import subprocess
-import socket
-import time
-
-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
-connect_packet = mosq_test.gen_connect("test-helper", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-mid = 312
-publish_packet = mosq_test.gen_publish("qos2/timeout/test", qos=2, mid=mid, payload="timeout-message")
-pubrec_packet = mosq_test.gen_pubrec(mid)
-pubrel_packet = mosq_test.gen_pubrel(mid)
-pubcomp_packet = mosq_test.gen_pubcomp(mid)
-
-sock = mosq_test.do_client_connect(connect_packet, connack_packet, connack_error="helper connack")
-sock.send(publish_packet)
-
-if mosq_test.expect_packet(sock, "helper pubrec", pubrec_packet):
- sock.send(pubrel_packet)
-
- if mosq_test.expect_packet(sock, "helper pubcomp", pubcomp_packet):
- rc = 0
-
-sock.close()
-
-exit(rc)
-
diff --git a/test/broker/03-publish-b2c-timeout-qos2.conf b/test/broker/03-publish-b2c-timeout-qos2.conf
deleted file mode 100644
index 425d6679..00000000
--- a/test/broker/03-publish-b2c-timeout-qos2.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-retry_interval 10
-port 1888
-log_type debug
diff --git a/test/broker/03-publish-b2c-timeout-qos2.py b/test/broker/03-publish-b2c-timeout-qos2.py
deleted file mode 100755
index 092299af..00000000
--- a/test/broker/03-publish-b2c-timeout-qos2.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a SUBSCRIBE to a topic with QoS 2 results in the correct SUBACK packet.
-
-import subprocess
-import socket
-import time
-from os import environ
-
-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
-mid = 3265
-keepalive = 60
-connect_packet = mosq_test.gen_connect("pub-qo2-timeout-test", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-subscribe_packet = mosq_test.gen_subscribe(mid, "qos2/timeout/test", 2)
-suback_packet = mosq_test.gen_suback(mid, 2)
-
-mid = 1
-publish_packet = mosq_test.gen_publish("qos2/timeout/test", qos=2, mid=mid, payload="timeout-message")
-publish_dup_packet = mosq_test.gen_publish("qos2/timeout/test", qos=2, mid=mid, payload="timeout-message", dup=True)
-pubrec_packet = mosq_test.gen_pubrec(mid)
-pubrel_packet = mosq_test.gen_pubrel(mid)
-pubcomp_packet = mosq_test.gen_pubcomp(mid)
-
-broker = mosq_test.start_broker(filename=os.path.basename(__file__))
-
-try:
- sock = mosq_test.do_client_connect(connect_packet, connack_packet)
- sock.send(subscribe_packet)
-
- if mosq_test.expect_packet(sock, "suback", suback_packet):
- pub = subprocess.Popen(['./03-publish-b2c-timeout-qos2-helper.py'])
- pub.wait()
- # Should have now received a publish command
-
- if mosq_test.expect_packet(sock, "publish", publish_packet):
- # Wait for longer than 5 seconds to get republish with dup set
- # This is covered by the 8 second timeout
-
- if mosq_test.expect_packet(sock, "dup publish", publish_dup_packet):
- sock.send(pubrec_packet)
-
- if mosq_test.expect_packet(sock, "pubrel", pubrel_packet):
- # Wait for longer than 5 seconds to get republish with dup set
- # This is covered by the 8 second timeout
-
- if mosq_test.expect_packet(sock, "dup pubrel", pubrel_packet):
- sock.send(pubcomp_packet)
- rc = 0
-
- sock.close()
-finally:
- broker.terminate()
- broker.wait()
- if rc:
- (stdo, stde) = broker.communicate()
- print(stde)
-
-exit(rc)
-
diff --git a/test/broker/03-publish-c2b-timeout-qos2.conf b/test/broker/03-publish-c2b-timeout-qos2.conf
deleted file mode 100644
index a427f244..00000000
--- a/test/broker/03-publish-c2b-timeout-qos2.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-retry_interval 10
-port 1888
diff --git a/test/broker/03-publish-c2b-timeout-qos2.py b/test/broker/03-publish-c2b-timeout-qos2.py
deleted file mode 100755
index a6e5997d..00000000
--- a/test/broker/03-publish-c2b-timeout-qos2.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a PUBLISH to a topic with QoS 2 results in the correct packet
-# flow. This test introduces delays into the flow in order to force the broker
-# to send duplicate PUBREC and PUBCOMP messages.
-
-import subprocess
-import socket
-import time
-
-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 = 600
-connect_packet = mosq_test.gen_connect("pub-qos2-timeout-test", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-mid = 1926
-publish_packet = mosq_test.gen_publish("pub/qos2/test", qos=2, mid=mid, payload="timeout-message")
-pubrec_packet = mosq_test.gen_pubrec(mid)
-pubrel_packet = mosq_test.gen_pubrel(mid)
-pubcomp_packet = mosq_test.gen_pubcomp(mid)
-
-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)
-
- if mosq_test.expect_packet(sock, "pubrec", pubrec_packet):
- # Timeout is 8 seconds which means the broker should repeat the PUBREC.
-
- if mosq_test.expect_packet(sock, "pubrec", pubrec_packet):
- sock.send(pubrel_packet)
-
- if mosq_test.expect_packet(sock, "pubcomp", pubcomp_packet):
- 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 510d90f9..1a0ed553 100644
--- a/test/broker/Makefile
+++ b/test/broker/Makefile
@@ -44,11 +44,8 @@ endif
03 :
./03-publish-qos1.py
./03-publish-qos2.py
- ./03-publish-b2c-timeout-qos1.py
./03-publish-b2c-disconnect-qos1.py
- ./03-publish-c2b-timeout-qos2.py
./03-publish-c2b-disconnect-qos2.py
- ./03-publish-b2c-timeout-qos2.py
./03-publish-b2c-disconnect-qos2.py
./03-pattern-matching.py
diff --git a/test/lib/03-publish-b2c-qos2.py b/test/lib/03-publish-b2c-qos2.py
index 83545421..5099ae5f 100755
--- a/test/lib/03-publish-b2c-qos2.py
+++ b/test/lib/03-publish-b2c-qos2.py
@@ -68,12 +68,10 @@ try:
conn.send(publish_packet)
if mosq_test.expect_packet(conn, "pubrec", pubrec_packet):
- # Should be repeated due to timeout
- if mosq_test.expect_packet(conn, "pubrec", pubrec_packet):
- conn.send(pubrel_packet)
+ conn.send(pubrel_packet)
- if mosq_test.expect_packet(conn, "pubcomp", pubcomp_packet):
- rc = 0
+ if mosq_test.expect_packet(conn, "pubcomp", pubcomp_packet):
+ rc = 0
conn.close()
finally:
diff --git a/test/lib/03-publish-c2b-qos1-timeout.py b/test/lib/03-publish-c2b-qos1-timeout.py
deleted file mode 100755
index 344ca957..00000000
--- a/test/lib/03-publish-c2b-qos1-timeout.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a client sends a correct PUBLISH to a topic with QoS 1 and responds to a delay.
-
-# The client should connect to port 1888 with keepalive=60, clean session set,
-# and client id publish-qos1-test
-# The test will send a CONNACK message to the client with rc=0. Upon receiving
-# the CONNACK the client should verify that rc==0. If not, it should exit with
-# return code=1.
-# On a successful CONNACK, the client should send a PUBLISH message with topic
-# "pub/qos1/test", payload "message" and QoS=1.
-# The test will not respond to the first PUBLISH message, so the client must
-# resend the PUBLISH message with dup=1. Note that to keep test durations low, a
-# message retry timeout of less than 10 seconds is required for this test.
-# On receiving the second PUBLISH message, the test will send the correct
-# PUBACK response. On receiving the correct PUBACK response, the client should
-# send a DISCONNECT message.
-
-import inspect
-import os
-import subprocess
-import socket
-import sys
-import time
-
-# 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
-connect_packet = mosq_test.gen_connect("publish-qos1-test", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-disconnect_packet = mosq_test.gen_disconnect()
-
-mid = 1
-publish_packet = mosq_test.gen_publish("pub/qos1/test", qos=1, mid=mid, payload="message")
-publish_packet_dup = mosq_test.gen_publish("pub/qos1/test", qos=1, mid=mid, payload="message", dup=True)
-puback_packet = mosq_test.gen_puback(mid)
-
-sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-sock.settimeout(10)
-sock.bind(('', 1888))
-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)
-
-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):
- # Delay for > 3 seconds (message retry time)
-
- if mosq_test.expect_packet(conn, "dup publish", publish_packet_dup):
- conn.send(puback_packet)
-
- if mosq_test.expect_packet(conn, "disconnect", disconnect_packet):
- rc = 0
-
- conn.close()
-finally:
- client.terminate()
- client.wait()
- sock.close()
-
-exit(rc)
diff --git a/test/lib/03-publish-c2b-qos2-timeout.py b/test/lib/03-publish-c2b-qos2-timeout.py
deleted file mode 100755
index 0705fc63..00000000
--- a/test/lib/03-publish-c2b-qos2-timeout.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/usr/bin/env python
-
-# Test whether a client sends a correct PUBLISH to a topic with QoS 1 and responds to a delay.
-
-# The client should connect to port 1888 with keepalive=60, clean session set,
-# and client id publish-qos2-test
-# The test will send a CONNACK message to the client with rc=0. Upon receiving
-# the CONNACK the client should verify that rc==0. If not, it should exit with
-# return code=1.
-# On a successful CONNACK, the client should send a PUBLISH message with topic
-# "pub/qos2/test", payload "message" and QoS=2.
-# The test will not respond to the first PUBLISH message, so the client must
-# resend the PUBLISH message with dup=1. Note that to keep test durations low, a
-# message retry timeout of less than 10 seconds is required for this test.
-# On receiving the second PUBLISH message, the test will send the correct
-# PUBREC response. On receiving the correct PUBREC response, the client should
-# send a PUBREL message.
-# The test will not respond to the first PUBREL message, so the client must
-# resend the PUBREL message with dup=1. On receiving the second PUBREL message,
-# the test will send the correct PUBCOMP response. On receiving the correct
-# PUBCOMP response, the client should send a DISCONNECT message.
-
-import inspect
-import os
-import subprocess
-import socket
-import sys
-import time
-
-# 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
-connect_packet = mosq_test.gen_connect("publish-qos2-test", keepalive=keepalive)
-connack_packet = mosq_test.gen_connack(rc=0)
-
-disconnect_packet = mosq_test.gen_disconnect()
-
-mid = 1
-publish_packet = mosq_test.gen_publish("pub/qos2/test", qos=2, mid=mid, payload="message")
-publish_dup_packet = mosq_test.gen_publish("pub/qos2/test", qos=2, mid=mid, payload="message", dup=True)
-pubrec_packet = mosq_test.gen_pubrec(mid)
-pubrel_packet = mosq_test.gen_pubrel(mid)
-pubcomp_packet = mosq_test.gen_pubcomp(mid)
-
-sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-sock.settimeout(10)
-sock.bind(('', 1888))
-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)
-
-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):
- # Delay for > 3 seconds (message retry time)
-
- if mosq_test.expect_packet(conn, "dup publish", publish_dup_packet):
- conn.send(pubrec_packet)
-
- if mosq_test.expect_packet(conn, "pubrel", pubrel_packet):
- if mosq_test.expect_packet(conn, "dup pubrel", pubrel_packet):
- conn.send(pubcomp_packet)
-
- if mosq_test.expect_packet(conn, "disconnect", disconnect_packet):
- rc = 0
-
- conn.close()
-finally:
- client.terminate()
- client.wait()
- sock.close()
-
-exit(rc)
diff --git a/test/lib/Makefile b/test/lib/Makefile
index 03f13908..dc27edd2 100644
--- a/test/lib/Makefile
+++ b/test/lib/Makefile
@@ -30,10 +30,8 @@ c cpp : test-compile
./02-unsubscribe.py $@/02-unsubscribe.test
./03-publish-qos0.py $@/03-publish-qos0.test
./03-publish-qos0-no-payload.py $@/03-publish-qos0-no-payload.test
- ./03-publish-c2b-qos1-timeout.py $@/03-publish-c2b-qos1-timeout.test
./03-publish-c2b-qos1-disconnect.py $@/03-publish-c2b-qos1-disconnect.test
./03-publish-c2b-qos2.py $@/03-publish-c2b-qos2.test
- ./03-publish-c2b-qos2-timeout.py $@/03-publish-c2b-qos2-timeout.test
./03-publish-c2b-qos2-disconnect.py $@/03-publish-c2b-qos2-disconnect.test
./03-publish-b2c-qos1.py $@/03-publish-b2c-qos1.test
./03-publish-b2c-qos2.py $@/03-publish-b2c-qos2.test
diff --git a/test/lib/c/03-publish-c2b-qos1-timeout.c b/test/lib/c/03-publish-c2b-qos1-timeout.c
deleted file mode 100644
index b01473f1..00000000
--- a/test/lib/c/03-publish-c2b-qos1-timeout.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-
-static int run = -1;
-
-void on_connect(struct mosquitto *mosq, void *obj, int rc)
-{
- if(rc){
- exit(1);
- }else{
- mosquitto_publish(mosq, NULL, "pub/qos1/test", strlen("message"), "message", 1, false);
- }
-}
-
-void on_publish(struct mosquitto *mosq, void *obj, int mid)
-{
- mosquitto_disconnect(mosq);
-}
-
-void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
-{
- run = 0;
-}
-
-int main(int argc, char *argv[])
-{
- int rc;
- struct mosquitto *mosq;
-
- mosquitto_lib_init();
-
- mosq = mosquitto_new("publish-qos1-test", true, NULL);
- mosquitto_connect_callback_set(mosq, on_connect);
- mosquitto_disconnect_callback_set(mosq, on_disconnect);
- mosquitto_publish_callback_set(mosq, on_publish);
- mosquitto_message_retry_set(mosq, 3);
-
- rc = mosquitto_connect(mosq, "localhost", 1888, 60);
-
- while(run == -1){
- mosquitto_loop(mosq, 300, 1);
- }
-
- mosquitto_lib_cleanup();
- return run;
-}
diff --git a/test/lib/c/03-publish-c2b-qos2-timeout.c b/test/lib/c/03-publish-c2b-qos2-timeout.c
deleted file mode 100644
index f4c379e9..00000000
--- a/test/lib/c/03-publish-c2b-qos2-timeout.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-
-static int run = -1;
-
-void on_connect(struct mosquitto *mosq, void *obj, int rc)
-{
- if(rc){
- exit(1);
- }else{
- mosquitto_publish(mosq, NULL, "pub/qos2/test", strlen("message"), "message", 2, false);
- }
-}
-
-void on_publish(struct mosquitto *mosq, void *obj, int mid)
-{
- mosquitto_disconnect(mosq);
-}
-
-void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
-{
- run = 0;
-}
-
-int main(int argc, char *argv[])
-{
- int rc;
- struct mosquitto *mosq;
-
- mosquitto_lib_init();
-
- mosq = mosquitto_new("publish-qos2-test", true, NULL);
- mosquitto_connect_callback_set(mosq, on_connect);
- mosquitto_disconnect_callback_set(mosq, on_disconnect);
- mosquitto_publish_callback_set(mosq, on_publish);
- mosquitto_message_retry_set(mosq, 3);
-
- rc = mosquitto_connect(mosq, "localhost", 1888, 60);
-
- while(run == -1){
- mosquitto_loop(mosq, 300, 1);
- }
-
- mosquitto_lib_cleanup();
- return run;
-}
diff --git a/test/lib/c/Makefile b/test/lib/c/Makefile
index 570b7ad3..0484fedd 100644
--- a/test/lib/c/Makefile
+++ b/test/lib/c/Makefile
@@ -41,18 +41,12 @@ all : 01 02 03 04 08 09
03-publish-qos0-no-payload.test : 03-publish-qos0-no-payload.c
$(CC) $< -o $@ $(CFLAGS) $(LIBS)
-03-publish-c2b-qos1-timeout.test : 03-publish-c2b-qos1-timeout.c
- $(CC) $< -o $@ $(CFLAGS) $(LIBS)
-
03-publish-c2b-qos1-disconnect.test : 03-publish-c2b-qos1-disconnect.c
$(CC) $< -o $@ $(CFLAGS) $(LIBS)
03-publish-c2b-qos2.test : 03-publish-c2b-qos2.c
$(CC) $< -o $@ $(CFLAGS) $(LIBS)
-03-publish-c2b-qos2-timeout.test : 03-publish-c2b-qos2-timeout.c
- $(CC) $< -o $@ $(CFLAGS) $(LIBS)
-
03-publish-c2b-qos2-disconnect.test : 03-publish-c2b-qos2-disconnect.c
$(CC) $< -o $@ $(CFLAGS) $(LIBS)
@@ -90,7 +84,7 @@ all : 01 02 03 04 08 09
02 : 02-subscribe-qos0.test 02-subscribe-qos1.test 02-subscribe-qos2.test 02-unsubscribe.test
-03 : 03-publish-qos0.test 03-publish-qos0-no-payload.test 03-publish-c2b-qos1-timeout.test 03-publish-c2b-qos1-disconnect.test 03-publish-c2b-qos2.test 03-publish-c2b-qos2-timeout.test 03-publish-c2b-qos2-disconnect.test 03-publish-b2c-qos1.test 03-publish-b2c-qos2.test
+03 : 03-publish-qos0.test 03-publish-qos0-no-payload.test 03-publish-c2b-qos1-disconnect.test 03-publish-c2b-qos2.test 03-publish-c2b-qos2-disconnect.test 03-publish-b2c-qos1.test 03-publish-b2c-qos2.test
04 : 04-retain-qos0.test
diff --git a/test/lib/cpp/03-publish-c2b-qos1-timeout.cpp b/test/lib/cpp/03-publish-c2b-qos1-timeout.cpp
deleted file mode 100644
index 417c84c6..00000000
--- a/test/lib/cpp/03-publish-c2b-qos1-timeout.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include
-#include
-
-#include
-
-static int run = -1;
-
-class mosquittopp_test : public mosqpp::mosquittopp
-{
- public:
- mosquittopp_test(const char *id);
-
- void on_connect(int rc);
- void on_disconnect(int rc);
- void on_publish(int mid);
-};
-
-mosquittopp_test::mosquittopp_test(const char *id) : mosqpp::mosquittopp(id)
-{
-}
-
-void mosquittopp_test::on_connect(int rc)
-{
- if(rc){
- exit(1);
- }else{
- publish(NULL, "pub/qos1/test", strlen("message"), "message", 1, false);
- }
-}
-
-void mosquittopp_test::on_disconnect(int rc)
-{
- run = 0;
-}
-
-void mosquittopp_test::on_publish(int mid)
-{
- disconnect();
-}
-
-int main(int argc, char *argv[])
-{
- struct mosquittopp_test *mosq;
-
- mosqpp::lib_init();
-
- mosq = new mosquittopp_test("publish-qos1-test");
- mosq->message_retry_set(3);
-
- mosq->connect("localhost", 1888, 60);
-
- while(run == -1){
- mosq->loop();
- }
-
- mosqpp::lib_cleanup();
-
- return run;
-}
-
diff --git a/test/lib/cpp/03-publish-c2b-qos2-timeout.cpp b/test/lib/cpp/03-publish-c2b-qos2-timeout.cpp
deleted file mode 100644
index 6f53e5a4..00000000
--- a/test/lib/cpp/03-publish-c2b-qos2-timeout.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include
-#include
-
-#include
-
-static int run = -1;
-
-class mosquittopp_test : public mosqpp::mosquittopp
-{
- public:
- mosquittopp_test(const char *id);
-
- void on_connect(int rc);
- void on_disconnect(int rc);
- void on_publish(int mid);
-};
-
-mosquittopp_test::mosquittopp_test(const char *id) : mosqpp::mosquittopp(id)
-{
-}
-
-void mosquittopp_test::on_connect(int rc)
-{
- if(rc){
- exit(1);
- }else{
- publish(NULL, "pub/qos2/test", strlen("message"), "message", 2, false);
- }
-}
-
-void mosquittopp_test::on_disconnect(int rc)
-{
- run = 0;
-}
-
-void mosquittopp_test::on_publish(int mid)
-{
- disconnect();
-}
-
-int main(int argc, char *argv[])
-{
- struct mosquittopp_test *mosq;
-
- mosqpp::lib_init();
-
- mosq = new mosquittopp_test("publish-qos2-test");
- mosq->message_retry_set(3);
-
- mosq->connect("localhost", 1888, 60);
-
- while(run == -1){
- mosq->loop();
- }
-
- mosqpp::lib_cleanup();
-
- return run;
-}
-
diff --git a/test/lib/cpp/Makefile b/test/lib/cpp/Makefile
index 91583f6c..4d9e86f0 100644
--- a/test/lib/cpp/Makefile
+++ b/test/lib/cpp/Makefile
@@ -41,9 +41,6 @@ all : 01 02 03 04 08 09
03-publish-qos0-no-payload.test : 03-publish-qos0-no-payload.cpp
$(CXX) $< -o $@ $(CFLAGS) $(LIBS)
-03-publish-c2b-qos1-timeout.test : 03-publish-c2b-qos1-timeout.cpp
- $(CXX) $< -o $@ $(CFLAGS) $(LIBS)
-
03-publish-c2b-qos1-disconnect.test : 03-publish-c2b-qos1-disconnect.cpp
$(CXX) $< -o $@ $(CFLAGS) $(LIBS)
@@ -53,9 +50,6 @@ all : 01 02 03 04 08 09
03-publish-c2b-qos2-disconnect.test : 03-publish-c2b-qos2-disconnect.cpp
$(CXX) $< -o $@ $(CFLAGS) $(LIBS)
-03-publish-c2b-qos2-timeout.test : 03-publish-c2b-qos2-timeout.cpp
- $(CXX) $< -o $@ $(CFLAGS) $(LIBS)
-
03-publish-b2c-qos1.test : 03-publish-b2c-qos1.cpp
$(CXX) $< -o $@ $(CFLAGS) $(LIBS)
@@ -90,7 +84,7 @@ all : 01 02 03 04 08 09
02 : 02-subscribe-qos0.test 02-subscribe-qos1.test 02-subscribe-qos2.test 02-unsubscribe.test
-03 : 03-publish-qos0.test 03-publish-qos0-no-payload.test 03-publish-c2b-qos1-timeout.test 03-publish-c2b-qos1-disconnect.test 03-publish-c2b-qos2.test 03-publish-c2b-qos2-timeout.test 03-publish-c2b-qos2-disconnect.test 03-publish-b2c-qos1.test 03-publish-b2c-qos2.test
+03 : 03-publish-qos0.test 03-publish-qos0-no-payload.test 03-publish-c2b-qos1-disconnect.test 03-publish-c2b-qos2.test 03-publish-c2b-qos2-disconnect.test 03-publish-b2c-qos1.test 03-publish-b2c-qos2.test
04 : 04-retain-qos0.test