1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest lldb Python commands.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprechtimport sys
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprechtclass CmdPythonTestCase(TestBase):
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
15*99451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht    def test(self):
18*99451b44SJordan Rupprecht        self.build()
19*99451b44SJordan Rupprecht        self.pycmd_tests()
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht    def pycmd_tests(self):
22*99451b44SJordan Rupprecht        self.runCmd("command source py_import")
23*99451b44SJordan Rupprecht
24*99451b44SJordan Rupprecht        # Test a bunch of different kinds of python callables with
25*99451b44SJordan Rupprecht        # both 4 and 5 positional arguments.
26*99451b44SJordan Rupprecht        self.expect("foobar", substrs=["All good"])
27*99451b44SJordan Rupprecht        self.expect("foobar4", substrs=["All good"])
28*99451b44SJordan Rupprecht        self.expect("vfoobar", substrs=["All good"])
29*99451b44SJordan Rupprecht        self.expect("v5foobar", substrs=["All good"])
30*99451b44SJordan Rupprecht        self.expect("sfoobar", substrs=["All good"])
31*99451b44SJordan Rupprecht        self.expect("cfoobar", substrs=["All good"])
32*99451b44SJordan Rupprecht        self.expect("ifoobar", substrs=["All good"])
33*99451b44SJordan Rupprecht        self.expect("sfoobar4", substrs=["All good"])
34*99451b44SJordan Rupprecht        self.expect("cfoobar4", substrs=["All good"])
35*99451b44SJordan Rupprecht        self.expect("ifoobar4", substrs=["All good"])
36*99451b44SJordan Rupprecht        self.expect("ofoobar", substrs=["All good"])
37*99451b44SJordan Rupprecht        self.expect("ofoobar4", substrs=["All good"])
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        # Verify command that specifies eCommandRequiresTarget returns failure
40*99451b44SJordan Rupprecht        # without a target.
41*99451b44SJordan Rupprecht        self.expect('targetname',
42*99451b44SJordan Rupprecht                    substrs=['a.out'], matching=False, error=True)
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
45*99451b44SJordan Rupprecht        self.expect("file " + exe,
46*99451b44SJordan Rupprecht                    patterns=["Current executable set to .*a.out"])
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        self.expect('targetname',
49*99451b44SJordan Rupprecht                    substrs=['a.out'], matching=True, error=False)
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprecht        # This is the function to remove the custom commands in order to have a
52*99451b44SJordan Rupprecht        # clean slate for the next test case.
53*99451b44SJordan Rupprecht        def cleanup():
54*99451b44SJordan Rupprecht            self.runCmd('command script delete welcome', check=False)
55*99451b44SJordan Rupprecht            self.runCmd('command script delete targetname', check=False)
56*99451b44SJordan Rupprecht            self.runCmd('command script delete longwait', check=False)
57*99451b44SJordan Rupprecht            self.runCmd('command script delete mysto', check=False)
58*99451b44SJordan Rupprecht            self.runCmd('command script delete tell_sync', check=False)
59*99451b44SJordan Rupprecht            self.runCmd('command script delete tell_async', check=False)
60*99451b44SJordan Rupprecht            self.runCmd('command script delete tell_curr', check=False)
61*99451b44SJordan Rupprecht            self.runCmd('command script delete bug11569', check=False)
62*99451b44SJordan Rupprecht            self.runCmd('command script delete takes_exe_ctx', check=False)
63*99451b44SJordan Rupprecht            self.runCmd('command script delete decorated', check=False)
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht        # Execute the cleanup function during test case tear down.
66*99451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht        # Interact with debugger in synchronous mode
69*99451b44SJordan Rupprecht        self.setAsync(False)
70*99451b44SJordan Rupprecht
71*99451b44SJordan Rupprecht        # We don't want to display the stdout if not in TraceOn() mode.
72*99451b44SJordan Rupprecht        if not self.TraceOn():
73*99451b44SJordan Rupprecht            self.HideStdout()
74*99451b44SJordan Rupprecht
75*99451b44SJordan Rupprecht        self.expect('welcome Enrico',
76*99451b44SJordan Rupprecht                    substrs=['Hello Enrico, welcome to LLDB'])
77*99451b44SJordan Rupprecht
78*99451b44SJordan Rupprecht        self.expect("help welcome",
79*99451b44SJordan Rupprecht                    substrs=['Just a docstring for welcome_impl',
80*99451b44SJordan Rupprecht                             'A command that says hello to LLDB users'])
81*99451b44SJordan Rupprecht
82*99451b44SJordan Rupprecht        decorated_commands = ["decorated" + str(n) for n in range(1, 5)]
83*99451b44SJordan Rupprecht        for name in decorated_commands:
84*99451b44SJordan Rupprecht            self.expect(name, substrs=["hello from " + name])
85*99451b44SJordan Rupprecht            self.expect("help " + name,
86*99451b44SJordan Rupprecht                        substrs=["Python command defined by @lldb.command"])
87*99451b44SJordan Rupprecht
88*99451b44SJordan Rupprecht        self.expect("help",
89*99451b44SJordan Rupprecht                    substrs=['For more information run']
90*99451b44SJordan Rupprecht                             + decorated_commands + ['welcome'])
91*99451b44SJordan Rupprecht
92*99451b44SJordan Rupprecht        self.expect("help -a",
93*99451b44SJordan Rupprecht                    substrs=['For more information run']
94*99451b44SJordan Rupprecht                             + decorated_commands + ['welcome'])
95*99451b44SJordan Rupprecht
96*99451b44SJordan Rupprecht        self.expect("help -u", matching=False,
97*99451b44SJordan Rupprecht                    substrs=['For more information run'])
98*99451b44SJordan Rupprecht
99*99451b44SJordan Rupprecht        self.runCmd("command script delete welcome")
100*99451b44SJordan Rupprecht
101*99451b44SJordan Rupprecht        self.expect('welcome Enrico', matching=False, error=True,
102*99451b44SJordan Rupprecht                    substrs=['Hello Enrico, welcome to LLDB'])
103*99451b44SJordan Rupprecht
104*99451b44SJordan Rupprecht        self.expect('targetname fail', error=True,
105*99451b44SJordan Rupprecht                    substrs=['a test for error in command'])
106*99451b44SJordan Rupprecht
107*99451b44SJordan Rupprecht        self.expect('command script list',
108*99451b44SJordan Rupprecht                    substrs=['targetname',
109*99451b44SJordan Rupprecht                             'For more information run'])
110*99451b44SJordan Rupprecht
111*99451b44SJordan Rupprecht        self.expect("help targetname",
112*99451b44SJordan Rupprecht                    substrs=['Expects', '\'raw\'', 'input',
113*99451b44SJordan Rupprecht                             'help', 'raw-input'])
114*99451b44SJordan Rupprecht
115*99451b44SJordan Rupprecht        self.expect("longwait",
116*99451b44SJordan Rupprecht                    substrs=['Done; if you saw the delays I am doing OK'])
117*99451b44SJordan Rupprecht
118*99451b44SJordan Rupprecht        self.runCmd("b main")
119*99451b44SJordan Rupprecht        self.runCmd("run")
120*99451b44SJordan Rupprecht        self.runCmd("mysto 3")
121*99451b44SJordan Rupprecht        self.expect("frame variable array",
122*99451b44SJordan Rupprecht                    substrs=['[0] = 79630', '[1] = 388785018', '[2] = 0'])
123*99451b44SJordan Rupprecht        self.runCmd("mysto 3")
124*99451b44SJordan Rupprecht        self.expect("frame variable array",
125*99451b44SJordan Rupprecht                    substrs=['[0] = 79630', '[4] = 388785018', '[5] = 0'])
126*99451b44SJordan Rupprecht
127*99451b44SJordan Rupprecht# we cannot use the stepover command to check for async execution mode since LLDB
128*99451b44SJordan Rupprecht# seems to get confused when events start to queue up
129*99451b44SJordan Rupprecht        self.expect("tell_sync",
130*99451b44SJordan Rupprecht                    substrs=['running sync'])
131*99451b44SJordan Rupprecht        self.expect("tell_async",
132*99451b44SJordan Rupprecht                    substrs=['running async'])
133*99451b44SJordan Rupprecht        self.expect("tell_curr",
134*99451b44SJordan Rupprecht                    substrs=['I am running sync'])
135*99451b44SJordan Rupprecht
136*99451b44SJordan Rupprecht# check that the execution context is passed in to commands that ask for it
137*99451b44SJordan Rupprecht        self.expect("takes_exe_ctx", substrs=["a.out"])
138*99451b44SJordan Rupprecht
139*99451b44SJordan Rupprecht        # Test that a python command can redefine itself
140*99451b44SJordan Rupprecht        self.expect('command script add -f foobar welcome -h "just some help"')
141*99451b44SJordan Rupprecht
142*99451b44SJordan Rupprecht        self.runCmd("command script clear")
143*99451b44SJordan Rupprecht
144*99451b44SJordan Rupprecht        # Test that re-defining an existing command works
145*99451b44SJordan Rupprecht        self.runCmd(
146*99451b44SJordan Rupprecht            'command script add my_command --class welcome.WelcomeCommand')
147*99451b44SJordan Rupprecht        self.expect('my_command Blah', substrs=['Hello Blah, welcome to LLDB'])
148*99451b44SJordan Rupprecht
149*99451b44SJordan Rupprecht        self.runCmd(
150*99451b44SJordan Rupprecht            'command script add my_command --class welcome.TargetnameCommand')
151*99451b44SJordan Rupprecht        self.expect('my_command', substrs=['a.out'])
152*99451b44SJordan Rupprecht
153*99451b44SJordan Rupprecht        self.runCmd("command script clear")
154*99451b44SJordan Rupprecht
155*99451b44SJordan Rupprecht        self.expect('command script list', matching=False,
156*99451b44SJordan Rupprecht                    substrs=['targetname',
157*99451b44SJordan Rupprecht                             'longwait'])
158*99451b44SJordan Rupprecht
159*99451b44SJordan Rupprecht        self.expect('command script add -f foobar frame', error=True,
160*99451b44SJordan Rupprecht                    substrs=['cannot add command'])
161*99451b44SJordan Rupprecht
162*99451b44SJordan Rupprecht        # http://llvm.org/bugs/show_bug.cgi?id=11569
163*99451b44SJordan Rupprecht        # LLDBSwigPythonCallCommand crashes when a command script returns an
164*99451b44SJordan Rupprecht        # object
165*99451b44SJordan Rupprecht        self.runCmd('command script add -f bug11569 bug11569')
166*99451b44SJordan Rupprecht        # This should not crash.
167*99451b44SJordan Rupprecht        self.runCmd('bug11569', check=False)
168