| import gdbremote_testcase | |
| import lldbgdbserverutils | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbgdbserverutils import * | |
| import xml.etree.ElementTree as ET | |
| @skipIfRemote | |
| @skipIf(hostoslist=["windows"]) | |
| class PtyServerTestCase(gdbremote_testcase.GdbRemoteTestCaseBase): | |
| def setUp(self): | |
| super().setUp() | |
| import pty | |
| import tty | |
| primary, secondary = pty.openpty() | |
| tty.setraw(primary) | |
| self._primary = io.FileIO(primary, "r+b") | |
| self._secondary = io.FileIO(secondary, "r+b") | |
| def get_debug_monitor_command_line_args(self, attach_pid=None): | |
| commandline_args = self.debug_monitor_extra_args | |
| if attach_pid: | |
| commandline_args += ["--attach=%d" % attach_pid] | |
| libc = ctypes.CDLL(None) | |
| libc.ptsname.argtypes = (ctypes.c_int,) | |
| libc.ptsname.restype = ctypes.c_char_p | |
| pty_path = libc.ptsname(self._primary.fileno()).decode() | |
| commandline_args += ["serial://%s" % (pty_path,)] | |
| return commandline_args | |
| def connect_to_debug_monitor(self, attach_pid=None): | |
| self.reverse_connect = False | |
| server = self.launch_debug_monitor(attach_pid=attach_pid) | |
| self.assertIsNotNone(server) | |
| # TODO: make it into proper abstraction | |
| class FakeSocket: | |
| def __init__(self, fd): | |
| self.fd = fd | |
| def sendall(self, frame): | |
| self.fd.write(frame) | |
| def recv(self, count): | |
| return self.fd.read(count) | |
| self.sock = FakeSocket(self._primary) | |
| self._server = Server(self.sock, server) | |
| return server | |
| @add_test_categories(["llgs"]) | |
| def test_pty_server(self): | |
| self.build() | |
| self.set_inferior_startup_launch() | |
| self.prep_debug_monitor_and_inferior() | |
| # target.xml transfer should trigger a large enough packet to check | |
| # for partial write regression | |
| self.test_sequence.add_log_lines( | |
| [ | |
| "read packet: $qXfer:features:read:target.xml:0,200000#00", | |
| { | |
| "direction": "send", | |
| "regex": re.compile(r"^\$l(.+)#[0-9a-fA-F]{2}$", flags=re.DOTALL), | |
| "capture": {1: "target_xml"}, | |
| }, | |
| ], | |
| True, | |
| ) | |
| context = self.expect_gdbremote_sequence() | |
| # verify that we have received a complete, non-malformed XML | |
| self.assertIsNotNone(ET.fromstring(context.get("target_xml"))) |