1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest that you can set breakpoint and hit the C++ language exception breakpoint
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 TestCPPExceptionBreakpoint (TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
16*99451b44SJordan Rupprecht    my_var = 10
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
19*99451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24538")
20*99451b44SJordan Rupprecht    @expectedFailureNetBSD
21*99451b44SJordan Rupprecht    def test_cpp_exception_breakpoint(self):
22*99451b44SJordan Rupprecht        """Test setting and hitting the C++ exception breakpoint."""
23*99451b44SJordan Rupprecht        self.build()
24*99451b44SJordan Rupprecht        self.do_cpp_exception_bkpt()
25*99451b44SJordan Rupprecht
26*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
27*99451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24538")
28*99451b44SJordan Rupprecht    @expectedFailureNetBSD
29*99451b44SJordan Rupprecht    def test_dummy_target_cpp_exception_breakpoint(self):
30*99451b44SJordan Rupprecht        """Test setting and hitting the C++ exception breakpoint from dummy target."""
31*99451b44SJordan Rupprecht        self.build()
32*99451b44SJordan Rupprecht        self.do_dummy_target_cpp_exception_bkpt()
33*99451b44SJordan Rupprecht
34*99451b44SJordan Rupprecht    def setUp(self):
35*99451b44SJordan Rupprecht        TestBase.setUp(self)
36*99451b44SJordan Rupprecht        self.main_source = "main.c"
37*99451b44SJordan Rupprecht        self.main_source_spec = lldb.SBFileSpec(self.main_source)
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht    def do_cpp_exception_bkpt(self):
40*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
41*99451b44SJordan Rupprecht        error = lldb.SBError()
42*99451b44SJordan Rupprecht
43*99451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe)
44*99451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
45*99451b44SJordan Rupprecht
46*99451b44SJordan Rupprecht        exception_bkpt = self.target.BreakpointCreateForException(
47*99451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus, False, True)
48*99451b44SJordan Rupprecht        self.assertTrue(
49*99451b44SJordan Rupprecht            exception_bkpt.IsValid(),
50*99451b44SJordan Rupprecht            "Created exception breakpoint.")
51*99451b44SJordan Rupprecht
52*99451b44SJordan Rupprecht        process = self.target.LaunchSimple(
53*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
54*99451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
55*99451b44SJordan Rupprecht
56*99451b44SJordan Rupprecht        thread_list = lldbutil.get_threads_stopped_at_breakpoint(
57*99451b44SJordan Rupprecht            process, exception_bkpt)
58*99451b44SJordan Rupprecht        self.assertTrue(len(thread_list) == 1,
59*99451b44SJordan Rupprecht                        "One thread stopped at the exception breakpoint.")
60*99451b44SJordan Rupprecht
61*99451b44SJordan Rupprecht    def do_dummy_target_cpp_exception_bkpt(self):
62*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
63*99451b44SJordan Rupprecht        error = lldb.SBError()
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht        dummy_exception_bkpt = self.dbg.GetDummyTarget().BreakpointCreateForException(
66*99451b44SJordan Rupprecht            lldb.eLanguageTypeC_plus_plus, False, True)
67*99451b44SJordan Rupprecht        self.assertTrue(
68*99451b44SJordan Rupprecht            dummy_exception_bkpt.IsValid(),
69*99451b44SJordan Rupprecht            "Created exception breakpoint in dummy target.")
70*99451b44SJordan Rupprecht
71*99451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe)
72*99451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
73*99451b44SJordan Rupprecht
74*99451b44SJordan Rupprecht        exception_bkpt = self.target.GetBreakpointAtIndex(0)
75*99451b44SJordan Rupprecht        self.assertTrue(
76*99451b44SJordan Rupprecht            exception_bkpt.IsValid(),
77*99451b44SJordan Rupprecht            "Target primed with exception breakpoint from dummy target.")
78*99451b44SJordan Rupprecht
79*99451b44SJordan Rupprecht        process = self.target.LaunchSimple(
80*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
81*99451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
82*99451b44SJordan Rupprecht
83*99451b44SJordan Rupprecht        thread_list = lldbutil.get_threads_stopped_at_breakpoint(
84*99451b44SJordan Rupprecht           process, exception_bkpt)
85*99451b44SJordan Rupprecht        self.assertTrue(len(thread_list) == 1,
86*99451b44SJordan Rupprecht                       "One thread stopped at the exception breakpoint.")
87