Implement first handler testing

pull/8/head
Nicolas Jouanin 2015-06-23 22:46:53 +02:00
rodzic a711b1c775
commit 4c89b2ecde
3 zmienionych plików z 58 dodań i 22 usunięć

Wyświetl plik

@ -3,27 +3,10 @@
# See the file license.txt for copying permission. # See the file license.txt for copying permission.
import logging import logging
import asyncio import asyncio
import threading
from hbmqtt.session import Session from hbmqtt.session import Session
from hbmqtt.mqtt.packet import MQTTFixedHeader from hbmqtt.mqtt.packet import MQTTFixedHeader
from hbmqtt.mqtt import packet_class from hbmqtt.mqtt import packet_class
from hbmqtt.errors import NoDataException
# class ProtoThread(threading.Thread):
# def __init__(self, session: Session, loop: asyncio.BaseEventLoop):
# super().__init__(name="MQTT Protocol communication thread")
# self.logger = logging.getLogger(__name__)
# self._loop = loop
# self._session = session
#
# def run(self):
# asyncio.set_event_loop(self._loop)
# self._loop.call_soon(asyncio.async, self._read_protocol())
# if not self._loop.is_running():
# self._loop.run_forever()
#
# @asyncio.coroutine
# def _read_protocol(self):
# while true:
class ProtocolHandler: class ProtocolHandler:
""" """
@ -52,10 +35,13 @@ class ProtocolHandler:
fixed_header = yield from MQTTFixedHeader.from_stream(self.session.reader) fixed_header = yield from MQTTFixedHeader.from_stream(self.session.reader)
cls = packet_class(fixed_header) cls = packet_class(fixed_header)
packet = yield from cls.from_stream(self.session.reader, fixed_header=fixed_header) packet = yield from cls.from_stream(self.session.reader, fixed_header=fixed_header)
self.logger.debug(packet) yield from self.session.incoming_queues[packet.fixed_header.packet_type].put(packet)
except asyncio.CancelledError: except asyncio.CancelledError:
self.logger.warn("Reader coro stopping") self.logger.warn("Reader coro stopping")
break break
except NoDataException:
self.logger.debug("No more data to read")
break
except Exception as e: except Exception as e:
self.logger.warn("Exception in reader coro: %s" % e) self.logger.warn("Exception in reader coro: %s" % e)
break break
@ -63,13 +49,13 @@ class ProtocolHandler:
@asyncio.coroutine @asyncio.coroutine
def _writer_coro(self): def _writer_coro(self):
self.logger.debug("Starting writer coro") self.logger.debug("Starting writer coro")
out_queue = self.session._out_queue out_queue = self.session.outgoing_queue
while True: while True:
try: try:
packet = yield from out_queue.get() packet = yield from out_queue.get()
yield from packet.to_stream(self.session.writer) yield from packet.to_stream(self.session.writer)
except asyncio.CancelledError: except asyncio.CancelledError:
self.logger.warn("Reader coro stopping") self.logger.warn("Writer coro stopping")
break break
except Exception as e: except Exception as e:
self.logger.warn("Exception in writer coro: %s" % e) self.logger.warn("Exception in writer coro: %s" % e)

Wyświetl plik

@ -3,6 +3,7 @@
# See the file license.txt for copying permission. # See the file license.txt for copying permission.
import asyncio import asyncio
from enum import Enum from enum import Enum
from hbmqtt.mqtt.packet import PacketType
class SessionState(Enum): class SessionState(Enum):
NEW = 0 NEW = 0
@ -31,7 +32,10 @@ class Session:
self.scheme = None self.scheme = None
self._packet_id = 0 self._packet_id = 0
self._out_queue = asyncio.Queue() self.incoming_queues = dict()
for p in PacketType:
self.incoming_queues[p] = asyncio.Queue()
self.outgoing_queue = asyncio.Queue()
@property @property
def next_packet_id(self): def next_packet_id(self):

Wyświetl plik

@ -0,0 +1,46 @@
# Copyright (c) 2015 Nicolas JOUANIN
#
# See the file license.txt for copying permission.
import unittest
import asyncio
from hbmqtt.mqtt.connect import ConnectPacket, ConnectVariableHeader, ConnectPayload
from hbmqtt.mqtt.packet import MQTTFixedHeader, PacketType
from hbmqtt.errors import MQTTException
from hbmqtt.session import Session
from hbmqtt.protocol import ProtocolHandler
from hbmqtt.mqtt.packet import PacketType
import logging
logging.basicConfig(level=logging.DEBUG)
class ConnectPacketTest(unittest.TestCase):
def setUp(self):
self.loop = asyncio.new_event_loop()
def test_read_loop(self):
data = b'\x10\x3e\x00\x04MQTT\x04\xce\x00\x00\x00\x0a0123456789\x00\x09WillTopic\x00\x0bWillMessage\x00\x04user\x00\x08password'
@asyncio.coroutine
def serve_test(reader, writer):
writer.write(data)
yield from writer.drain()
writer.close()
loop = asyncio.get_event_loop()
coro = asyncio.start_server(serve_test, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
@asyncio.coroutine
def client():
S = Session()
S.reader, S.writer = yield from asyncio.open_connection('127.0.0.1', 8888,
loop=loop)
handler = ProtocolHandler(S, loop)
handler.start()
incoming_packet = yield from S.incoming_queues[PacketType.CONNECT].get()
handler.stop()
return incoming_packet
packet = loop.run_until_complete(client())
server.close()
self.assertEquals(packet.fixed_header.packet_type, PacketType.CONNECT)