1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest that SBFrame::GetVariables() calls work correctly.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtfrom __future__ import print_function
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbplatform
12*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprechtdef get_names_from_value_list(value_list):
16*99451b44SJordan Rupprecht    names = list()
17*99451b44SJordan Rupprecht    for value in value_list:
18*99451b44SJordan Rupprecht        names.append(value.GetName())
19*99451b44SJordan Rupprecht    return names
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprechtclass TestGetVariables(TestBase):
23*99451b44SJordan Rupprecht
24*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
25*99451b44SJordan Rupprecht
26*99451b44SJordan Rupprecht    def setUp(self):
27*99451b44SJordan Rupprecht        # Call super's setUp().
28*99451b44SJordan Rupprecht        TestBase.setUp(self)
29*99451b44SJordan Rupprecht        self.source = 'main.c'
30*99451b44SJordan Rupprecht
31*99451b44SJordan Rupprecht    def verify_variable_names(self, description, value_list, names):
32*99451b44SJordan Rupprecht        copy_names = list(names)
33*99451b44SJordan Rupprecht        actual_names = get_names_from_value_list(value_list)
34*99451b44SJordan Rupprecht        for name in actual_names:
35*99451b44SJordan Rupprecht            if name in copy_names:
36*99451b44SJordan Rupprecht                copy_names.remove(name)
37*99451b44SJordan Rupprecht            else:
38*99451b44SJordan Rupprecht                self.assertTrue(
39*99451b44SJordan Rupprecht                    False, "didn't find '%s' in %s" %
40*99451b44SJordan Rupprecht                    (name, copy_names))
41*99451b44SJordan Rupprecht        self.assertEqual(
42*99451b44SJordan Rupprecht            len(copy_names), 0, "%s: we didn't find variables: %s in value list (%s)" %
43*99451b44SJordan Rupprecht            (description, copy_names, actual_names))
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht    def test(self):
46*99451b44SJordan Rupprecht        self.build()
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        # Set debugger into synchronous mode
49*99451b44SJordan Rupprecht        self.dbg.SetAsync(False)
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprecht        # Create a target by the debugger.
52*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
53*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
54*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
55*99451b44SJordan Rupprecht
56*99451b44SJordan Rupprecht        line1 = line_number(self.source, '// breakpoint 1')
57*99451b44SJordan Rupprecht        line2 = line_number(self.source, '// breakpoint 2')
58*99451b44SJordan Rupprecht        line3 = line_number(self.source, '// breakpoint 3')
59*99451b44SJordan Rupprecht
60*99451b44SJordan Rupprecht        breakpoint1 = target.BreakpointCreateByLocation(self.source, line1)
61*99451b44SJordan Rupprecht        breakpoint2 = target.BreakpointCreateByLocation(self.source, line2)
62*99451b44SJordan Rupprecht        breakpoint3 = target.BreakpointCreateByLocation(self.source, line3)
63*99451b44SJordan Rupprecht
64*99451b44SJordan Rupprecht        self.assertTrue(breakpoint1.GetNumLocations() >= 1, PROCESS_IS_VALID)
65*99451b44SJordan Rupprecht        self.assertTrue(breakpoint2.GetNumLocations() >= 1, PROCESS_IS_VALID)
66*99451b44SJordan Rupprecht        self.assertTrue(breakpoint3.GetNumLocations() >= 1, PROCESS_IS_VALID)
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht        # Register our shared libraries for remote targets so they get
69*99451b44SJordan Rupprecht        # automatically uploaded
70*99451b44SJordan Rupprecht        arguments = None
71*99451b44SJordan Rupprecht        environment = None
72*99451b44SJordan Rupprecht
73*99451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
74*99451b44SJordan Rupprecht        process = target.LaunchSimple(
75*99451b44SJordan Rupprecht            arguments, environment, self.get_process_working_directory())
76*99451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
77*99451b44SJordan Rupprecht
78*99451b44SJordan Rupprecht        threads = lldbutil.get_threads_stopped_at_breakpoint(
79*99451b44SJordan Rupprecht            process, breakpoint1)
80*99451b44SJordan Rupprecht        self.assertEqual(
81*99451b44SJordan Rupprecht            len(threads),
82*99451b44SJordan Rupprecht            1,
83*99451b44SJordan Rupprecht            "There should be a thread stopped at breakpoint 1")
84*99451b44SJordan Rupprecht
85*99451b44SJordan Rupprecht        thread = threads[0]
86*99451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
87*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
88*99451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
89*99451b44SJordan Rupprecht
90*99451b44SJordan Rupprecht        arg_names = ['argc', 'argv']
91*99451b44SJordan Rupprecht        local_names = ['i', 'j', 'k']
92*99451b44SJordan Rupprecht        static_names = ['static_var', 'g_global_var', 'g_static_var']
93*99451b44SJordan Rupprecht        breakpoint1_locals = ['i']
94*99451b44SJordan Rupprecht        breakpoint1_statics = ['static_var']
95*99451b44SJordan Rupprecht        num_args = len(arg_names)
96*99451b44SJordan Rupprecht        num_locals = len(local_names)
97*99451b44SJordan Rupprecht        num_statics = len(static_names)
98*99451b44SJordan Rupprecht        args_yes = True
99*99451b44SJordan Rupprecht        args_no = False
100*99451b44SJordan Rupprecht        locals_yes = True
101*99451b44SJordan Rupprecht        locals_no = False
102*99451b44SJordan Rupprecht        statics_yes = True
103*99451b44SJordan Rupprecht        statics_no = False
104*99451b44SJordan Rupprecht        in_scopy_only = True
105*99451b44SJordan Rupprecht        ignore_scope = False
106*99451b44SJordan Rupprecht
107*99451b44SJordan Rupprecht        # Verify if we ask for only arguments that we got what we expect
108*99451b44SJordan Rupprecht        vars = frame.GetVariables(
109*99451b44SJordan Rupprecht            args_yes, locals_no, statics_no, ignore_scope)
110*99451b44SJordan Rupprecht        self.assertEqual(
111*99451b44SJordan Rupprecht            vars.GetSize(),
112*99451b44SJordan Rupprecht            num_args,
113*99451b44SJordan Rupprecht            "There should be %i arguments, but we are reporting %i" %
114*99451b44SJordan Rupprecht            (num_args,
115*99451b44SJordan Rupprecht             vars.GetSize()))
116*99451b44SJordan Rupprecht        self.verify_variable_names("check names of arguments", vars, arg_names)
117*99451b44SJordan Rupprecht        self.assertEqual(
118*99451b44SJordan Rupprecht            len(arg_names),
119*99451b44SJordan Rupprecht            num_args,
120*99451b44SJordan Rupprecht            "make sure verify_variable_names() didn't mutate list")
121*99451b44SJordan Rupprecht
122*99451b44SJordan Rupprecht        # Verify if we ask for only locals that we got what we expect
123*99451b44SJordan Rupprecht        vars = frame.GetVariables(
124*99451b44SJordan Rupprecht            args_no, locals_yes, statics_no, ignore_scope)
125*99451b44SJordan Rupprecht        self.assertEqual(
126*99451b44SJordan Rupprecht            vars.GetSize(),
127*99451b44SJordan Rupprecht            num_locals,
128*99451b44SJordan Rupprecht            "There should be %i local variables, but we are reporting %i" %
129*99451b44SJordan Rupprecht            (num_locals,
130*99451b44SJordan Rupprecht             vars.GetSize()))
131*99451b44SJordan Rupprecht        self.verify_variable_names("check names of locals", vars, local_names)
132*99451b44SJordan Rupprecht
133*99451b44SJordan Rupprecht        # Verify if we ask for only statics that we got what we expect
134*99451b44SJordan Rupprecht        vars = frame.GetVariables(
135*99451b44SJordan Rupprecht            args_no, locals_no, statics_yes, ignore_scope)
136*99451b44SJordan Rupprecht        print('statics: ', str(vars))
137*99451b44SJordan Rupprecht        self.assertEqual(
138*99451b44SJordan Rupprecht            vars.GetSize(),
139*99451b44SJordan Rupprecht            num_statics,
140*99451b44SJordan Rupprecht            "There should be %i static variables, but we are reporting %i" %
141*99451b44SJordan Rupprecht            (num_statics,
142*99451b44SJordan Rupprecht             vars.GetSize()))
143*99451b44SJordan Rupprecht        self.verify_variable_names(
144*99451b44SJordan Rupprecht            "check names of statics", vars, static_names)
145*99451b44SJordan Rupprecht
146*99451b44SJordan Rupprecht        # Verify if we ask for arguments and locals that we got what we expect
147*99451b44SJordan Rupprecht        vars = frame.GetVariables(
148*99451b44SJordan Rupprecht            args_yes, locals_yes, statics_no, ignore_scope)
149*99451b44SJordan Rupprecht        desc = 'arguments + locals'
150*99451b44SJordan Rupprecht        names = arg_names + local_names
151*99451b44SJordan Rupprecht        count = len(names)
152*99451b44SJordan Rupprecht        self.assertEqual(
153*99451b44SJordan Rupprecht            vars.GetSize(),
154*99451b44SJordan Rupprecht            count,
155*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
156*99451b44SJordan Rupprecht            (count,
157*99451b44SJordan Rupprecht             desc,
158*99451b44SJordan Rupprecht             names,
159*99451b44SJordan Rupprecht             vars.GetSize(),
160*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
161*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
162*99451b44SJordan Rupprecht
163*99451b44SJordan Rupprecht        # Verify if we ask for arguments and statics that we got what we expect
164*99451b44SJordan Rupprecht        vars = frame.GetVariables(
165*99451b44SJordan Rupprecht            args_yes, locals_no, statics_yes, ignore_scope)
166*99451b44SJordan Rupprecht        desc = 'arguments + statics'
167*99451b44SJordan Rupprecht        names = arg_names + static_names
168*99451b44SJordan Rupprecht        count = len(names)
169*99451b44SJordan Rupprecht        self.assertEqual(
170*99451b44SJordan Rupprecht            vars.GetSize(),
171*99451b44SJordan Rupprecht            count,
172*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
173*99451b44SJordan Rupprecht            (count,
174*99451b44SJordan Rupprecht             desc,
175*99451b44SJordan Rupprecht             names,
176*99451b44SJordan Rupprecht             vars.GetSize(),
177*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
178*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
179*99451b44SJordan Rupprecht
180*99451b44SJordan Rupprecht        # Verify if we ask for locals and statics that we got what we expect
181*99451b44SJordan Rupprecht        vars = frame.GetVariables(
182*99451b44SJordan Rupprecht            args_no, locals_yes, statics_yes, ignore_scope)
183*99451b44SJordan Rupprecht        desc = 'locals + statics'
184*99451b44SJordan Rupprecht        names = local_names + static_names
185*99451b44SJordan Rupprecht        count = len(names)
186*99451b44SJordan Rupprecht        self.assertEqual(
187*99451b44SJordan Rupprecht            vars.GetSize(),
188*99451b44SJordan Rupprecht            count,
189*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
190*99451b44SJordan Rupprecht            (count,
191*99451b44SJordan Rupprecht             desc,
192*99451b44SJordan Rupprecht             names,
193*99451b44SJordan Rupprecht             vars.GetSize(),
194*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
195*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
196*99451b44SJordan Rupprecht
197*99451b44SJordan Rupprecht        # Verify if we ask for arguments, locals and statics that we got what
198*99451b44SJordan Rupprecht        # we expect
199*99451b44SJordan Rupprecht        vars = frame.GetVariables(
200*99451b44SJordan Rupprecht            args_yes, locals_yes, statics_yes, ignore_scope)
201*99451b44SJordan Rupprecht        desc = 'arguments + locals + statics'
202*99451b44SJordan Rupprecht        names = arg_names + local_names + static_names
203*99451b44SJordan Rupprecht        count = len(names)
204*99451b44SJordan Rupprecht        self.assertEqual(
205*99451b44SJordan Rupprecht            vars.GetSize(),
206*99451b44SJordan Rupprecht            count,
207*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
208*99451b44SJordan Rupprecht            (count,
209*99451b44SJordan Rupprecht             desc,
210*99451b44SJordan Rupprecht             names,
211*99451b44SJordan Rupprecht             vars.GetSize(),
212*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
213*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
214*99451b44SJordan Rupprecht
215*99451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
216*99451b44SJordan Rupprecht        vars = frame.GetVariables(
217*99451b44SJordan Rupprecht            args_no, locals_yes, statics_no, in_scopy_only)
218*99451b44SJordan Rupprecht        desc = 'in scope locals at breakpoint 1'
219*99451b44SJordan Rupprecht        names = ['i']
220*99451b44SJordan Rupprecht        count = len(names)
221*99451b44SJordan Rupprecht        self.assertEqual(
222*99451b44SJordan Rupprecht            vars.GetSize(),
223*99451b44SJordan Rupprecht            count,
224*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
225*99451b44SJordan Rupprecht            (count,
226*99451b44SJordan Rupprecht             desc,
227*99451b44SJordan Rupprecht             names,
228*99451b44SJordan Rupprecht             vars.GetSize(),
229*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
230*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
231*99451b44SJordan Rupprecht
232*99451b44SJordan Rupprecht        # Continue to breakpoint 2
233*99451b44SJordan Rupprecht        process.Continue()
234*99451b44SJordan Rupprecht
235*99451b44SJordan Rupprecht        threads = lldbutil.get_threads_stopped_at_breakpoint(
236*99451b44SJordan Rupprecht            process, breakpoint2)
237*99451b44SJordan Rupprecht        self.assertEqual(
238*99451b44SJordan Rupprecht            len(threads),
239*99451b44SJordan Rupprecht            1,
240*99451b44SJordan Rupprecht            "There should be a thread stopped at breakpoint 2")
241*99451b44SJordan Rupprecht
242*99451b44SJordan Rupprecht        thread = threads[0]
243*99451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
244*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
245*99451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
246*99451b44SJordan Rupprecht
247*99451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
248*99451b44SJordan Rupprecht        vars = frame.GetVariables(
249*99451b44SJordan Rupprecht            args_no, locals_yes, statics_no, in_scopy_only)
250*99451b44SJordan Rupprecht        desc = 'in scope locals at breakpoint 2'
251*99451b44SJordan Rupprecht        names = ['i', 'j']
252*99451b44SJordan Rupprecht        count = len(names)
253*99451b44SJordan Rupprecht        self.assertEqual(
254*99451b44SJordan Rupprecht            vars.GetSize(),
255*99451b44SJordan Rupprecht            count,
256*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
257*99451b44SJordan Rupprecht            (count,
258*99451b44SJordan Rupprecht             desc,
259*99451b44SJordan Rupprecht             names,
260*99451b44SJordan Rupprecht             vars.GetSize(),
261*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
262*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
263*99451b44SJordan Rupprecht
264*99451b44SJordan Rupprecht        # Continue to breakpoint 3
265*99451b44SJordan Rupprecht        process.Continue()
266*99451b44SJordan Rupprecht
267*99451b44SJordan Rupprecht        threads = lldbutil.get_threads_stopped_at_breakpoint(
268*99451b44SJordan Rupprecht            process, breakpoint3)
269*99451b44SJordan Rupprecht        self.assertEqual(
270*99451b44SJordan Rupprecht            len(threads),
271*99451b44SJordan Rupprecht            1,
272*99451b44SJordan Rupprecht            "There should be a thread stopped at breakpoint 3")
273*99451b44SJordan Rupprecht
274*99451b44SJordan Rupprecht        thread = threads[0]
275*99451b44SJordan Rupprecht        self.assertTrue(thread.IsValid(), "Thread must be valid")
276*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
277*99451b44SJordan Rupprecht        self.assertTrue(frame.IsValid(), "Frame must be valid")
278*99451b44SJordan Rupprecht
279*99451b44SJordan Rupprecht        # Verify if we ask for in scope locals that we got what we expect
280*99451b44SJordan Rupprecht        vars = frame.GetVariables(
281*99451b44SJordan Rupprecht            args_no, locals_yes, statics_no, in_scopy_only)
282*99451b44SJordan Rupprecht        desc = 'in scope locals at breakpoint 3'
283*99451b44SJordan Rupprecht        names = ['i', 'j', 'k']
284*99451b44SJordan Rupprecht        count = len(names)
285*99451b44SJordan Rupprecht        self.assertEqual(
286*99451b44SJordan Rupprecht            vars.GetSize(),
287*99451b44SJordan Rupprecht            count,
288*99451b44SJordan Rupprecht            "There should be %i %s (%s) but we are reporting %i (%s)" %
289*99451b44SJordan Rupprecht            (count,
290*99451b44SJordan Rupprecht             desc,
291*99451b44SJordan Rupprecht             names,
292*99451b44SJordan Rupprecht             vars.GetSize(),
293*99451b44SJordan Rupprecht             get_names_from_value_list(vars)))
294*99451b44SJordan Rupprecht        self.verify_variable_names("check names of %s" % (desc), vars, names)
295