================
@@ -0,0 +1,82 @@
+import io
+import json
+from typing import List
+
+from lldbsuite.test.tools.lldb_dap.dap_types import RawMessage
+from lldbsuite.test.tools.lldb_dap.lldb_dap_testcase import DAPTestCaseBase
+from lldbsuite.test.tools.lldb_dap.utils import DAPConnection, MessageHandler, 
Transport
+
+
+class EchoClient:
+    def __init__(self):
+        self.seen_messages: List[RawMessage] = []
+
+    def on_message(self, msg: RawMessage):
+        self.seen_messages.append(msg)
+
+
+class TestDAPUtils_DAPConnection(DAPTestCaseBase):
+    def test_round_trip(self):
+        received_messages = self.get_sample_dap_log()
+        transport = self.create_transport(received_messages)
+        connection = DAPConnection("conn0", transport)
+
+        client = EchoClient()
+        handler = MessageHandler(
+            on_event=client.on_message,
+            on_response=client.on_message,
+            on_reverse_request=client.on_message,
+        )
+        connection.start(handler)
+        expected_messages = client.seen_messages
+        self.assertEqual(len(received_messages), len(expected_messages))
+        for actual, expected in zip(received_messages, expected_messages):
+            self.assertEqual(actual, expected)
+
+    def test_encode_message_framing(self):
+        payload = {"type": "request", "seq": 1, "command": "initialize"}
+        data = DAPConnection.encode_message(payload)
+        header, _, body = data.partition(b"\r\n\r\n")
+        self.assertTrue(header.startswith(b"Content-Length:"))
+        content_length = int(header.split(b":")[1].strip())
+        self.assertEqual(content_length, len(body))
+        self.assertEqual(json.loads(body), payload)
+
+    def test_encode_message_round_trips(self):
+        payload = {"nested": {"a": 1, "b": [1, 2, 3]}}
+        _, _, body = 
DAPConnection.encode_message(payload).partition(b"\r\n\r\n")
+        self.assertEqual(json.loads(body), payload)
+
+    @staticmethod
+    def create_transport(data: List[RawMessage]) -> Transport:
+        class BinaryTransport:
+            def __init__(self, data: List[RawMessage]):
+                encoded_data = [
+                    DAPConnection.encode_message(message) for message in data
+                ]
+                self._in = io.BytesIO(b"".join(encoded_data))
+                self._out: List[str] = []
+
+            def write(self, data: bytes):
+                self._out.append(data.decode("utf-8"))
+
+            def readline(self):
+                return self._in.readline()
+
+            def read(self, n: int) -> bytes:
+                return self._in.read(n)
+
+            def close(self):
+                self._in.close()
+
+            @property
+            def is_alive(self) -> bool:
+                return not self._in.closed
+
+        return BinaryTransport(data)
+
+    def get_sample_dap_log(self) -> List[dict]:
+        message_log = self.getSourcePath("sample_dap_log.json")
+        with open(message_log, "r") as file:
----------------
DrSergei wrote:

Maybe better to explicitly set UTF-8 encoding here and in `populate_history`

https://github.com/llvm/llvm-project/pull/207037
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to