from __future__ import absolute_import # System modules import os import sys # Third-party modules import six # LLDB Modules import lldb from .lldbtest import * from . import lldbutil from lldbsuite.test.decorators import * @skipIfRemote @skipIfWindows # llvm.org/pr22274: need a pexpect replacement for windows class PExpectTest(TestBase): NO_DEBUG_INFO_TESTCASE = True PROMPT = "(lldb) " def expect_prompt(self): self.child.expect_exact(self.PROMPT) def launch(self, executable=None, extra_args=None, timeout=30, dimensions=None): logfile = getattr(sys.stdout, 'buffer', sys.stdout) if self.TraceOn() else None args = ['--no-lldbinit', '--no-use-colors'] for cmd in self.setUpCommands(): args += ['-O', cmd] if executable is not None: args += ['--file', executable] if extra_args is not None: args.extend(extra_args) env = dict(os.environ) env["TERM"]="vt100" import pexpect self.child = pexpect.spawn( lldbtest_config.lldbExec, args=args, logfile=logfile, timeout=timeout, dimensions=dimensions, env=env) self.expect_prompt() for cmd in self.setUpCommands(): self.child.expect_exact(cmd) self.expect_prompt() if executable is not None: self.child.expect_exact("target create") self.child.expect_exact("Current executable set to") self.expect_prompt() def expect(self, cmd, substrs=None): self.assertNotIn('\n', cmd) self.child.sendline(cmd) # If 'substrs' is a string then this code would just check that every # character of the string is in the output. assert not isinstance(substrs, six.string_types), \ "substrs must be a collection of strings" if substrs is not None: for s in substrs: self.child.expect_exact(s) self.expect_prompt() def quit(self, gracefully=True): self.child.sendeof() self.child.close(force=not gracefully) self.child = None def cursor_forward_escape_seq(self, chars_to_move): """ Returns the escape sequence to move the cursor forward/right by a certain amount of characters. """ return b"\x1b\[" + str(chars_to_move).encode("utf-8") + b"C"