diff --git a/test/broker/02-subpub-qos0-v5.py b/test/broker/02-subpub-qos0-v5.py new file mode 100755 index 00000000..ef3c9009 --- /dev/null +++ b/test/broker/02-subpub-qos0-v5.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# MQTT v5 + +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 = 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 = mosq_test.gen_publish("subpub/qos0", qos=0, payload="message", proto_ver=5) + +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, publish_packet, "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/02-subpub-qos1-v5.py b/test/broker/02-subpub-qos1-v5.py new file mode 100755 index 00000000..2d08f43d --- /dev/null +++ b/test/broker/02-subpub-qos1-v5.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# MQTT v5 + +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 = 530 +keepalive = 60 +connect_packet = mosq_test.gen_connect("subpub-qos1-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/qos1", 1, proto_ver=5) +suback_packet = mosq_test.gen_suback(mid, 1, proto_ver=5) + +mid = 300 +publish_packet = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=5) +puback_packet = mosq_test.gen_puback(mid, proto_ver=5) + +mid = 1 +publish_packet2 = mosq_test.gen_publish("subpub/qos1", qos=1, mid=mid, payload="message", proto_ver=5) + + +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, puback_packet, "puback") + + if mosq_test.expect_packet(sock, "publish2", publish_packet2): + rc = 0 + + sock.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/02-subpub-qos2-v5.py b/test/broker/02-subpub-qos2-v5.py new file mode 100755 index 00000000..796ed821 --- /dev/null +++ b/test/broker/02-subpub-qos2-v5.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +# Test whether a client subscribed to a topic receives its own message sent to that topic. +# MQTT v5 + +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 = 530 +keepalive = 60 +connect_packet = mosq_test.gen_connect("subpub-qos2-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/qos2", 2, proto_ver=5) +suback_packet = mosq_test.gen_suback(mid, 2, proto_ver=5) + +mid = 301 +publish_packet = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=5) +pubrec_packet = mosq_test.gen_pubrec(mid, proto_ver=5) +pubrel_packet = mosq_test.gen_pubrel(mid, proto_ver=5) +pubcomp_packet = mosq_test.gen_pubcomp(mid, proto_ver=5) + +mid = 1 +publish_packet2 = mosq_test.gen_publish("subpub/qos2", qos=2, mid=mid, payload="message", proto_ver=5) +pubrec_packet2 = mosq_test.gen_pubrec(mid, proto_ver=5) +pubrel_packet2 = mosq_test.gen_pubrel(mid, proto_ver=5) +pubcomp_packet2 = mosq_test.gen_pubcomp(mid, proto_ver=5) + + +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, pubrec_packet, "pubrec") + mosq_test.do_send_receive(sock, pubrel_packet, pubcomp_packet, "pubcomp") + + if mosq_test.expect_packet(sock, "publish2", publish_packet2): + mosq_test.do_send_receive(sock, pubrec_packet2, pubrel_packet2, "pubrel2") + # Broker side of flow complete so can quit here. + rc = 0 + + sock.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/02-unsubscribe-qos2-v5.py b/test/broker/02-unsubscribe-qos2-v5.py new file mode 100755 index 00000000..64d71963 --- /dev/null +++ b/test/broker/02-unsubscribe-qos2-v5.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +# Test whether a SUBSCRIBE to a topic with QoS 2 results in the correct SUBACK packet. +# MQTT 5 + +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 = 3 +keepalive = 60 +connect_packet = mosq_test.gen_connect("unsubscribe-qos2-test", keepalive=keepalive, proto_ver=5) +connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) + +unsubscribe_packet = mosq_test.gen_unsubscribe(mid, "qos2/test", proto_ver=5) +unsuback_packet = mosq_test.gen_unsuback(mid, proto_ver=5) + +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, port=port) + mosq_test.do_send_receive(sock, unsubscribe_packet, unsuback_packet, "unsuback") + + rc = 0 + + sock.close() +finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde) + +exit(rc) + diff --git a/test/broker/Makefile b/test/broker/Makefile index 0bed1290..7466f052 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -46,9 +46,13 @@ endif ./02-subpub-qos0.py ./02-subpub-qos1.py ./02-subpub-qos2.py + ./02-subpub-qos0-v5.py + ./02-subpub-qos1-v5.py + ./02-subpub-qos2-v5.py ./02-unsubscribe-qos0.py ./02-unsubscribe-qos1.py ./02-unsubscribe-qos2.py + ./02-unsubscribe-qos2-v5.py ./02-unsubscribe-invalid-no-topic.py ./02-subscribe-invalid-utf8.py ./02-subscribe-persistence-flipflop.py diff --git a/test/broker/ptest.py b/test/broker/ptest.py index dad3b42d..71ffdf75 100755 --- a/test/broker/ptest.py +++ b/test/broker/ptest.py @@ -29,9 +29,13 @@ tests = [ (1, './02-subpub-qos0.py'), (1, './02-subpub-qos1.py'), (1, './02-subpub-qos2.py'), + (1, './02-subpub-qos0-v5.py'), + (1, './02-subpub-qos1-v5.py'), + (1, './02-subpub-qos2-v5.py'), (1, './02-unsubscribe-qos0.py'), (1, './02-unsubscribe-qos1.py'), (1, './02-unsubscribe-qos2.py'), + (1, './02-unsubscribe-qos2-v5.py'), (1, './02-unsubscribe-invalid-no-topic.py'), (1, './02-subscribe-invalid-utf8.py'), (1, './02-subscribe-persistence-flipflop.py'), diff --git a/test/mosq_test.py b/test/mosq_test.py index 43d26369..972a81c8 100644 --- a/test/mosq_test.py +++ b/test/mosq_test.py @@ -363,12 +363,16 @@ def gen_connack(resv=0, rc=0, proto_ver=4): return packet -def gen_publish(topic, qos, payload=None, retain=False, dup=False, mid=0): +def gen_publish(topic, qos, payload=None, retain=False, dup=False, mid=0, proto_ver=4): rl = 2+len(topic) pack_format = "H"+str(len(topic))+"s" if qos > 0: rl = rl + 2 pack_format = pack_format + "H" + if proto_ver == 5: + rl += 1 + pack_format = pack_format + "B" + if payload != None: rl = rl + len(payload) pack_format = pack_format + str(len(payload))+"s" @@ -383,40 +387,72 @@ def gen_publish(topic, qos, payload=None, retain=False, dup=False, mid=0): if dup: cmd = cmd + 8 - if qos > 0: - return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, mid, payload) + if proto_ver == 5: + if qos > 0: + return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, mid, 0, payload) + else: + return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, 0, payload) else: - return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, payload) + if qos > 0: + return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, mid, payload) + else: + return struct.pack("!B" + str(len(rlpacked))+"s" + pack_format, cmd, rlpacked, len(topic), topic, payload) -def gen_puback(mid): - return struct.pack('!BBH', 64, 2, mid) +def gen_puback(mid, proto_ver=4): + if proto_ver == 5: + return struct.pack('!BBHB', 64, 3, mid, 0) + else: + return struct.pack('!BBH', 64, 2, mid) -def gen_pubrec(mid): - return struct.pack('!BBH', 80, 2, mid) +def gen_pubrec(mid, proto_ver=4): + if proto_ver == 5: + return struct.pack('!BBHB', 80, 3, mid, 0) + else: + return struct.pack('!BBH', 80, 2, mid) -def gen_pubrel(mid, dup=False): +def gen_pubrel(mid, dup=False, proto_ver=4): if dup: cmd = 96+8+2 else: cmd = 96+2 - return struct.pack('!BBH', cmd, 2, mid) + if proto_ver == 5: + return struct.pack('!BBHB', cmd, 3, mid, 0) + else: + return struct.pack('!BBH', cmd, 2, mid) -def gen_pubcomp(mid): - return struct.pack('!BBH', 112, 2, mid) +def gen_pubcomp(mid, proto_ver=4): + if proto_ver == 5: + return struct.pack('!BBHB', 112, 3, mid, 0) + else: + return struct.pack('!BBH', 112, 2, mid) -def gen_subscribe(mid, topic, qos): - pack_format = "!BBHH"+str(len(topic))+"sB" - return struct.pack(pack_format, 130, 2+2+len(topic)+1, mid, len(topic), topic, qos) +def gen_subscribe(mid, topic, qos, proto_ver=4): + if proto_ver == 5: + pack_format = "!BBHBH"+str(len(topic))+"sB" + return struct.pack(pack_format, 130, 2+1+2+len(topic)+1, mid, 0, len(topic), topic, qos) + else: + pack_format = "!BBHH"+str(len(topic))+"sB" + return struct.pack(pack_format, 130, 2+2+len(topic)+1, mid, len(topic), topic, qos) -def gen_suback(mid, qos): - return struct.pack('!BBHB', 144, 2+1, mid, qos) +def gen_suback(mid, qos, proto_ver=4): + if proto_ver == 5: + return struct.pack('!BBHBB', 144, 2+1+1, mid, 0, qos) + else: + return struct.pack('!BBHB', 144, 2+1, mid, qos) -def gen_unsubscribe(mid, topic): - pack_format = "!BBHH"+str(len(topic))+"s" - return struct.pack(pack_format, 162, 2+2+len(topic), mid, len(topic), topic) +def gen_unsubscribe(mid, topic, proto_ver=4): + if proto_ver == 5: + pack_format = "!BBHBH"+str(len(topic))+"s" + return struct.pack(pack_format, 162, 2+2+len(topic)+1, mid, 0, len(topic), topic) + else: + pack_format = "!BBHH"+str(len(topic))+"s" + return struct.pack(pack_format, 162, 2+2+len(topic), mid, len(topic), topic) -def gen_unsuback(mid): - return struct.pack('!BBH', 176, 2, mid) +def gen_unsuback(mid, proto_ver=4): + if proto_ver == 5: + return struct.pack('!BBHB', 176, 3, mid, 0) + else: + return struct.pack('!BBH', 176, 2, mid) def gen_pingreq(): return struct.pack('!BB', 192, 0)