xref: /llvm-project/lldb/test/API/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py (revision 99451b4453688a94c6014cac233d371ab4cc342d)
1"""
2Test lldb Python API object's default constructor and make sure it is invalid
3after initial construction.
4
5There are also some cases of boundary condition testings sprinkled throughout
6the tests where None is passed to SB API which expects (const char *) in the
7C++ API counterpart.  Passing None should not crash lldb!
8
9There are three exceptions to the above general rules, though; API objects
10SBCommadnReturnObject, SBStream, and SBSymbolContextList, are all valid objects
11after default construction.
12"""
13
14from __future__ import print_function
15
16
17import lldb
18from lldbsuite.test.decorators import *
19from lldbsuite.test.lldbtest import *
20from lldbsuite.test import lldbutil
21
22
23class APIDefaultConstructorTestCase(TestBase):
24
25    mydir = TestBase.compute_mydir(__file__)
26    NO_DEBUG_INFO_TESTCASE = True
27
28    @add_test_categories(['pyapi'])
29    def test_SBAddress(self):
30        obj = lldb.SBAddress()
31        if self.TraceOn():
32            print(obj)
33        self.assertFalse(obj)
34        # Do fuzz testing on the invalid obj, it should not crash lldb.
35        import sb_address
36        sb_address.fuzz_obj(obj)
37
38    @add_test_categories(['pyapi'])
39    def test_SBBlock(self):
40        obj = lldb.SBBlock()
41        if self.TraceOn():
42            print(obj)
43        self.assertFalse(obj)
44        # Do fuzz testing on the invalid obj, it should not crash lldb.
45        import sb_block
46        sb_block.fuzz_obj(obj)
47
48    @add_test_categories(['pyapi'])
49    def test_SBBreakpoint(self):
50        obj = lldb.SBBreakpoint()
51        if self.TraceOn():
52            print(obj)
53        self.assertFalse(obj)
54        # Do fuzz testing on the invalid obj, it should not crash lldb.
55        import sb_breakpoint
56        sb_breakpoint.fuzz_obj(obj)
57
58    @add_test_categories(['pyapi'])
59    def test_SBBreakpointLocation(self):
60        obj = lldb.SBBreakpointLocation()
61        if self.TraceOn():
62            print(obj)
63        self.assertFalse(obj)
64        # Do fuzz testing on the invalid obj, it should not crash lldb.
65        import sb_breakpointlocation
66        sb_breakpointlocation.fuzz_obj(obj)
67
68    @add_test_categories(['pyapi'])
69    def test_SBBreakpointName(self):
70        obj = lldb.SBBreakpointName()
71        if self.TraceOn():
72            print(obj)
73        self.assertFalse(obj)
74        # Do fuzz testing on the invalid obj, it should not crash lldb.
75        import sb_breakpointname
76        sb_breakpointname.fuzz_obj(obj)
77
78    @add_test_categories(['pyapi'])
79    def test_SBBroadcaster(self):
80        obj = lldb.SBBroadcaster()
81        if self.TraceOn():
82            print(obj)
83        self.assertFalse(obj)
84        # Do fuzz testing on the invalid obj, it should not crash lldb.
85        import sb_broadcaster
86        sb_broadcaster.fuzz_obj(obj)
87
88    @add_test_categories(['pyapi'])
89    def test_SBCommandReturnObject(self):
90        """SBCommandReturnObject object is valid after default construction."""
91        obj = lldb.SBCommandReturnObject()
92        if self.TraceOn():
93            print(obj)
94        self.assertTrue(obj)
95
96    @add_test_categories(['pyapi'])
97    def test_SBCommunication(self):
98        obj = lldb.SBCommunication()
99        if self.TraceOn():
100            print(obj)
101        self.assertFalse(obj)
102        # Do fuzz testing on the invalid obj, it should not crash lldb.
103        import sb_communication
104        sb_communication.fuzz_obj(obj)
105
106    @add_test_categories(['pyapi'])
107    def test_SBCompileUnit(self):
108        obj = lldb.SBCompileUnit()
109        if self.TraceOn():
110            print(obj)
111        self.assertFalse(obj)
112        # Do fuzz testing on the invalid obj, it should not crash lldb.
113        import sb_compileunit
114        sb_compileunit.fuzz_obj(obj)
115
116    @add_test_categories(['pyapi'])
117    def test_SBDebugger(self):
118        obj = lldb.SBDebugger()
119        if self.TraceOn():
120            print(obj)
121        self.assertFalse(obj)
122        # Do fuzz testing on the invalid obj, it should not crash lldb.
123        import sb_debugger
124        sb_debugger.fuzz_obj(obj)
125
126    @add_test_categories(['pyapi'])
127    # darwin: This test passes with swig 3.0.2, fails w/3.0.5 other tests fail
128    # with 2.0.12 http://llvm.org/pr23488
129    def test_SBError(self):
130        obj = lldb.SBError()
131        if self.TraceOn():
132            print(obj)
133        self.assertFalse(obj)
134        # Do fuzz testing on the invalid obj, it should not crash lldb.
135        import sb_error
136        sb_error.fuzz_obj(obj)
137
138    @add_test_categories(['pyapi'])
139    def test_SBEvent(self):
140        obj = lldb.SBEvent()
141        # This is just to test that typemap, as defined in lldb.swig, works.
142        obj2 = lldb.SBEvent(0, "abc")
143        if self.TraceOn():
144            print(obj)
145        self.assertFalse(obj)
146        # Do fuzz testing on the invalid obj, it should not crash lldb.
147        import sb_event
148        sb_event.fuzz_obj(obj)
149
150    @add_test_categories(['pyapi'])
151    def test_SBFileSpec(self):
152        obj = lldb.SBFileSpec()
153        # This is just to test that FileSpec(None) does not crash.
154        obj2 = lldb.SBFileSpec(None, True)
155        if self.TraceOn():
156            print(obj)
157        self.assertFalse(obj)
158        # Do fuzz testing on the invalid obj, it should not crash lldb.
159        import sb_filespec
160        sb_filespec.fuzz_obj(obj)
161
162    @add_test_categories(['pyapi'])
163    def test_SBFrame(self):
164        obj = lldb.SBFrame()
165        if self.TraceOn():
166            print(obj)
167        self.assertFalse(obj)
168        # Do fuzz testing on the invalid obj, it should not crash lldb.
169        import sb_frame
170        sb_frame.fuzz_obj(obj)
171
172    @add_test_categories(['pyapi'])
173    def test_SBFunction(self):
174        obj = lldb.SBFunction()
175        if self.TraceOn():
176            print(obj)
177        self.assertFalse(obj)
178        # Do fuzz testing on the invalid obj, it should not crash lldb.
179        import sb_function
180        sb_function.fuzz_obj(obj)
181
182    @add_test_categories(['pyapi'])
183    def test_SBFile(self):
184        sbf = lldb.SBFile()
185        self.assertFalse(sbf.IsValid())
186        self.assertFalse(bool(sbf))
187        e, n = sbf.Write(b'foo')
188        self.assertTrue(e.Fail())
189        self.assertEqual(n, 0)
190        buffer = bytearray(100)
191        e, n = sbf.Read(buffer)
192        self.assertEqual(n, 0)
193        self.assertTrue(e.Fail())
194
195    @add_test_categories(['pyapi'])
196    def test_SBInstruction(self):
197        obj = lldb.SBInstruction()
198        if self.TraceOn():
199            print(obj)
200        self.assertFalse(obj)
201        # Do fuzz testing on the invalid obj, it should not crash lldb.
202        import sb_instruction
203        sb_instruction.fuzz_obj(obj)
204
205    @add_test_categories(['pyapi'])
206    def test_SBInstructionList(self):
207        obj = lldb.SBInstructionList()
208        if self.TraceOn():
209            print(obj)
210        self.assertFalse(obj)
211        # Do fuzz testing on the invalid obj, it should not crash lldb.
212        import sb_instructionlist
213        sb_instructionlist.fuzz_obj(obj)
214
215    @add_test_categories(['pyapi'])
216    def test_SBLineEntry(self):
217        obj = lldb.SBLineEntry()
218        if self.TraceOn():
219            print(obj)
220        self.assertFalse(obj)
221        # Do fuzz testing on the invalid obj, it should not crash lldb.
222        import sb_lineentry
223        sb_lineentry.fuzz_obj(obj)
224
225    @add_test_categories(['pyapi'])
226    def test_SBListener(self):
227        obj = lldb.SBListener()
228        if self.TraceOn():
229            print(obj)
230        self.assertFalse(obj)
231        # Do fuzz testing on the invalid obj, it should not crash lldb.
232        import sb_listener
233        sb_listener.fuzz_obj(obj)
234
235    @add_test_categories(['pyapi'])
236    # Py3 asserts due to a bug in SWIG.  Trying to upstream a patch to fix
237    # this in 3.0.8
238    @skipIf(py_version=['>=', (3, 0)], swig_version=['<', (3, 0, 8)])
239    def test_SBModule(self):
240        obj = lldb.SBModule()
241        if self.TraceOn():
242            print(obj)
243        self.assertFalse(obj)
244        # Do fuzz testing on the invalid obj, it should not crash lldb.
245        import sb_module
246        sb_module.fuzz_obj(obj)
247
248    @add_test_categories(['pyapi'])
249    def test_SBProcess(self):
250        obj = lldb.SBProcess()
251        if self.TraceOn():
252            print(obj)
253        self.assertFalse(obj)
254        # Do fuzz testing on the invalid obj, it should not crash lldb.
255        import sb_process
256        sb_process.fuzz_obj(obj)
257
258    @add_test_categories(['pyapi'])
259    def test_SBProcessInfo(self):
260        obj = lldb.SBProcessInfo()
261        if self.TraceOn():
262            print(obj)
263        self.assertFalse(obj)
264        # Do fuzz testing on the invalid obj, it should not crash lldb.
265        import sb_process_info
266        sb_process_info.fuzz_obj(obj)
267
268    @add_test_categories(['pyapi'])
269    def test_SBSection(self):
270        obj = lldb.SBSection()
271        if self.TraceOn():
272            print(obj)
273        self.assertFalse(obj)
274        # Do fuzz testing on the invalid obj, it should not crash lldb.
275        import sb_section
276        sb_section.fuzz_obj(obj)
277
278    @add_test_categories(['pyapi'])
279    def test_SBStream(self):
280        """SBStream object is valid after default construction."""
281        obj = lldb.SBStream()
282        if self.TraceOn():
283            print(obj)
284        self.assertTrue(obj)
285
286    @add_test_categories(['pyapi'])
287    def test_SBStringList(self):
288        obj = lldb.SBStringList()
289        if self.TraceOn():
290            print(obj)
291        self.assertFalse(obj)
292        # Do fuzz testing on the invalid obj, it should not crash lldb.
293        import sb_stringlist
294        sb_stringlist.fuzz_obj(obj)
295
296    @add_test_categories(['pyapi'])
297    def test_SBSymbol(self):
298        obj = lldb.SBSymbol()
299        if self.TraceOn():
300            print(obj)
301        self.assertFalse(obj)
302        # Do fuzz testing on the invalid obj, it should not crash lldb.
303        import sb_symbol
304        sb_symbol.fuzz_obj(obj)
305
306    @add_test_categories(['pyapi'])
307    def test_SBSymbolContext(self):
308        obj = lldb.SBSymbolContext()
309        if self.TraceOn():
310            print(obj)
311        self.assertFalse(obj)
312        # Do fuzz testing on the invalid obj, it should not crash lldb.
313        import sb_symbolcontext
314        sb_symbolcontext.fuzz_obj(obj)
315
316    @add_test_categories(['pyapi'])
317    def test_SBSymbolContextList(self):
318        """SBSymbolContextList object is valid after default construction."""
319        obj = lldb.SBSymbolContextList()
320        if self.TraceOn():
321            print(obj)
322        self.assertTrue(obj)
323
324    @add_test_categories(['pyapi'])
325    def test_SBTarget(self):
326        obj = lldb.SBTarget()
327        if self.TraceOn():
328            print(obj)
329        self.assertFalse(obj)
330        # Do fuzz testing on the invalid obj, it should not crash lldb.
331        import sb_target
332        sb_target.fuzz_obj(obj)
333
334    @add_test_categories(['pyapi'])
335    def test_SBThread(self):
336        obj = lldb.SBThread()
337        if self.TraceOn():
338            print(obj)
339        self.assertFalse(obj)
340        # Do fuzz testing on the invalid obj, it should not crash lldb.
341        import sb_thread
342        sb_thread.fuzz_obj(obj)
343
344    @add_test_categories(['pyapi'])
345    def test_SBType(self):
346        try:
347            obj = lldb.SBType()
348            if self.TraceOn():
349                print(obj)
350            self.assertFalse(obj)
351            # If we reach here, the test fails.
352            self.fail("lldb.SBType() should fail, not succeed!")
353        except:
354            # Exception is expected.
355            return
356
357        # Unreachable code because lldb.SBType() should fail.
358        # Do fuzz testing on the invalid obj, it should not crash lldb.
359        import sb_type
360        sb_type.fuzz_obj(obj)
361
362    @add_test_categories(['pyapi'])
363    def test_SBTypeList(self):
364        """SBTypeList object is valid after default construction."""
365        obj = lldb.SBTypeList()
366        if self.TraceOn():
367            print(obj)
368        self.assertTrue(obj)
369
370    @add_test_categories(['pyapi'])
371    def test_SBValue(self):
372        obj = lldb.SBValue()
373        if self.TraceOn():
374            print(obj)
375        self.assertFalse(obj)
376        # Do fuzz testing on the invalid obj, it should not crash lldb.
377        import sb_value
378        sb_value.fuzz_obj(obj)
379
380    @add_test_categories(['pyapi'])
381    def test_SBValueList(self):
382        obj = lldb.SBValueList()
383        if self.TraceOn():
384            print(obj)
385        self.assertFalse(obj)
386        # Do fuzz testing on the invalid obj, it should not crash lldb.
387        import sb_valuelist
388        sb_valuelist.fuzz_obj(obj)
389
390    @add_test_categories(['pyapi'])
391    def test_SBWatchpoint(self):
392        obj = lldb.SBWatchpoint()
393        if self.TraceOn():
394            print(obj)
395        self.assertFalse(obj)
396        # Do fuzz testing on the invalid obj, it should not crash lldb.
397        import sb_watchpoint
398        sb_watchpoint.fuzz_obj(obj)
399