""" Test lldb-dap attach request """ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil import lldbdap_testcase import subprocess import threading import time # Often fails on Arm Linux, but not specifically because it's Arm, something in # process scheduling can cause a massive (minutes) delay during this test. @skipIf(oslist=["linux"], archs=["arm$"]) class TestDAP_attach(lldbdap_testcase.DAPTestCaseBase): def spawn(self, args): self.process = subprocess.Popen( args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, ) def spawn_and_wait(self, program, delay): time.sleep(delay) self.spawn([program]) self.process.wait() def continue_and_verify_pid(self): self.do_continue() out, _ = self.process.communicate("foo") self.assertIn(f"pid = {self.process.pid}", out) def test_by_pid(self): """ Tests attaching to a process by process ID. """ program = self.build_and_create_debug_adapter_for_attach() self.spawn([program]) self.attach(pid=self.process.pid) self.continue_and_verify_pid() def test_by_name(self): """ Tests attaching to a process by process name. """ program = self.build_and_create_debug_adapter_for_attach() # Use a file as a synchronization point between test and inferior. pid_file_path = lldbutil.append_to_process_working_directory( self, "pid_file_%d" % (int(time.time())) ) self.spawn([program, pid_file_path]) lldbutil.wait_for_file_on_target(self, pid_file_path) self.attach(program=program) self.continue_and_verify_pid() def test_by_name_waitFor(self): """ Tests waiting for, and attaching to a process by process name that doesn't exist yet. """ program = self.build_and_create_debug_adapter_for_attach() self.spawn_thread = threading.Thread( target=self.spawn_and_wait, args=( program, 1.0, ), ) self.spawn_thread.start() self.attach(program=program, waitFor=True) self.continue_and_verify_pid()