xref: /llvm-project/lldb/test/API/terminal/TestSTTYBeforeAndAfter.py (revision 1b70580dd867195b0442e582eccd42abc41ee12d)
199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that 'stty -a' displays the same output before and after running the lldb command.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
656f9cfe3SDave Leeimport io
70e9af88bSJonas Devlieghereimport sys
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass TestSTTYBeforeAndAfter(TestBase):
1499451b44SJordan Rupprecht    @classmethod
1599451b44SJordan Rupprecht    def classCleanup(cls):
1699451b44SJordan Rupprecht        """Cleanup the test byproducts."""
1799451b44SJordan Rupprecht        cls.RemoveTempFile("child_send1.txt")
1899451b44SJordan Rupprecht        cls.RemoveTempFile("child_read1.txt")
1999451b44SJordan Rupprecht        cls.RemoveTempFile("child_send2.txt")
2099451b44SJordan Rupprecht        cls.RemoveTempFile("child_read2.txt")
2199451b44SJordan Rupprecht
22*1b70580dSAdrian Prantl    @skipIf(macos_version=["<", "14.0"], asan=True)
238bed754cSJordan Rupprecht    @add_test_categories(["pexpect"])
2499451b44SJordan Rupprecht    @no_debug_info_test
2599451b44SJordan Rupprecht    def test_stty_dash_a_before_and_afetr_invoking_lldb_command(self):
2699451b44SJordan Rupprecht        """Test that 'stty -a' displays the same output before and after running the lldb command."""
2799451b44SJordan Rupprecht        import pexpect
282238dcc3SJonas Devlieghere
292238dcc3SJonas Devlieghere        if not which("expect"):
302238dcc3SJonas Devlieghere            self.skipTest("The 'expect' program cannot be located, skip the test")
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        # The expect prompt.
3399451b44SJordan Rupprecht        expect_prompt = "expect[0-9.]+> "
3499451b44SJordan Rupprecht        # The default lldb prompt.
3599451b44SJordan Rupprecht        lldb_prompt = "(lldb) "
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        # So that the child gets torn down after the test.
3899824cf7SDavid Spickett        self.child = pexpect.spawn("expect", encoding="utf-8")
3999451b44SJordan Rupprecht        child = self.child
4099451b44SJordan Rupprecht
4199451b44SJordan Rupprecht        child.expect(expect_prompt)
4299451b44SJordan Rupprecht        child.setecho(True)
4399451b44SJordan Rupprecht        if self.TraceOn():
4499451b44SJordan Rupprecht            child.logfile = sys.stdout
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        if self.platformIsDarwin():
472238dcc3SJonas Devlieghere            child.sendline("set env(TERM) xterm")
4899451b44SJordan Rupprecht        else:
492238dcc3SJonas Devlieghere            child.sendline("set env(TERM) vt100")
5099451b44SJordan Rupprecht        child.expect(expect_prompt)
512238dcc3SJonas Devlieghere        child.sendline("puts $env(TERM)")
5299451b44SJordan Rupprecht        child.expect(expect_prompt)
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        # Turn on loggings for input/output to/from the child.
5556f9cfe3SDave Lee        child.logfile_send = child_send1 = io.StringIO()
5656f9cfe3SDave Lee        child.logfile_read = child_read1 = io.StringIO()
572238dcc3SJonas Devlieghere        child.sendline("stty -a")
5899451b44SJordan Rupprecht        child.expect(expect_prompt)
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        # Now that the stage1 logging is done, restore logfile to None to
6199451b44SJordan Rupprecht        # stop further logging.
6299451b44SJordan Rupprecht        child.logfile_send = None
6399451b44SJordan Rupprecht        child.logfile_read = None
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        # Invoke the lldb command.
6699451b44SJordan Rupprecht        child.sendline(lldbtest_config.lldbExec)
6799451b44SJordan Rupprecht        child.expect_exact(lldb_prompt)
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        # Immediately quit.
702238dcc3SJonas Devlieghere        child.sendline("quit")
7199451b44SJordan Rupprecht        child.expect(expect_prompt)
7299451b44SJordan Rupprecht
7356f9cfe3SDave Lee        child.logfile_send = child_send2 = io.StringIO()
7456f9cfe3SDave Lee        child.logfile_read = child_read2 = io.StringIO()
752238dcc3SJonas Devlieghere        child.sendline("stty -a")
7699451b44SJordan Rupprecht        child.expect(expect_prompt)
7799451b44SJordan Rupprecht
782238dcc3SJonas Devlieghere        child.sendline("exit")
7999451b44SJordan Rupprecht
8099451b44SJordan Rupprecht        # Now that the stage2 logging is done, restore logfile to None to
8199451b44SJordan Rupprecht        # stop further logging.
8299451b44SJordan Rupprecht        child.logfile_send = None
8399451b44SJordan Rupprecht        child.logfile_read = None
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        if self.TraceOn():
8699451b44SJordan Rupprecht            print("\n\nContents of child_send1:")
8799451b44SJordan Rupprecht            print(child_send1.getvalue())
8899451b44SJordan Rupprecht            print("\n\nContents of child_read1:")
8999451b44SJordan Rupprecht            print(child_read1.getvalue())
9099451b44SJordan Rupprecht            print("\n\nContents of child_send2:")
9199451b44SJordan Rupprecht            print(child_send2.getvalue())
9299451b44SJordan Rupprecht            print("\n\nContents of child_read2:")
9399451b44SJordan Rupprecht            print(child_read2.getvalue())
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        stty_output1_lines = child_read1.getvalue().splitlines()
9699451b44SJordan Rupprecht        stty_output2_lines = child_read2.getvalue().splitlines()
9799451b44SJordan Rupprecht        zipped = list(zip(stty_output1_lines, stty_output2_lines))
9899451b44SJordan Rupprecht        for tuple in zipped:
9999451b44SJordan Rupprecht            if self.TraceOn():
10099451b44SJordan Rupprecht                print("tuple->%s" % str(tuple))
10199451b44SJordan Rupprecht            # Every line should compare equal until the first blank line.
10299451b44SJordan Rupprecht            if len(tuple[0]) == 0:
10399451b44SJordan Rupprecht                break
104619e2e09SDave Lee            self.assertEqual(tuple[0], tuple[1])
105