1#!/usr/bin/env python3 2 3# Test whether a client subscribed to a topic receives its own message sent to that topic. 4# And whether the no-local option is persisted. 5 6from mosq_test_helper import * 7 8def write_config(filename, port): 9 with open(filename, 'w') as f: 10 f.write("port %d\n" % (port)) 11 f.write("allow_anonymous true\n") 12 f.write("persistence true\n") 13 f.write("persistence_file mosquitto-%d.db\n" % (port)) 14 15port = mosq_test.get_port() 16conf_file = os.path.basename(__file__).replace('.py', '.conf') 17write_config(conf_file, port) 18 19rc = 1 20keepalive = 60 21connect_packet = mosq_test.gen_connect( 22 "persistent-subscription-test", keepalive=keepalive, clean_session=False, proto_ver=5, session_expiry=60 23) 24connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5) 25connack_packet2 = mosq_test.gen_connack(rc=0, flags=1, proto_ver=5) # session present 26 27mid = 1 28subscribe1_packet = mosq_test.gen_subscribe(mid, "subpub/nolocal", 5, proto_ver=5) 29suback1_packet = mosq_test.gen_suback(mid, 1, proto_ver=5) 30 31mid = 2 32subscribe2_packet = mosq_test.gen_subscribe(mid, "subpub/local", 1, proto_ver=5) 33suback2_packet = mosq_test.gen_suback(mid, 1, proto_ver=5) 34 35mid = 1 36publish1_packet = mosq_test.gen_publish("subpub/nolocal", qos=1, mid=mid, payload="message", proto_ver=5) 37puback1_packet = mosq_test.gen_puback(mid, proto_ver=5) 38 39mid = 2 40publish2s_packet = mosq_test.gen_publish("subpub/local", qos=1, mid=mid, payload="message", proto_ver=5) 41puback2s_packet = mosq_test.gen_puback(mid, proto_ver=5) 42 43mid = 1 44publish2a_packet = mosq_test.gen_publish("subpub/local", qos=1, mid=mid, payload="message", proto_ver=5) 45puback2a_packet = mosq_test.gen_puback(mid, proto_ver=5) 46 47mid = 2 48publish2b_packet = mosq_test.gen_publish("subpub/local", qos=1, mid=mid, payload="message", proto_ver=5) 49puback2b_packet = mosq_test.gen_puback(mid, proto_ver=5) 50 51if os.path.exists('mosquitto-%d.db' % (port)): 52 os.unlink('mosquitto-%d.db' % (port)) 53 54broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port) 55 56(stdo1, stde1) = ("", "") 57try: 58 sock = mosq_test.do_client_connect(connect_packet, connack_packet, timeout=20, port=port) 59 mosq_test.do_send_receive(sock, subscribe1_packet, suback1_packet, "suback1") 60 mosq_test.do_send_receive(sock, subscribe2_packet, suback2_packet, "suback2") 61 62 mosq_test.do_send_receive(sock, publish1_packet, puback1_packet, "puback1a") 63 sock.send(publish2s_packet) 64 mosq_test.receive_unordered(sock, puback2s_packet, publish2a_packet, "puback2a/publish2a") 65 66 sock.send(puback2a_packet) 67 68 broker.terminate() 69 broker.wait() 70 (stdo1, stde1) = broker.communicate() 71 sock.close() 72 73 broker = mosq_test.start_broker(filename=os.path.basename(__file__), use_conf=True, port=port) 74 75 sock = mosq_test.do_client_connect(connect_packet, connack_packet2, timeout=20, port=port) 76 77 mosq_test.do_send_receive(sock, publish1_packet, puback1_packet, "puback1b") 78 sock.send(publish2s_packet) 79 mosq_test.receive_unordered(sock, puback2s_packet, publish2b_packet, "puback2b/publish2b") 80 81 rc = 0 82 83 sock.close() 84except mosq_test.TestError: 85 pass 86finally: 87 os.remove(conf_file) 88 broker.terminate() 89 broker.wait() 90 (stdo, stde) = broker.communicate() 91 if rc: 92 print(stde.decode('utf-8')) 93 if os.path.exists('mosquitto-%d.db' % (port)): 94 os.unlink('mosquitto-%d.db' % (port)) 95 96 97exit(rc) 98 99