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
14import os, time
15import re
16import unittest2
17import lldb, lldbutil
18from lldbtest import *
19
20class APIDefaultConstructorTestCase(TestBase):
21
22    mydir = os.path.join("python_api", "default-constructor")
23
24    @python_api_test
25    def test_SBAddress(self):
26        obj = lldb.SBAddress()
27        if self.TraceOn():
28            print obj
29        self.assertFalse(obj)
30        # Do fuzz testing on the invalid obj, it should not crash lldb.
31        import sb_address
32        sb_address.fuzz_obj(obj)
33
34    @python_api_test
35    def test_SBBlock(self):
36        obj = lldb.SBBlock()
37        if self.TraceOn():
38            print obj
39        self.assertFalse(obj)
40        # Do fuzz testing on the invalid obj, it should not crash lldb.
41        import sb_block
42        sb_block.fuzz_obj(obj)
43
44    @python_api_test
45    def test_SBBreakpoint(self):
46        obj = lldb.SBBreakpoint()
47        if self.TraceOn():
48            print obj
49        self.assertFalse(obj)
50        # Do fuzz testing on the invalid obj, it should not crash lldb.
51        import sb_breakpoint
52        sb_breakpoint.fuzz_obj(obj)
53
54    @python_api_test
55    def test_SBBreakpointLocation(self):
56        obj = lldb.SBBreakpointLocation()
57        if self.TraceOn():
58            print obj
59        self.assertFalse(obj)
60        # Do fuzz testing on the invalid obj, it should not crash lldb.
61        import sb_breakpointlocation
62        sb_breakpointlocation.fuzz_obj(obj)
63
64    @python_api_test
65    def test_SBBroadcaster(self):
66        obj = lldb.SBBroadcaster()
67        if self.TraceOn():
68            print obj
69        self.assertFalse(obj)
70        # Do fuzz testing on the invalid obj, it should not crash lldb.
71        import sb_broadcaster
72        sb_broadcaster.fuzz_obj(obj)
73
74    @python_api_test
75    def test_SBCommandReturnObject(self):
76        """SBCommandReturnObject object is valid after default construction."""
77        obj = lldb.SBCommandReturnObject()
78        if self.TraceOn():
79            print obj
80        self.assertTrue(obj)
81
82    @python_api_test
83    def test_SBCommunication(self):
84        obj = lldb.SBCommunication()
85        if self.TraceOn():
86            print obj
87        self.assertFalse(obj)
88        # Do fuzz testing on the invalid obj, it should not crash lldb.
89        import sb_communication
90        sb_communication.fuzz_obj(obj)
91
92    @python_api_test
93    def test_SBCompileUnit(self):
94        obj = lldb.SBCompileUnit()
95        if self.TraceOn():
96            print obj
97        self.assertFalse(obj)
98        # Do fuzz testing on the invalid obj, it should not crash lldb.
99        import sb_compileunit
100        sb_compileunit.fuzz_obj(obj)
101
102    @python_api_test
103    def test_SBDebugger(self):
104        obj = lldb.SBDebugger()
105        if self.TraceOn():
106            print obj
107        self.assertFalse(obj)
108        # Do fuzz testing on the invalid obj, it should not crash lldb.
109        import sb_debugger
110        sb_debugger.fuzz_obj(obj)
111
112    @python_api_test
113    def test_SBError(self):
114        obj = lldb.SBError()
115        if self.TraceOn():
116            print obj
117        self.assertFalse(obj)
118        # Do fuzz testing on the invalid obj, it should not crash lldb.
119        import sb_error
120        sb_error.fuzz_obj(obj)
121
122    @python_api_test
123    def test_SBEvent(self):
124        obj = lldb.SBEvent()
125        # This is just to test that typemap, as defined in lldb.swig, works.
126        obj2 = lldb.SBEvent(0, "abc")
127        if self.TraceOn():
128            print obj
129        self.assertFalse(obj)
130        # Do fuzz testing on the invalid obj, it should not crash lldb.
131        import sb_event
132        sb_event.fuzz_obj(obj)
133
134    @python_api_test
135    def test_SBFileSpec(self):
136        obj = lldb.SBFileSpec()
137        # This is just to test that FileSpec(None) does not crash.
138        obj2 = lldb.SBFileSpec(None, True)
139        if self.TraceOn():
140            print obj
141        self.assertFalse(obj)
142        # Do fuzz testing on the invalid obj, it should not crash lldb.
143        import sb_filespec
144        sb_filespec.fuzz_obj(obj)
145
146    @python_api_test
147    def test_SBFrame(self):
148        obj = lldb.SBFrame()
149        if self.TraceOn():
150            print obj
151        self.assertFalse(obj)
152        # Do fuzz testing on the invalid obj, it should not crash lldb.
153        import sb_frame
154        sb_frame.fuzz_obj(obj)
155
156    @python_api_test
157    def test_SBFunction(self):
158        obj = lldb.SBFunction()
159        if self.TraceOn():
160            print obj
161        self.assertFalse(obj)
162        # Do fuzz testing on the invalid obj, it should not crash lldb.
163        import sb_function
164        sb_function.fuzz_obj(obj)
165
166    @python_api_test
167    def test_SBInputReader(self):
168        obj = lldb.SBInputReader()
169        if self.TraceOn():
170            print obj
171        self.assertFalse(obj)
172        # Do fuzz testing on the invalid obj, it should not crash lldb.
173        import sb_inputreader
174        sb_inputreader.fuzz_obj(obj)
175
176    @python_api_test
177    def test_SBInstruction(self):
178        obj = lldb.SBInstruction()
179        if self.TraceOn():
180            print obj
181        self.assertFalse(obj)
182        # Do fuzz testing on the invalid obj, it should not crash lldb.
183        import sb_instruction
184        sb_instruction.fuzz_obj(obj)
185
186    @python_api_test
187    def test_SBInstructionList(self):
188        obj = lldb.SBInstructionList()
189        if self.TraceOn():
190            print obj
191        self.assertFalse(obj)
192        # Do fuzz testing on the invalid obj, it should not crash lldb.
193        import sb_instructionlist
194        sb_instructionlist.fuzz_obj(obj)
195
196    @python_api_test
197    def test_SBLineEntry(self):
198        obj = lldb.SBLineEntry()
199        if self.TraceOn():
200            print obj
201        self.assertFalse(obj)
202        # Do fuzz testing on the invalid obj, it should not crash lldb.
203        import sb_lineentry
204        sb_lineentry.fuzz_obj(obj)
205
206    @python_api_test
207    def test_SBListener(self):
208        obj = lldb.SBListener()
209        if self.TraceOn():
210            print obj
211        self.assertFalse(obj)
212        # Do fuzz testing on the invalid obj, it should not crash lldb.
213        import sb_listener
214        sb_listener.fuzz_obj(obj)
215
216    @python_api_test
217    def test_SBModule(self):
218        obj = lldb.SBModule()
219        if self.TraceOn():
220            print obj
221        self.assertFalse(obj)
222        # Do fuzz testing on the invalid obj, it should not crash lldb.
223        import sb_module
224        sb_module.fuzz_obj(obj)
225
226    @python_api_test
227    def test_SBProcess(self):
228        obj = lldb.SBProcess()
229        if self.TraceOn():
230            print obj
231        self.assertFalse(obj)
232        # Do fuzz testing on the invalid obj, it should not crash lldb.
233        import sb_process
234        sb_process.fuzz_obj(obj)
235
236    @python_api_test
237    def test_SBSection(self):
238        obj = lldb.SBSection()
239        if self.TraceOn():
240            print obj
241        self.assertFalse(obj)
242        # Do fuzz testing on the invalid obj, it should not crash lldb.
243        import sb_section
244        sb_section.fuzz_obj(obj)
245
246    @python_api_test
247    def test_SBStream(self):
248        """SBStream object is valid after default construction."""
249        obj = lldb.SBStream()
250        if self.TraceOn():
251            print obj
252        self.assertTrue(obj)
253
254    @python_api_test
255    def test_SBStringList(self):
256        obj = lldb.SBStringList()
257        if self.TraceOn():
258            print obj
259        self.assertFalse(obj)
260        # Do fuzz testing on the invalid obj, it should not crash lldb.
261        import sb_stringlist
262        sb_stringlist.fuzz_obj(obj)
263
264    @python_api_test
265    def test_SBSymbol(self):
266        obj = lldb.SBSymbol()
267        if self.TraceOn():
268            print obj
269        self.assertFalse(obj)
270        # Do fuzz testing on the invalid obj, it should not crash lldb.
271        import sb_symbol
272        sb_symbol.fuzz_obj(obj)
273
274    @python_api_test
275    def test_SBSymbolContext(self):
276        obj = lldb.SBSymbolContext()
277        if self.TraceOn():
278            print obj
279        self.assertFalse(obj)
280        # Do fuzz testing on the invalid obj, it should not crash lldb.
281        import sb_symbolcontext
282        sb_symbolcontext.fuzz_obj(obj)
283
284    @python_api_test
285    def test_SBSymbolContextList(self):
286        """SBSymbolContextList object is valid after default construction."""
287        obj = lldb.SBSymbolContextList()
288        if self.TraceOn():
289            print obj
290        self.assertTrue(obj)
291
292    @python_api_test
293    def test_SBTarget(self):
294        obj = lldb.SBTarget()
295        if self.TraceOn():
296            print obj
297        self.assertFalse(obj)
298        # Do fuzz testing on the invalid obj, it should not crash lldb.
299        import sb_target
300        sb_target.fuzz_obj(obj)
301
302    @python_api_test
303    def test_SBThread(self):
304        obj = lldb.SBThread()
305        if self.TraceOn():
306            print obj
307        self.assertFalse(obj)
308        # Do fuzz testing on the invalid obj, it should not crash lldb.
309        import sb_thread
310        sb_thread.fuzz_obj(obj)
311
312    @python_api_test
313    def test_SBType(self):
314        try:
315            obj = lldb.SBType()
316            if self.TraceOn():
317                print obj
318            self.assertFalse(obj)
319            # If we reach here, the test fails.
320            self.fail("lldb.SBType() should fail, not succeed!")
321        except:
322            # Exception is expected.
323            return
324
325        # Unreachable code because lldb.SBType() should fail.
326        # Do fuzz testing on the invalid obj, it should not crash lldb.
327        import sb_type
328        sb_type.fuzz_obj(obj)
329
330    @python_api_test
331    def test_SBTypeList(self):
332        """SBTypeList object is valid after default construction."""
333        obj = lldb.SBTypeList()
334        if self.TraceOn():
335            print obj
336        self.assertTrue(obj)
337
338    @python_api_test
339    def test_SBValue(self):
340        obj = lldb.SBValue()
341        if self.TraceOn():
342            print obj
343        self.assertFalse(obj)
344        # Do fuzz testing on the invalid obj, it should not crash lldb.
345        import sb_value
346        sb_value.fuzz_obj(obj)
347
348    @python_api_test
349    def test_SBValueList(self):
350        obj = lldb.SBValueList()
351        if self.TraceOn():
352            print obj
353        self.assertFalse(obj)
354        # Do fuzz testing on the invalid obj, it should not crash lldb.
355        import sb_valuelist
356        sb_valuelist.fuzz_obj(obj)
357
358    @python_api_test
359    def test_SBWatchpoint(self):
360        obj = lldb.SBWatchpoint()
361        if self.TraceOn():
362            print obj
363        self.assertFalse(obj)
364        # Do fuzz testing on the invalid obj, it should not crash lldb.
365        import sb_watchpoint
366        sb_watchpoint.fuzz_obj(obj)
367
368
369if __name__ == '__main__':
370    import atexit
371    lldb.SBDebugger.Initialize()
372    atexit.register(lambda: lldb.SBDebugger.Terminate())
373    unittest2.main()
374