384 lines · python
1"""2Test lldb Python API object's default constructor and make sure it is invalid3after initial construction.4 5There are also some cases of boundary condition testings sprinkled throughout6the tests where None is passed to SB API which expects (const char *) in the7C++ API counterpart. Passing None should not crash lldb!8 9There are three exceptions to the above general rules, though; API objects10SBCommandReturnObject, SBStream, and SBSymbolContextList, are all valid objects11after default construction.12"""13 14import lldb15from lldbsuite.test.decorators import *16from lldbsuite.test.lldbtest import *17from lldbsuite.test import lldbutil18 19 20class APIDefaultConstructorTestCase(TestBase):21 NO_DEBUG_INFO_TESTCASE = True22 23 def test_SBAddress(self):24 obj = lldb.SBAddress()25 if self.TraceOn():26 print(obj)27 self.assertFalse(obj)28 # Do fuzz testing on the invalid obj, it should not crash lldb.29 import sb_address30 31 sb_address.fuzz_obj(obj)32 33 def test_SBBlock(self):34 obj = lldb.SBBlock()35 if self.TraceOn():36 print(obj)37 self.assertFalse(obj)38 # Do fuzz testing on the invalid obj, it should not crash lldb.39 import sb_block40 41 sb_block.fuzz_obj(obj)42 43 def test_SBBreakpoint(self):44 obj = lldb.SBBreakpoint()45 if self.TraceOn():46 print(obj)47 self.assertFalse(obj)48 # Do fuzz testing on the invalid obj, it should not crash lldb.49 import sb_breakpoint50 51 sb_breakpoint.fuzz_obj(obj)52 53 def test_SBBreakpointLocation(self):54 obj = lldb.SBBreakpointLocation()55 if self.TraceOn():56 print(obj)57 self.assertFalse(obj)58 # Do fuzz testing on the invalid obj, it should not crash lldb.59 import sb_breakpointlocation60 61 sb_breakpointlocation.fuzz_obj(obj)62 63 def test_SBBreakpointName(self):64 obj = lldb.SBBreakpointName()65 if self.TraceOn():66 print(obj)67 self.assertFalse(obj)68 # Do fuzz testing on the invalid obj, it should not crash lldb.69 import sb_breakpointname70 71 sb_breakpointname.fuzz_obj(obj)72 73 def test_SBBroadcaster(self):74 obj = lldb.SBBroadcaster()75 if self.TraceOn():76 print(obj)77 self.assertFalse(obj)78 # Do fuzz testing on the invalid obj, it should not crash lldb.79 import sb_broadcaster80 81 sb_broadcaster.fuzz_obj(obj)82 83 def test_SBCommandReturnObject(self):84 """SBCommandReturnObject object is valid after default construction."""85 obj = lldb.SBCommandReturnObject()86 if self.TraceOn():87 print(obj)88 self.assertTrue(obj)89 90 def test_SBCommunication(self):91 obj = lldb.SBCommunication()92 if self.TraceOn():93 print(obj)94 self.assertFalse(obj)95 # Do fuzz testing on the invalid obj, it should not crash lldb.96 import sb_communication97 98 sb_communication.fuzz_obj(obj)99 100 def test_SBCompileUnit(self):101 obj = lldb.SBCompileUnit()102 if self.TraceOn():103 print(obj)104 self.assertFalse(obj)105 # Do fuzz testing on the invalid obj, it should not crash lldb.106 import sb_compileunit107 108 sb_compileunit.fuzz_obj(obj)109 110 def test_SBDebugger(self):111 obj = lldb.SBDebugger()112 if self.TraceOn():113 print(obj)114 self.assertFalse(obj)115 # Do fuzz testing on the invalid obj, it should not crash lldb.116 import sb_debugger117 118 sb_debugger.fuzz_obj(obj)119 120 def test_SBError(self):121 obj = lldb.SBError()122 if self.TraceOn():123 print(obj)124 self.assertFalse(obj)125 # Do fuzz testing on the invalid obj, it should not crash lldb.126 import sb_error127 128 sb_error.fuzz_obj(obj)129 130 def test_SBEvent(self):131 obj = lldb.SBEvent()132 # This is just to test that typemap, as defined in lldb.swig, works.133 obj2 = lldb.SBEvent(0, "abc")134 if self.TraceOn():135 print(obj)136 self.assertFalse(obj)137 # Do fuzz testing on the invalid obj, it should not crash lldb.138 import sb_event139 140 sb_event.fuzz_obj(obj)141 142 def test_SBFileSpec(self):143 obj = lldb.SBFileSpec()144 # This is just to test that FileSpec(None) does not crash.145 obj2 = lldb.SBFileSpec(None, True)146 if self.TraceOn():147 print(obj)148 self.assertFalse(obj)149 # Do fuzz testing on the invalid obj, it should not crash lldb.150 import sb_filespec151 152 sb_filespec.fuzz_obj(obj)153 154 def test_SBFrame(self):155 obj = lldb.SBFrame()156 if self.TraceOn():157 print(obj)158 self.assertFalse(obj)159 # Do fuzz testing on the invalid obj, it should not crash lldb.160 import sb_frame161 162 sb_frame.fuzz_obj(obj)163 164 def test_SBFunction(self):165 obj = lldb.SBFunction()166 if self.TraceOn():167 print(obj)168 self.assertFalse(obj)169 # Do fuzz testing on the invalid obj, it should not crash lldb.170 import sb_function171 172 sb_function.fuzz_obj(obj)173 174 def test_SBFile(self):175 sbf = lldb.SBFile()176 self.assertFalse(sbf.IsValid())177 self.assertFalse(bool(sbf))178 e, n = sbf.Write(b"foo")179 self.assertTrue(e.Fail())180 self.assertEqual(n, 0)181 buffer = bytearray(100)182 e, n = sbf.Read(buffer)183 self.assertEqual(n, 0)184 self.assertTrue(e.Fail())185 186 def test_SBInstruction(self):187 obj = lldb.SBInstruction()188 if self.TraceOn():189 print(obj)190 self.assertFalse(obj)191 # Do fuzz testing on the invalid obj, it should not crash lldb.192 import sb_instruction193 194 sb_instruction.fuzz_obj(obj)195 196 def test_SBInstructionList(self):197 obj = lldb.SBInstructionList()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_instructionlist203 204 sb_instructionlist.fuzz_obj(obj)205 206 def test_SBLineEntry(self):207 obj = lldb.SBLineEntry()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_lineentry213 214 sb_lineentry.fuzz_obj(obj)215 216 def test_SBListener(self):217 obj = lldb.SBListener()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_listener223 224 sb_listener.fuzz_obj(obj)225 226 def test_SBModule(self):227 obj = lldb.SBModule()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_module233 234 sb_module.fuzz_obj(obj)235 236 def test_SBProcess(self):237 obj = lldb.SBProcess()238 if self.TraceOn():239 print(obj)240 self.assertFalse(obj)241 # Do fuzz testing on the invalid obj, it should not crash lldb.242 import sb_process243 244 sb_process.fuzz_obj(obj)245 246 def test_SBProcessInfo(self):247 obj = lldb.SBProcessInfo()248 if self.TraceOn():249 print(obj)250 self.assertFalse(obj)251 # Do fuzz testing on the invalid obj, it should not crash lldb.252 import sb_process_info253 254 sb_process_info.fuzz_obj(obj)255 256 def test_SBSection(self):257 obj = lldb.SBSection()258 if self.TraceOn():259 print(obj)260 self.assertFalse(obj)261 # Do fuzz testing on the invalid obj, it should not crash lldb.262 import sb_section263 264 sb_section.fuzz_obj(obj)265 266 def test_SBStream(self):267 """SBStream object is valid after default construction."""268 obj = lldb.SBStream()269 if self.TraceOn():270 print(obj)271 self.assertTrue(obj)272 273 def test_SBStringList(self):274 obj = lldb.SBStringList()275 if self.TraceOn():276 print(obj)277 self.assertFalse(obj)278 # Do fuzz testing on the invalid obj, it should not crash lldb.279 import sb_stringlist280 281 sb_stringlist.fuzz_obj(obj)282 283 def test_SBSymbol(self):284 obj = lldb.SBSymbol()285 if self.TraceOn():286 print(obj)287 self.assertFalse(obj)288 # Do fuzz testing on the invalid obj, it should not crash lldb.289 import sb_symbol290 291 sb_symbol.fuzz_obj(obj)292 293 def test_SBSymbolContext(self):294 obj = lldb.SBSymbolContext()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_symbolcontext300 301 sb_symbolcontext.fuzz_obj(obj)302 303 def test_SBSymbolContextList(self):304 """SBSymbolContextList object is valid after default construction."""305 obj = lldb.SBSymbolContextList()306 if self.TraceOn():307 print(obj)308 self.assertTrue(obj)309 310 def test_SBTarget(self):311 obj = lldb.SBTarget()312 if self.TraceOn():313 print(obj)314 self.assertFalse(obj)315 # Do fuzz testing on the invalid obj, it should not crash lldb.316 import sb_target317 318 sb_target.fuzz_obj(obj)319 320 def test_SBThread(self):321 obj = lldb.SBThread()322 if self.TraceOn():323 print(obj)324 self.assertFalse(obj)325 # Do fuzz testing on the invalid obj, it should not crash lldb.326 import sb_thread327 328 sb_thread.fuzz_obj(obj)329 330 def test_SBType(self):331 try:332 obj = lldb.SBType()333 if self.TraceOn():334 print(obj)335 self.assertFalse(obj)336 # If we reach here, the test fails.337 self.fail("lldb.SBType() should fail, not succeed!")338 except:339 # Exception is expected.340 return341 342 # Unreachable code because lldb.SBType() should fail.343 # Do fuzz testing on the invalid obj, it should not crash lldb.344 import sb_type345 346 sb_type.fuzz_obj(obj)347 348 def test_SBTypeList(self):349 """SBTypeList object is valid after default construction."""350 obj = lldb.SBTypeList()351 if self.TraceOn():352 print(obj)353 self.assertTrue(obj)354 355 def test_SBValue(self):356 obj = lldb.SBValue()357 if self.TraceOn():358 print(obj)359 self.assertFalse(obj)360 # Do fuzz testing on the invalid obj, it should not crash lldb.361 import sb_value362 363 sb_value.fuzz_obj(obj)364 365 def test_SBValueList(self):366 obj = lldb.SBValueList()367 if self.TraceOn():368 print(obj)369 self.assertFalse(obj)370 # Do fuzz testing on the invalid obj, it should not crash lldb.371 import sb_valuelist372 373 sb_valuelist.fuzz_obj(obj)374 375 def test_SBWatchpoint(self):376 obj = lldb.SBWatchpoint()377 if self.TraceOn():378 print(obj)379 self.assertFalse(obj)380 # Do fuzz testing on the invalid obj, it should not crash lldb.381 import sb_watchpoint382 383 sb_watchpoint.fuzz_obj(obj)384