1"""
2Test process attach.
3"""
4
5
6
7import os
8import lldb
9import shutil
10from lldbsuite.test.decorators import *
11from lldbsuite.test.lldbtest import *
12from lldbsuite.test import lldbutil
13
14exe_name = "ProcessAttach"  # Must match Makefile
15
16
17class ProcessAttachTestCase(TestBase):
18
19    mydir = TestBase.compute_mydir(__file__)
20
21    NO_DEBUG_INFO_TESTCASE = True
22
23    @skipIfiOSSimulator
24    @expectedFailureNetBSD
25    def test_attach_to_process_by_id(self):
26        """Test attach by process id"""
27        self.build()
28        exe = self.getBuildArtifact(exe_name)
29
30        # Spawn a new process
31        popen = self.spawnSubprocess(exe)
32        self.addTearDownHook(self.cleanupSubprocesses)
33
34        self.runCmd("process attach -p " + str(popen.pid))
35
36        target = self.dbg.GetSelectedTarget()
37
38        process = target.GetProcess()
39        self.assertTrue(process, PROCESS_IS_VALID)
40
41    @expectedFailureNetBSD
42    @skipIfReproducer # Unexpected packet during replay
43    def test_attach_to_process_from_different_dir_by_id(self):
44        """Test attach by process id"""
45        newdir = self.getBuildArtifact("newdir")
46        try:
47            os.mkdir(newdir)
48        except OSError as e:
49            if e.errno != os.errno.EEXIST:
50                raise
51        testdir = self.getBuildDir()
52        exe = os.path.join(newdir, 'proc_attach')
53        self.buildProgram('main.cpp', exe)
54        self.addTearDownHook(lambda: shutil.rmtree(newdir))
55
56        # Spawn a new process
57        popen = self.spawnSubprocess(exe)
58        self.addTearDownHook(self.cleanupSubprocesses)
59
60        os.chdir(newdir)
61        self.addTearDownHook(lambda: os.chdir(testdir))
62        self.runCmd("process attach -p " + str(popen.pid))
63
64        target = self.dbg.GetSelectedTarget()
65
66        process = target.GetProcess()
67        self.assertTrue(process, PROCESS_IS_VALID)
68
69    @expectedFailureNetBSD
70    def test_attach_to_process_by_name(self):
71        """Test attach by process name"""
72        self.build()
73        exe = self.getBuildArtifact(exe_name)
74
75        # Spawn a new process
76        popen = self.spawnSubprocess(exe)
77        self.addTearDownHook(self.cleanupSubprocesses)
78
79        self.runCmd("process attach -n " + exe_name)
80
81        target = self.dbg.GetSelectedTarget()
82
83        process = target.GetProcess()
84        self.assertTrue(process, PROCESS_IS_VALID)
85
86    def tearDown(self):
87        # Destroy process before TestBase.tearDown()
88        self.dbg.GetSelectedTarget().GetProcess().Destroy()
89
90        # Call super's tearDown().
91        TestBase.tearDown(self)
92