199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that we handle breakpoints on consecutive instructions correctly.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport unittest2
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass ConsecutiveBreakpointsTestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def prepare_test(self):
1799451b44SJordan Rupprecht        self.build()
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        (self.target, self.process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(
2099451b44SJordan Rupprecht                self, "Set breakpoint here", lldb.SBFileSpec("main.cpp"))
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht        # Set breakpoint to the next instruction
2399451b44SJordan Rupprecht        frame = self.thread.GetFrameAtIndex(0)
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht        address = frame.GetPCAddress()
2699451b44SJordan Rupprecht        instructions = self.target.ReadInstructions(address, 2)
27b3a0c4d7SRaphael Isemann        self.assertEquals(len(instructions), 2)
2899451b44SJordan Rupprecht        self.bkpt_address = instructions[1].GetAddress()
2999451b44SJordan Rupprecht        self.breakpoint2 = self.target.BreakpointCreateByAddress(
3099451b44SJordan Rupprecht            self.bkpt_address.GetLoadAddress(self.target))
3199451b44SJordan Rupprecht        self.assertTrue(
3299451b44SJordan Rupprecht            self.breakpoint2 and self.breakpoint2.GetNumLocations() == 1,
3399451b44SJordan Rupprecht            VALID_BREAKPOINT)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht    def finish_test(self):
3699451b44SJordan Rupprecht        # Run the process until termination
3799451b44SJordan Rupprecht        self.process.Continue()
38*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateExited)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht    @no_debug_info_test
4199451b44SJordan Rupprecht    def test_continue(self):
4299451b44SJordan Rupprecht        """Test that continue stops at the second breakpoint."""
4399451b44SJordan Rupprecht        self.prepare_test()
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht        self.process.Continue()
46*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
4799451b44SJordan Rupprecht        # We should be stopped at the second breakpoint
4899451b44SJordan Rupprecht        self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(
4999451b44SJordan Rupprecht            self.process, self.breakpoint2)
5099451b44SJordan Rupprecht        self.assertIsNotNone(
5199451b44SJordan Rupprecht            self.thread,
5299451b44SJordan Rupprecht            "Expected one thread to be stopped at breakpoint 2")
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht        self.finish_test()
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht    @no_debug_info_test
5799451b44SJordan Rupprecht    def test_single_step(self):
5899451b44SJordan Rupprecht        """Test that single step stops at the second breakpoint."""
5999451b44SJordan Rupprecht        self.prepare_test()
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        step_over = False
6299451b44SJordan Rupprecht        self.thread.StepInstruction(step_over)
6399451b44SJordan Rupprecht
64*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
6599451b44SJordan Rupprecht        self.assertEquals(
6699451b44SJordan Rupprecht            self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress(
6799451b44SJordan Rupprecht                self.target), self.bkpt_address.GetLoadAddress(
6899451b44SJordan Rupprecht                self.target))
6999451b44SJordan Rupprecht        self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(
7099451b44SJordan Rupprecht            self.process, self.breakpoint2)
7199451b44SJordan Rupprecht        self.assertIsNotNone(
7299451b44SJordan Rupprecht            self.thread,
7399451b44SJordan Rupprecht            "Expected one thread to be stopped at breakpoint 2")
7499451b44SJordan Rupprecht
7599451b44SJordan Rupprecht        self.finish_test()
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht    @no_debug_info_test
7899451b44SJordan Rupprecht    def test_single_step_thread_specific(self):
7999451b44SJordan Rupprecht        """Test that single step stops, even though the second breakpoint is not valid."""
8099451b44SJordan Rupprecht        self.prepare_test()
8199451b44SJordan Rupprecht
8299451b44SJordan Rupprecht        # Choose a thread other than the current one. A non-existing thread is
8399451b44SJordan Rupprecht        # fine.
8499451b44SJordan Rupprecht        thread_index = self.process.GetNumThreads() + 1
8599451b44SJordan Rupprecht        self.assertFalse(self.process.GetThreadAtIndex(thread_index).IsValid())
8699451b44SJordan Rupprecht        self.breakpoint2.SetThreadIndex(thread_index)
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        step_over = False
8999451b44SJordan Rupprecht        self.thread.StepInstruction(step_over)
9099451b44SJordan Rupprecht
91*ce825e46SJonas Devlieghere        self.assertState(self.process.GetState(), lldb.eStateStopped)
9299451b44SJordan Rupprecht        self.assertEquals(
9399451b44SJordan Rupprecht            self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress(
9499451b44SJordan Rupprecht                self.target), self.bkpt_address.GetLoadAddress(
9599451b44SJordan Rupprecht                self.target))
9699451b44SJordan Rupprecht        self.assertEquals(
9799451b44SJordan Rupprecht            self.thread.GetStopReason(),
9899451b44SJordan Rupprecht            lldb.eStopReasonPlanComplete,
9999451b44SJordan Rupprecht            "Stop reason should be 'plan complete'")
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht        self.finish_test()
102