From 09e95fff5a6995ad781110c5413f326d416dcdf2 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Thu, 10 Oct 2019 10:00:33 +0100 Subject: [PATCH] Add test for session takeover and wills. --- test/broker/07-will-takeover.py | 62 +++++++++++++++++++++++++++++++++ test/broker/Makefile | 1 + test/broker/test.py | 1 + 3 files changed, 64 insertions(+) create mode 100755 test/broker/07-will-takeover.py diff --git a/test/broker/07-will-takeover.py b/test/broker/07-will-takeover.py new file mode 100755 index 00000000..855b3c52 --- /dev/null +++ b/test/broker/07-will-takeover.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 + +# Test whether a will is published when a client takes over an existing session that has a will set. +# +from mosq_test_helper import * + + +def do_test(proto_ver, clean_session): + rc = 1 + keepalive = 60 + + mid = 1 + connect1_packet = mosq_test.gen_connect("will-helper", keepalive=keepalive, proto_ver=proto_ver) + connack1_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) + + connect2_packet = mosq_test.gen_connect("will-test", keepalive=keepalive, proto_ver=proto_ver, will_topic="will/test", will_payload=b"will delay", clean_session=clean_session) + connack2a_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) + if clean_session == False and proto_ver == 4: + connack2b_packet = mosq_test.gen_connack(rc=0, flags=1, proto_ver=proto_ver) + else: + connack2b_packet = mosq_test.gen_connack(rc=0, proto_ver=proto_ver) + + subscribe_packet = mosq_test.gen_subscribe(mid, "will/test", 0, proto_ver=proto_ver) + suback_packet = mosq_test.gen_suback(mid, 0, proto_ver=proto_ver) + + port = mosq_test.get_port() + broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port) + + try: + # Connect helper to look for will being published + sock1 = mosq_test.do_client_connect(connect1_packet, connack1_packet, timeout=30, port=port) + mosq_test.do_send_receive(sock1, subscribe_packet, suback_packet, "suback") + + # Connect client with will + sock2 = mosq_test.do_client_connect(connect2_packet, connack2a_packet, timeout=30, port=port) + + # Connect client with will again as a separate connection, this should + # take over from the previous one but not trigger a Will. + sock3 = mosq_test.do_client_connect(connect2_packet, connack2b_packet, timeout=30, port=port) + + time.sleep(0.5) + # If the helper has received a will message, then the ping test will fail + mosq_test.do_ping(sock1) + rc = 0 + + sock1.close() + sock2.close() + sock3.close() + finally: + broker.terminate() + broker.wait() + (stdo, stde) = broker.communicate() + if rc: + print(stde.decode('utf-8')) + print("proto_ver=%d clean_session=%d" % (proto_ver, clean_session)) + exit(rc) + + +do_test(proto_ver=4, clean_session=True) +do_test(proto_ver=4, clean_session=False) +do_test(proto_ver=5, clean_session=True) +do_test(proto_ver=5, clean_session=False) diff --git a/test/broker/Makefile b/test/broker/Makefile index e4c32c63..685ada73 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -151,6 +151,7 @@ endif ./07-will-properties.py ./07-will-qos0.py ./07-will-reconnect-1273.py + ./07-will-takeover.py 08 : ifeq ($(WITH_TLS),yes) diff --git a/test/broker/test.py b/test/broker/test.py index 7a2f9f66..278fc397 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -125,6 +125,7 @@ tests = [ (1, './07-will-properties.py'), (1, './07-will-qos0.py'), (1, './07-will-reconnect-1273.py'), + (1, './07-will-takeover.py'), (2, './08-ssl-bridge.py'), (2, './08-ssl-connect-cert-auth-crl.py'),