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)