import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from lldbsuite.test.gdbclientutils import *
from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase


class TestRestartBug(GDBRemoteTestBase):
    @expectedFailureAll(bugnumber="llvm.org/pr24530")
    def test(self):
        """
        Test auto-continue behavior when a process is interrupted to deliver
        an "asynchronous" packet. This simulates the situation when a process
        stops on its own just as lldb client is about to interrupt it. The
        client should not auto-continue in this case, unless the user has
        explicitly requested that we ignore signals of this type.
        """

        class MyResponder(MockGDBServerResponder):
            continueCount = 0

            def setBreakpoint(self, packet):
                return "OK"

            def interrupt(self):
                # Simulate process stopping due to a raise(SIGINT) just as lldb
                # is about to interrupt it.
                return "T02reason:signal"

            def cont(self):
                self.continueCount += 1
                if self.continueCount == 1:
                    # No response, wait for the client to interrupt us.
                    return None
                return "W00"  # Exit

        self.server.responder = MyResponder()
        target = self.createTarget("a.yaml")
        process = self.connect(target)
        self.dbg.SetAsync(True)
        process.Continue()

        # resume the process and immediately try to set another breakpoint. When using the remote
        # stub, this will trigger a request to stop the process.  Make sure we
        # do not lose this signal.
        bkpt = target.BreakpointCreateByAddress(0x1234)
        self.assertTrue(bkpt.IsValid())
        self.assertEqual(bkpt.GetNumLocations(), 1)

        event = lldb.SBEvent()
        while self.dbg.GetListener().WaitForEvent(2, event):
            if self.TraceOn():
                print(
                    "Process changing state to:",
                    self.dbg.StateAsCString(process.GetStateFromEvent(event)),
                )
            if process.GetStateFromEvent(event) == lldb.eStateExited:
                break

        # We should get only one continue packet as the client should not
        # auto-continue after setting the breakpoint.
        self.assertEqual(self.server.responder.continueCount, 1)
        # And the process should end up in the stopped state.
        self.assertState(process.GetState(), lldb.eStateStopped)
