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