"""
Test process attach/resume.
"""


import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil

exe_name = "AttachResume"  # Must match Makefile


class AttachResumeTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    @skipIfRemote
    @expectedFailureNetBSD
    @skipIfWindows  # llvm.org/pr24778, llvm.org/pr21753
    def test_attach_continue_interrupt_detach(self):
        """Test attach/continue/interrupt/detach"""
        self.build()
        self.process_attach_continue_interrupt_detach()

    def process_attach_continue_interrupt_detach(self):
        """Test attach/continue/interrupt/detach"""

        exe = self.getBuildArtifact(exe_name)

        popen = self.spawnSubprocess(exe)

        self.runCmd("process attach -p " + str(popen.pid))

        self.setAsync(True)
        listener = self.dbg.GetListener()
        process = self.dbg.GetSelectedTarget().GetProcess()

        self.runCmd("c")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning])

        self.runCmd("process interrupt")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateStopped])

        # be sure to continue/interrupt/continue (r204504)
        self.runCmd("c")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning])

        self.runCmd("process interrupt")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateStopped])

        # Second interrupt should have no effect.
        self.expect(
            "process interrupt", patterns=["Process is not running"], error=True
        )

        # check that this breakpoint is auto-cleared on detach (r204752)
        self.runCmd(
            "br set -f main.cpp -l %u"
            % (line_number("main.cpp", "// Set breakpoint here"))
        )

        self.runCmd("c")
        lldbutil.expect_state_changes(
            self, listener, process, [lldb.eStateRunning, lldb.eStateStopped]
        )
        self.expect("br list", "Breakpoint not hit", substrs=["hit count = 1"])

        # Make sure the breakpoint is not hit again.
        self.expect("expr debugger_flag = false", substrs=[" = false"])

        self.runCmd("c")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning])

        # make sure to detach while in running state (r204759)
        self.runCmd("detach")
        lldbutil.expect_state_changes(self, listener, process, [lldb.eStateDetached])
