blob: 9f8e39e8ecca517f58f2dafe8006a1acd2570743 [file] [log] [blame]
from __future__ import print_function
import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from gdbclientutils import *
class TestHaltFails(GDBRemoteTestBase):
class MyResponder(MockGDBServerResponder):
def setBreakpoint(self, packet):
return "OK"
def interrupt(self):
# Simulate process waiting longer than the interrupt
# timeout to stop, then sending the reply.
time.sleep(14)
return "T02reason:signal"
def cont(self):
# No response, wait for the client to interrupt us.
return None
def wait_for_and_check_event(self, wait_time, value):
event = lldb.SBEvent()
got_event = self.dbg.GetListener().WaitForEvent(wait_time, event)
self.assertTrue(got_event, "Failed to get event after wait")
self.assertTrue(lldb.SBProcess.EventIsProcessEvent(event), "Event was not a process event")
event_type = lldb.SBProcess.GetStateFromEvent(event)
self.assertEqual(event_type, value)
def get_to_running(self):
self.server.responder = self.MyResponder()
self.target = self.createTarget("a.yaml")
process = self.connect(self.target)
self.dbg.SetAsync(True)
# There should be a stopped event, consume that:
self.wait_for_and_check_event(2, lldb.eStateStopped)
process.Continue()
# There should be a running event, consume that:
self.wait_for_and_check_event(2, lldb.eStateRunning)
return process
@skipIfReproducer # FIXME: Unexpected packet during (passive) replay
def test_destroy_while_running(self):
process = self.get_to_running()
process.Destroy()
# Again pretend that after failing to be interrupted, we delivered the stop
# and make sure we still exit properly.
self.wait_for_and_check_event(14, lldb.eStateExited)
@skipIfReproducer # FIXME: Unexpected packet during (passive) replay
def test_async_interrupt(self):
"""
Test that explicitly calling AsyncInterrupt, which then fails, leads
to an "eStateExited" state.
"""
process = self.get_to_running()
# Now do the interrupt:
process.SendAsyncInterrupt()
# That should have caused the Halt to time out and we should
# be in eStateExited:
self.wait_for_and_check_event(15, lldb.eStateExited)