From b1044667abbecc1129bab4bc0d72f5e72df5e8f1 Mon Sep 17 00:00:00 2001 From: Axel Suarez Date: Thu, 29 Apr 2021 00:32:48 -0700 Subject: [PATCH 1/2] 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 ab1433aa99b404610b1d9ac2f46435d392e36483 Mon Sep 17 00:00:00 2001 From: Axel Suarez Date: Mon, 3 May 2021 22:15:30 -0700 Subject: [PATCH 2/2] StreamingRequestHandler test listen --- .../test_streaming_request_handler.py | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 libraries/botbuilder-core/tests/streaming/test_streaming_request_handler.py diff --git a/libraries/botbuilder-core/tests/streaming/test_streaming_request_handler.py b/libraries/botbuilder-core/tests/streaming/test_streaming_request_handler.py new file mode 100644 index 000000000..4c0cfe995 --- /dev/null +++ b/libraries/botbuilder-core/tests/streaming/test_streaming_request_handler.py @@ -0,0 +1,55 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +from unittest.mock import Mock +from typing import Any + +import aiounittest + +from botbuilder.core.streaming import StreamingRequestHandler +from botbuilder.streaming.transport.web_socket import ( + WebSocket, + WebSocketState, + WebSocketCloseStatus, + WebSocketMessage, + WebSocketMessageType, +) + + +class MockWebSocket(WebSocket): + def __init__(self): + super(MockWebSocket, self).__init__() + + self.receive_called = False + + def dispose(self): + return + + async def close(self, close_status: WebSocketCloseStatus, status_description: str): + return + + async def receive(self) -> WebSocketMessage: + self.receive_called = True + + async def send( + self, buffer: Any, message_type: WebSocketMessageType, end_of_message: bool + ): + raise Exception + + @property + def status(self) -> WebSocketState: + return WebSocketState.OPEN + + +class TestStramingRequestHandler(aiounittest.AsyncTestCase): + async def test_listen(self): + mock_bot = Mock() + mock_activity_processor = Mock() + mock_web_socket = MockWebSocket() + + sut = StreamingRequestHandler( + mock_bot, mock_activity_processor, mock_web_socket + ) + await sut.listen() + + assert mock_web_socket.receive_called