aboutsummaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py
blob: 914c3d25fd5d99b493d52494ac4d722ed5603df2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
"""
Test that SBFrame::GetVariables() calls work correctly.
"""

from __future__ import print_function



import os, time
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbplatform
from lldbsuite.test import lldbutil

def get_names_from_value_list(value_list):
    names = list()
    for value in value_list:
        names.append(value.GetName())
    return names

class TestGetVariables(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        self.source = 'main.c'

    def verify_variable_names(self, description, value_list, names):
        copy_names = list(names)
        actual_names = get_names_from_value_list(value_list)
        for name in actual_names:
            if name in copy_names:
                copy_names.remove(name)
            else:
                self.assertTrue(False, "didn't find '%s' in %s" % (name, copy_names))
        self.assertEqual(len(copy_names), 0, "%s: we didn't find variables: %s in value list (%s)" % (description, copy_names, actual_names))

    def test (self):
        self.build ()
        
        # Set debugger into synchronous mode
        self.dbg.SetAsync(False)

        # Create a target by the debugger.
        exe = os.path.join(os.getcwd(), "a.out")
        target = self.dbg.CreateTarget(exe)
        self.assertTrue(target, VALID_TARGET)
                                                                              
        line1 = line_number(self.source, '// breakpoint 1')
        line2 = line_number(self.source, '// breakpoint 2')
        line3 = line_number(self.source, '// breakpoint 3')

        breakpoint1 = target.BreakpointCreateByLocation (self.source, line1);
        breakpoint2 = target.BreakpointCreateByLocation (self.source, line2);
        breakpoint3 = target.BreakpointCreateByLocation (self.source, line3);

        self.assertTrue(breakpoint1.GetNumLocations() >= 1, PROCESS_IS_VALID)
        self.assertTrue(breakpoint2.GetNumLocations() >= 1, PROCESS_IS_VALID)
        self.assertTrue(breakpoint3.GetNumLocations() >= 1, PROCESS_IS_VALID)

        # Register our shared libraries for remote targets so they get automatically uploaded
        arguments = None
        environment = None 

        # Now launch the process, and do not stop at entry point.
        process = target.LaunchSimple (arguments, environment, self.get_process_working_directory())
        self.assertTrue(process, PROCESS_IS_VALID)
        
        threads = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint1)
        self.assertEqual(len(threads), 1, "There should be a thread stopped at breakpoint 1")
                        
        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")
        
        arg_names = ['argc', 'argv']   
        local_names = ['i', 'j', 'k']
        static_names = ['static_var', 'g_global_var', 'g_static_var']
        breakpoint1_locals = ['i']
        breakpoint1_statics = ['static_var']
        num_args = len(arg_names)
        num_locals = len(local_names)
        num_statics = len(static_names)
        args_yes = True
        args_no = False
        locals_yes = True
        locals_no = False
        statics_yes = True
        statics_no = False
        in_scopy_only = True
        ignore_scope = False

        # Verify if we ask for only arguments that we got what we expect
        vars = frame.GetVariables(args_yes, locals_no, statics_no, ignore_scope)
        self.assertEqual(vars.GetSize(), num_args, "There should be %i arguments, but we are reporting %i" % (num_args, vars.GetSize()))    
        self.verify_variable_names("check names of arguments", vars, arg_names)
        self.assertEqual(len(arg_names), num_args, "make sure verify_variable_names() didn't mutate list")

        # Verify if we ask for only locals that we got what we expect
        vars = frame.GetVariables(args_no, locals_yes, statics_no, ignore_scope)   
        self.assertEqual(vars.GetSize(), num_locals, "There should be %i local variables, but we are reporting %i" % (num_locals, vars.GetSize()))    
        self.verify_variable_names("check names of locals", vars, local_names)

        # Verify if we ask for only statics that we got what we expect
        vars = frame.GetVariables(args_no, locals_no, statics_yes, ignore_scope)   
        print('statics: ', str(vars))
        self.assertEqual(vars.GetSize(), num_statics, "There should be %i static variables, but we are reporting %i" % (num_statics, vars.GetSize()))    
        self.verify_variable_names("check names of statics", vars, static_names)

        # Verify if we ask for arguments and locals that we got what we expect
        vars = frame.GetVariables(args_yes, locals_yes, statics_no, ignore_scope)
        desc = 'arguments + locals'
        names = arg_names + local_names
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for arguments and statics that we got what we expect
        vars = frame.GetVariables(args_yes, locals_no, statics_yes, ignore_scope)
        desc = 'arguments + statics'
        names = arg_names + static_names
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for locals and statics that we got what we expect
        vars = frame.GetVariables(args_no, locals_yes, statics_yes, ignore_scope)
        desc = 'locals + statics'
        names = local_names + static_names
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for arguments, locals and statics that we got what we expect
        vars = frame.GetVariables(args_yes, locals_yes, statics_yes, ignore_scope)
        desc = 'arguments + locals + statics'
        names = arg_names + local_names + static_names
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)   
        desc = 'in scope locals at breakpoint 1'
        names = ['i']
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)
                             
        # Continue to breakpoint 2
        process.Continue()
                                     
        threads = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint2)
        self.assertEqual(len(threads), 1, "There should be a thread stopped at breakpoint 2")
                        
        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)   
        desc = 'in scope locals at breakpoint 2'
        names = ['i', 'j']
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)

        # Continue to breakpoint 3
        process.Continue()
                                     
        threads = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint3)
        self.assertEqual(len(threads), 1, "There should be a thread stopped at breakpoint 3")
                        
        thread = threads[0]
        self.assertTrue(thread.IsValid(), "Thread must be valid")
        frame = thread.GetFrameAtIndex(0)
        self.assertTrue(frame.IsValid(), "Frame must be valid")

        # Verify if we ask for in scope locals that we got what we expect
        vars = frame.GetVariables(args_no, locals_yes, statics_no, in_scopy_only)   
        desc = 'in scope locals at breakpoint 3'
        names = ['i', 'j', 'k']
        count = len(names)
        self.assertEqual(vars.GetSize(), count, "There should be %i %s (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), get_names_from_value_list(vars)))    
        self.verify_variable_names("check names of %s" % (desc), vars, names)