1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest breakpoint command for different options.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprechtimport lldb
8*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
9*99451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
10*99451b44SJordan Rupprecht
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprechtclass BreakpointOptionsTestCase(TestBase):
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprecht    def test(self):
15*99451b44SJordan Rupprecht        """Test breakpoint command for different options."""
16*99451b44SJordan Rupprecht        self.build()
17*99451b44SJordan Rupprecht        self.breakpoint_options_test()
18*99451b44SJordan Rupprecht
19*99451b44SJordan Rupprecht    def setUp(self):
20*99451b44SJordan Rupprecht        # Call super's setUp().
21*99451b44SJordan Rupprecht        TestBase.setUp(self)
22*99451b44SJordan Rupprecht        # Find the line number to break inside main().
23*99451b44SJordan Rupprecht        self.line = line_number('main.cpp', '// Set break point at this line.')
24*99451b44SJordan Rupprecht
25*99451b44SJordan Rupprecht    def breakpoint_options_test(self):
26*99451b44SJordan Rupprecht        """Test breakpoint command for different options."""
27*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
28*99451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
29*99451b44SJordan Rupprecht
30*99451b44SJordan Rupprecht        # This should create a breakpoint with 1 locations.
31*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
32*99451b44SJordan Rupprecht            self,
33*99451b44SJordan Rupprecht            "main.cpp",
34*99451b44SJordan Rupprecht            self.line,
35*99451b44SJordan Rupprecht            extra_options="-K 1",
36*99451b44SJordan Rupprecht            num_expected_locations=1)
37*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
38*99451b44SJordan Rupprecht            self,
39*99451b44SJordan Rupprecht            "main.cpp",
40*99451b44SJordan Rupprecht            self.line,
41*99451b44SJordan Rupprecht            extra_options="-K 0",
42*99451b44SJordan Rupprecht            num_expected_locations=1)
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht        # Run the program.
45*99451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprecht        # Stopped once.
48*99451b44SJordan Rupprecht        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
49*99451b44SJordan Rupprecht                    substrs=["stop reason = breakpoint 2."])
50*99451b44SJordan Rupprecht
51*99451b44SJordan Rupprecht        # Check the list of breakpoint.
52*99451b44SJordan Rupprecht        self.expect(
53*99451b44SJordan Rupprecht            "breakpoint list -f",
54*99451b44SJordan Rupprecht            "Breakpoint locations shown correctly",
55*99451b44SJordan Rupprecht            substrs=[
56*99451b44SJordan Rupprecht                "1: file = 'main.cpp', line = %d, exact_match = 0, locations = 1" %
57*99451b44SJordan Rupprecht                self.line,
58*99451b44SJordan Rupprecht                "2: file = 'main.cpp', line = %d, exact_match = 0, locations = 1" %
59*99451b44SJordan Rupprecht                self.line])
60*99451b44SJordan Rupprecht
61*99451b44SJordan Rupprecht        # Continue the program, there should be another stop.
62*99451b44SJordan Rupprecht        self.runCmd("process continue")
63*99451b44SJordan Rupprecht
64*99451b44SJordan Rupprecht        # Stopped again.
65*99451b44SJordan Rupprecht        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
66*99451b44SJordan Rupprecht                    substrs=["stop reason = breakpoint 1."])
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht        # Continue the program, we should exit.
69*99451b44SJordan Rupprecht        self.runCmd("process continue")
70*99451b44SJordan Rupprecht
71*99451b44SJordan Rupprecht        # We should exit.
72*99451b44SJordan Rupprecht        self.expect("process status", "Process exited successfully",
73*99451b44SJordan Rupprecht                    patterns=["^Process [0-9]+ exited with status = 0"])
74*99451b44SJordan Rupprecht
75*99451b44SJordan Rupprecht    def breakpoint_options_language_test(self):
76*99451b44SJordan Rupprecht        """Test breakpoint command for language option."""
77*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
78*99451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
79*99451b44SJordan Rupprecht
80*99451b44SJordan Rupprecht        # This should create a breakpoint with 1 locations.
81*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_symbol(
82*99451b44SJordan Rupprecht            self,
83*99451b44SJordan Rupprecht            'ns::func',
84*99451b44SJordan Rupprecht            sym_exact=False,
85*99451b44SJordan Rupprecht            extra_options="-L c++",
86*99451b44SJordan Rupprecht            num_expected_locations=1)
87*99451b44SJordan Rupprecht
88*99451b44SJordan Rupprecht        # This should create a breakpoint with 0 locations.
89*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_symbol(
90*99451b44SJordan Rupprecht            self,
91*99451b44SJordan Rupprecht            'ns::func',
92*99451b44SJordan Rupprecht            sym_exact=False,
93*99451b44SJordan Rupprecht            extra_options="-L c",
94*99451b44SJordan Rupprecht            num_expected_locations=0)
95*99451b44SJordan Rupprecht        self.runCmd("settings set target.language c")
96*99451b44SJordan Rupprecht        lldbutil.run_break_set_by_symbol(
97*99451b44SJordan Rupprecht            self, 'ns::func', sym_exact=False, num_expected_locations=0)
98*99451b44SJordan Rupprecht
99*99451b44SJordan Rupprecht        # Run the program.
100*99451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
101*99451b44SJordan Rupprecht
102*99451b44SJordan Rupprecht        # Stopped once.
103*99451b44SJordan Rupprecht        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
104*99451b44SJordan Rupprecht                    substrs=["stop reason = breakpoint 1."])
105*99451b44SJordan Rupprecht
106*99451b44SJordan Rupprecht        # Continue the program, we should exit.
107*99451b44SJordan Rupprecht        self.runCmd("process continue")
108*99451b44SJordan Rupprecht
109*99451b44SJordan Rupprecht        # We should exit.
110*99451b44SJordan Rupprecht        self.expect("process status", "Process exited successfully",
111*99451b44SJordan Rupprecht                    patterns=["^Process [0-9]+ exited with status = 0"])
112