199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest lldb breakpoint command for CPP methods & functions in a namespace.
399451b44SJordan Rupprecht"""
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 CPPBreakpointCommandsTestCase(TestBase):
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprecht    def make_breakpoint(self, name, type, expected_num_locations):
1699451b44SJordan Rupprecht        bkpt = self.target.BreakpointCreateByName(name,
1799451b44SJordan Rupprecht                                                  type,
1899451b44SJordan Rupprecht                                                  self.a_out_module,
1999451b44SJordan Rupprecht                                                  self.nested_comp_unit)
2099451b44SJordan Rupprecht        num_locations = bkpt.GetNumLocations()
21*0ed758b2SDave Lee        self.assertEqual(
22*0ed758b2SDave Lee            num_locations, expected_num_locations,
2399451b44SJordan Rupprecht            "Wrong number of locations for '%s', expected: %d got: %d" %
2499451b44SJordan Rupprecht            (name,
2599451b44SJordan Rupprecht             expected_num_locations,
2699451b44SJordan Rupprecht             num_locations))
2799451b44SJordan Rupprecht        return bkpt
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht    def test_cpp_breakpoint_cmds(self):
3099451b44SJordan Rupprecht        """Test a sequence of breakpoint command add, list, and delete."""
3199451b44SJordan Rupprecht        self.build()
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Create a target from the debugger.
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe)
3899451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        self.a_out_module = lldb.SBFileSpecList()
4199451b44SJordan Rupprecht        self.a_out_module.Append(lldb.SBFileSpec(exe))
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        self.nested_comp_unit = lldb.SBFileSpecList()
4499451b44SJordan Rupprecht        self.nested_comp_unit.Append(lldb.SBFileSpec("nested.cpp"))
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        # First provide ONLY the method name.  This should get everybody...
4799451b44SJordan Rupprecht        self.make_breakpoint("Function",
4899451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
4999451b44SJordan Rupprecht                             5)
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        # Now add the Baz class specifier.  This should get the version contained in Bar,
5299451b44SJordan Rupprecht        # AND the one contained in ::
5399451b44SJordan Rupprecht        self.make_breakpoint("Baz::Function",
5499451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
5599451b44SJordan Rupprecht                             2)
5699451b44SJordan Rupprecht
5799451b44SJordan Rupprecht        # Then add the Bar::Baz specifier.  This should get the version
5899451b44SJordan Rupprecht        # contained in Bar only
5999451b44SJordan Rupprecht        self.make_breakpoint("Bar::Baz::Function",
6099451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
6199451b44SJordan Rupprecht                             1)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        self.make_breakpoint("Function",
6499451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
6599451b44SJordan Rupprecht                             3)
6699451b44SJordan Rupprecht
6799451b44SJordan Rupprecht        self.make_breakpoint("Baz::Function",
6899451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
6999451b44SJordan Rupprecht                             2)
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht        self.make_breakpoint("Bar::Baz::Function",
7299451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
7399451b44SJordan Rupprecht                             1)
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        self.make_breakpoint("Function",
7699451b44SJordan Rupprecht                             lldb.eFunctionNameTypeBase,
7799451b44SJordan Rupprecht                             2)
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        self.make_breakpoint("Bar::Function",
8099451b44SJordan Rupprecht                             lldb.eFunctionNameTypeBase,
8199451b44SJordan Rupprecht                             1)
82