1"""
2Test inferior restart when breakpoint is set on running target.
3"""
4
5import lldb
6from lldbsuite.test.decorators import *
7from lldbsuite.test.lldbtest import *
8
9
10class BreakpointSetRestart(TestBase):
11    BREAKPOINT_TEXT = 'Set a breakpoint here'
12
13    @skipIfNetBSD
14    @skipIf(oslist=["freebsd"],
15            bugnumber="github.com/llvm/llvm-project/issues/56082")
16    def test_breakpoint_set_restart(self):
17        self.build()
18
19        exe = self.getBuildArtifact("a.out")
20
21        target = self.dbg.CreateTarget(exe)
22        self.assertTrue(target, VALID_TARGET)
23
24        self.dbg.SetAsync(True)
25        process = target.LaunchSimple(
26            None, None, self.get_process_working_directory())
27        self.assertTrue(process, PROCESS_IS_VALID)
28
29        event = lldb.SBEvent()
30        # Wait for inferior to transition to running state
31        while self.dbg.GetListener().WaitForEvent(2, event):
32            if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning:
33                break
34
35        bp = target.BreakpointCreateBySourceRegex(
36            self.BREAKPOINT_TEXT, lldb.SBFileSpec('main.cpp'))
37        self.assertTrue(
38            bp.IsValid() and bp.GetNumLocations() == 1,
39            VALID_BREAKPOINT)
40
41        while self.dbg.GetListener().WaitForEvent(2, event):
42            if lldb.SBProcess.GetStateFromEvent(
43                    event) == lldb.eStateStopped and lldb.SBProcess.GetRestartedFromEvent(event):
44                continue
45            if lldb.SBProcess.GetStateFromEvent(event) == lldb.eStateRunning:
46                continue
47            self.fail(
48                "Setting a breakpoint generated an unexpected event: %s" %
49                lldb.SBDebugger.StateAsCString(
50                    lldb.SBProcess.GetStateFromEvent(event)))
51