199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest that the breakpoint auto-continue flag works correctly. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass BreakpointAutoContinue(TestBase): 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht def test_breakpoint_auto_continue(self): 1799451b44SJordan Rupprecht """Make sure the auto continue continues with no other complications""" 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht self.simple_auto_continue() 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht def test_auto_continue_with_command(self): 2299451b44SJordan Rupprecht """Add a command, make sure the command gets run""" 2399451b44SJordan Rupprecht self.build() 2499451b44SJordan Rupprecht self.auto_continue_with_command() 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht def test_auto_continue_on_location(self): 2799451b44SJordan Rupprecht """Set auto-continue on a location and make sure only that location continues""" 2899451b44SJordan Rupprecht self.build() 2999451b44SJordan Rupprecht self.auto_continue_location() 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht def make_target_and_bkpt(self, additional_options=None, num_expected_loc=1, 3299451b44SJordan Rupprecht pattern="Set a breakpoint here"): 3354c26872SRaphael Isemann self.target = self.createTestTarget() 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht extra_options_txt = "--auto-continue 1 " 3699451b44SJordan Rupprecht if additional_options: 3799451b44SJordan Rupprecht extra_options_txt += additional_options 3899451b44SJordan Rupprecht bpno = lldbutil.run_break_set_by_source_regexp(self, pattern, 3999451b44SJordan Rupprecht extra_options = extra_options_txt, 4099451b44SJordan Rupprecht num_expected_locations = num_expected_loc) 4199451b44SJordan Rupprecht return bpno 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht def launch_it (self, expected_state): 4499451b44SJordan Rupprecht error = lldb.SBError() 4586aa8e63SJonas Devlieghere launch_info = self.target.GetLaunchInfo() 4699451b44SJordan Rupprecht launch_info.SetWorkingDirectory(self.get_process_working_directory()) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht process = self.target.Launch(launch_info, error) 49779bbbf2SDave Lee self.assertSuccess(error, "Launch failed.") 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht state = process.GetState() 5299451b44SJordan Rupprecht self.assertEqual(state, expected_state, "Didn't get expected state") 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht return process 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht def simple_auto_continue(self): 5799451b44SJordan Rupprecht bpno = self.make_target_and_bkpt() 5899451b44SJordan Rupprecht process = self.launch_it(lldb.eStateExited) 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht bkpt = self.target.FindBreakpointByID(bpno) 6199451b44SJordan Rupprecht self.assertEqual(bkpt.GetHitCount(), 2, "Should have run through the breakpoint twice") 6299451b44SJordan Rupprecht 6399451b44SJordan Rupprecht def auto_continue_with_command(self): 6499451b44SJordan Rupprecht bpno = self.make_target_and_bkpt("-N BKPT -C 'break modify --auto-continue 0 BKPT'") 6599451b44SJordan Rupprecht process = self.launch_it(lldb.eStateStopped) 6699451b44SJordan Rupprecht state = process.GetState() 67*47c4c6a7SDave Lee self.assertState(state, lldb.eStateStopped, "Process should be stopped") 6899451b44SJordan Rupprecht bkpt = self.target.FindBreakpointByID(bpno) 6999451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt) 7099451b44SJordan Rupprecht self.assertEqual(len(threads), 1, "There was a thread stopped at our breakpoint") 7199451b44SJordan Rupprecht self.assertEqual(bkpt.GetHitCount(), 2, "Should have hit the breakpoint twice") 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht def auto_continue_location(self): 7499451b44SJordan Rupprecht bpno = self.make_target_and_bkpt(pattern="Set a[^ ]* breakpoint here", num_expected_loc=2) 7599451b44SJordan Rupprecht bkpt = self.target.FindBreakpointByID(bpno) 7699451b44SJordan Rupprecht bkpt.SetAutoContinue(False) 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht loc = lldb.SBBreakpointLocation() 7999451b44SJordan Rupprecht for i in range(0,2): 8099451b44SJordan Rupprecht func_name = bkpt.location[i].GetAddress().function.name 8199451b44SJordan Rupprecht if func_name == "main": 8299451b44SJordan Rupprecht loc = bkpt.location[i] 8399451b44SJordan Rupprecht 8499451b44SJordan Rupprecht self.assertTrue(loc.IsValid(), "Didn't find a location in main") 8599451b44SJordan Rupprecht loc.SetAutoContinue(True) 8699451b44SJordan Rupprecht 8799451b44SJordan Rupprecht process = self.launch_it(lldb.eStateStopped) 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint(process, bkpt) 9099451b44SJordan Rupprecht self.assertEqual(len(threads), 1, "Didn't get one thread stopped at our breakpoint") 9199451b44SJordan Rupprecht func_name = threads[0].frame[0].function.name 9299451b44SJordan Rupprecht self.assertEqual(func_name, "call_me") 93