1import lldb
2from lldbsuite.test.decorators import *
3from lldbsuite.test.lldbtest import *
4import lldbsuite.test.lldbutil as lldbutil
5
6
7class TestMembersAndLocalsWithSameName(TestBase):
8
9    def test_when_stopped_in_method(self):
10        self._load_exe()
11
12        # Set breakpoints
13        bp1 = self.target.BreakpointCreateBySourceRegex(
14            "Break 1", self.src_file_spec)
15        self.assertTrue(
16            bp1.IsValid() and bp1.GetNumLocations() >= 1,
17            VALID_BREAKPOINT)
18        bp2 = self.target.BreakpointCreateBySourceRegex(
19            "Break 2", self.src_file_spec)
20        self.assertTrue(
21            bp2.IsValid() and bp2.GetNumLocations() >= 1,
22            VALID_BREAKPOINT)
23        bp3 = self.target.BreakpointCreateBySourceRegex(
24            "Break 3", self.src_file_spec)
25        self.assertTrue(
26            bp3.IsValid() and bp3.GetNumLocations() >= 1,
27            VALID_BREAKPOINT)
28        bp4 = self.target.BreakpointCreateBySourceRegex(
29            "Break 4", self.src_file_spec)
30        self.assertTrue(
31            bp4.IsValid() and bp4.GetNumLocations() >= 1,
32            VALID_BREAKPOINT)
33
34        # Launch the process
35        self.process = self.target.LaunchSimple(
36            None, None, self.get_process_working_directory())
37        self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)
38
39        self.assertEqual(
40            self.process.GetState(), lldb.eStateStopped,
41            PROCESS_STOPPED)
42
43        self._test_globals()
44
45        self.process.Continue()
46        self.assertEqual(
47            self.process.GetState(), lldb.eStateStopped,
48            PROCESS_STOPPED)
49        thread = lldbutil.get_stopped_thread(
50            self.process, lldb.eStopReasonBreakpoint)
51        self.assertTrue(thread.IsValid())
52        frame = thread.GetSelectedFrame()
53        self.assertTrue(frame.IsValid())
54
55        val = frame.EvaluateExpression("a")
56        self.assertTrue(val.IsValid())
57        self.assertEqual(val.GetValueAsUnsigned(), 12345)
58
59        val = frame.EvaluateExpression("b")
60        self.assertTrue(val.IsValid())
61        self.assertEqual(val.GetValueAsUnsigned(), 54321)
62
63        val = frame.EvaluateExpression("c")
64        self.assertTrue(val.IsValid())
65        self.assertEqual(val.GetValueAsUnsigned(), 34567)
66
67        self.process.Continue()
68        self.assertEqual(
69            self.process.GetState(), lldb.eStateStopped,
70            PROCESS_STOPPED)
71        thread = lldbutil.get_stopped_thread(
72            self.process, lldb.eStopReasonBreakpoint)
73        self.assertTrue(thread.IsValid())
74        frame = thread.GetSelectedFrame()
75        self.assertTrue(frame.IsValid())
76
77        val = frame.EvaluateExpression("a")
78        self.assertTrue(val.IsValid())
79        self.assertEqual(val.GetValueAsUnsigned(), 10001)
80
81        val = frame.EvaluateExpression("b")
82        self.assertTrue(val.IsValid())
83        self.assertEqual(val.GetValueAsUnsigned(), 10002)
84
85        val = frame.EvaluateExpression("c")
86        self.assertTrue(val.IsValid())
87        self.assertEqual(val.GetValueAsUnsigned(), 10003)
88
89        self.process.Continue()
90        self.assertEqual(
91            self.process.GetState(), lldb.eStateStopped,
92            PROCESS_STOPPED)
93        thread = lldbutil.get_stopped_thread(
94            self.process, lldb.eStopReasonBreakpoint)
95        self.assertTrue(thread.IsValid())
96        frame = thread.GetSelectedFrame()
97        self.assertTrue(frame.IsValid())
98
99        val = frame.EvaluateExpression("a")
100        self.assertTrue(val.IsValid())
101        self.assertEqual(val.GetValueAsUnsigned(), 1)
102
103        val = frame.EvaluateExpression("b")
104        self.assertTrue(val.IsValid())
105        self.assertEqual(val.GetValueAsUnsigned(), 2)
106
107        val = frame.EvaluateExpression("c")
108        self.assertTrue(val.IsValid())
109        self.assertEqual(val.GetValueAsUnsigned(), 778899)
110
111    def test_when_stopped_in_function(self):
112        self._load_exe()
113
114        # Set breakpoints
115        bp1 = self.target.BreakpointCreateBySourceRegex(
116            "Break 1", self.src_file_spec)
117        self.assertTrue(
118            bp1.IsValid() and bp1.GetNumLocations() >= 1,
119            VALID_BREAKPOINT)
120        bp5 = self.target.BreakpointCreateBySourceRegex(
121            "Break 5", self.src_file_spec)
122        self.assertTrue(
123            bp5.IsValid() and bp5.GetNumLocations() >= 1,
124            VALID_BREAKPOINT)
125        bp6 = self.target.BreakpointCreateBySourceRegex(
126            "Break 6", self.src_file_spec)
127        self.assertTrue(
128            bp6.IsValid() and bp6.GetNumLocations() >= 1,
129            VALID_BREAKPOINT)
130        bp7 = self.target.BreakpointCreateBySourceRegex(
131            "Break 7", self.src_file_spec)
132        self.assertTrue(
133            bp7.IsValid() and bp7.GetNumLocations() >= 1,
134            VALID_BREAKPOINT)
135
136        # Launch the process
137        self.process = self.target.LaunchSimple(
138            None, None, self.get_process_working_directory())
139        self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID)
140
141        self.assertEqual(
142            self.process.GetState(), lldb.eStateStopped,
143            PROCESS_STOPPED)
144
145        self._test_globals()
146
147        self.process.Continue()
148        self.assertEqual(
149            self.process.GetState(), lldb.eStateStopped,
150            PROCESS_STOPPED)
151        thread = lldbutil.get_stopped_thread(
152            self.process, lldb.eStopReasonBreakpoint)
153        self.assertTrue(thread.IsValid())
154        frame = thread.GetSelectedFrame()
155        self.assertTrue(frame.IsValid())
156
157        self.enable_expression_log()
158        val = frame.EvaluateExpression("a")
159        self.disable_expression_log_and_check_for_locals(['a'])
160        self.assertTrue(val.IsValid())
161        self.assertEqual(val.GetValueAsUnsigned(), 12345)
162
163        val = frame.EvaluateExpression("b")
164        self.assertTrue(val.IsValid())
165        self.assertEqual(val.GetValueAsUnsigned(), 54321)
166
167        val = frame.EvaluateExpression("c")
168        self.assertTrue(val.IsValid())
169        self.assertEqual(val.GetValueAsUnsigned(), 34567)
170
171        self.process.Continue()
172        self.assertEqual(
173            self.process.GetState(), lldb.eStateStopped,
174            PROCESS_STOPPED)
175        thread = lldbutil.get_stopped_thread(
176            self.process, lldb.eStopReasonBreakpoint)
177        self.assertTrue(thread.IsValid())
178        frame = thread.GetSelectedFrame()
179        self.assertTrue(frame.IsValid())
180
181        val = frame.EvaluateExpression("a")
182        self.assertTrue(val.IsValid())
183        self.assertEqual(val.GetValueAsUnsigned(), 10001)
184
185        val = frame.EvaluateExpression("b")
186        self.assertTrue(val.IsValid())
187        self.assertEqual(val.GetValueAsUnsigned(), 10002)
188
189        val = frame.EvaluateExpression("c")
190        self.assertTrue(val.IsValid())
191        self.assertEqual(val.GetValueAsUnsigned(), 10003)
192
193        self.enable_expression_log()
194        val = frame.EvaluateExpression("c-b")
195        self.disable_expression_log_and_check_for_locals(['c','b'])
196        self.assertTrue(val.IsValid())
197        self.assertEqual(val.GetValueAsUnsigned(), 1)
198
199        self.process.Continue()
200        self.assertEqual(
201            self.process.GetState(), lldb.eStateStopped,
202            PROCESS_STOPPED)
203        thread = lldbutil.get_stopped_thread(
204            self.process, lldb.eStopReasonBreakpoint)
205        self.assertTrue(thread.IsValid())
206        frame = thread.GetSelectedFrame()
207        self.assertTrue(frame.IsValid())
208
209        val = frame.EvaluateExpression("a")
210        self.assertTrue(val.IsValid())
211        self.assertEqual(val.GetValueAsUnsigned(), 1)
212
213        val = frame.EvaluateExpression("b")
214        self.assertTrue(val.IsValid())
215        self.assertEqual(val.GetValueAsUnsigned(), 2)
216
217        val = frame.EvaluateExpression("c")
218        self.assertTrue(val.IsValid())
219        self.assertEqual(val.GetValueAsUnsigned(), 778899)
220
221        self.enable_expression_log()
222        val = frame.EvaluateExpression("a+b")
223        self.disable_expression_log_and_check_for_locals(['a','b'])
224        self.assertTrue(val.IsValid())
225        self.assertEqual(val.GetValueAsUnsigned(), 3)
226
227
228    def _load_exe(self):
229        self.build()
230
231        cwd = os.getcwd()
232
233        src_file = os.path.join(cwd, "main.cpp")
234        self.src_file_spec = lldb.SBFileSpec(src_file)
235        self.assertTrue(self.src_file_spec.IsValid(), "breakpoint file")
236
237        # Get the path of the executable
238        exe_path = self.getBuildArtifact("a.out")
239
240        # Load the executable
241        self.target = self.dbg.CreateTarget(exe_path)
242        self.assertTrue(self.target.IsValid(), VALID_TARGET)
243
244    def _test_globals(self):
245        thread = lldbutil.get_stopped_thread(
246            self.process, lldb.eStopReasonBreakpoint)
247        self.assertTrue(thread.IsValid())
248        frame = thread.GetSelectedFrame()
249        self.assertTrue(frame.IsValid())
250
251        self.enable_expression_log()
252        val = frame.EvaluateExpression("a")
253        self.disable_expression_log_and_check_for_locals([])
254        self.assertTrue(val.IsValid())
255        self.assertEqual(val.GetValueAsUnsigned(), 112233)
256
257        val = frame.EvaluateExpression("b")
258        self.assertTrue(val.IsValid())
259        self.assertEqual(val.GetValueAsUnsigned(), 445566)
260
261        val = frame.EvaluateExpression("c")
262        self.assertTrue(val.IsValid())
263        self.assertEqual(val.GetValueAsUnsigned(), 778899)
264
265    def enable_expression_log(self):
266        log_file = self.getBuildArtifact("expr.log")
267        self.runCmd("log enable  -f '%s' lldb expr" % (log_file))
268
269    def disable_expression_log_and_check_for_locals(self, variables):
270        log_file = self.getBuildArtifact("expr.log")
271        self.runCmd("log disable lldb expr")
272        local_var_regex = re.compile(r".*__lldb_local_vars::(.*);")
273        matched = []
274        with open(log_file, 'r') as log:
275            for line in log:
276                if line.find('LLDB_BODY_START') != -1:
277                    break
278                m = re.match(local_var_regex, line)
279                if m:
280                    self.assertIn(m.group(1), variables)
281                    matched.append(m.group(1))
282        self.assertEqual([item for item in variables if item not in matched],
283                         [])
284