1#!/usr/bin/env python3 2 3# Test whether a client responds correctly to multiple PUBLISH with QoS 1, with 4# receive maximum set to 3. 5 6from mosq_test_helper import * 7 8port = mosq_test.get_lib_port() 9 10rc = 1 11keepalive = 60 12connect_packet = mosq_test.gen_connect("publish-qos1-test", keepalive=keepalive, proto_ver=5) 13 14props = mqtt5_props.gen_uint16_prop(mqtt5_props.PROP_RECEIVE_MAXIMUM, 3) 15connack_packet = mosq_test.gen_connack(rc=0, proto_ver=5, properties=props, property_helper=False) 16 17disconnect_packet = mosq_test.gen_disconnect(proto_ver=5) 18 19mid = 1 20publish_1_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 21puback_1_packet = mosq_test.gen_puback(mid, proto_ver=5) 22 23mid = 2 24publish_2_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 25puback_2_packet = mosq_test.gen_puback(mid, proto_ver=5) 26 27mid = 3 28publish_3_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 29puback_3_packet = mosq_test.gen_puback(mid, proto_ver=5) 30 31mid = 4 32publish_4_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 33puback_4_packet = mosq_test.gen_puback(mid, proto_ver=5) 34 35mid = 5 36publish_5_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 37puback_5_packet = mosq_test.gen_puback(mid, proto_ver=5) 38 39mid = 6 40publish_6_packet = mosq_test.gen_publish("topic", qos=1, mid=mid, payload="12345", proto_ver=5) 41puback_6_packet = mosq_test.gen_puback(mid, proto_ver=5) 42 43 44sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 45sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 46sock.settimeout(10) 47sock.bind(('', port)) 48sock.listen(5) 49 50 51client_args = sys.argv[1:] 52env = dict(os.environ) 53env['LD_LIBRARY_PATH'] = '../../lib:../../lib/cpp' 54try: 55 pp = env['PYTHONPATH'] 56except KeyError: 57 pp = '' 58env['PYTHONPATH'] = '../../lib/python:'+pp 59client = mosq_test.start_client(filename=sys.argv[1].replace('/', '-'), cmd=client_args, env=env, port=port) 60 61 62try: 63 (conn, address) = sock.accept() 64 conn.settimeout(10) 65 66 mosq_test.do_receive_send(conn, connect_packet, connack_packet, "connect") 67 68 mosq_test.expect_packet(conn, "publish 1", publish_1_packet) 69 mosq_test.expect_packet(conn, "publish 2", publish_2_packet) 70 mosq_test.expect_packet(conn, "publish 3", publish_3_packet) 71 conn.send(puback_1_packet) 72 conn.send(puback_2_packet) 73 74 mosq_test.expect_packet(conn, "publish 4", publish_4_packet) 75 mosq_test.expect_packet(conn, "publish 5", publish_5_packet) 76 conn.send(puback_3_packet) 77 78 mosq_test.expect_packet(conn, "publish 6", publish_6_packet) 79 conn.send(puback_4_packet) 80 conn.send(puback_5_packet) 81 conn.send(puback_6_packet) 82 rc = 0 83 84 conn.close() 85except mosq_test.TestError: 86 pass 87finally: 88 for i in range(0, 5): 89 if client.returncode != None: 90 break 91 time.sleep(0.1) 92 93 try: 94 client.terminate() 95 except OSError: 96 pass 97 98 client.wait() 99 sock.close() 100 if client.returncode != 0: 101 exit(1) 102 103exit(rc) 104