1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest lldb breakpoint command for CPP methods & functions in a namespace.
3*99451b44SJordan Rupprecht"""
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 CPPBreakpointCommandsTestCase(TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
16*99451b44SJordan Rupprecht
17*99451b44SJordan Rupprecht    def make_breakpoint(self, name, type, expected_num_locations):
18*99451b44SJordan Rupprecht        bkpt = self.target.BreakpointCreateByName(name,
19*99451b44SJordan Rupprecht                                                  type,
20*99451b44SJordan Rupprecht                                                  self.a_out_module,
21*99451b44SJordan Rupprecht                                                  self.nested_comp_unit)
22*99451b44SJordan Rupprecht        num_locations = bkpt.GetNumLocations()
23*99451b44SJordan Rupprecht        self.assertTrue(
24*99451b44SJordan Rupprecht            num_locations == expected_num_locations,
25*99451b44SJordan Rupprecht            "Wrong number of locations for '%s', expected: %d got: %d" %
26*99451b44SJordan Rupprecht            (name,
27*99451b44SJordan Rupprecht             expected_num_locations,
28*99451b44SJordan Rupprecht             num_locations))
29*99451b44SJordan Rupprecht        return bkpt
30*99451b44SJordan Rupprecht
31*99451b44SJordan Rupprecht    def test_cpp_breakpoint_cmds(self):
32*99451b44SJordan Rupprecht        """Test a sequence of breakpoint command add, list, and delete."""
33*99451b44SJordan Rupprecht        self.build()
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
36*99451b44SJordan Rupprecht
37*99451b44SJordan Rupprecht        # Create a target from the debugger.
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe)
40*99451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
41*99451b44SJordan Rupprecht
42*99451b44SJordan Rupprecht        self.a_out_module = lldb.SBFileSpecList()
43*99451b44SJordan Rupprecht        self.a_out_module.Append(lldb.SBFileSpec(exe))
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht        self.nested_comp_unit = lldb.SBFileSpecList()
46*99451b44SJordan Rupprecht        self.nested_comp_unit.Append(lldb.SBFileSpec("nested.cpp"))
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        # First provide ONLY the method name.  This should get everybody...
49*99451b44SJordan Rupprecht        self.make_breakpoint("Function",
50*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
51*99451b44SJordan Rupprecht                             5)
52*99451b44SJordan Rupprecht
53*99451b44SJordan Rupprecht        # Now add the Baz class specifier.  This should get the version contained in Bar,
54*99451b44SJordan Rupprecht        # AND the one contained in ::
55*99451b44SJordan Rupprecht        self.make_breakpoint("Baz::Function",
56*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
57*99451b44SJordan Rupprecht                             2)
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprecht        # Then add the Bar::Baz specifier.  This should get the version
60*99451b44SJordan Rupprecht        # contained in Bar only
61*99451b44SJordan Rupprecht        self.make_breakpoint("Bar::Baz::Function",
62*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeAuto,
63*99451b44SJordan Rupprecht                             1)
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht        self.make_breakpoint("Function",
66*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
67*99451b44SJordan Rupprecht                             3)
68*99451b44SJordan Rupprecht
69*99451b44SJordan Rupprecht        self.make_breakpoint("Baz::Function",
70*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
71*99451b44SJordan Rupprecht                             2)
72*99451b44SJordan Rupprecht
73*99451b44SJordan Rupprecht        self.make_breakpoint("Bar::Baz::Function",
74*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeMethod,
75*99451b44SJordan Rupprecht                             1)
76*99451b44SJordan Rupprecht
77*99451b44SJordan Rupprecht        self.make_breakpoint("Function",
78*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeBase,
79*99451b44SJordan Rupprecht                             2)
80*99451b44SJordan Rupprecht
81*99451b44SJordan Rupprecht        self.make_breakpoint("Bar::Function",
82*99451b44SJordan Rupprecht                             lldb.eFunctionNameTypeBase,
83*99451b44SJordan Rupprecht                             1)
84