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 1599451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 1699451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht @add_test_categories(['pyapi']) 1999451b44SJordan Rupprecht def test_resolvers(self): 2099451b44SJordan Rupprecht """Use Python APIs to test that we serialize resolvers.""" 2199451b44SJordan Rupprecht self.build() 2299451b44SJordan Rupprecht self.setup_targets_and_cleanup() 2399451b44SJordan Rupprecht self.do_check_resolvers() 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def test_filters(self): 2699451b44SJordan Rupprecht """Use Python APIs to test that we serialize search filters correctly.""" 2799451b44SJordan Rupprecht self.build() 2899451b44SJordan Rupprecht self.setup_targets_and_cleanup() 2999451b44SJordan Rupprecht self.do_check_filters() 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht def test_options(self): 3299451b44SJordan Rupprecht """Use Python APIs to test that we serialize breakpoint options correctly.""" 3399451b44SJordan Rupprecht self.build() 3499451b44SJordan Rupprecht self.setup_targets_and_cleanup() 3599451b44SJordan Rupprecht self.do_check_options() 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht def test_appending(self): 3899451b44SJordan Rupprecht """Use Python APIs to test that we serialize breakpoint options correctly.""" 3999451b44SJordan Rupprecht self.build() 4099451b44SJordan Rupprecht self.setup_targets_and_cleanup() 4199451b44SJordan Rupprecht self.do_check_appending() 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht def test_name_filters(self): 4499451b44SJordan Rupprecht """Use python APIs to test that reading in by name works correctly.""" 4599451b44SJordan Rupprecht self.build() 4699451b44SJordan Rupprecht self.setup_targets_and_cleanup() 4799451b44SJordan Rupprecht self.do_check_names() 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht def test_scripted_extra_args(self): 5099451b44SJordan Rupprecht self.build() 5199451b44SJordan Rupprecht self.setup_targets_and_cleanup() 5299451b44SJordan Rupprecht self.do_check_extra_args() 5399451b44SJordan Rupprecht 544da8fa45SMed Ismail Bennani def test_structured_data_serialization(self): 554da8fa45SMed Ismail Bennani target = self.dbg.GetDummyTarget() 564da8fa45SMed Ismail Bennani self.assertTrue(target.IsValid(), VALID_TARGET) 574da8fa45SMed Ismail Bennani 584da8fa45SMed Ismail Bennani interpreter = self.dbg.GetCommandInterpreter() 594da8fa45SMed Ismail Bennani result = lldb.SBCommandReturnObject() 604da8fa45SMed Ismail Bennani interpreter.HandleCommand("br set -f foo -l 42", result) 614da8fa45SMed Ismail Bennani result = lldb.SBCommandReturnObject() 624da8fa45SMed Ismail Bennani interpreter.HandleCommand("br set -c 'argc == 1' -n main", result) 634da8fa45SMed Ismail Bennani 644da8fa45SMed Ismail Bennani bkp1 = target.GetBreakpointAtIndex(0) 654da8fa45SMed Ismail Bennani self.assertTrue(bkp1.IsValid(), VALID_BREAKPOINT) 664da8fa45SMed Ismail Bennani stream = lldb.SBStream() 674da8fa45SMed Ismail Bennani sd = bkp1.SerializeToStructuredData() 684da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 694da8fa45SMed Ismail Bennani serialized_data = json.loads(stream.GetData()) 704da8fa45SMed Ismail Bennani self.assertEqual(serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["FileName"], "foo") 714da8fa45SMed Ismail Bennani self.assertEqual(serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["LineNumber"], 42) 724da8fa45SMed Ismail Bennani 734da8fa45SMed Ismail Bennani bkp2 = target.GetBreakpointAtIndex(1) 744da8fa45SMed Ismail Bennani self.assertTrue(bkp2.IsValid(), VALID_BREAKPOINT) 754da8fa45SMed Ismail Bennani stream = lldb.SBStream() 764da8fa45SMed Ismail Bennani sd = bkp2.SerializeToStructuredData() 774da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 784da8fa45SMed Ismail Bennani serialized_data = json.loads(stream.GetData()) 794da8fa45SMed Ismail Bennani self.assertIn("main", serialized_data["Breakpoint"]["BKPTResolver"]["Options"]["SymbolNames"]) 804da8fa45SMed Ismail Bennani self.assertEqual(serialized_data["Breakpoint"]["BKPTOptions"]["ConditionText"],"argc == 1") 814da8fa45SMed Ismail Bennani 824da8fa45SMed Ismail Bennani invalid_bkp = lldb.SBBreakpoint() 834da8fa45SMed Ismail Bennani self.assertFalse(invalid_bkp.IsValid(), "Breakpoint should not be valid.") 844da8fa45SMed Ismail Bennani stream = lldb.SBStream() 854da8fa45SMed Ismail Bennani sd = invalid_bkp.SerializeToStructuredData() 864da8fa45SMed Ismail Bennani sd.GetAsJSON(stream) 874da8fa45SMed Ismail Bennani self.assertFalse(stream.GetData(), "Invalid breakpoint should have an empty structured data") 884da8fa45SMed Ismail Bennani 8999451b44SJordan Rupprecht def setup_targets_and_cleanup(self): 9099451b44SJordan Rupprecht def cleanup (): 9199451b44SJordan Rupprecht self.RemoveTempFile(self.bkpts_file_path) 9299451b44SJordan Rupprecht 9399451b44SJordan Rupprecht if self.orig_target.IsValid(): 9499451b44SJordan Rupprecht self.dbg.DeleteTarget(self.orig_target) 9599451b44SJordan Rupprecht self.dbg.DeleteTarget(self.copy_target) 9699451b44SJordan Rupprecht 9799451b44SJordan Rupprecht self.addTearDownHook(cleanup) 9899451b44SJordan Rupprecht self.RemoveTempFile(self.bkpts_file_path) 9999451b44SJordan Rupprecht 10099451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 10199451b44SJordan Rupprecht 10299451b44SJordan Rupprecht # Create the targets we are making breakpoints in and copying them to: 10399451b44SJordan Rupprecht self.orig_target = self.dbg.CreateTarget(exe) 10499451b44SJordan Rupprecht self.assertTrue(self.orig_target, VALID_TARGET) 10599451b44SJordan Rupprecht 10699451b44SJordan Rupprecht self.copy_target = self.dbg.CreateTarget(exe) 10799451b44SJordan Rupprecht self.assertTrue(self.copy_target, VALID_TARGET) 10899451b44SJordan Rupprecht 10999451b44SJordan Rupprecht def setUp(self): 11099451b44SJordan Rupprecht # Call super's setUp(). 11199451b44SJordan Rupprecht TestBase.setUp(self) 11299451b44SJordan Rupprecht 11399451b44SJordan Rupprecht self.bkpts_file_path = self.getBuildArtifact("breakpoints.json") 11499451b44SJordan Rupprecht self.bkpts_file_spec = lldb.SBFileSpec(self.bkpts_file_path) 11599451b44SJordan Rupprecht 11699451b44SJordan Rupprecht def check_equivalence(self, source_bps, do_write = True): 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht error = lldb.SBError() 11999451b44SJordan Rupprecht 12099451b44SJordan Rupprecht if (do_write): 12199451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, source_bps) 122*779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 12399451b44SJordan Rupprecht 12499451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 12599451b44SJordan Rupprecht error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, copy_bps) 126*779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 12799451b44SJordan Rupprecht 12899451b44SJordan Rupprecht num_source_bps = source_bps.GetSize() 12999451b44SJordan Rupprecht num_copy_bps = copy_bps.GetSize() 130619e2e09SDave Lee self.assertEqual(num_source_bps, num_copy_bps, "Didn't get same number of input and output breakpoints - orig: %d copy: %d"%(num_source_bps, num_copy_bps)) 13199451b44SJordan Rupprecht 13299451b44SJordan Rupprecht for i in range(0, num_source_bps): 13399451b44SJordan Rupprecht source_bp = source_bps.GetBreakpointAtIndex(i) 13499451b44SJordan Rupprecht source_desc = lldb.SBStream() 13599451b44SJordan Rupprecht source_bp.GetDescription(source_desc, False) 13699451b44SJordan Rupprecht source_text = source_desc.GetData() 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht # I am assuming here that the breakpoints will get written out in breakpoint ID order, and 13999451b44SJordan Rupprecht # read back in ditto. That is true right now, and I can't see any reason to do it differently 14099451b44SJordan Rupprecht # but if we do we can go to writing the breakpoints one by one, or sniffing the descriptions to 14199451b44SJordan Rupprecht # see which one is which. 14299451b44SJordan Rupprecht copy_id = source_bp.GetID() 14399451b44SJordan Rupprecht copy_bp = copy_bps.FindBreakpointByID(copy_id) 14499451b44SJordan Rupprecht self.assertTrue(copy_bp.IsValid(), "Could not find copy breakpoint %d."%(copy_id)) 14599451b44SJordan Rupprecht 14699451b44SJordan Rupprecht copy_desc = lldb.SBStream() 14799451b44SJordan Rupprecht copy_bp.GetDescription(copy_desc, False) 14899451b44SJordan Rupprecht copy_text = copy_desc.GetData() 14999451b44SJordan Rupprecht 15099451b44SJordan Rupprecht # These two should be identical. 151b321b429SJonas Devlieghere self.trace("Source text for %d is %s."%(i, source_text)) 15299451b44SJordan Rupprecht self.assertTrue (source_text == copy_text, "Source and dest breakpoints are not identical: \nsource: %s\ndest: %s"%(source_text, copy_text)) 15399451b44SJordan Rupprecht 15499451b44SJordan Rupprecht def do_check_resolvers(self): 15599451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint resolvers""" 15699451b44SJordan Rupprecht 15799451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 15899451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 15999451b44SJordan Rupprecht blubby_file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "blubby.c")) 16099451b44SJordan Rupprecht 16199451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 16299451b44SJordan Rupprecht # actually have locations. 16399451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 16499451b44SJordan Rupprecht source_bps.Append(self.orig_target.BreakpointCreateByLocation("blubby.c", 666)) 16599451b44SJordan Rupprecht # Make sure we do one breakpoint right: 16699451b44SJordan Rupprecht self.check_equivalence(source_bps) 16799451b44SJordan Rupprecht source_bps.Clear() 16899451b44SJordan Rupprecht 16999451b44SJordan Rupprecht source_bps.Append(self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list)) 17099451b44SJordan Rupprecht source_bps.Append(self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeFull, empty_module_list,empty_cu_list)) 17199451b44SJordan Rupprecht source_bps.Append(self.orig_target.BreakpointCreateBySourceRegex("dont really care", blubby_file_spec)) 17299451b44SJordan Rupprecht 17399451b44SJordan Rupprecht # And some number greater than one: 17499451b44SJordan Rupprecht self.check_equivalence(source_bps) 17599451b44SJordan Rupprecht 17699451b44SJordan Rupprecht def do_check_filters(self): 17799451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint filters.""" 17899451b44SJordan Rupprecht module_list = lldb.SBFileSpecList() 17999451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec("SomeBinary")) 18099451b44SJordan Rupprecht module_list.Append(lldb.SBFileSpec("SomeOtherBinary")) 18199451b44SJordan Rupprecht 18299451b44SJordan Rupprecht cu_list = lldb.SBFileSpecList() 18399451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("SomeCU.c")) 18499451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("AnotherCU.c")) 18599451b44SJordan Rupprecht cu_list.Append(lldb.SBFileSpec("ThirdCU.c")) 18699451b44SJordan Rupprecht 18799451b44SJordan Rupprecht blubby_file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "blubby.c")) 18899451b44SJordan Rupprecht 18999451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 19099451b44SJordan Rupprecht # actually have locations. 19199451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 19299451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation(blubby_file_spec, 666, 0, module_list) 19399451b44SJordan Rupprecht source_bps.Append(bkpt) 19499451b44SJordan Rupprecht 19599451b44SJordan Rupprecht # Make sure we do one right: 19699451b44SJordan Rupprecht self.check_equivalence(source_bps) 19799451b44SJordan Rupprecht source_bps.Clear() 19899451b44SJordan Rupprecht 19999451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, module_list, cu_list) 20099451b44SJordan Rupprecht source_bps.Append(bkpt) 20199451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeFull, module_list, cu_list) 20299451b44SJordan Rupprecht source_bps.Append(bkpt) 20399451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateBySourceRegex("dont really care", blubby_file_spec) 20499451b44SJordan Rupprecht source_bps.Append(bkpt) 20599451b44SJordan Rupprecht 20699451b44SJordan Rupprecht # And some number greater than one: 20799451b44SJordan Rupprecht self.check_equivalence(source_bps) 20899451b44SJordan Rupprecht 20999451b44SJordan Rupprecht def do_check_options(self): 21099451b44SJordan Rupprecht """Use Python APIs to check serialization of breakpoint options.""" 21199451b44SJordan Rupprecht 21299451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 21399451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 21499451b44SJordan Rupprecht blubby_file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "blubby.c")) 21599451b44SJordan Rupprecht 21699451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 21799451b44SJordan Rupprecht # actually have locations. 21899451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 21999451b44SJordan Rupprecht 22099451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 22199451b44SJordan Rupprecht lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList()) 22299451b44SJordan Rupprecht bkpt.SetEnabled(False) 22399451b44SJordan Rupprecht bkpt.SetOneShot(True) 22499451b44SJordan Rupprecht bkpt.SetThreadID(10) 22599451b44SJordan Rupprecht source_bps.Append(bkpt) 22699451b44SJordan Rupprecht 22799451b44SJordan Rupprecht # Make sure we get one right: 22899451b44SJordan Rupprecht self.check_equivalence(source_bps) 22999451b44SJordan Rupprecht source_bps.Clear() 23099451b44SJordan Rupprecht 23199451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list) 23299451b44SJordan Rupprecht bkpt.SetIgnoreCount(10) 23399451b44SJordan Rupprecht bkpt.SetThreadName("grubby") 23499451b44SJordan Rupprecht source_bps.Append(bkpt) 23599451b44SJordan Rupprecht 23699451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list) 23799451b44SJordan Rupprecht bkpt.SetCondition("gonna remove this") 23899451b44SJordan Rupprecht bkpt.SetCondition("") 23999451b44SJordan Rupprecht source_bps.Append(bkpt) 24099451b44SJordan Rupprecht 24199451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeFull, empty_module_list,empty_cu_list) 24299451b44SJordan Rupprecht bkpt.SetCondition("something != something_else") 24399451b44SJordan Rupprecht bkpt.SetQueueName("grubby") 24499451b44SJordan Rupprecht bkpt.AddName("FirstName") 24599451b44SJordan Rupprecht bkpt.AddName("SecondName") 24699451b44SJordan Rupprecht bkpt.SetScriptCallbackBody('\tprint("I am a function that prints.")\n\tprint("I don\'t do anything else")\n') 24799451b44SJordan Rupprecht source_bps.Append(bkpt) 24899451b44SJordan Rupprecht 24999451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateBySourceRegex("dont really care", blubby_file_spec) 25099451b44SJordan Rupprecht cmd_list = lldb.SBStringList() 25199451b44SJordan Rupprecht cmd_list.AppendString("frame var") 25299451b44SJordan Rupprecht cmd_list.AppendString("thread backtrace") 25399451b44SJordan Rupprecht 25499451b44SJordan Rupprecht bkpt.SetCommandLineCommands(cmd_list) 25599451b44SJordan Rupprecht source_bps.Append(bkpt) 25699451b44SJordan Rupprecht 25799451b44SJordan Rupprecht self.check_equivalence(source_bps) 25899451b44SJordan Rupprecht 25999451b44SJordan Rupprecht def do_check_appending(self): 26099451b44SJordan Rupprecht """Use Python APIs to check appending to already serialized options.""" 26199451b44SJordan Rupprecht 26299451b44SJordan Rupprecht empty_module_list = lldb.SBFileSpecList() 26399451b44SJordan Rupprecht empty_cu_list = lldb.SBFileSpecList() 26499451b44SJordan Rupprecht blubby_file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "blubby.c")) 26599451b44SJordan Rupprecht 26699451b44SJordan Rupprecht # It isn't actually important for these purposes that these breakpoint 26799451b44SJordan Rupprecht # actually have locations. 26899451b44SJordan Rupprecht 26999451b44SJordan Rupprecht all_bps = lldb.SBBreakpointList(self.orig_target) 27099451b44SJordan Rupprecht source_bps = lldb.SBBreakpointList(self.orig_target) 27199451b44SJordan Rupprecht 27299451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 27399451b44SJordan Rupprecht lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList()) 27499451b44SJordan Rupprecht bkpt.SetEnabled(False) 27599451b44SJordan Rupprecht bkpt.SetOneShot(True) 27699451b44SJordan Rupprecht bkpt.SetThreadID(10) 27799451b44SJordan Rupprecht source_bps.Append(bkpt) 27899451b44SJordan Rupprecht all_bps.Append(bkpt) 27999451b44SJordan Rupprecht 28099451b44SJordan Rupprecht error = lldb.SBError() 28199451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, source_bps) 282*779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 28399451b44SJordan Rupprecht 28499451b44SJordan Rupprecht source_bps.Clear() 28599451b44SJordan Rupprecht 28699451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeAuto, empty_module_list, empty_cu_list) 28799451b44SJordan Rupprecht bkpt.SetIgnoreCount(10) 28899451b44SJordan Rupprecht bkpt.SetThreadName("grubby") 28999451b44SJordan Rupprecht source_bps.Append(bkpt) 29099451b44SJordan Rupprecht all_bps.Append(bkpt) 29199451b44SJordan Rupprecht 29299451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByName("blubby", lldb.eFunctionNameTypeFull, empty_module_list,empty_cu_list) 29399451b44SJordan Rupprecht bkpt.SetCondition("something != something_else") 29499451b44SJordan Rupprecht bkpt.SetQueueName("grubby") 29599451b44SJordan Rupprecht bkpt.AddName("FirstName") 29699451b44SJordan Rupprecht bkpt.AddName("SecondName") 29799451b44SJordan Rupprecht 29899451b44SJordan Rupprecht source_bps.Append(bkpt) 29999451b44SJordan Rupprecht all_bps.Append(bkpt) 30099451b44SJordan Rupprecht 30199451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, source_bps, True) 302*779bbbf2SDave Lee self.assertSuccess(error, "Failed appending breakpoints to file") 30399451b44SJordan Rupprecht 30499451b44SJordan Rupprecht self.check_equivalence(all_bps) 30599451b44SJordan Rupprecht 30699451b44SJordan Rupprecht def do_check_names(self): 30799451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateByLocation( 30899451b44SJordan Rupprecht lldb.SBFileSpec("blubby.c"), 666, 333, 0, lldb.SBFileSpecList()) 30999451b44SJordan Rupprecht good_bkpt_name = "GoodBreakpoint" 31099451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 31199451b44SJordan Rupprecht bkpt.AddName(good_bkpt_name) 31299451b44SJordan Rupprecht write_bps.Append(bkpt) 31399451b44SJordan Rupprecht 31499451b44SJordan Rupprecht error = lldb.SBError() 31599451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 316*779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints to file") 31799451b44SJordan Rupprecht 31899451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 31999451b44SJordan Rupprecht names_list = lldb.SBStringList() 32099451b44SJordan Rupprecht names_list.AppendString("NoSuchName") 32199451b44SJordan Rupprecht 32299451b44SJordan Rupprecht error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, names_list, copy_bps) 323*779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 324619e2e09SDave Lee self.assertEqual(copy_bps.GetSize(), 0, "Found breakpoints with a nonexistent name.") 32599451b44SJordan Rupprecht 32699451b44SJordan Rupprecht names_list.AppendString(good_bkpt_name) 32799451b44SJordan Rupprecht error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, names_list, copy_bps) 328*779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints from file") 329619e2e09SDave Lee self.assertEqual(copy_bps.GetSize(), 1, "Found the matching breakpoint.") 33099451b44SJordan Rupprecht 33199451b44SJordan Rupprecht def do_check_extra_args(self): 33299451b44SJordan Rupprecht 33399451b44SJordan Rupprecht import side_effect 33499451b44SJordan Rupprecht interp = self.dbg.GetCommandInterpreter() 33599451b44SJordan Rupprecht error = lldb.SBError() 33699451b44SJordan Rupprecht 33799451b44SJordan Rupprecht script_name = os.path.join(self.getSourceDir(), "resolver.py") 33899451b44SJordan Rupprecht 33999451b44SJordan Rupprecht command = "command script import " + script_name 34099451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 34199451b44SJordan Rupprecht interp.HandleCommand(command, result) 34299451b44SJordan Rupprecht self.assertTrue(result.Succeeded(), "com scr imp failed: %s"%(result.GetError())) 34399451b44SJordan Rupprecht 34499451b44SJordan Rupprecht # First make sure a scripted breakpoint with no args works: 34599451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateFromScript("resolver.Resolver", lldb.SBStructuredData(), 34699451b44SJordan Rupprecht lldb.SBFileSpecList(), lldb.SBFileSpecList()) 34799451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid(), "Bkpt is valid") 34899451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 34999451b44SJordan Rupprecht 35099451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 351*779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints") 35299451b44SJordan Rupprecht 35399451b44SJordan Rupprecht side_effect.g_extra_args = None 35499451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 35599451b44SJordan Rupprecht error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, copy_bps) 356*779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints") 35799451b44SJordan Rupprecht 35899451b44SJordan Rupprecht self.assertEqual(copy_bps.GetSize(), 1, "Got one breakpoint from file.") 35999451b44SJordan Rupprecht no_keys = lldb.SBStringList() 36099451b44SJordan Rupprecht side_effect.g_extra_args.GetKeys(no_keys) 36199451b44SJordan Rupprecht self.assertEqual(no_keys.GetSize(), 0, "Should have no keys") 36299451b44SJordan Rupprecht 36399451b44SJordan Rupprecht self.orig_target.DeleteAllBreakpoints() 36499451b44SJordan Rupprecht self.copy_target.DeleteAllBreakpoints() 36599451b44SJordan Rupprecht 36699451b44SJordan Rupprecht # Now try one with extra args: 36799451b44SJordan Rupprecht 36899451b44SJordan Rupprecht extra_args = lldb.SBStructuredData() 36999451b44SJordan Rupprecht stream = lldb.SBStream() 37099451b44SJordan Rupprecht stream.Print('{"first_arg" : "first_value", "second_arg" : "second_value"}') 37199451b44SJordan Rupprecht extra_args.SetFromJSON(stream) 37299451b44SJordan Rupprecht self.assertTrue(extra_args.IsValid(), "SBStructuredData is valid.") 37399451b44SJordan Rupprecht 37499451b44SJordan Rupprecht bkpt = self.orig_target.BreakpointCreateFromScript("resolver.Resolver", 37599451b44SJordan Rupprecht extra_args, lldb.SBFileSpecList(), lldb.SBFileSpecList()) 37699451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid(), "Bkpt is valid") 37799451b44SJordan Rupprecht write_bps = lldb.SBBreakpointList(self.orig_target) 37899451b44SJordan Rupprecht 37999451b44SJordan Rupprecht error = self.orig_target.BreakpointsWriteToFile(self.bkpts_file_spec, write_bps) 380*779bbbf2SDave Lee self.assertSuccess(error, "Failed writing breakpoints") 38199451b44SJordan Rupprecht 38299451b44SJordan Rupprecht orig_extra_args = side_effect.g_extra_args 38399451b44SJordan Rupprecht self.assertTrue(orig_extra_args.IsValid(), "Extra args originally valid") 38499451b44SJordan Rupprecht 38599451b44SJordan Rupprecht orig_keys = lldb.SBStringList() 38699451b44SJordan Rupprecht orig_extra_args.GetKeys(orig_keys) 38799451b44SJordan Rupprecht self.assertEqual(2, orig_keys.GetSize(), "Should have two keys") 38899451b44SJordan Rupprecht 38999451b44SJordan Rupprecht side_effect.g_extra_args = None 39099451b44SJordan Rupprecht 39199451b44SJordan Rupprecht copy_bps = lldb.SBBreakpointList(self.copy_target) 39299451b44SJordan Rupprecht error = self.copy_target.BreakpointsCreateFromFile(self.bkpts_file_spec, copy_bps) 393*779bbbf2SDave Lee self.assertSuccess(error, "Failed reading breakpoints") 39499451b44SJordan Rupprecht 39599451b44SJordan Rupprecht self.assertEqual(copy_bps.GetSize(), 1, "Got one breakpoint from file.") 39699451b44SJordan Rupprecht 39799451b44SJordan Rupprecht copy_extra_args = side_effect.g_extra_args 39899451b44SJordan Rupprecht copy_keys = lldb.SBStringList() 39999451b44SJordan Rupprecht copy_extra_args.GetKeys(copy_keys) 40099451b44SJordan Rupprecht self.assertEqual(2, copy_keys.GetSize(), "Copy should have two keys") 40199451b44SJordan Rupprecht 40299451b44SJordan Rupprecht for idx in range(0, orig_keys.GetSize()): 40399451b44SJordan Rupprecht key = orig_keys.GetStringAtIndex(idx) 40499451b44SJordan Rupprecht copy_value = copy_extra_args.GetValueForKey(key).GetStringValue(100) 40599451b44SJordan Rupprecht 40699451b44SJordan Rupprecht if key == "first_arg": 40799451b44SJordan Rupprecht self.assertEqual(copy_value, "first_value") 40899451b44SJordan Rupprecht elif key == "second_arg": 40999451b44SJordan Rupprecht self.assertEqual(copy_value, "second_value") 41099451b44SJordan Rupprecht else: 41199451b44SJordan Rupprecht self.Fail("Unknown key: %s"%(key)) 412