1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest that inlined breakpoints (breakpoint set on a file/line included from
3*99451b44SJordan Rupprechtanother source file) works correctly.
4*99451b44SJordan Rupprecht"""
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
10*99451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprechtclass InlinedBreakpointsTestCase(TestBase):
14*99451b44SJordan Rupprecht    """Bug fixed: rdar://problem/8464339"""
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht    def test_with_run_command(self):
17*99451b44SJordan Rupprecht        """Test 'b basic_types.cpp:176' does break (where int.cpp includes basic_type.cpp)."""
18*99451b44SJordan Rupprecht        self.build()
19*99451b44SJordan Rupprecht        self.inlined_breakpoints()
20*99451b44SJordan Rupprecht
21*99451b44SJordan Rupprecht    def setUp(self):
22*99451b44SJordan Rupprecht        # Call super's setUp().
23*99451b44SJordan Rupprecht        TestBase.setUp(self)
24*99451b44SJordan Rupprecht        # Find the line number to break inside basic_type.cpp.
25*99451b44SJordan Rupprecht        self.line = line_number(
26*99451b44SJordan Rupprecht            'basic_type.cpp',
27*99451b44SJordan Rupprecht            '// Set break point at this line.')
28*99451b44SJordan Rupprecht
29*99451b44SJordan Rupprecht    def inlined_breakpoints(self):
30*99451b44SJordan Rupprecht        """Test 'b basic_types.cpp:176' does break (where int.cpp includes basic_type.cpp)."""
31*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
32*99451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
33*99451b44SJordan Rupprecht
34*99451b44SJordan Rupprecht        # With the inline-breakpoint-strategy, our file+line breakpoint should
35*99451b44SJordan Rupprecht        # not resolve to a location.
36*99451b44SJordan Rupprecht        self.runCmd('settings set target.inline-breakpoint-strategy headers')
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht        # Set a breakpoint and fail because it is in an inlined source
39*99451b44SJordan Rupprecht        # implemenation file
40*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
41*99451b44SJordan Rupprecht            self, "basic_type.cpp", self.line, num_expected_locations=0)
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprecht        # Now enable breakpoints in implementation files and see the breakpoint
44*99451b44SJordan Rupprecht        # set succeed
45*99451b44SJordan Rupprecht        self.runCmd('settings set target.inline-breakpoint-strategy always')
46*99451b44SJordan Rupprecht        # And add hooks to restore the settings during tearDown().
47*99451b44SJordan Rupprecht        self.addTearDownHook(lambda: self.runCmd(
48*99451b44SJordan Rupprecht            "settings set target.inline-breakpoint-strategy always"))
49*99451b44SJordan Rupprecht
50*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
51*99451b44SJordan Rupprecht            self,
52*99451b44SJordan Rupprecht            "basic_type.cpp",
53*99451b44SJordan Rupprecht            self.line,
54*99451b44SJordan Rupprecht            num_expected_locations=1,
55*99451b44SJordan Rupprecht            loc_exact=True)
56*99451b44SJordan Rupprecht
57*99451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprecht        # The stop reason of the thread should be breakpoint.
60*99451b44SJordan Rupprecht        # And it should break at basic_type.cpp:176.
61*99451b44SJordan Rupprecht        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
62*99451b44SJordan Rupprecht                    substrs=['stopped',
63*99451b44SJordan Rupprecht                             'basic_type.cpp:%d' % self.line,
64*99451b44SJordan Rupprecht                             'stop reason = breakpoint',])
65