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