xref: /openbsd-src/gnu/llvm/lldb/packages/Python/lldbsuite/test/lldbpexpect.py (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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