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    def test_attach_to_process_from_different_dir_by_id(self):
43        """Test attach by process id"""
44        newdir = self.getBuildArtifact("newdir")
45        try:
46            os.mkdir(newdir)
47        except OSError as e:
48            if e.errno != os.errno.EEXIST:
49                raise
50        testdir = self.getBuildDir()
51        exe = os.path.join(newdir, 'proc_attach')
52        self.buildProgram('main.cpp', exe)
53        self.addTearDownHook(lambda: shutil.rmtree(newdir))
54
55        # Spawn a new process
56        popen = self.spawnSubprocess(exe)
57        self.addTearDownHook(self.cleanupSubprocesses)
58
59        os.chdir(newdir)
60        self.addTearDownHook(lambda: os.chdir(testdir))
61        self.runCmd("process attach -p " + str(popen.pid))
62
63        target = self.dbg.GetSelectedTarget()
64
65        process = target.GetProcess()
66        self.assertTrue(process, PROCESS_IS_VALID)
67
68    @expectedFailureNetBSD
69    def test_attach_to_process_by_name(self):
70        """Test attach by process name"""
71        self.build()
72        exe = self.getBuildArtifact(exe_name)
73
74        # Spawn a new process
75        popen = self.spawnSubprocess(exe)
76        self.addTearDownHook(self.cleanupSubprocesses)
77
78        self.runCmd("process attach -n " + exe_name)
79
80        target = self.dbg.GetSelectedTarget()
81
82        process = target.GetProcess()
83        self.assertTrue(process, PROCESS_IS_VALID)
84
85    def tearDown(self):
86        # Destroy process before TestBase.tearDown()
87        self.dbg.GetSelectedTarget().GetProcess().Destroy()
88
89        # Call super's tearDown().
90        TestBase.tearDown(self)
91