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
33        self.runCmd("process attach -p " + str(popen.pid))
34
35        target = self.dbg.GetSelectedTarget()
36
37        process = target.GetProcess()
38        self.assertTrue(process, PROCESS_IS_VALID)
39
40    @expectedFailureNetBSD
41    @skipIfReproducer # FIXME: Unexpected packet during (active) replay
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
58        os.chdir(newdir)
59        self.addTearDownHook(lambda: os.chdir(testdir))
60        self.runCmd("process attach -p " + str(popen.pid))
61
62        target = self.dbg.GetSelectedTarget()
63
64        process = target.GetProcess()
65        self.assertTrue(process, PROCESS_IS_VALID)
66
67    @expectedFailureNetBSD
68    def test_attach_to_process_by_name(self):
69        """Test attach by process name"""
70        self.build()
71        exe = self.getBuildArtifact(exe_name)
72
73        # Spawn a new process
74        popen = self.spawnSubprocess(exe)
75
76        self.runCmd("process attach -n " + exe_name)
77
78        target = self.dbg.GetSelectedTarget()
79
80        process = target.GetProcess()
81        self.assertTrue(process, PROCESS_IS_VALID)
82
83    def tearDown(self):
84        # Destroy process before TestBase.tearDown()
85        self.dbg.GetSelectedTarget().GetProcess().Destroy()
86
87        # Call super's tearDown().
88        TestBase.tearDown(self)
89