brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 94eeb6e Raw
186 lines · python
1import lldb2from lldbsuite.test.lldbtest import *3from lldbsuite.test.decorators import *4from lldbsuite.test.gdbclientutils import *5from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase6 7 8@skipIf(hostoslist=["windows"])9class TestPty(GDBRemoteTestBase):10    server_socket_class = PtyServerSocket11 12    def get_term_attrs(self):13        import termios14 15        return termios.tcgetattr(self._secondary_socket)16 17    def setUp(self):18        super().setUp()19        # Duplicate the pty descriptors so we can inspect the pty state after20        # they are closed21        self._primary_socket = os.dup(self.server._socket._primary.name)22        self._secondary_socket = os.dup(self.server._socket._secondary.name)23        self.orig_attr = self.get_term_attrs()24 25    def assert_raw_mode(self, current_attr):26        import termios27 28        self.assertEqual(29            current_attr[0]30            & (31                termios.BRKINT32                | termios.PARMRK33                | termios.ISTRIP34                | termios.INLCR35                | termios.IGNCR36                | termios.ICRNL37                | termios.IXON38            ),39            0,40        )41        self.assertEqual(current_attr[1] & termios.OPOST, 0)42        self.assertEqual(current_attr[2] & termios.CSIZE, termios.CS8)43        self.assertEqual(44            current_attr[3]45            & (termios.ICANON | termios.ECHO | termios.ISIG | termios.IEXTEN),46            0,47        )48        self.assertEqual(current_attr[6][termios.VMIN], 1)49        self.assertEqual(current_attr[6][termios.VTIME], 0)50 51    def get_parity_flags(self, attr):52        import termios53 54        return attr[2] & (termios.PARENB | termios.PARODD)55 56    def get_stop_bit_flags(self, attr):57        import termios58 59        return attr[2] & termios.CSTOPB60 61    def test_process_connect_sync(self):62        """Test the process connect command in synchronous mode"""63        try:64            self.dbg.SetAsync(False)65            self.expect(66                "platform select remote-gdb-server",67                substrs=["Platform: remote-gdb-server", "Connected: no"],68            )69            self.expect(70                "process connect " + self.server.get_connect_url(),71                substrs=["Process", "stopped"],72            )73 74            current_attr = self.get_term_attrs()75            # serial:// should set raw mode76            self.assert_raw_mode(current_attr)77            # other parameters should be unmodified78            self.assertEqual(current_attr[4:6], self.orig_attr[4:6])79            self.assertEqual(80                self.get_parity_flags(current_attr),81                self.get_parity_flags(self.orig_attr),82            )83            self.assertEqual(84                self.get_stop_bit_flags(current_attr),85                self.get_stop_bit_flags(self.orig_attr),86            )87        finally:88            self.dbg.GetSelectedTarget().GetProcess().Kill()89        # original mode should be restored on exit90        self.assertEqual(self.get_term_attrs(), self.orig_attr)91 92    def test_process_connect_async(self):93        """Test the process connect command in asynchronous mode"""94        try:95            self.dbg.SetAsync(True)96            self.expect(97                "platform select remote-gdb-server",98                substrs=["Platform: remote-gdb-server", "Connected: no"],99            )100            self.expect(101                "process connect " + self.server.get_connect_url(),102                matching=False,103                substrs=["Process", "stopped"],104            )105            lldbutil.expect_state_changes(106                self, self.dbg.GetListener(), self.process(), [lldb.eStateStopped]107            )108 109            current_attr = self.get_term_attrs()110            # serial:// should set raw mode111            self.assert_raw_mode(current_attr)112            # other parameters should be unmodified113            self.assertEqual(current_attr[4:6], self.orig_attr[4:6])114            self.assertEqual(115                self.get_parity_flags(current_attr),116                self.get_parity_flags(self.orig_attr),117            )118            self.assertEqual(119                self.get_stop_bit_flags(current_attr),120                self.get_stop_bit_flags(self.orig_attr),121            )122        finally:123            self.dbg.GetSelectedTarget().GetProcess().Kill()124        lldbutil.expect_state_changes(125            self, self.dbg.GetListener(), self.process(), [lldb.eStateExited]126        )127        # original mode should be restored on exit128        self.assertEqual(self.get_term_attrs(), self.orig_attr)129 130    def test_connect_via_file(self):131        """Test connecting via the legacy file:// URL"""132        import termios133 134        try:135            self.expect(136                "platform select remote-gdb-server",137                substrs=["Platform: remote-gdb-server", "Connected: no"],138            )139            self.expect(140                "process connect file://" + self.server.get_connect_address(),141                substrs=["Process", "stopped"],142            )143 144            # file:// sets baud rate and some raw-related flags145            current_attr = self.get_term_attrs()146            self.assertEqual(147                current_attr[3]148                & (termios.ICANON | termios.ECHO | termios.ECHOE | termios.ISIG),149                0,150            )151            self.assertEqual(current_attr[4], termios.B115200)152            self.assertEqual(current_attr[5], termios.B115200)153            self.assertEqual(current_attr[6][termios.VMIN], 1)154            self.assertEqual(current_attr[6][termios.VTIME], 0)155        finally:156            self.dbg.GetSelectedTarget().GetProcess().Kill()157 158    def test_process_connect_params(self):159        """Test serial:// URL with parameters"""160        import termios161 162        try:163            self.expect(164                "platform select remote-gdb-server",165                substrs=["Platform: remote-gdb-server", "Connected: no"],166            )167            self.expect(168                "process connect "169                + self.server.get_connect_url()170                + "?baud=115200&stop-bits=2",171                substrs=["Process", "stopped"],172            )173 174            current_attr = self.get_term_attrs()175            self.assert_raw_mode(current_attr)176            self.assertEqual(current_attr[4:6], 2 * [termios.B115200])177            self.assertEqual(178                self.get_parity_flags(current_attr),179                self.get_parity_flags(self.orig_attr),180            )181            self.assertEqual(self.get_stop_bit_flags(current_attr), termios.CSTOPB)182        finally:183            self.dbg.GetSelectedTarget().GetProcess().Kill()184        # original mode should be restored on exit185        self.assertEqual(self.get_term_attrs(), self.orig_attr)186