1061da546Spatrickfrom __future__ import absolute_import 2061da546Spatrick 3061da546Spatrick# System modules 4061da546Spatrickimport os 5061da546Spatrickimport sys 6061da546Spatrick 7061da546Spatrick# LLDB Modules 8061da546Spatrickimport lldb 9061da546Spatrickfrom .lldbtest import * 10061da546Spatrickfrom . import lldbutil 11be691f3bSpatrickfrom lldbsuite.test.decorators import * 12061da546Spatrick 13be691f3bSpatrick@skipIfRemote 14be691f3bSpatrick@skipIfWindows # llvm.org/pr22274: need a pexpect replacement for windows 15061da546Spatrickclass PExpectTest(TestBase): 16061da546Spatrick 17061da546Spatrick NO_DEBUG_INFO_TESTCASE = True 18061da546Spatrick PROMPT = "(lldb) " 19061da546Spatrick 20061da546Spatrick def expect_prompt(self): 21061da546Spatrick self.child.expect_exact(self.PROMPT) 22061da546Spatrick 23*f6aab3d8Srobert def launch(self, executable=None, extra_args=None, timeout=60, 24*f6aab3d8Srobert dimensions=None, run_under=None, post_spawn=None, 25*f6aab3d8Srobert use_colors=False): 26061da546Spatrick logfile = getattr(sys.stdout, 'buffer', 27061da546Spatrick sys.stdout) if self.TraceOn() else None 28061da546Spatrick 29*f6aab3d8Srobert args = [] 30*f6aab3d8Srobert if run_under is not None: 31*f6aab3d8Srobert args += run_under 32*f6aab3d8Srobert args += [lldbtest_config.lldbExec, '--no-lldbinit'] 33*f6aab3d8Srobert if not use_colors: 34*f6aab3d8Srobert args.append('--no-use-colors') 35061da546Spatrick for cmd in self.setUpCommands(): 36*f6aab3d8Srobert if "use-color false" in cmd and use_colors: 37*f6aab3d8Srobert continue 38061da546Spatrick args += ['-O', cmd] 39061da546Spatrick if executable is not None: 40061da546Spatrick args += ['--file', executable] 41061da546Spatrick if extra_args is not None: 42061da546Spatrick args.extend(extra_args) 43061da546Spatrick 44061da546Spatrick env = dict(os.environ) 45061da546Spatrick env["TERM"] = "vt100" 46*f6aab3d8Srobert env["HOME"] = self.getBuildDir() 47061da546Spatrick 48be691f3bSpatrick import pexpect 49061da546Spatrick self.child = pexpect.spawn( 50*f6aab3d8Srobert args[0], args=args[1:], logfile=logfile, 51061da546Spatrick timeout=timeout, dimensions=dimensions, env=env) 52*f6aab3d8Srobert self.child.ptyproc.delayafterclose = timeout/10 53*f6aab3d8Srobert self.child.ptyproc.delayafterterminate = timeout/10 54*f6aab3d8Srobert 55*f6aab3d8Srobert if post_spawn is not None: 56*f6aab3d8Srobert post_spawn() 57061da546Spatrick self.expect_prompt() 58061da546Spatrick for cmd in self.setUpCommands(): 59*f6aab3d8Srobert if "use-color false" in cmd and use_colors: 60*f6aab3d8Srobert continue 61061da546Spatrick self.child.expect_exact(cmd) 62061da546Spatrick self.expect_prompt() 63061da546Spatrick if executable is not None: 64061da546Spatrick self.child.expect_exact("target create") 65061da546Spatrick self.child.expect_exact("Current executable set to") 66061da546Spatrick self.expect_prompt() 67061da546Spatrick 68061da546Spatrick def expect(self, cmd, substrs=None): 69061da546Spatrick self.assertNotIn('\n', cmd) 70be691f3bSpatrick # If 'substrs' is a string then this code would just check that every 71be691f3bSpatrick # character of the string is in the output. 72*f6aab3d8Srobert assert not isinstance(substrs, str), \ 73be691f3bSpatrick "substrs must be a collection of strings" 74be691f3bSpatrick 75061da546Spatrick self.child.sendline(cmd) 76061da546Spatrick if substrs is not None: 77061da546Spatrick for s in substrs: 78061da546Spatrick self.child.expect_exact(s) 79061da546Spatrick self.expect_prompt() 80061da546Spatrick 81061da546Spatrick def quit(self, gracefully=True): 82061da546Spatrick self.child.sendeof() 83061da546Spatrick self.child.close(force=not gracefully) 84061da546Spatrick self.child = None 85be691f3bSpatrick 86be691f3bSpatrick def cursor_forward_escape_seq(self, chars_to_move): 87be691f3bSpatrick """ 88be691f3bSpatrick Returns the escape sequence to move the cursor forward/right 89be691f3bSpatrick by a certain amount of characters. 90be691f3bSpatrick """ 91be691f3bSpatrick return b"\x1b\[" + str(chars_to_move).encode("utf-8") + b"C" 92