199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest inferior restart when breakpoint is set on running target.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtclass BreakpointSetRestart(TestBase):
112238dcc3SJonas Devlieghere    BREAKPOINT_TEXT = "Set a breakpoint here"
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht    @skipIfNetBSD
142238dcc3SJonas Devlieghere    @skipIf(oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56082")
1599451b44SJordan Rupprecht    def test_breakpoint_set_restart(self):
1699451b44SJordan Rupprecht        self.build()
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        self.dbg.SetAsync(True)
242238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
2599451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
2699451b44SJordan Rupprecht
2799451b44SJordan Rupprecht        event = lldb.SBEvent()
2899451b44SJordan Rupprecht        # Wait for inferior to transition to running state
2999451b44SJordan Rupprecht        while self.dbg.GetListener().WaitForEvent(2, event):
3099451b44SJordan Rupprecht            if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning:
3199451b44SJordan Rupprecht                break
3299451b44SJordan Rupprecht
3399451b44SJordan Rupprecht        bp = target.BreakpointCreateBySourceRegex(
342238dcc3SJonas Devlieghere            self.BREAKPOINT_TEXT, lldb.SBFileSpec("main.cpp")
352238dcc3SJonas Devlieghere        )
36*aad78740SMichael Buch        self.assertTrue(bp.IsValid(), VALID_BREAKPOINT)
37*aad78740SMichael Buch        self.assertEqual(bp.GetNumLocations(), 1, VALID_BREAKPOINT)
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        while self.dbg.GetListener().WaitForEvent(2, event):
4099451b44SJordan Rupprecht            if lldb.SBProcess.GetStateFromEvent(
412238dcc3SJonas Devlieghere                event
422238dcc3SJonas Devlieghere            ) == lldb.eStateStopped and lldb.SBProcess.GetRestartedFromEvent(event):
4399451b44SJordan Rupprecht                continue
4499451b44SJordan Rupprecht            if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning:
4599451b44SJordan Rupprecht                continue
4699451b44SJordan Rupprecht            self.fail(
472238dcc3SJonas Devlieghere                "Setting a breakpoint generated an unexpected event: %s"
482238dcc3SJonas Devlieghere                % lldb.SBDebugger.StateAsCString(
492238dcc3SJonas Devlieghere                    lldb.SBProcess.GetStateFromEvent(event)
502238dcc3SJonas Devlieghere                )
512238dcc3SJonas Devlieghere            )
52