From b1044667abbecc1129bab4bc0d72f5e72df5e8f1 Mon Sep 17 00:00:00 2001 From: Axel Suarez Date: Thu, 29 Apr 2021 00:32:48 -0700 Subject: [PATCH 1/4] payload receiver unit test --- .../payload_transport/payload_receiver.py | 1 + .../streaming/payload_transport/send_queue.py | 2 +- .../tests/test_payload_receiver.py | 70 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 libraries/botbuilder-streaming/tests/test_payload_receiver.py diff --git a/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/payload_receiver.py b/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/payload_receiver.py index df054ced8..092c0f1cb 100644 --- a/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/payload_receiver.py +++ b/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/payload_receiver.py @@ -88,6 +88,7 @@ async def disconnect(self, event_args: DisconnectedEventArgs = None): async def _receive_packets(self): is_closed = False + disconnect_args = None while self._receiver and self._receiver.is_connected and not is_closed: # receive a single packet diff --git a/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/send_queue.py b/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/send_queue.py index 07d197496..4163e7558 100644 --- a/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/send_queue.py +++ b/libraries/botbuilder-streaming/botbuilder/streaming/payload_transport/send_queue.py @@ -27,7 +27,7 @@ async def _process(self): while True: try: while True: - await sleep(1) + await sleep(0.2) item = await self._queue.get() try: await self._action(item) diff --git a/libraries/botbuilder-streaming/tests/test_payload_receiver.py b/libraries/botbuilder-streaming/tests/test_payload_receiver.py new file mode 100644 index 000000000..315bd23a7 --- /dev/null +++ b/libraries/botbuilder-streaming/tests/test_payload_receiver.py @@ -0,0 +1,70 @@ +from typing import List + +import aiounittest + +from botbuilder.streaming import PayloadStream +from botbuilder.streaming.payload_transport import PayloadReceiver +from botbuilder.streaming.transport import TransportReceiverBase + + +class MockTransportReceiver(TransportReceiverBase): + def __init__(self, mock_header: bytes, mock_payload: bytes): + self._is_connected = True + self._mock_gen = self._mock_receive(mock_header, mock_payload) + + def _mock_receive(self, mock_header: bytes, mock_payload: bytes): + yield mock_header + yield mock_payload + + @property + def is_connected(self): + if self._is_connected: + self._is_connected = False + return True + return False + + async def close(self): + return + + async def receive(self, buffer: object, offset: int, count: int) -> int: + resp_buffer = list(next(self._mock_gen)) + for index, val in enumerate(resp_buffer): + buffer[index] = val + return len(resp_buffer) + + +class MockStream(PayloadStream): + # pylint: disable=super-init-not-called + def __init__(self): + self.buffer = None + self._producer_length = 0 # total length + + def give_buffer(self, buffer: List[int]): + self.buffer = buffer + + +class TestBotFrameworkHttpClient(aiounittest.AsyncTestCase): + async def test_connect(self): + mock_header = b"S.000004.e35ed534-0808-4acf-af1e-24aa81d2b31d.1\n" + mock_payload = b"test" + + mock_receiver = MockTransportReceiver(mock_header, mock_payload) + mock_stream = MockStream() + + receive_action_called = False + + def mock_get_stream(header): # pylint: disable=unused-argument + return mock_stream + + def mock_receive_action(header, stream, offset): + nonlocal receive_action_called + assert header.type == "S" + assert len(stream.buffer) == offset + receive_action_called = True + + sut = PayloadReceiver() + sut.subscribe(mock_get_stream, mock_receive_action) + await sut.connect(mock_receiver) + + assert bytes(mock_stream.buffer) == mock_payload + assert receive_action_called From d598a5655f7237fe5f804b64b0aea3e61066898c Mon Sep 17 00:00:00 2001 From: msomanathan Date: Mon, 3 May 2021 01:15:12 -0700 Subject: [PATCH 2/4] senderTest --- .../tests/test_payload_sender.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 libraries/botbuilder-streaming/tests/test_payload_sender.py diff --git a/libraries/botbuilder-streaming/tests/test_payload_sender.py b/libraries/botbuilder-streaming/tests/test_payload_sender.py new file mode 100644 index 000000000..b0a669f8c --- /dev/null +++ b/libraries/botbuilder-streaming/tests/test_payload_sender.py @@ -0,0 +1,55 @@ +from asyncio import Semaphore +from typing import List +from uuid import UUID, uuid4 + +import aiounittest +from botbuilder.streaming.payload_transport import PayloadSender +from botbuilder.streaming.payloads import HeaderSerializer +from botbuilder.streaming.payloads.models import Header +from botbuilder.streaming.transport import TransportSenderBase + + +class MockTransportSender(TransportSenderBase): + def __init__(self): + super().__init__() + self.send_called = Semaphore(0) + + async def send(self, buffer: List[int], offset: int, count: int) -> int: + # Assert + if count == 48: # Header + print("Validating Header...") + header = HeaderSerializer.deserialize(buffer, offset, count) + assert header.type == "A" + assert header.payload_length == 3 + assert header.end + else: # Payload + print("Validating Payload...") + assert count == 3 + self.send_called.release() + + return count + + async def close(self): + pass + + +class TestPayloadSender(aiounittest.AsyncTestCase): + async def test_send(self): + # Arrange + sut = PayloadSender() + sender = MockTransportSender() + sut.connect(sender) + + headerId: UUID = uuid4() + header = Header(type="A", id=headerId, end=True) + header.payload_length = 3 + payload = [1, 2, 3] + + async def mock_sent_callback(h: Header): + print(f"{h.type}.{h.payload_length}.{h.id}.{h.end}") + + # Act + sut.send_payload(header, payload, is_length_known=True, sent_callback=mock_sent_callback) + + # Assert + await sender.send_called.acquire() From bec94caf57d4970d9dfae7c5d6e9fd6b44d31c35 Mon Sep 17 00:00:00 2001 From: msomanathan Date: Mon, 3 May 2021 01:36:43 -0700 Subject: [PATCH 3/4] disconnect --- libraries/botbuilder-streaming/tests/test_payload_sender.py | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/botbuilder-streaming/tests/test_payload_sender.py b/libraries/botbuilder-streaming/tests/test_payload_sender.py index b0a669f8c..58a0b4fec 100644 --- a/libraries/botbuilder-streaming/tests/test_payload_sender.py +++ b/libraries/botbuilder-streaming/tests/test_payload_sender.py @@ -53,3 +53,4 @@ async def mock_sent_callback(h: Header): # Assert await sender.send_called.acquire() + await sut.disconnect() From cb38c253cad20e1bd2db3a515329cdcbfce1559c Mon Sep 17 00:00:00 2001 From: msomanathan Date: Mon, 3 May 2021 01:42:56 -0700 Subject: [PATCH 4/4] fixWarning --- libraries/botbuilder-streaming/tests/test_payload_sender.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/botbuilder-streaming/tests/test_payload_sender.py b/libraries/botbuilder-streaming/tests/test_payload_sender.py index 58a0b4fec..75528b8ba 100644 --- a/libraries/botbuilder-streaming/tests/test_payload_sender.py +++ b/libraries/botbuilder-streaming/tests/test_payload_sender.py @@ -29,7 +29,7 @@ async def send(self, buffer: List[int], offset: int, count: int) -> int: return count - async def close(self): + def close(self): pass