199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb breakpoint setting by source regular expression.
399451b44SJordan RupprechtThis test just tests the source file & function restrictions.
499451b44SJordan Rupprecht"""
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
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 TestSourceRegexBreakpoints(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def test_location(self):
1699451b44SJordan Rupprecht        self.build()
1799451b44SJordan Rupprecht        self.source_regex_locations()
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht    def test_restrictions(self):
2099451b44SJordan Rupprecht        self.build()
2199451b44SJordan Rupprecht        self.source_regex_restrictions()
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht    def source_regex_locations(self):
2499451b44SJordan Rupprecht        """ Test that restricting source expressions to files & to functions. """
2599451b44SJordan Rupprecht        # Create a target by the debugger.
2699451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2799451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2899451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        # First look just in main:
3199451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
3299451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        func_names = lldb.SBStringList()
3599451b44SJordan Rupprecht        func_names.AppendString("a_func")
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
3899451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
3999451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, func_names)
4099451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
41*0ed758b2SDave Lee        self.assertEqual(
42*0ed758b2SDave Lee            num_locations, 1,
4399451b44SJordan Rupprecht            "a.c in a_func should give one breakpoint, got %d." %
4499451b44SJordan Rupprecht            (num_locations))
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        loc = main_break.GetLocationAtIndex(0)
4799451b44SJordan Rupprecht        self.assertTrue(loc.IsValid(), "Got a valid location.")
4899451b44SJordan Rupprecht        address = loc.GetAddress()
4999451b44SJordan Rupprecht        self.assertTrue(
5099451b44SJordan Rupprecht            address.IsValid(),
5199451b44SJordan Rupprecht            "Got a valid address from the location.")
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        a_func_line = line_number("a.c", "Set A breakpoint here")
5499451b44SJordan Rupprecht        line_entry = address.GetLineEntry()
5599451b44SJordan Rupprecht        self.assertTrue(line_entry.IsValid(), "Got a valid line entry.")
56b3a0c4d7SRaphael Isemann        self.assertEquals(line_entry.line, a_func_line,
5799451b44SJordan Rupprecht                        "Our line number matches the one lldbtest found.")
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht    def source_regex_restrictions(self):
6099451b44SJordan Rupprecht        """ Test that restricting source expressions to files & to functions. """
6199451b44SJordan Rupprecht        # Create a target by the debugger.
6299451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6399451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
6499451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        # First look just in main:
6799451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
6899451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("main.c"))
6999451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
7099451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
7199451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList())
7299451b44SJordan Rupprecht
7399451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
74*0ed758b2SDave Lee        self.assertEqual(
75*0ed758b2SDave Lee            num_locations, 2,
7699451b44SJordan Rupprecht            "main.c should have 2 matches, got %d." %
7799451b44SJordan Rupprecht            (num_locations))
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        # Now look in both files:
8099451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
8399451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList())
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
86*0ed758b2SDave Lee        self.assertEqual(
87*0ed758b2SDave Lee            num_locations, 4,
8899451b44SJordan Rupprecht            "main.c and a.c should have 4 matches, got %d." %
8999451b44SJordan Rupprecht            (num_locations))
9099451b44SJordan Rupprecht
9199451b44SJordan Rupprecht        # Now restrict it to functions:
9299451b44SJordan Rupprecht        func_names = lldb.SBStringList()
9399451b44SJordan Rupprecht        func_names.AppendString("main_func")
9499451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
9599451b44SJordan Rupprecht            source_regex, lldb.SBFileSpecList(), target_files, func_names)
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
98*0ed758b2SDave Lee        self.assertEqual(
99*0ed758b2SDave Lee            num_locations, 2,
10099451b44SJordan Rupprecht            "main_func in main.c and a.c should have 2 matches, got %d." %
10199451b44SJordan Rupprecht            (num_locations))
102