199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that breakpoints do not affect stepping.
399451b44SJordan RupprechtCheck for correct StopReason when stepping to the line with breakpoint
4e9264b74SKazuaki Ishizakiwhich should be eStopReasonBreakpoint in general,
599451b44SJordan Rupprechtand eStopReasonPlanComplete when breakpoint's condition fails.
699451b44SJordan Rupprecht"""
799451b44SJordan Rupprecht
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtimport unittest2
1099451b44SJordan Rupprechtimport lldb
1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1399451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprechtclass StepOverBreakpointsTestCase(TestBase):
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def setUp(self):
1899451b44SJordan Rupprecht        TestBase.setUp(self)
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht        self.build()
2199451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2299451b44SJordan Rupprecht        src = lldb.SBFileSpec("main.cpp")
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht        # Create a target by the debugger.
2599451b44SJordan Rupprecht        self.target = self.dbg.CreateTarget(exe)
2699451b44SJordan Rupprecht        self.assertTrue(self.target, VALID_TARGET)
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Setup four breakpoints, two of them with false condition
2999451b44SJordan Rupprecht        self.line1 = line_number('main.cpp', "breakpoint_1")
3099451b44SJordan Rupprecht        self.line4 = line_number('main.cpp', "breakpoint_4")
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        self.breakpoint1 = self.target.BreakpointCreateByLocation(src, self.line1)
3399451b44SJordan Rupprecht        self.assertTrue(
3499451b44SJordan Rupprecht            self.breakpoint1 and self.breakpoint1.GetNumLocations() == 1,
3599451b44SJordan Rupprecht            VALID_BREAKPOINT)
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        self.breakpoint2 = self.target.BreakpointCreateBySourceRegex("breakpoint_2", src)
3899451b44SJordan Rupprecht        self.breakpoint2.GetLocationAtIndex(0).SetCondition('false')
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht        self.breakpoint3 = self.target.BreakpointCreateBySourceRegex("breakpoint_3", src)
4199451b44SJordan Rupprecht        self.breakpoint3.GetLocationAtIndex(0).SetCondition('false')
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        self.breakpoint4 = self.target.BreakpointCreateByLocation(src, self.line4)
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        # Start debugging
4699451b44SJordan Rupprecht        self.process = self.target.LaunchSimple(
4799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
4899451b44SJordan Rupprecht        self.assertIsNotNone(self.process, PROCESS_IS_VALID)
4999451b44SJordan Rupprecht        self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint1)
5099451b44SJordan Rupprecht        self.assertIsNotNone(self.thread, "Didn't stop at breakpoint 1.")
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht    def test_step_instruction(self):
5399451b44SJordan Rupprecht        # Count instructions between breakpoint_1 and breakpoint_4
5499451b44SJordan Rupprecht        contextList = self.target.FindFunctions('main', lldb.eFunctionNameTypeAuto)
5599451b44SJordan Rupprecht        self.assertEquals(contextList.GetSize(), 1)
5699451b44SJordan Rupprecht        symbolContext = contextList.GetContextAtIndex(0)
5799451b44SJordan Rupprecht        function = symbolContext.GetFunction()
5899451b44SJordan Rupprecht        self.assertTrue(function)
5999451b44SJordan Rupprecht        instructions = function.GetInstructions(self.target)
6099451b44SJordan Rupprecht        addr_1 = self.breakpoint1.GetLocationAtIndex(0).GetAddress()
6199451b44SJordan Rupprecht        addr_4 = self.breakpoint4.GetLocationAtIndex(0).GetAddress()
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        # if third argument is true then the count will be the number of
6499451b44SJordan Rupprecht        # instructions on which a breakpoint can be set.
6599451b44SJordan Rupprecht        # start = addr_1, end = addr_4, canSetBreakpoint = True
6699451b44SJordan Rupprecht        steps_expected = instructions.GetInstructionsCount(addr_1, addr_4, True)
6799451b44SJordan Rupprecht        step_count = 0
6899451b44SJordan Rupprecht        # Step from breakpoint_1 to breakpoint_4
6999451b44SJordan Rupprecht        while True:
7099451b44SJordan Rupprecht            self.thread.StepInstruction(True)
7199451b44SJordan Rupprecht            step_count = step_count + 1
72*ce825e46SJonas Devlieghere            self.assertState(self.process.GetState(), lldb.eStateStopped)
7399451b44SJordan Rupprecht            self.assertTrue(self.thread.GetStopReason() == lldb.eStopReasonPlanComplete or
7499451b44SJordan Rupprecht                            self.thread.GetStopReason() == lldb.eStopReasonBreakpoint)
7599451b44SJordan Rupprecht            if (self.thread.GetStopReason() == lldb.eStopReasonBreakpoint) :
7699451b44SJordan Rupprecht                # we should not stop on breakpoint_2 and _3 because they have false condition
7799451b44SJordan Rupprecht                self.assertEquals(self.thread.GetFrameAtIndex(0).GetLineEntry().GetLine(), self.line4)
7899451b44SJordan Rupprecht                # breakpoint_2 and _3 should not affect step count
7999451b44SJordan Rupprecht                self.assertTrue(step_count >= steps_expected)
8099451b44SJordan Rupprecht                break
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        # Run the process until termination
8399451b44SJordan Rupprecht        self.process.Continue()
84*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateExited)
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht    @skipIf(bugnumber="llvm.org/pr31972", hostoslist=["windows"])
8799451b44SJordan Rupprecht    def test_step_over(self):
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        self.thread.StepOver()
9099451b44SJordan Rupprecht        # We should be stopped at the breakpoint_2 line with stop plan complete reason
91*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
9299451b44SJordan Rupprecht        self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
9399451b44SJordan Rupprecht
9499451b44SJordan Rupprecht        self.thread.StepOver()
9599451b44SJordan Rupprecht        # We should be stopped at the breakpoint_3 line with stop plan complete reason
96*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
9799451b44SJordan Rupprecht        self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonPlanComplete)
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        self.thread.StepOver()
10099451b44SJordan Rupprecht        # We should be stopped at the breakpoint_4
101*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
10299451b44SJordan Rupprecht        self.assertEquals(self.thread.GetStopReason(), lldb.eStopReasonBreakpoint)
10399451b44SJordan Rupprecht        thread1 = lldbutil.get_one_thread_stopped_at_breakpoint(self.process, self.breakpoint4)
10499451b44SJordan Rupprecht        self.assertEquals(self.thread, thread1, "Didn't stop at breakpoint 4.")
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        # Check that stepping does not affect breakpoint's hit count
10799451b44SJordan Rupprecht        self.assertEquals(self.breakpoint1.GetHitCount(), 1)
10899451b44SJordan Rupprecht        self.assertEquals(self.breakpoint2.GetHitCount(), 0)
10999451b44SJordan Rupprecht        self.assertEquals(self.breakpoint3.GetHitCount(), 0)
11099451b44SJordan Rupprecht        self.assertEquals(self.breakpoint4.GetHitCount(), 1)
11199451b44SJordan Rupprecht
11299451b44SJordan Rupprecht        # Run the process until termination
11399451b44SJordan Rupprecht        self.process.Continue()
114*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateExited)
11599451b44SJordan Rupprecht
116