199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest breakpoint serialization. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport os 64da8fa45SMed Ismail Bennaniimport json 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass BreakpointSerialization(TestBase): 1499451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1599451b44SJordan Rupprecht 162238dcc3SJonas Devlieghere @add_test_categories(["pyapi"]) 1799451b44SJordan Rupprecht def test_resolvers(self): 1899451b44SJordan Rupprecht """Use Python APIs to test that we serialize resolvers.""" 1999451b44SJordan Rupprecht self.build() 2099451b44SJordan Rupprecht self.setup_targets_and_cleanup() 2199451b44SJordan Rupprecht self.do_check_resolvers() 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht def test_filters(self): 2499451b44SJordan Rupprecht """Use Python APIs to test that we serialize search filters correctly.""" 2599451b44SJordan Rupprecht self.build() 2699451b44SJordan Rupprecht self.setup_targets_and_cleanup() 2799451b44SJordan Rupprecht self.do_check_filters() 2899451b44SJordan Rupprecht 2999451b44SJordan Rupprecht def test_options(self): 3099451b44SJordan Rupprecht """Use Python APIs to test that we serialize breakpoint options correctly.""" 3199451b44SJordan Rupprecht self.build() 3299451b44SJordan Rupprecht self.setup_targets_and_cleanup() 3399451b44SJordan Rupprecht self.do_check_options() 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht def test_appending(self): 3699451b44SJordan Rupprecht """Use Python APIs to test that we serialize breakpoint options correctly.""" 3799451b44SJordan Rupprecht self.build() 3899451b44SJordan Rupprecht self.setup_targets_and_cleanup() 3999451b44SJordan Rupprecht self.do_check_appending() 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht def test_name_filters(self): 4299451b44SJordan Rupprecht """Use python APIs to test that reading in by name works correctly.""" 4399451b44SJordan Rupprecht self.build() 4499451b44SJordan Rupprecht self.setup_targets_and_cleanup() 4599451b44SJordan Rupprecht self.do_check_names() 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht def test_scripted_extra_args(self): 4899451b44SJordan Rupprecht self.build() 4999451b44SJordan Rupprecht self.setup_targets_and_cleanup() 5099451b44SJordan Rupprecht self.do_check_extra_args() 5199451b44SJordan Rupprecht 5249029f92SAlex Langford def test_resolver_serialization(self): 5349029f92SAlex Langford """Test that breakpoint resolvers contain the expected information""" 5449029f92SAlex Langford self.build() 5549029f92SAlex Langford self.setup_targets_and_cleanup() 5649029f92SAlex Langford 5749029f92SAlex Langford exe_path = self.getBuildArtifact("a.out") 58bdaedffcSAlex Langford exe_module = self.orig_target.module["a.out"] 5949029f92SAlex Langford self.assertTrue( 6049029f92SAlex Langford exe_module.IsValid(), "Failed to find the executable module in target" 6149029f92SAlex Langford ) 6249029f92SAlex Langford sym_ctx_list = exe_module.FindFunctions("main") 63*9c246882SJordan Rupprecht self.assertEqual(sym_ctx_list.GetSize(), 1, "Unable to find function 'main'") 6449029f92SAlex Langford sym_ctx = sym_ctx_list.GetContextAtIndex(0) 6549029f92SAlex Langford self.assertTrue( 6649029f92SAlex Langford sym_ctx.IsValid(), "SBSymbolContext representing function 'main' is invalid" 6749029f92SAlex Langford ) 6849029f92SAlex Langford main_func = sym_ctx.GetFunction() 6949029f92SAlex Langford self.assertTrue( 7049029f92SAlex Langford main_func.IsValid(), "SBFunction representing 'main' is invalid" 7149029f92SAlex Langford ) 7249029f92SAlex Langford main_addr = main_func.GetStartAddress() 7349029f92SAlex Langford 7449029f92SAlex Langford bkpt = self.orig_target.BreakpointCreateBySBAddress(main_addr) 7549029f92SAlex Langford self.assertTrue( 7649029f92SAlex Langford bkpt.IsValid(), "Could not place breakpoint on 'main' by address" 7749029f92SAlex Langford ) 7849029f92SAlex Langford stream = lldb.SBStream() 7949029f92SAlex Langford sd = bkpt.SerializeToStructuredData() 8049029f92SAlex Langford sd.GetAsJSON(stream) 8149029f92SAlex Langford serialized_data = json.loads(stream.GetData()) 8249029f92SAlex Langford 8349029f92SAlex Langford self.assertIn( 8449029f92SAlex Langford exe_path, 8549029f92SAlex Langford serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["ModuleName"], 8649029f92SAlex Langford ) 8749029f92SAlex Langford 884da8fa45SMed Ismail Bennani def test_structured_data_serialization(self): 894da8fa45SMed Ismail Bennani target = self.dbg.GetDummyTarget() 904da8fa45SMed Ismail Bennani self.assertTrue(target.IsValid(), VALID_TARGET) 914da8fa45SMed Ismail Bennani 924da8fa45SMed Ismail Bennani interpreter = self.dbg.GetCommandInterpreter() 934da8fa45SMed Ismail Bennani result = lldb.SBCommandReturnObject() 944da8fa45SMed Ismail Bennani interpreter.HandleCommand("br set -f foo -l 42", result) 954da8fa45SMed Ismail Bennani result = lldb.SBCommandReturnObject() 964da8fa45SMed Ismail Bennani interpreter.HandleCommand("br set -c 'argc == 1' -n main", result) 974da8fa45SMed Ismail Bennani 984da8fa45SMed Ismail Bennani bkp1 = target.GetBreakpointAtIndex(0) 994da8fa45SMed Ismail Bennani self.assertTrue(bkp1.IsValid(), VALID_BREAKPOINT) 1004da8fa45SMed Ismail Bennani stream = lldb.SBStream() 1014da8fa45SMed Ismail Bennani sd = bkp1.SerializeToStructuredData() 1024da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 1034da8fa45SMed Ismail Bennani serialized_data = json.loads(stream.GetData()) 1042238dcc3SJonas Devlieghere self.assertEqual( 1052238dcc3SJonas Devlieghere serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["FileName"], "foo" 1062238dcc3SJonas Devlieghere ) 1072238dcc3SJonas Devlieghere self.assertEqual( 1082238dcc3SJonas Devlieghere serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["LineNumber"], 42 1092238dcc3SJonas Devlieghere ) 1104da8fa45SMed Ismail Bennani 1114da8fa45SMed Ismail Bennani bkp2 = target.GetBreakpointAtIndex(1) 1124da8fa45SMed Ismail Bennani self.assertTrue(bkp2.IsValid(), VALID_BREAKPOINT) 1134da8fa45SMed Ismail Bennani stream = lldb.SBStream() 1144da8fa45SMed Ismail Bennani sd = bkp2.SerializeToStructuredData() 1154da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 1164da8fa45SMed Ismail Bennani serialized_data = json.loads(stream.GetData()) 1172238dcc3SJonas Devlieghere self.assertIn( 1182238dcc3SJonas Devlieghere "main", 1192238dcc3SJonas Devlieghere serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["SymbolNames"], 1202238dcc3SJonas Devlieghere ) 1212238dcc3SJonas Devlieghere self.assertEqual( 1222238dcc3SJonas Devlieghere serialized_data["Breakpoint"]["BKPTOptions"]["ConditionText"], "argc == 1" 1232238dcc3SJonas Devlieghere ) 1244da8fa45SMed Ismail Bennani 1254da8fa45SMed Ismail Bennani invalid_bkp = lldb.SBBreakpoint() 1264da8fa45SMed Ismail Bennani self.assertFalse(invalid_bkp.IsValid(), "Breakpoint should not be valid.") 1274da8fa45SMed Ismail Bennani stream = lldb.SBStream() 1284da8fa45SMed Ismail Bennani sd = invalid_bkp.SerializeToStructuredData() 1294da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 1302238dcc3SJonas Devlieghere self.assertFalse( 1312238dcc3SJonas Devlieghere stream.GetData(), "Invalid breakpoint should have an empty structured data" 1322238dcc3SJonas Devlieghere ) 1334da8fa45SMed Ismail Bennani 13499451b44SJordan Rupprecht def setup_targets_and_cleanup(self): 13599451b44SJordan Rupprecht def cleanup(): 13699451b44SJordan Rupprecht self.RemoveTempFile(self.bkpts_file_path) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht if self.orig_target.IsValid(): 13999451b44SJordan Rupprecht self.dbg.DeleteTarget(self.orig_target) 14099451b44SJordan Rupprecht self.dbg.DeleteTarget(self.copy_target) 14199451b44SJordan Rupprecht 14299451b44SJordan Rupprecht self.addTearDownHook(cleanup) 14399451b44SJordan Rupprecht self.RemoveTempFile(self.bkpts_file_path) 14499451b44SJordan Rupprecht 14599451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 14699451b44SJordan Rupprecht 14799451b44SJordan Rupprecht # Create the targets we are making breakpoints in and copying them to: 14899451b44SJordan Rupprecht self.orig_target = self.dbg.CreateTarget(exe) 14999451b44SJordan Rupprecht self.assertTrue(self.orig_target, VALID_TARGET) 15099451b44SJordan Rupprecht 15199451b44SJordan Rupprecht self.copy_target = self.dbg.CreateTarget(exe) 15299451b44SJordan Rupprecht self.assertTrue(self.copy_target, VALID_TARGET) 15399451b44SJordan Rupprecht 15499451b44SJordan Rupprecht def setUp(self): 15599451b44SJordan Rupprecht # Call super's setUp(). 15699451b44SJordan Rupprecht TestBase.setUp(self) 15799451b44SJordan Rupprecht 15899451b44SJordan Rupprecht self.bkpts_file_path = self.getBuildArtifact("breakpoints.json") 15999451b44SJordan Rupprecht self.bkpts_file_spec = lldb.SBFileSpec(self.bkpts_file_path) 16099451b44SJordan Rupprecht 16199451b44SJordan Rupprecht def check_equivalence(self, source_bps, do_write=True): 16299451b44SJordan Rupprecht error = lldb.SBError() 16399451b44SJordan Rupprecht 1642238dcc3SJonas Devlieghere if do_write: 1652238dcc3SJonas Devlieghere error = self.orig_target.BreakpointsWriteToFile( 1662238dcc3SJonas Devlieghere self.bkpts_file_spec, source_bps 1672238dcc3SJonas Devlieghere ) 168779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 16999451b44SJordan Rupprecht 17099451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 1712238dcc3SJonas Devlieghere error = self.copy_target.BreakpointsCreateFromFile( 1722238dcc3SJonas Devlieghere self.bkpts_file_spec, copy_bps 1732238dcc3SJonas Devlieghere ) 174779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 17599451b44SJordan Rupprecht 17699451b44SJordan Rupprecht num_source_bps = source_bps.GetSize() 17799451b44SJordan Rupprecht num_copy_bps = copy_bps.GetSize() 1782238dcc3SJonas Devlieghere self.assertEqual( 1792238dcc3SJonas Devlieghere num_source_bps, 1802238dcc3SJonas Devlieghere num_copy_bps, 1812238dcc3SJonas Devlieghere "Didn't get same number of input and output breakpoints - orig: %d copy: %d" 1822238dcc3SJonas Devlieghere % (num_source_bps, num_copy_bps), 1832238dcc3SJonas Devlieghere ) 18499451b44SJordan Rupprecht 18599451b44SJordan Rupprecht for i in range(0, num_source_bps): 18699451b44SJordan Rupprecht source_bp = source_bps.GetBreakpointAtIndex(i) 18799451b44SJordan Rupprecht source_desc = lldb.SBStream() 18899451b44SJordan Rupprecht source_bp.GetDescription(source_desc, False) 18999451b44SJordan Rupprecht source_text = source_desc.GetData() 19099451b44SJordan Rupprecht 19199451b44SJordan Rupprecht # I am assuming here that the breakpoints will get written out in breakpoint ID order, and 19299451b44SJordan Rupprecht # read back in ditto. That is true right now, and I can't see any reason to do it differently 19399451b44SJordan Rupprecht # but if we do we can go to writing the breakpoints one by one, or sniffing the descriptions to 19499451b44SJordan Rupprecht # see which one is which. 19599451b44SJordan Rupprecht copy_id = source_bp.GetID() 19699451b44SJordan Rupprecht copy_bp = copy_bps.FindBreakpointByID(copy_id) 1972238dcc3SJonas Devlieghere self.assertTrue( 1982238dcc3SJonas Devlieghere copy_bp.IsValid(), "Could not find copy breakpoint %d." % (copy_id) 1992238dcc3SJonas Devlieghere ) 20099451b44SJordan Rupprecht 20199451b44SJordan Rupprecht copy_desc = lldb.SBStream() 20299451b44SJordan Rupprecht copy_bp.GetDescription(copy_desc, False) 20399451b44SJordan Rupprecht copy_text = copy_desc.GetData() 20499451b44SJordan Rupprecht 20599451b44SJordan Rupprecht # These two should be identical. 206b321b429SJonas Devlieghere self.trace("Source text for %d is %s." % (i, source_text)) 2072238dcc3SJonas Devlieghere self.assertEqual( 2082238dcc3SJonas Devlieghere source_text, 2092238dcc3SJonas Devlieghere copy_text, 2102238dcc3SJonas Devlieghere "Source and dest breakpoints are not identical: \nsource: %s\ndest: %s" 2112238dcc3SJonas Devlieghere % (source_text, copy_text), 2122238dcc3SJonas Devlieghere ) 21399451b44SJordan Rupprecht 21499451b44SJordan Rupprecht def do_check_resolvers(self): 21599451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint resolvers""" 21699451b44SJordan Rupprecht 21799451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 21899451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 2192238dcc3SJonas Devlieghere blubby_file_spec = lldb.SBFileSpec( 2202238dcc3SJonas Devlieghere os.path.join(self.getSourceDir(), "blubby.c") 2212238dcc3SJonas Devlieghere ) 22299451b44SJordan Rupprecht 22399451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 22499451b44SJordan Rupprecht # actually have locations. 22599451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 22699451b44SJordan Rupprecht source_bps.Append(self.orig_target.BreakpointCreateByLocation("blubby.c", 666)) 22799451b44SJordan Rupprecht # Make sure we do one breakpoint right: 22899451b44SJordan Rupprecht self.check_equivalence(source_bps) 22999451b44SJordan Rupprecht source_bps.Clear() 23099451b44SJordan Rupprecht 2312238dcc3SJonas Devlieghere source_bps.Append( 2322238dcc3SJonas Devlieghere self.orig_target.BreakpointCreateByName( 2332238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list 2342238dcc3SJonas Devlieghere ) 2352238dcc3SJonas Devlieghere ) 2362238dcc3SJonas Devlieghere source_bps.Append( 2372238dcc3SJonas Devlieghere self.orig_target.BreakpointCreateByName( 2382238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeFull, empty_module_list, empty_cu_list 2392238dcc3SJonas Devlieghere ) 2402238dcc3SJonas Devlieghere ) 2412238dcc3SJonas Devlieghere source_bps.Append( 2422238dcc3SJonas Devlieghere self.orig_target.BreakpointCreateBySourceRegex( 2432238dcc3SJonas Devlieghere "dont really care", blubby_file_spec 2442238dcc3SJonas Devlieghere ) 2452238dcc3SJonas Devlieghere ) 24699451b44SJordan Rupprecht 24799451b44SJordan Rupprecht # And some number greater than one: 24899451b44SJordan Rupprecht self.check_equivalence(source_bps) 24999451b44SJordan Rupprecht 25099451b44SJordan Rupprecht def do_check_filters(self): 25199451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint filters.""" 25299451b44SJordan Rupprecht module_list = lldb.SBFileSpecList() 25399451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec("SomeBinary")) 25499451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec("SomeOtherBinary")) 25599451b44SJordan Rupprecht 25699451b44SJordan Rupprecht cu_list = lldb.SBFileSpecList() 25799451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("SomeCU.c")) 25899451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("AnotherCU.c")) 25999451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("ThirdCU.c")) 26099451b44SJordan Rupprecht 2612238dcc3SJonas Devlieghere blubby_file_spec = lldb.SBFileSpec( 2622238dcc3SJonas Devlieghere os.path.join(self.getSourceDir(), "blubby.c") 2632238dcc3SJonas Devlieghere ) 26499451b44SJordan Rupprecht 26599451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 26699451b44SJordan Rupprecht # actually have locations. 26799451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 2682238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByLocation( 2692238dcc3SJonas Devlieghere blubby_file_spec, 666, 0, module_list 2702238dcc3SJonas Devlieghere ) 27199451b44SJordan Rupprecht source_bps.Append(bkpt) 27299451b44SJordan Rupprecht 27399451b44SJordan Rupprecht # Make sure we do one right: 27499451b44SJordan Rupprecht self.check_equivalence(source_bps) 27599451b44SJordan Rupprecht source_bps.Clear() 27699451b44SJordan Rupprecht 2772238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 2782238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeAuto, module_list, cu_list 2792238dcc3SJonas Devlieghere ) 28099451b44SJordan Rupprecht source_bps.Append(bkpt) 2812238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 2822238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeFull, module_list, cu_list 2832238dcc3SJonas Devlieghere ) 28499451b44SJordan Rupprecht source_bps.Append(bkpt) 2852238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateBySourceRegex( 2862238dcc3SJonas Devlieghere "dont really care", blubby_file_spec 2872238dcc3SJonas Devlieghere ) 28899451b44SJordan Rupprecht source_bps.Append(bkpt) 28999451b44SJordan Rupprecht 29099451b44SJordan Rupprecht # And some number greater than one: 29199451b44SJordan Rupprecht self.check_equivalence(source_bps) 29299451b44SJordan Rupprecht 29399451b44SJordan Rupprecht def do_check_options(self): 29499451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint options.""" 29599451b44SJordan Rupprecht 29699451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 29799451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 2982238dcc3SJonas Devlieghere blubby_file_spec = lldb.SBFileSpec( 2992238dcc3SJonas Devlieghere os.path.join(self.getSourceDir(), "blubby.c") 3002238dcc3SJonas Devlieghere ) 30199451b44SJordan Rupprecht 30299451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 30399451b44SJordan Rupprecht # actually have locations. 30499451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 30599451b44SJordan Rupprecht 30699451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 3072238dcc3SJonas Devlieghere lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList() 3082238dcc3SJonas Devlieghere ) 30999451b44SJordan Rupprecht bkpt.SetEnabled(False) 31099451b44SJordan Rupprecht bkpt.SetOneShot(True) 31199451b44SJordan Rupprecht bkpt.SetThreadID(10) 31299451b44SJordan Rupprecht source_bps.Append(bkpt) 31399451b44SJordan Rupprecht 31499451b44SJordan Rupprecht # Make sure we get one right: 31599451b44SJordan Rupprecht self.check_equivalence(source_bps) 31699451b44SJordan Rupprecht source_bps.Clear() 31799451b44SJordan Rupprecht 3182238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 3192238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list 3202238dcc3SJonas Devlieghere ) 32199451b44SJordan Rupprecht bkpt.SetIgnoreCount(10) 32299451b44SJordan Rupprecht bkpt.SetThreadName("grubby") 32399451b44SJordan Rupprecht source_bps.Append(bkpt) 32499451b44SJordan Rupprecht 3252238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 3262238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list 3272238dcc3SJonas Devlieghere ) 32899451b44SJordan Rupprecht bkpt.SetCondition("gonna remove this") 32999451b44SJordan Rupprecht bkpt.SetCondition("") 33099451b44SJordan Rupprecht source_bps.Append(bkpt) 33199451b44SJordan Rupprecht 3322238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 3332238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeFull, empty_module_list, empty_cu_list 3342238dcc3SJonas Devlieghere ) 33599451b44SJordan Rupprecht bkpt.SetCondition("something != something_else") 33699451b44SJordan Rupprecht bkpt.SetQueueName("grubby") 33799451b44SJordan Rupprecht bkpt.AddName("FirstName") 33899451b44SJordan Rupprecht bkpt.AddName("SecondName") 3392238dcc3SJonas Devlieghere bkpt.SetScriptCallbackBody( 3402238dcc3SJonas Devlieghere '\tprint("I am a function that prints.")\n\tprint("I don\'t do anything else")\n' 3412238dcc3SJonas Devlieghere ) 34299451b44SJordan Rupprecht source_bps.Append(bkpt) 34399451b44SJordan Rupprecht 3442238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateBySourceRegex( 3452238dcc3SJonas Devlieghere "dont really care", blubby_file_spec 3462238dcc3SJonas Devlieghere ) 34799451b44SJordan Rupprecht cmd_list = lldb.SBStringList() 34899451b44SJordan Rupprecht cmd_list.AppendString("frame var") 34999451b44SJordan Rupprecht cmd_list.AppendString("thread backtrace") 35099451b44SJordan Rupprecht 35199451b44SJordan Rupprecht bkpt.SetCommandLineCommands(cmd_list) 35299451b44SJordan Rupprecht source_bps.Append(bkpt) 35399451b44SJordan Rupprecht 35499451b44SJordan Rupprecht self.check_equivalence(source_bps) 35599451b44SJordan Rupprecht 35699451b44SJordan Rupprecht def do_check_appending(self): 35799451b44SJordan Rupprecht """Use Python APIs to check appending to already serialized options.""" 35899451b44SJordan Rupprecht 35999451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 36099451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 3612238dcc3SJonas Devlieghere blubby_file_spec = lldb.SBFileSpec( 3622238dcc3SJonas Devlieghere os.path.join(self.getSourceDir(), "blubby.c") 3632238dcc3SJonas Devlieghere ) 36499451b44SJordan Rupprecht 36599451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 36699451b44SJordan Rupprecht # actually have locations. 36799451b44SJordan Rupprecht 36899451b44SJordan Rupprecht all_bps = lldb.SBBreakpointList(self.orig_target) 36999451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 37099451b44SJordan Rupprecht 37199451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 3722238dcc3SJonas Devlieghere lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList() 3732238dcc3SJonas Devlieghere ) 37499451b44SJordan Rupprecht bkpt.SetEnabled(False) 37599451b44SJordan Rupprecht bkpt.SetOneShot(True) 37699451b44SJordan Rupprecht bkpt.SetThreadID(10) 37799451b44SJordan Rupprecht source_bps.Append(bkpt) 37899451b44SJordan Rupprecht all_bps.Append(bkpt) 37999451b44SJordan Rupprecht 38099451b44SJordan Rupprecht error = lldb.SBError() 3812238dcc3SJonas Devlieghere error = self.orig_target.BreakpointsWriteToFile( 3822238dcc3SJonas Devlieghere self.bkpts_file_spec, source_bps 3832238dcc3SJonas Devlieghere ) 384779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 38599451b44SJordan Rupprecht 38699451b44SJordan Rupprecht source_bps.Clear() 38799451b44SJordan Rupprecht 3882238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 3892238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list 3902238dcc3SJonas Devlieghere ) 39199451b44SJordan Rupprecht bkpt.SetIgnoreCount(10) 39299451b44SJordan Rupprecht bkpt.SetThreadName("grubby") 39399451b44SJordan Rupprecht source_bps.Append(bkpt) 39499451b44SJordan Rupprecht all_bps.Append(bkpt) 39599451b44SJordan Rupprecht 3962238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateByName( 3972238dcc3SJonas Devlieghere "blubby", lldb.eFunctionNameTypeFull, empty_module_list, empty_cu_list 3982238dcc3SJonas Devlieghere ) 39999451b44SJordan Rupprecht bkpt.SetCondition("something != something_else") 40099451b44SJordan Rupprecht bkpt.SetQueueName("grubby") 40199451b44SJordan Rupprecht bkpt.AddName("FirstName") 40299451b44SJordan Rupprecht bkpt.AddName("SecondName") 40399451b44SJordan Rupprecht 40499451b44SJordan Rupprecht source_bps.Append(bkpt) 40599451b44SJordan Rupprecht all_bps.Append(bkpt) 40699451b44SJordan Rupprecht 4072238dcc3SJonas Devlieghere error = self.orig_target.BreakpointsWriteToFile( 4082238dcc3SJonas Devlieghere self.bkpts_file_spec, source_bps, True 4092238dcc3SJonas Devlieghere ) 410779bbbf2SDave Lee self.assertSuccess(error, "Failed appending breakpoints to file") 41199451b44SJordan Rupprecht 41299451b44SJordan Rupprecht self.check_equivalence(all_bps) 41399451b44SJordan Rupprecht 41499451b44SJordan Rupprecht def do_check_names(self): 41599451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 4162238dcc3SJonas Devlieghere lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList() 4172238dcc3SJonas Devlieghere ) 41899451b44SJordan Rupprecht good_bkpt_name = "GoodBreakpoint" 41999451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 42099451b44SJordan Rupprecht bkpt.AddName(good_bkpt_name) 42199451b44SJordan Rupprecht write_bps.Append(bkpt) 42299451b44SJordan Rupprecht 42399451b44SJordan Rupprecht error = lldb.SBError() 42499451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 425779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 42699451b44SJordan Rupprecht 42799451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 42899451b44SJordan Rupprecht names_list = lldb.SBStringList() 42999451b44SJordan Rupprecht names_list.AppendString("NoSuchName") 43099451b44SJordan Rupprecht 4312238dcc3SJonas Devlieghere error = self.copy_target.BreakpointsCreateFromFile( 4322238dcc3SJonas Devlieghere self.bkpts_file_spec, names_list, copy_bps 4332238dcc3SJonas Devlieghere ) 434779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 4352238dcc3SJonas Devlieghere self.assertEqual( 4362238dcc3SJonas Devlieghere copy_bps.GetSize(), 0, "Found breakpoints with a nonexistent name." 4372238dcc3SJonas Devlieghere ) 43899451b44SJordan Rupprecht 43999451b44SJordan Rupprecht names_list.AppendString(good_bkpt_name) 4402238dcc3SJonas Devlieghere error = self.copy_target.BreakpointsCreateFromFile( 4412238dcc3SJonas Devlieghere self.bkpts_file_spec, names_list, copy_bps 4422238dcc3SJonas Devlieghere ) 443779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 444619e2e09SDave Lee self.assertEqual(copy_bps.GetSize(), 1, "Found the matching breakpoint.") 44599451b44SJordan Rupprecht 44699451b44SJordan Rupprecht def do_check_extra_args(self): 44799451b44SJordan Rupprecht import side_effect 4482238dcc3SJonas Devlieghere 44999451b44SJordan Rupprecht interp = self.dbg.GetCommandInterpreter() 45099451b44SJordan Rupprecht error = lldb.SBError() 45199451b44SJordan Rupprecht 45299451b44SJordan Rupprecht script_name = os.path.join(self.getSourceDir(), "resolver.py") 45399451b44SJordan Rupprecht 45499451b44SJordan Rupprecht command = "command script import " + script_name 45599451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 45699451b44SJordan Rupprecht interp.HandleCommand(command, result) 4572238dcc3SJonas Devlieghere self.assertTrue( 4582238dcc3SJonas Devlieghere result.Succeeded(), "com scr imp failed: %s" % (result.GetError()) 4592238dcc3SJonas Devlieghere ) 46099451b44SJordan Rupprecht 46199451b44SJordan Rupprecht # First make sure a scripted breakpoint with no args works: 4622238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateFromScript( 4632238dcc3SJonas Devlieghere "resolver.Resolver", 4642238dcc3SJonas Devlieghere lldb.SBStructuredData(), 4652238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 4662238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 4672238dcc3SJonas Devlieghere ) 46899451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid(), "Bkpt is valid") 46999451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 47099451b44SJordan Rupprecht 47199451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 472779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints") 47399451b44SJordan Rupprecht 47499451b44SJordan Rupprecht side_effect.g_extra_args = None 47599451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 4762238dcc3SJonas Devlieghere error = self.copy_target.BreakpointsCreateFromFile( 4772238dcc3SJonas Devlieghere self.bkpts_file_spec, copy_bps 4782238dcc3SJonas Devlieghere ) 479779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints") 48099451b44SJordan Rupprecht 48199451b44SJordan Rupprecht self.assertEqual(copy_bps.GetSize(), 1, "Got one breakpoint from file.") 48299451b44SJordan Rupprecht no_keys = lldb.SBStringList() 48399451b44SJordan Rupprecht side_effect.g_extra_args.GetKeys(no_keys) 48499451b44SJordan Rupprecht self.assertEqual(no_keys.GetSize(), 0, "Should have no keys") 48599451b44SJordan Rupprecht 48699451b44SJordan Rupprecht self.orig_target.DeleteAllBreakpoints() 48799451b44SJordan Rupprecht self.copy_target.DeleteAllBreakpoints() 48899451b44SJordan Rupprecht 48999451b44SJordan Rupprecht # Now try one with extra args: 49099451b44SJordan Rupprecht 49199451b44SJordan Rupprecht extra_args = lldb.SBStructuredData() 49299451b44SJordan Rupprecht stream = lldb.SBStream() 49399451b44SJordan Rupprecht stream.Print('{"first_arg" : "first_value", "second_arg" : "second_value"}') 49499451b44SJordan Rupprecht extra_args.SetFromJSON(stream) 49599451b44SJordan Rupprecht self.assertTrue(extra_args.IsValid(), "SBStructuredData is valid.") 49699451b44SJordan Rupprecht 4972238dcc3SJonas Devlieghere bkpt = self.orig_target.BreakpointCreateFromScript( 4982238dcc3SJonas Devlieghere "resolver.Resolver", 4992238dcc3SJonas Devlieghere extra_args, 5002238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 5012238dcc3SJonas Devlieghere lldb.SBFileSpecList(), 5022238dcc3SJonas Devlieghere ) 50399451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid(), "Bkpt is valid") 50499451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 50599451b44SJordan Rupprecht 50699451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 507779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints") 50899451b44SJordan Rupprecht 50999451b44SJordan Rupprecht orig_extra_args = side_effect.g_extra_args 51099451b44SJordan Rupprecht self.assertTrue(orig_extra_args.IsValid(), "Extra args originally valid") 51199451b44SJordan Rupprecht 51299451b44SJordan Rupprecht orig_keys = lldb.SBStringList() 51399451b44SJordan Rupprecht orig_extra_args.GetKeys(orig_keys) 51499451b44SJordan Rupprecht self.assertEqual(2, orig_keys.GetSize(), "Should have two keys") 51599451b44SJordan Rupprecht 51699451b44SJordan Rupprecht side_effect.g_extra_args = None 51799451b44SJordan Rupprecht 51899451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 5192238dcc3SJonas Devlieghere error = self.copy_target.BreakpointsCreateFromFile( 5202238dcc3SJonas Devlieghere self.bkpts_file_spec, copy_bps 5212238dcc3SJonas Devlieghere ) 522779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints") 52399451b44SJordan Rupprecht 52499451b44SJordan Rupprecht self.assertEqual(copy_bps.GetSize(), 1, "Got one breakpoint from file.") 52599451b44SJordan Rupprecht 52699451b44SJordan Rupprecht copy_extra_args = side_effect.g_extra_args 52799451b44SJordan Rupprecht copy_keys = lldb.SBStringList() 52899451b44SJordan Rupprecht copy_extra_args.GetKeys(copy_keys) 52999451b44SJordan Rupprecht self.assertEqual(2, copy_keys.GetSize(), "Copy should have two keys") 53099451b44SJordan Rupprecht 53199451b44SJordan Rupprecht for idx in range(0, orig_keys.GetSize()): 53299451b44SJordan Rupprecht key = orig_keys.GetStringAtIndex(idx) 53399451b44SJordan Rupprecht copy_value = copy_extra_args.GetValueForKey(key).GetStringValue(100) 53499451b44SJordan Rupprecht 53599451b44SJordan Rupprecht if key == "first_arg": 53699451b44SJordan Rupprecht self.assertEqual(copy_value, "first_value") 53799451b44SJordan Rupprecht elif key == "second_arg": 53899451b44SJordan Rupprecht self.assertEqual(copy_value, "second_value") 53999451b44SJordan Rupprecht else: 54099451b44SJordan Rupprecht self.Fail("Unknown key: %s" % (key)) 541