From 5fa686de6a9666494475311f6e46ba2fdf22ae7b Mon Sep 17 00:00:00 2001 From: Nicolas Jouanin Date: Sat, 13 Jun 2015 15:05:42 +0200 Subject: [PATCH] Test connect packet --- hbmqtt/mqtt/connect.py | 4 +- tests/mqtt/test_connect.py | 91 ++++++++++++++++++-------------------- 2 files changed, 45 insertions(+), 50 deletions(-) diff --git a/hbmqtt/mqtt/connect.py b/hbmqtt/mqtt/connect.py index 67e38aa..16460ae 100644 --- a/hbmqtt/mqtt/connect.py +++ b/hbmqtt/mqtt/connect.py @@ -162,13 +162,13 @@ class ConnectPayload(MQTTPayload): try: payload.username = yield from decode_string(reader) except NoDataException: - raise CodecException('username flag set, but username not present in payload') + raise MQTTException('username flag set, but username not present in payload') if variable_header.password_flag: try: payload.password = yield from decode_string(reader) except NoDataException: - raise CodecException('password flag set, but password not present in payload') + raise MQTTException('password flag set, but password not present in payload') return payload diff --git a/tests/mqtt/test_connect.py b/tests/mqtt/test_connect.py index ab0a90c..e592baa 100644 --- a/tests/mqtt/test_connect.py +++ b/tests/mqtt/test_connect.py @@ -4,89 +4,84 @@ import unittest import asyncio -from hbmqtt.codecs.connect import ConnectCodec, ConnectException -from hbmqtt.messages.packet import PacketType, MQTTHeader, ConnectMessage +from hbmqtt.mqtt.connect import ConnectPacket, ConnectVariableHeader, ConnectPayload +from hbmqtt.mqtt.packet import MQTTFixedHeader, PacketType +from hbmqtt.errors import MQTTException - -class TestConnectCodec(unittest.TestCase): +class ConnectPacketTest(unittest.TestCase): def setUp(self): self.loop = asyncio.new_event_loop() def test_decode_ok(self): - data = b'\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x3e\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) - message = self.loop.run_until_complete(ConnectCodec.decode(header, stream)) - self.assertEqual(message.proto_name, "MQTT") - self.assertEqual(message.proto_level, 4) - self.assertTrue(message.is_user_name_flag()) - self.assertTrue(message.is_password_flag()) - self.assertFalse(message.is_will_retain()) - self.assertEqual(message.will_qos(), 1) - self.assertTrue(message.is_will_flag()) - self.assertTrue(message.is_clean_session()) - self.assertFalse(message.is_reserved_flag()) + message = self.loop.run_until_complete(ConnectPacket.from_stream(stream)) + self.assertEqual(message.variable_header.proto_name, "MQTT") + self.assertEqual(message.variable_header.proto_level, 4) + self.assertTrue(message.variable_header.username_flag) + self.assertTrue(message.variable_header.password_flag) + self.assertFalse(message.variable_header.will_retain_flag) + self.assertEqual(message.variable_header.will_qos, 1) + self.assertTrue(message.variable_header.will_flag) + self.assertTrue(message.variable_header.clean_session_flag) + self.assertFalse(message.variable_header.reserved_flag) + self.assertEqual(message.payload.client_id, '0123456789') + self.assertEqual(message.payload.will_topic, 'WillTopic') + self.assertEqual(message.payload.will_message, 'WillMessage') + self.assertEqual(message.payload.username, 'user') + self.assertEqual(message.payload.password, 'password') def test_decode_fail_protocol_name(self): - data = b'\x00\x04TTQM\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x3e\x00\x04TTQM\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_decode_fail_reserved_flag(self): - data = b'\x00\x04MQTT\x04\xcf\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x3e\x00\x04MQTT\x04\xcf\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_decode_fail_miss_clientId(self): - data = b'\x00\x04MQTT\x04\xce\x00\x00' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x0a\x00\x04MQTT\x04\xce\x00\x00' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) stream.feed_eof() - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_decode_fail_miss_willtopic(self): - data = b'\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x16\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) stream.feed_eof() - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_decode_fail_miss_username(self): - data = b'\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x2e\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) stream.feed_eof() - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_decode_fail_miss_password(self): - data = b'\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user' - header = MQTTHeader(PacketType.CONNECT, 0x00, len(data)) + data = b'\x10\x34\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user' stream = asyncio.StreamReader(loop=self.loop) stream.feed_data(data) stream.feed_eof() - with self.assertRaises(ConnectException): - self.loop.run_until_complete(ConnectCodec.decode(header, stream)) + with self.assertRaises(MQTTException): + self.loop.run_until_complete(ConnectPacket.from_stream(stream)) def test_encode(self): - header = MQTTHeader(PacketType.CONNECT, 0x00, 0) - message = ConnectMessage(header, 0xce, 0, 'MQTT', 4) - message.client_id = '0123456789' - message.will_topic = 'WillTopic' - message.will_message = 'WillMessage' - message.user_name = 'user' - message.password = 'password' - encoded = yield from ConnectCodec.encode(message) + header = MQTTFixedHeader(PacketType.CONNECT, 0x00, 0) + variable_header = ConnectVariableHeader(0xce, 0, 'MQTT', 4) + payload = ConnectPayload('0123456789', 'WillTopic', 'WillMessage', 'user', 'password') + message = ConnectPacket(header, variable_header, payload) + encoded = message.to_bytes() self.assertEqual(encoded, b'\x10\x3e\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password')