1#!/usr/bin/env python3
2
3# Test whether a client sends a correct PUBLISH to a topic with QoS 2 and responds to a disconnect.
4
5from mosq_test_helper import *
6
7port = mosq_test.get_lib_port()
8
9rc = 1
10keepalive = 60
11connect_packet = mosq_test.gen_connect("publish-qos2-test", keepalive=keepalive)
12connack_packet = mosq_test.gen_connack(rc=0)
13
14disconnect_packet = mosq_test.gen_disconnect()
15
16mid = 1
17publish_packet = mosq_test.gen_publish("pub/qos2/test", qos=2, mid=mid, payload="message")
18publish_dup_packet = mosq_test.gen_publish("pub/qos2/test", qos=2, mid=mid, payload="message", dup=True)
19pubrec_packet = mosq_test.gen_pubrec(mid)
20pubrel_packet = mosq_test.gen_pubrel(mid)
21pubcomp_packet = mosq_test.gen_pubcomp(mid)
22
23sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
24sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
25sock.settimeout(10)
26sock.bind(('', port))
27sock.listen(5)
28
29client_args = sys.argv[1:]
30env = dict(os.environ)
31env['LD_LIBRARY_PATH'] = '../../lib:../../lib/cpp'
32try:
33    pp = env['PYTHONPATH']
34except KeyError:
35    pp = ''
36env['PYTHONPATH'] = '../../lib/python:'+pp
37client = mosq_test.start_client(filename=sys.argv[1].replace('/', '-'), cmd=client_args, env=env, port=port)
38
39try:
40    (conn, address) = sock.accept()
41    conn.settimeout(10)
42
43    mosq_test.do_receive_send(conn, connect_packet, connack_packet, "connect")
44
45    mosq_test.expect_packet(conn, "publish", publish_packet)
46    # Disconnect client. It should reconnect.
47    conn.close()
48
49    (conn, address) = sock.accept()
50    conn.settimeout(15)
51
52    mosq_test.do_receive_send(conn, connect_packet, connack_packet, "connect")
53    mosq_test.do_receive_send(conn, publish_dup_packet, pubrec_packet, "retried publish")
54
55    mosq_test.expect_packet(conn, "pubrel", pubrel_packet)
56    # Disconnect client. It should reconnect.
57    conn.close()
58
59    (conn, address) = sock.accept()
60    conn.settimeout(15)
61
62    # Complete connection and message flow.
63    mosq_test.do_receive_send(conn, connect_packet, connack_packet, "connect")
64    mosq_test.do_receive_send(conn, pubrel_packet, pubcomp_packet, "retried pubrel")
65
66    mosq_test.expect_packet(conn, "disconnect", disconnect_packet)
67    rc = 0
68
69    conn.close()
70except mosq_test.TestError:
71    pass
72finally:
73    client.terminate()
74    client.wait()
75    sock.close()
76
77exit(rc)
78