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    def test_attach_to_process_by_id(self):
25        """Test attach by process id"""
26        self.build()
27        exe = self.getBuildArtifact(exe_name)
28
29        # Spawn a new process
30        popen = self.spawnSubprocess(exe)
31
32        self.runCmd("process attach -p " + str(popen.pid))
33
34        target = self.dbg.GetSelectedTarget()
35
36        process = target.GetProcess()
37        self.assertTrue(process, PROCESS_IS_VALID)
38
39    @skipIfReproducer # FIXME: Unexpected packet during (active) replay
40    def test_attach_to_process_from_different_dir_by_id(self):
41        """Test attach by process id"""
42        newdir = self.getBuildArtifact("newdir")
43        try:
44            os.mkdir(newdir)
45        except OSError as e:
46            if e.errno != os.errno.EEXIST:
47                raise
48        testdir = self.getBuildDir()
49        exe = os.path.join(newdir, 'proc_attach')
50        self.buildProgram('main.cpp', exe)
51        self.addTearDownHook(lambda: shutil.rmtree(newdir))
52
53        # Spawn a new process
54        popen = self.spawnSubprocess(exe)
55
56        os.chdir(newdir)
57        self.addTearDownHook(lambda: os.chdir(testdir))
58        self.runCmd("process attach -p " + str(popen.pid))
59
60        target = self.dbg.GetSelectedTarget()
61
62        process = target.GetProcess()
63        self.assertTrue(process, PROCESS_IS_VALID)
64
65    def test_attach_to_process_by_name(self):
66        """Test attach by process name"""
67        self.build()
68        exe = self.getBuildArtifact(exe_name)
69
70        # Spawn a new process
71        popen = self.spawnSubprocess(exe)
72
73        self.runCmd("process attach -n " + exe_name)
74
75        target = self.dbg.GetSelectedTarget()
76
77        process = target.GetProcess()
78        self.assertTrue(process, PROCESS_IS_VALID)
79
80    def tearDown(self):
81        # Destroy process before TestBase.tearDown()
82        self.dbg.GetSelectedTarget().GetProcess().Destroy()
83
84        # Call super's tearDown().
85        TestBase.tearDown(self)
86