xref: /llvm-project/lldb/test/API/functionalities/breakpoint/source_regexp/TestSourceRegexBreakpoints.py (revision 99451b4453688a94c6014cac233d371ab4cc342d)
1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest lldb breakpoint setting by source regular expression.
3*99451b44SJordan RupprechtThis test just tests the source file & function restrictions.
4*99451b44SJordan Rupprecht"""
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprechtclass TestSourceRegexBreakpoints(TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht    def test_location(self):
18*99451b44SJordan Rupprecht        self.build()
19*99451b44SJordan Rupprecht        self.source_regex_locations()
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht    def test_restrictions(self):
22*99451b44SJordan Rupprecht        self.build()
23*99451b44SJordan Rupprecht        self.source_regex_restrictions()
24*99451b44SJordan Rupprecht
25*99451b44SJordan Rupprecht    def source_regex_locations(self):
26*99451b44SJordan Rupprecht        """ Test that restricting source expressions to files & to functions. """
27*99451b44SJordan Rupprecht        # Create a target by the debugger.
28*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
29*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
30*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht        # First look just in main:
33*99451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
34*99451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
35*99451b44SJordan Rupprecht
36*99451b44SJordan Rupprecht        func_names = lldb.SBStringList()
37*99451b44SJordan Rupprecht        func_names.AppendString("a_func")
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
40*99451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
41*99451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, func_names)
42*99451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
43*99451b44SJordan Rupprecht        self.assertTrue(
44*99451b44SJordan Rupprecht            num_locations == 1,
45*99451b44SJordan Rupprecht            "a.c in a_func should give one breakpoint, got %d." %
46*99451b44SJordan Rupprecht            (num_locations))
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        loc = main_break.GetLocationAtIndex(0)
49*99451b44SJordan Rupprecht        self.assertTrue(loc.IsValid(), "Got a valid location.")
50*99451b44SJordan Rupprecht        address = loc.GetAddress()
51*99451b44SJordan Rupprecht        self.assertTrue(
52*99451b44SJordan Rupprecht            address.IsValid(),
53*99451b44SJordan Rupprecht            "Got a valid address from the location.")
54*99451b44SJordan Rupprecht
55*99451b44SJordan Rupprecht        a_func_line = line_number("a.c", "Set A breakpoint here")
56*99451b44SJordan Rupprecht        line_entry = address.GetLineEntry()
57*99451b44SJordan Rupprecht        self.assertTrue(line_entry.IsValid(), "Got a valid line entry.")
58*99451b44SJordan Rupprecht        self.assertTrue(line_entry.line == a_func_line,
59*99451b44SJordan Rupprecht                        "Our line number matches the one lldbtest found.")
60*99451b44SJordan Rupprecht
61*99451b44SJordan Rupprecht    def source_regex_restrictions(self):
62*99451b44SJordan Rupprecht        """ Test that restricting source expressions to files & to functions. """
63*99451b44SJordan Rupprecht        # Create a target by the debugger.
64*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
65*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
66*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht        # First look just in main:
69*99451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
70*99451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("main.c"))
71*99451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
72*99451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
73*99451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList())
74*99451b44SJordan Rupprecht
75*99451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
76*99451b44SJordan Rupprecht        self.assertTrue(
77*99451b44SJordan Rupprecht            num_locations == 2,
78*99451b44SJordan Rupprecht            "main.c should have 2 matches, got %d." %
79*99451b44SJordan Rupprecht            (num_locations))
80*99451b44SJordan Rupprecht
81*99451b44SJordan Rupprecht        # Now look in both files:
82*99451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
83*99451b44SJordan Rupprecht
84*99451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
85*99451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList())
86*99451b44SJordan Rupprecht
87*99451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
88*99451b44SJordan Rupprecht        self.assertTrue(
89*99451b44SJordan Rupprecht            num_locations == 4,
90*99451b44SJordan Rupprecht            "main.c and a.c should have 4 matches, got %d." %
91*99451b44SJordan Rupprecht            (num_locations))
92*99451b44SJordan Rupprecht
93*99451b44SJordan Rupprecht        # Now restrict it to functions:
94*99451b44SJordan Rupprecht        func_names = lldb.SBStringList()
95*99451b44SJordan Rupprecht        func_names.AppendString("main_func")
96*99451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
97*99451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, func_names)
98*99451b44SJordan Rupprecht
99*99451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
100*99451b44SJordan Rupprecht        self.assertTrue(
101*99451b44SJordan Rupprecht            num_locations == 2,
102*99451b44SJordan Rupprecht            "main_func in main.c and a.c should have 2 matches, got %d." %
103*99451b44SJordan Rupprecht            (num_locations))
104