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