def test_from_stream_qos_2(self): data = b"\x37\x13\x00\x05topic\x00\x0a0123456789" stream = BufferReader(data) message = self.loop.run_until_complete(PublishPacket.from_stream(stream)) self.assertEqual(message.variable_header.topic_name, "topic") self.assertEqual(message.variable_header.packet_id, 10) assert (message.fixed_header.flags >> 1) & 0x03 assert message.fixed_header.flags & 0x01 assert message.payload.data, b"0123456789"
def build_publish_packet(self, dup=False): """ Build :class:`amqtt.mqtt.publish.PublishPacket` from attributes :param dup: force dup flag :return: :class:`amqtt.mqtt.publish.PublishPacket` built from ApplicationMessage instance attributes """ return PublishPacket.build(self.topic, self.data, self.packet_id, dup, self.qos, self.retain)
def test_publish_qos2_retry(self): async def server_mock(reader, writer): try: packet = await PublishPacket.from_stream(reader) self.assertEqual(packet.topic_name, "/topic") self.assertEqual(packet.qos, QOS_2) self.assertIsNotNone(packet.packet_id) self.assertIn(packet.packet_id, self.session.inflight_out) self.assertIn(packet.packet_id, self.handler._pubrec_waiters) pubrec = PubrecPacket.build(packet.packet_id) await pubrec.to_stream(writer) await PubrelPacket.from_stream(reader) self.assertIn(packet.packet_id, self.handler._pubcomp_waiters) pubcomp = PubcompPacket.build(packet.packet_id) await pubcomp.to_stream(writer) except Exception as ae: future.set_exception(ae) async def test_coro(): try: reader, writer = await asyncio.open_connection("127.0.0.1", 8888, loop=self.loop) reader_adapted, writer_adapted = adapt(reader, writer) self.handler = ProtocolHandler(self.plugin_manager, loop=self.loop) self.handler.attach(self.session, reader_adapted, writer_adapted) await self.handler.start() await self.stop_handler(self.handler, self.session) if not future.done(): future.set_result(True) except Exception as ae: future.set_exception(ae) self.handler = None self.session = Session() message = OutgoingApplicationMessage(1, "/topic", QOS_2, b"test_data", False) message.publish_packet = PublishPacket.build("/topic", b"test_data", rand_packet_id(), False, QOS_2, False) self.session.inflight_out[1] = message future = asyncio.Future(loop=self.loop) coro = asyncio.start_server(server_mock, "127.0.0.1", 8888, loop=self.loop) server = self.loop.run_until_complete(coro) self.loop.run_until_complete(test_coro()) server.close() self.loop.run_until_complete(server.wait_closed()) if future.exception(): raise future.exception()
async def server_mock(reader, writer): try: packet = PublishPacket.build("/topic", b"test_data", rand_packet_id(), False, QOS_1, False) await packet.to_stream(writer) puback = await PubackPacket.from_stream(reader) self.assertIsNotNone(puback) self.assertEqual(packet.packet_id, puback.packet_id) except Exception as ae: print(ae) future.set_exception(ae)
async def server_mock(reader, writer): try: packet = PublishPacket.build("/topic", b"test_data", rand_packet_id(), False, QOS_2, False) await packet.to_stream(writer) pubrec = await PubrecPacket.from_stream(reader) self.assertIsNotNone(pubrec) self.assertEqual(packet.packet_id, pubrec.packet_id) self.assertIn(packet.packet_id, self.handler._pubrel_waiters) pubrel = PubrelPacket.build(packet.packet_id) await pubrel.to_stream(writer) pubcomp = await PubcompPacket.from_stream(reader) self.assertIsNotNone(pubcomp) self.assertEqual(packet.packet_id, pubcomp.packet_id) except Exception as ae: future.set_exception(ae)
def test_build(self): packet = PublishPacket.build("/topic", b"data", 1, False, QOS_0, False) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_0) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, False, QOS_1, False) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_1) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, False, QOS_2, False) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_2) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, True, QOS_0, False) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_0) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, True, QOS_1, False) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_1) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, True, QOS_2, False) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_2) self.assertFalse(packet.retain_flag) packet = PublishPacket.build("/topic", b"data", 1, False, QOS_0, True) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_0) assert packet.retain_flag packet = PublishPacket.build("/topic", b"data", 1, False, QOS_1, True) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_1) assert packet.retain_flag packet = PublishPacket.build("/topic", b"data", 1, False, QOS_2, True) self.assertEqual(packet.packet_id, 1) self.assertFalse(packet.dup_flag) self.assertEqual(packet.qos, QOS_2) assert packet.retain_flag packet = PublishPacket.build("/topic", b"data", 1, True, QOS_0, True) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_0) assert packet.retain_flag packet = PublishPacket.build("/topic", b"data", 1, True, QOS_1, True) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_1) assert packet.retain_flag packet = PublishPacket.build("/topic", b"data", 1, True, QOS_2, True) self.assertEqual(packet.packet_id, 1) assert packet.dup_flag self.assertEqual(packet.qos, QOS_2) assert packet.retain_flag
def test_to_stream_packet(self): variable_header = PublishVariableHeader("topic", 10) payload = PublishPayload(b"0123456789") publish = PublishPacket(variable_header=variable_header, payload=payload) out = publish.to_bytes() self.assertEqual(out, b"\x30\x13\x00\x05topic\00\x0a0123456789")
async def server_mock(reader, writer): packet = PublishPacket.build("/topic", b"test_data", rand_packet_id(), False, QOS_0, False) await packet.to_stream(writer)