199451b44SJordan Rupprechtimport gdbremote_testcase
299451b44SJordan Rupprechtimport lldbgdbserverutils
399451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
499451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
599451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtclass TestGdbRemoteAttach(gdbremote_testcase.GdbRemoteTestCaseBase):
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1099451b44SJordan Rupprecht
11*76a718eeSPavel Labath    def test_attach_with_vAttach(self):
12*76a718eeSPavel Labath        self.build()
13*76a718eeSPavel Labath        self.set_inferior_startup_attach_manually()
14*76a718eeSPavel Labath
1599451b44SJordan Rupprecht        # Start the inferior, start the debug monitor, nothing is attached yet.
1699451b44SJordan Rupprecht        procs = self.prep_debug_monitor_and_inferior(
1799451b44SJordan Rupprecht            inferior_args=["sleep:60"])
1899451b44SJordan Rupprecht        self.assertIsNotNone(procs)
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht        # Make sure the target process has been launched.
2199451b44SJordan Rupprecht        inferior = procs.get("inferior")
2299451b44SJordan Rupprecht        self.assertIsNotNone(inferior)
2399451b44SJordan Rupprecht        self.assertTrue(inferior.pid > 0)
2499451b44SJordan Rupprecht        self.assertTrue(
2599451b44SJordan Rupprecht            lldbgdbserverutils.process_is_running(
2699451b44SJordan Rupprecht                inferior.pid, True))
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        # Add attach packets.
2999451b44SJordan Rupprecht        self.test_sequence.add_log_lines([
3099451b44SJordan Rupprecht            # Do the attach.
3199451b44SJordan Rupprecht            "read packet: $vAttach;{:x}#00".format(inferior.pid),
3299451b44SJordan Rupprecht            # Expect a stop notification from the attach.
3399451b44SJordan Rupprecht            {"direction": "send",
3499451b44SJordan Rupprecht             "regex": r"^\$T([0-9a-fA-F]{2})[^#]*#[0-9a-fA-F]{2}$",
3599451b44SJordan Rupprecht             "capture": {1: "stop_signal_hex"}},
3699451b44SJordan Rupprecht        ], True)
3799451b44SJordan Rupprecht        self.add_process_info_collection_packets()
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Run the stream
4099451b44SJordan Rupprecht        context = self.expect_gdbremote_sequence()
4199451b44SJordan Rupprecht        self.assertIsNotNone(context)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        # Gather process info response
4499451b44SJordan Rupprecht        process_info = self.parse_process_info_response(context)
4599451b44SJordan Rupprecht        self.assertIsNotNone(process_info)
4699451b44SJordan Rupprecht
4799451b44SJordan Rupprecht        # Ensure the process id matches what we expected.
4899451b44SJordan Rupprecht        pid_text = process_info.get('pid', None)
4999451b44SJordan Rupprecht        self.assertIsNotNone(pid_text)
5099451b44SJordan Rupprecht        reported_pid = int(pid_text, base=16)
5199451b44SJordan Rupprecht        self.assertEqual(reported_pid, inferior.pid)
52