xref: /llvm-project/lldb/test/API/functionalities/breakpoint/source_regexp/TestSourceRegexBreakpoints.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
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    def test_location(self):
1599451b44SJordan Rupprecht        self.build()
1699451b44SJordan Rupprecht        self.source_regex_locations()
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht    def test_restrictions(self):
1999451b44SJordan Rupprecht        self.build()
2099451b44SJordan Rupprecht        self.source_regex_restrictions()
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht    def source_regex_locations(self):
2399451b44SJordan Rupprecht        """Test that restricting source expressions to files & to functions."""
2499451b44SJordan Rupprecht        # Create a target by the debugger.
2599451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2699451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2799451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        # First look just in main:
3099451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
3199451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        func_names = lldb.SBStringList()
3499451b44SJordan Rupprecht        func_names.AppendString("a_func")
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
3799451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
382238dcc3SJonas Devlieghere            source_regex, lldb.SBFileSpecList(), target_files, func_names
392238dcc3SJonas Devlieghere        )
4099451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
410ed758b2SDave Lee        self.assertEqual(
422238dcc3SJonas Devlieghere            num_locations,
432238dcc3SJonas Devlieghere            1,
442238dcc3SJonas Devlieghere            "a.c in a_func should give one breakpoint, got %d." % (num_locations),
452238dcc3SJonas Devlieghere        )
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        loc = main_break.GetLocationAtIndex(0)
4899451b44SJordan Rupprecht        self.assertTrue(loc.IsValid(), "Got a valid location.")
4999451b44SJordan Rupprecht        address = loc.GetAddress()
502238dcc3SJonas Devlieghere        self.assertTrue(address.IsValid(), "Got a valid address from the location.")
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        a_func_line = line_number("a.c", "Set A breakpoint here")
5399451b44SJordan Rupprecht        line_entry = address.GetLineEntry()
5499451b44SJordan Rupprecht        self.assertTrue(line_entry.IsValid(), "Got a valid line entry.")
55*80fcecb1SJonas Devlieghere        self.assertEqual(
562238dcc3SJonas Devlieghere            line_entry.line,
572238dcc3SJonas Devlieghere            a_func_line,
582238dcc3SJonas Devlieghere            "Our line number matches the one lldbtest found.",
592238dcc3SJonas Devlieghere        )
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht    def source_regex_restrictions(self):
6299451b44SJordan Rupprecht        """Test that restricting source expressions to files & to functions."""
6399451b44SJordan Rupprecht        # Create a target by the debugger.
6499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
6599451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
6699451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        # First look just in main:
6999451b44SJordan Rupprecht        target_files = lldb.SBFileSpecList()
7099451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("main.c"))
7199451b44SJordan Rupprecht        source_regex = "Set . breakpoint here"
7299451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
732238dcc3SJonas Devlieghere            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList()
742238dcc3SJonas Devlieghere        )
7599451b44SJordan Rupprecht
7699451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
770ed758b2SDave Lee        self.assertEqual(
782238dcc3SJonas Devlieghere            num_locations, 2, "main.c should have 2 matches, got %d." % (num_locations)
792238dcc3SJonas Devlieghere        )
8099451b44SJordan Rupprecht
8199451b44SJordan Rupprecht        # Now look in both files:
8299451b44SJordan Rupprecht        target_files.Append(lldb.SBFileSpec("a.c"))
8399451b44SJordan Rupprecht
8499451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
852238dcc3SJonas Devlieghere            source_regex, lldb.SBFileSpecList(), target_files, lldb.SBStringList()
862238dcc3SJonas Devlieghere        )
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
890ed758b2SDave Lee        self.assertEqual(
902238dcc3SJonas Devlieghere            num_locations,
912238dcc3SJonas Devlieghere            4,
922238dcc3SJonas Devlieghere            "main.c and a.c should have 4 matches, got %d." % (num_locations),
932238dcc3SJonas Devlieghere        )
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        # Now restrict it to functions:
9699451b44SJordan Rupprecht        func_names = lldb.SBStringList()
9799451b44SJordan Rupprecht        func_names.AppendString("main_func")
9899451b44SJordan Rupprecht        main_break = target.BreakpointCreateBySourceRegex(
992238dcc3SJonas Devlieghere            source_regex, lldb.SBFileSpecList(), target_files, func_names
1002238dcc3SJonas Devlieghere        )
10199451b44SJordan Rupprecht
10299451b44SJordan Rupprecht        num_locations = main_break.GetNumLocations()
1030ed758b2SDave Lee        self.assertEqual(
1042238dcc3SJonas Devlieghere            num_locations,
1052238dcc3SJonas Devlieghere            2,
1062238dcc3SJonas Devlieghere            "main_func in main.c and a.c should have 2 matches, got %d."
1072238dcc3SJonas Devlieghere            % (num_locations),
1082238dcc3SJonas Devlieghere        )
109