def test_qos_1_queues_message(self): """ The WAMP layer calling send_publish will queue a message up for sending, and send it next time it has a chance. """ h = BasicHandler() r, t, p, cp = make_test_items(h) data = (Connect(client_id=u"test123", flags=ConnectFlags(clean_session=True)).serialise()) for x in iterbytes(data): p.dataReceived(x) # Connect has happened events = cp.data_received(t.value()) t.clear() self.assertFalse(t.disconnecting) self.assertIsInstance(events[0], ConnACK) # WAMP layer calls send_publish, with QoS 1 p.send_publish(u"hello", 1, b'some bytes', False) # Nothing should have been sent yet, it is queued self.assertEqual(t.value(), b'') # Advance the clock r.advance(0.1) # We should now get the sent Publish expected_publish = Publish(duplicate=False, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") events = cp.data_received(t.value()) t.clear() self.assertEqual(len(events), 1) self.assertEqual(events[0], expected_publish) # We send the PubACK, which we don't get a response to puback = PubACK(packet_identifier=1) for x in iterbytes(puback.serialise()): p.dataReceived(x) events = cp.data_received(t.value()) self.assertEqual(len(events), 0) self.assertFalse(t.disconnecting)
def test_qos_1_queues_message(self): """ The WAMP layer calling send_publish will queue a message up for sending, and send it next time it has a chance. """ h = BasicHandler() r, t, p, cp = make_test_items(h) data = ( Connect(client_id=u"test123", flags=ConnectFlags(clean_session=True)).serialise() ) for x in iterbytes(data): p.dataReceived(x) # Connect has happened events = cp.data_received(t.value()) t.clear() self.assertFalse(t.disconnecting) self.assertIsInstance(events[0], ConnACK) # WAMP layer calls send_publish, with QoS 1 p.send_publish(u"hello", 1, b'some bytes', False) # Nothing should have been sent yet, it is queued self.assertEqual(t.value(), b'') # Advance the clock r.advance(0.1) # We should now get the sent Publish expected_publish = Publish( duplicate=False, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") events = cp.data_received(t.value()) t.clear() self.assertEqual(len(events), 1) self.assertEqual(events[0], expected_publish) # We send the PubACK, which we don't get a response to puback = PubACK(packet_identifier=1) for x in iterbytes(puback.serialise()): p.dataReceived(x) events = cp.data_received(t.value()) self.assertEqual(len(events), 0) self.assertFalse(t.disconnecting)
def test_qos_1_resent_on_disconnect(self): """ If we send a QoS1 Publish and we did not get a PubACK from the client before it disconnected, we will resend the Publish packet if it connects with a non-clean session. Compliance statements: MQTT-4.4.0-1, MQTT-3.3.1-1 """ h = BasicHandler() r, t, p, cp = make_test_items(h) data = (Connect(client_id=u"test123", flags=ConnectFlags(clean_session=False)).serialise()) for x in iterbytes(data): p.dataReceived(x) # WAMP layer calls send_publish, with QoS 1 p.send_publish(u"hello", 1, b'some bytes', False) # Advance the clock r.advance(0.1) # We should now get the sent Publish expected_publish = Publish(duplicate=False, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") events = cp.data_received(t.value()) t.clear() self.assertEqual(len(events), 2) self.assertEqual(events[1], expected_publish) # Disconnect the client t.connected = False t.loseConnection() p.connectionLost(None) r2, t2, p2, cp2 = make_test_items(h) # We must NOT have a clean session data = (Connect(client_id=u"test123", flags=ConnectFlags(clean_session=False)).serialise()) for x in iterbytes(data): p2.dataReceived(x) # The flushing is queued, so we'll have to spin the reactor r2.advance(0.1) # We should have two events; the ConnACK, and the Publish. The ConnACK # MUST come first. events = cp2.data_received(t2.value()) t2.clear() self.assertEqual(len(events), 2) self.assertIsInstance(events[0], ConnACK) self.assertIsInstance(events[1], Publish) # The Publish packet must have DUP set to True. resent_publish = Publish(duplicate=True, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") self.assertEqual(events[1], resent_publish) # We send the PubACK to this Publish puback = PubACK(packet_identifier=1) for x in iterbytes(puback.serialise()): p2.dataReceived(x) events = cp2.data_received(t2.value()) self.assertEqual(len(events), 0) self.assertFalse(t2.disconnecting)
def test_qos_1_resent_on_disconnect(self): """ If we send a QoS1 Publish and we did not get a PubACK from the client before it disconnected, we will resend the Publish packet if it connects with a non-clean session. Compliance statements: MQTT-4.4.0-1, MQTT-3.3.1-1 """ h = BasicHandler() r, t, p, cp = make_test_items(h) data = ( Connect(client_id=u"test123", flags=ConnectFlags(clean_session=False)).serialise() ) for x in iterbytes(data): p.dataReceived(x) # WAMP layer calls send_publish, with QoS 1 p.send_publish(u"hello", 1, b'some bytes', False) # Advance the clock r.advance(0.1) # We should now get the sent Publish expected_publish = Publish(duplicate=False, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") events = cp.data_received(t.value()) t.clear() self.assertEqual(len(events), 2) self.assertEqual(events[1], expected_publish) # Disconnect the client t.connected = False t.loseConnection() p.connectionLost(None) r2, t2, p2, cp2 = make_test_items(h) # We must NOT have a clean session data = ( Connect(client_id=u"test123", flags=ConnectFlags(clean_session=False)).serialise() ) for x in iterbytes(data): p2.dataReceived(x) # The flushing is queued, so we'll have to spin the reactor r2.advance(0.1) # We should have two events; the ConnACK, and the Publish. The ConnACK # MUST come first. events = cp2.data_received(t2.value()) t2.clear() self.assertEqual(len(events), 2) self.assertIsInstance(events[0], ConnACK) self.assertIsInstance(events[1], Publish) # The Publish packet must have DUP set to True. resent_publish = Publish(duplicate=True, qos_level=1, retain=False, packet_identifier=1, topic_name=u"hello", payload=b"some bytes") self.assertEqual(events[1], resent_publish) # We send the PubACK to this Publish puback = PubACK(packet_identifier=1) for x in iterbytes(puback.serialise()): p2.dataReceived(x) events = cp2.data_received(t2.value()) self.assertEqual(len(events), 0) self.assertFalse(t2.disconnecting)