1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest SBProcess APIs, including ReadMemory(), WriteMemory(), and others.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtfrom __future__ import print_function
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbutil import get_stopped_thread, state_type_to_str
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprechtclass ProcessAPITestCase(TestBase):
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    def setUp(self):
19*99451b44SJordan Rupprecht        # Call super's setUp().
20*99451b44SJordan Rupprecht        TestBase.setUp(self)
21*99451b44SJordan Rupprecht        # Find the line number to break inside main().
22*99451b44SJordan Rupprecht        self.line = line_number(
23*99451b44SJordan Rupprecht            "main.cpp",
24*99451b44SJordan Rupprecht            "// Set break point at this line and check variable 'my_char'.")
25*99451b44SJordan Rupprecht
26*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
27*99451b44SJordan Rupprecht    def test_read_memory(self):
28*99451b44SJordan Rupprecht        """Test Python SBProcess.ReadMemory() API."""
29*99451b44SJordan Rupprecht        self.build()
30*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
31*99451b44SJordan Rupprecht
32*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
33*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
34*99451b44SJordan Rupprecht
35*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
36*99451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
39*99451b44SJordan Rupprecht        process = target.LaunchSimple(
40*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
41*99451b44SJordan Rupprecht
42*99451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
43*99451b44SJordan Rupprecht        self.assertTrue(
44*99451b44SJordan Rupprecht            thread.IsValid(),
45*99451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
46*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
47*99451b44SJordan Rupprecht
48*99451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_char'.
49*99451b44SJordan Rupprecht        val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal)
50*99451b44SJordan Rupprecht        self.DebugSBValue(val)
51*99451b44SJordan Rupprecht
52*99451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and
53*99451b44SJordan Rupprecht        # expect to get a Python string as the result object!
54*99451b44SJordan Rupprecht        error = lldb.SBError()
55*99451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
56*99451b44SJordan Rupprecht        content = process.ReadMemory(
57*99451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 1, error)
58*99451b44SJordan Rupprecht        if not error.Success():
59*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
60*99451b44SJordan Rupprecht        if self.TraceOn():
61*99451b44SJordan Rupprecht            print("memory content:", content)
62*99451b44SJordan Rupprecht
63*99451b44SJordan Rupprecht        self.expect(
64*99451b44SJordan Rupprecht            content,
65*99451b44SJordan Rupprecht            "Result from SBProcess.ReadMemory() matches our expected output: 'x'",
66*99451b44SJordan Rupprecht            exe=False,
67*99451b44SJordan Rupprecht            startstr=b'x')
68*99451b44SJordan Rupprecht
69*99451b44SJordan Rupprecht        # Read (char *)my_char_ptr.
70*99451b44SJordan Rupprecht        val = frame.FindValue("my_char_ptr", lldb.eValueTypeVariableGlobal)
71*99451b44SJordan Rupprecht        self.DebugSBValue(val)
72*99451b44SJordan Rupprecht        cstring = process.ReadCStringFromMemory(
73*99451b44SJordan Rupprecht            val.GetValueAsUnsigned(), 256, error)
74*99451b44SJordan Rupprecht        if not error.Success():
75*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
76*99451b44SJordan Rupprecht        if self.TraceOn():
77*99451b44SJordan Rupprecht            print("cstring read is:", cstring)
78*99451b44SJordan Rupprecht
79*99451b44SJordan Rupprecht        self.expect(
80*99451b44SJordan Rupprecht            cstring,
81*99451b44SJordan Rupprecht            "Result from SBProcess.ReadCStringFromMemory() matches our expected output",
82*99451b44SJordan Rupprecht            exe=False,
83*99451b44SJordan Rupprecht            startstr='Does it work?')
84*99451b44SJordan Rupprecht
85*99451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_cstring'.
86*99451b44SJordan Rupprecht        val = frame.FindValue("my_cstring", lldb.eValueTypeVariableGlobal)
87*99451b44SJordan Rupprecht        self.DebugSBValue(val)
88*99451b44SJordan Rupprecht
89*99451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 256 to read at most 256 bytes
90*99451b44SJordan Rupprecht        # from the address, and expect to get a Python string as the result
91*99451b44SJordan Rupprecht        # object!
92*99451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
93*99451b44SJordan Rupprecht        cstring = process.ReadCStringFromMemory(
94*99451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 256, error)
95*99451b44SJordan Rupprecht        if not error.Success():
96*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
97*99451b44SJordan Rupprecht        if self.TraceOn():
98*99451b44SJordan Rupprecht            print("cstring read is:", cstring)
99*99451b44SJordan Rupprecht
100*99451b44SJordan Rupprecht        self.expect(
101*99451b44SJordan Rupprecht            cstring,
102*99451b44SJordan Rupprecht            "Result from SBProcess.ReadCStringFromMemory() matches our expected output",
103*99451b44SJordan Rupprecht            exe=False,
104*99451b44SJordan Rupprecht            startstr='lldb.SBProcess.ReadCStringFromMemory() works!')
105*99451b44SJordan Rupprecht
106*99451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_uint32'.
107*99451b44SJordan Rupprecht        val = frame.FindValue("my_uint32", lldb.eValueTypeVariableGlobal)
108*99451b44SJordan Rupprecht        self.DebugSBValue(val)
109*99451b44SJordan Rupprecht
110*99451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 4 to read 4 bytes
111*99451b44SJordan Rupprecht        # from the address, and expect to get an int as the result!
112*99451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
113*99451b44SJordan Rupprecht        my_uint32 = process.ReadUnsignedFromMemory(
114*99451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 4, error)
115*99451b44SJordan Rupprecht        if not error.Success():
116*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
117*99451b44SJordan Rupprecht        if self.TraceOn():
118*99451b44SJordan Rupprecht            print("uint32 read is:", my_uint32)
119*99451b44SJordan Rupprecht
120*99451b44SJordan Rupprecht        if my_uint32 != 12345:
121*99451b44SJordan Rupprecht            self.fail(
122*99451b44SJordan Rupprecht                "Result from SBProcess.ReadUnsignedFromMemory() does not match our expected output")
123*99451b44SJordan Rupprecht
124*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
125*99451b44SJordan Rupprecht    def test_write_memory(self):
126*99451b44SJordan Rupprecht        """Test Python SBProcess.WriteMemory() API."""
127*99451b44SJordan Rupprecht        self.build()
128*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
129*99451b44SJordan Rupprecht
130*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
131*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
132*99451b44SJordan Rupprecht
133*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
134*99451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
135*99451b44SJordan Rupprecht
136*99451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
137*99451b44SJordan Rupprecht        process = target.LaunchSimple(
138*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
139*99451b44SJordan Rupprecht
140*99451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
141*99451b44SJordan Rupprecht        self.assertTrue(
142*99451b44SJordan Rupprecht            thread.IsValid(),
143*99451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
144*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
145*99451b44SJordan Rupprecht
146*99451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_char'.
147*99451b44SJordan Rupprecht        val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal)
148*99451b44SJordan Rupprecht        self.DebugSBValue(val)
149*99451b44SJordan Rupprecht
150*99451b44SJordan Rupprecht        # If the variable does not have a load address, there's no sense
151*99451b44SJordan Rupprecht        # continuing.
152*99451b44SJordan Rupprecht        if not val.GetLocation().startswith("0x"):
153*99451b44SJordan Rupprecht            return
154*99451b44SJordan Rupprecht
155*99451b44SJordan Rupprecht        # OK, let's get the hex location of the variable.
156*99451b44SJordan Rupprecht        location = int(val.GetLocation(), 16)
157*99451b44SJordan Rupprecht
158*99451b44SJordan Rupprecht        # The program logic makes the 'my_char' variable to have memory content as 'x'.
159*99451b44SJordan Rupprecht        # But we want to use the WriteMemory() API to assign 'a' to the
160*99451b44SJordan Rupprecht        # variable.
161*99451b44SJordan Rupprecht
162*99451b44SJordan Rupprecht        # Now use WriteMemory() API to write 'a' into the global variable.
163*99451b44SJordan Rupprecht        error = lldb.SBError()
164*99451b44SJordan Rupprecht        result = process.WriteMemory(location, 'a', error)
165*99451b44SJordan Rupprecht        if not error.Success() or result != 1:
166*99451b44SJordan Rupprecht            self.fail("SBProcess.WriteMemory() failed")
167*99451b44SJordan Rupprecht
168*99451b44SJordan Rupprecht        # Read from the memory location.  This time it should be 'a'.
169*99451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and
170*99451b44SJordan Rupprecht        # expect to get a Python string as the result object!
171*99451b44SJordan Rupprecht        content = process.ReadMemory(location, 1, error)
172*99451b44SJordan Rupprecht        if not error.Success():
173*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
174*99451b44SJordan Rupprecht        if self.TraceOn():
175*99451b44SJordan Rupprecht            print("memory content:", content)
176*99451b44SJordan Rupprecht
177*99451b44SJordan Rupprecht        self.expect(
178*99451b44SJordan Rupprecht            content,
179*99451b44SJordan Rupprecht            "Result from SBProcess.ReadMemory() matches our expected output: 'a'",
180*99451b44SJordan Rupprecht            exe=False,
181*99451b44SJordan Rupprecht            startstr=b'a')
182*99451b44SJordan Rupprecht
183*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
184*99451b44SJordan Rupprecht    def test_access_my_int(self):
185*99451b44SJordan Rupprecht        """Test access 'my_int' using Python SBProcess.GetByteOrder() and other APIs."""
186*99451b44SJordan Rupprecht        self.build()
187*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
188*99451b44SJordan Rupprecht
189*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
190*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
191*99451b44SJordan Rupprecht
192*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
193*99451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
194*99451b44SJordan Rupprecht
195*99451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
196*99451b44SJordan Rupprecht        process = target.LaunchSimple(
197*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
198*99451b44SJordan Rupprecht
199*99451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
200*99451b44SJordan Rupprecht        self.assertTrue(
201*99451b44SJordan Rupprecht            thread.IsValid(),
202*99451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
203*99451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
204*99451b44SJordan Rupprecht
205*99451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_int'.
206*99451b44SJordan Rupprecht        val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal)
207*99451b44SJordan Rupprecht        self.DebugSBValue(val)
208*99451b44SJordan Rupprecht
209*99451b44SJordan Rupprecht        # If the variable does not have a load address, there's no sense
210*99451b44SJordan Rupprecht        # continuing.
211*99451b44SJordan Rupprecht        if not val.GetLocation().startswith("0x"):
212*99451b44SJordan Rupprecht            return
213*99451b44SJordan Rupprecht
214*99451b44SJordan Rupprecht        # OK, let's get the hex location of the variable.
215*99451b44SJordan Rupprecht        location = int(val.GetLocation(), 16)
216*99451b44SJordan Rupprecht
217*99451b44SJordan Rupprecht        # Note that the canonical from of the bytearray is little endian.
218*99451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import int_to_bytearray, bytearray_to_int
219*99451b44SJordan Rupprecht
220*99451b44SJordan Rupprecht        byteSize = val.GetByteSize()
221*99451b44SJordan Rupprecht        bytes = int_to_bytearray(256, byteSize)
222*99451b44SJordan Rupprecht
223*99451b44SJordan Rupprecht        byteOrder = process.GetByteOrder()
224*99451b44SJordan Rupprecht        if byteOrder == lldb.eByteOrderBig:
225*99451b44SJordan Rupprecht            bytes.reverse()
226*99451b44SJordan Rupprecht        elif byteOrder == lldb.eByteOrderLittle:
227*99451b44SJordan Rupprecht            pass
228*99451b44SJordan Rupprecht        else:
229*99451b44SJordan Rupprecht            # Neither big endian nor little endian?  Return for now.
230*99451b44SJordan Rupprecht            # Add more logic here if we want to handle other types.
231*99451b44SJordan Rupprecht            return
232*99451b44SJordan Rupprecht
233*99451b44SJordan Rupprecht        # The program logic makes the 'my_int' variable to have int type and value of 0.
234*99451b44SJordan Rupprecht        # But we want to use the WriteMemory() API to assign 256 to the
235*99451b44SJordan Rupprecht        # variable.
236*99451b44SJordan Rupprecht
237*99451b44SJordan Rupprecht        # Now use WriteMemory() API to write 256 into the global variable.
238*99451b44SJordan Rupprecht        error = lldb.SBError()
239*99451b44SJordan Rupprecht        result = process.WriteMemory(location, bytes, error)
240*99451b44SJordan Rupprecht        if not error.Success() or result != byteSize:
241*99451b44SJordan Rupprecht            self.fail("SBProcess.WriteMemory() failed")
242*99451b44SJordan Rupprecht
243*99451b44SJordan Rupprecht        # Make sure that the val we got originally updates itself to notice the
244*99451b44SJordan Rupprecht        # change:
245*99451b44SJordan Rupprecht        self.expect(
246*99451b44SJordan Rupprecht            val.GetValue(),
247*99451b44SJordan Rupprecht            "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'",
248*99451b44SJordan Rupprecht            exe=False,
249*99451b44SJordan Rupprecht            startstr='256')
250*99451b44SJordan Rupprecht
251*99451b44SJordan Rupprecht        # And for grins, get the SBValue for the global variable 'my_int'
252*99451b44SJordan Rupprecht        # again, to make sure that also tracks the new value:
253*99451b44SJordan Rupprecht        val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal)
254*99451b44SJordan Rupprecht        self.expect(
255*99451b44SJordan Rupprecht            val.GetValue(),
256*99451b44SJordan Rupprecht            "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'",
257*99451b44SJordan Rupprecht            exe=False,
258*99451b44SJordan Rupprecht            startstr='256')
259*99451b44SJordan Rupprecht
260*99451b44SJordan Rupprecht        # Now read the memory content.  The bytearray should have (byte)1 as
261*99451b44SJordan Rupprecht        # the second element.
262*99451b44SJordan Rupprecht        content = process.ReadMemory(location, byteSize, error)
263*99451b44SJordan Rupprecht        if not error.Success():
264*99451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
265*99451b44SJordan Rupprecht
266*99451b44SJordan Rupprecht        # The bytearray_to_int utility function expects a little endian
267*99451b44SJordan Rupprecht        # bytearray.
268*99451b44SJordan Rupprecht        if byteOrder == lldb.eByteOrderBig:
269*99451b44SJordan Rupprecht            content = bytearray(content, 'ascii')
270*99451b44SJordan Rupprecht            content.reverse()
271*99451b44SJordan Rupprecht
272*99451b44SJordan Rupprecht        new_value = bytearray_to_int(content, byteSize)
273*99451b44SJordan Rupprecht        if new_value != 256:
274*99451b44SJordan Rupprecht            self.fail("Memory content read from 'my_int' does not match (int)256")
275*99451b44SJordan Rupprecht
276*99451b44SJordan Rupprecht        # Dump the memory content....
277*99451b44SJordan Rupprecht        if self.TraceOn():
278*99451b44SJordan Rupprecht            for i in content:
279*99451b44SJordan Rupprecht                print("byte:", i)
280*99451b44SJordan Rupprecht
281*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
282*99451b44SJordan Rupprecht    def test_remote_launch(self):
283*99451b44SJordan Rupprecht        """Test SBProcess.RemoteLaunch() API with a process not in eStateConnected, and it should fail."""
284*99451b44SJordan Rupprecht        self.build()
285*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
286*99451b44SJordan Rupprecht
287*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
288*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
289*99451b44SJordan Rupprecht
290*99451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
291*99451b44SJordan Rupprecht        process = target.LaunchSimple(
292*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
293*99451b44SJordan Rupprecht
294*99451b44SJordan Rupprecht        if self.TraceOn():
295*99451b44SJordan Rupprecht            print("process state:", state_type_to_str(process.GetState()))
296*99451b44SJordan Rupprecht        self.assertTrue(process.GetState() != lldb.eStateConnected)
297*99451b44SJordan Rupprecht
298*99451b44SJordan Rupprecht        error = lldb.SBError()
299*99451b44SJordan Rupprecht        success = process.RemoteLaunch(
300*99451b44SJordan Rupprecht            None, None, None, None, None, None, 0, False, error)
301*99451b44SJordan Rupprecht        self.assertTrue(
302*99451b44SJordan Rupprecht            not success,
303*99451b44SJordan Rupprecht            "RemoteLaunch() should fail for process state != eStateConnected")
304*99451b44SJordan Rupprecht
305*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
306*99451b44SJordan Rupprecht    def test_get_num_supported_hardware_watchpoints(self):
307*99451b44SJordan Rupprecht        """Test SBProcess.GetNumSupportedHardwareWatchpoints() API with a process."""
308*99451b44SJordan Rupprecht        self.build()
309*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
310*99451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
311*99451b44SJordan Rupprecht
312*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
313*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
314*99451b44SJordan Rupprecht
315*99451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
316*99451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
317*99451b44SJordan Rupprecht
318*99451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
319*99451b44SJordan Rupprecht        process = target.LaunchSimple(
320*99451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
321*99451b44SJordan Rupprecht
322*99451b44SJordan Rupprecht        error = lldb.SBError()
323*99451b44SJordan Rupprecht        num = process.GetNumSupportedHardwareWatchpoints(error)
324*99451b44SJordan Rupprecht        if self.TraceOn() and error.Success():
325*99451b44SJordan Rupprecht            print("Number of supported hardware watchpoints: %d" % num)
326*99451b44SJordan Rupprecht
327*99451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
328*99451b44SJordan Rupprecht    @no_debug_info_test
329*99451b44SJordan Rupprecht    def test_get_process_info(self):
330*99451b44SJordan Rupprecht        """Test SBProcess::GetProcessInfo() API with a locally launched process."""
331*99451b44SJordan Rupprecht        self.build()
332*99451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
333*99451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
334*99451b44SJordan Rupprecht
335*99451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
336*99451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
337*99451b44SJordan Rupprecht
338*99451b44SJordan Rupprecht        # Launch the process and stop at the entry point.
339*99451b44SJordan Rupprecht        launch_info = lldb.SBLaunchInfo(None)
340*99451b44SJordan Rupprecht        launch_info.SetWorkingDirectory(self.get_process_working_directory())
341*99451b44SJordan Rupprecht        launch_flags = launch_info.GetLaunchFlags()
342*99451b44SJordan Rupprecht        launch_flags |= lldb.eLaunchFlagStopAtEntry
343*99451b44SJordan Rupprecht        launch_info.SetLaunchFlags(launch_flags)
344*99451b44SJordan Rupprecht        error = lldb.SBError()
345*99451b44SJordan Rupprecht        process = target.Launch(launch_info, error)
346*99451b44SJordan Rupprecht
347*99451b44SJordan Rupprecht        if not error.Success():
348*99451b44SJordan Rupprecht            self.fail("Failed to launch process")
349*99451b44SJordan Rupprecht
350*99451b44SJordan Rupprecht        # Verify basic process info can be retrieved successfully
351*99451b44SJordan Rupprecht        process_info = process.GetProcessInfo()
352*99451b44SJordan Rupprecht        self.assertTrue(process_info.IsValid())
353*99451b44SJordan Rupprecht        file_spec = process_info.GetExecutableFile()
354*99451b44SJordan Rupprecht        self.assertTrue(file_spec.IsValid())
355*99451b44SJordan Rupprecht        process_name = process_info.GetName()
356*99451b44SJordan Rupprecht        self.assertIsNotNone(process_name, "Process has a name")
357*99451b44SJordan Rupprecht        self.assertGreater(len(process_name), 0, "Process name isn't blank")
358*99451b44SJordan Rupprecht        self.assertEqual(file_spec.GetFilename(), "a.out")
359*99451b44SJordan Rupprecht        self.assertNotEqual(
360*99451b44SJordan Rupprecht            process_info.GetProcessID(), lldb.LLDB_INVALID_PROCESS_ID,
361*99451b44SJordan Rupprecht            "Process ID is valid")
362*99451b44SJordan Rupprecht
363*99451b44SJordan Rupprecht        # Additional process info varies by platform, so just check that
364*99451b44SJordan Rupprecht        # whatever info was retrieved is consistent and nothing blows up.
365*99451b44SJordan Rupprecht        if process_info.UserIDIsValid():
366*99451b44SJordan Rupprecht            self.assertNotEqual(
367*99451b44SJordan Rupprecht                process_info.GetUserID(), lldb.UINT32_MAX,
368*99451b44SJordan Rupprecht                "Process user ID is valid")
369*99451b44SJordan Rupprecht        else:
370*99451b44SJordan Rupprecht            self.assertEqual(
371*99451b44SJordan Rupprecht                process_info.GetUserID(), lldb.UINT32_MAX,
372*99451b44SJordan Rupprecht                "Process user ID is invalid")
373*99451b44SJordan Rupprecht
374*99451b44SJordan Rupprecht        if process_info.GroupIDIsValid():
375*99451b44SJordan Rupprecht            self.assertNotEqual(
376*99451b44SJordan Rupprecht                process_info.GetGroupID(), lldb.UINT32_MAX,
377*99451b44SJordan Rupprecht                "Process group ID is valid")
378*99451b44SJordan Rupprecht        else:
379*99451b44SJordan Rupprecht            self.assertEqual(
380*99451b44SJordan Rupprecht                process_info.GetGroupID(), lldb.UINT32_MAX,
381*99451b44SJordan Rupprecht                "Process group ID is invalid")
382*99451b44SJordan Rupprecht
383*99451b44SJordan Rupprecht        if process_info.EffectiveUserIDIsValid():
384*99451b44SJordan Rupprecht            self.assertNotEqual(
385*99451b44SJordan Rupprecht                process_info.GetEffectiveUserID(), lldb.UINT32_MAX,
386*99451b44SJordan Rupprecht                "Process effective user ID is valid")
387*99451b44SJordan Rupprecht        else:
388*99451b44SJordan Rupprecht            self.assertEqual(
389*99451b44SJordan Rupprecht                process_info.GetEffectiveUserID(), lldb.UINT32_MAX,
390*99451b44SJordan Rupprecht                "Process effective user ID is invalid")
391*99451b44SJordan Rupprecht
392*99451b44SJordan Rupprecht        if process_info.EffectiveGroupIDIsValid():
393*99451b44SJordan Rupprecht            self.assertNotEqual(
394*99451b44SJordan Rupprecht                process_info.GetEffectiveGroupID(), lldb.UINT32_MAX,
395*99451b44SJordan Rupprecht                "Process effective group ID is valid")
396*99451b44SJordan Rupprecht        else:
397*99451b44SJordan Rupprecht            self.assertEqual(
398*99451b44SJordan Rupprecht                process_info.GetEffectiveGroupID(), lldb.UINT32_MAX,
399*99451b44SJordan Rupprecht                "Process effective group ID is invalid")
400*99451b44SJordan Rupprecht
401*99451b44SJordan Rupprecht        process_info.GetParentProcessID()
402