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