1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest process attach when executable was deleted.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprechtimport os
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprechtclass TestDeletedExecutable(TestBase):
14*99451b44SJordan Rupprecht
15*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
16*99451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    @skipIfWindows # cannot delete a running executable
19*99451b44SJordan Rupprecht    @expectedFailureAll(oslist=["linux"],
20*99451b44SJordan Rupprecht        triple=no_match('aarch64-.*-android'))
21*99451b44SJordan Rupprecht        # determining the architecture of the process fails
22*99451b44SJordan Rupprecht    @expectedFailureNetBSD
23*99451b44SJordan Rupprecht    def test(self):
24*99451b44SJordan Rupprecht        self.build()
25*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht        # Use a file as a synchronization point between test and inferior.
28*99451b44SJordan Rupprecht        pid_file_path = lldbutil.append_to_process_working_directory(self,
29*99451b44SJordan Rupprecht            "token_pid_%d" % (int(os.getpid())))
30*99451b44SJordan Rupprecht        self.addTearDownHook(
31*99451b44SJordan Rupprecht            lambda: self.run_platform_command(
32*99451b44SJordan Rupprecht                "rm %s" %
33*99451b44SJordan Rupprecht                (pid_file_path)))
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        # Spawn a new process
36*99451b44SJordan Rupprecht        popen = self.spawnSubprocess(exe, [pid_file_path])
37*99451b44SJordan Rupprecht        self.addTearDownHook(self.cleanupSubprocesses)
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprecht        # Wait until process has fully started up.
40*99451b44SJordan Rupprecht        pid = lldbutil.wait_for_file_on_target(self, pid_file_path)
41*99451b44SJordan Rupprecht
42*99451b44SJordan Rupprecht        # Now we can safely remove the executable and test if we can attach.
43*99451b44SJordan Rupprecht        os.remove(exe)
44*99451b44SJordan Rupprecht
45*99451b44SJordan Rupprecht        self.runCmd("process attach -p " + str(popen.pid))
46*99451b44SJordan Rupprecht        self.runCmd("kill")
47