xref: /llvm-project/lldb/test/API/functionalities/breakpoint/serialize/TestBreakpointSerialization.py (revision 9c2468821ec51defd09c246fea4a47886fff8c01)
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