199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest SBProcess APIs, including ReadMemory(), WriteMemory(), and others.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbutil import get_stopped_thread, state_type_to_str
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass ProcessAPITestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
1799451b44SJordan Rupprecht
1899451b44SJordan Rupprecht    def setUp(self):
1999451b44SJordan Rupprecht        # Call super's setUp().
2099451b44SJordan Rupprecht        TestBase.setUp(self)
2199451b44SJordan Rupprecht        # Find the line number to break inside main().
2299451b44SJordan Rupprecht        self.line = line_number(
2399451b44SJordan Rupprecht            "main.cpp",
2499451b44SJordan Rupprecht            "// Set break point at this line and check variable 'my_char'.")
2599451b44SJordan Rupprecht
267606a543SJonas Devlieghere    @skipIfReproducer # SBProcess::ReadMemory is not instrumented.
2799451b44SJordan Rupprecht    def test_read_memory(self):
2899451b44SJordan Rupprecht        """Test Python SBProcess.ReadMemory() API."""
2999451b44SJordan Rupprecht        self.build()
3099451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
3399451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
3699451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
3999451b44SJordan Rupprecht        process = target.LaunchSimple(
4099451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
4399451b44SJordan Rupprecht        self.assertTrue(
4499451b44SJordan Rupprecht            thread.IsValid(),
4599451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
4699451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_char'.
4999451b44SJordan Rupprecht        val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal)
5099451b44SJordan Rupprecht        self.DebugSBValue(val)
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and
5399451b44SJordan Rupprecht        # expect to get a Python string as the result object!
5499451b44SJordan Rupprecht        error = lldb.SBError()
5599451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
5699451b44SJordan Rupprecht        content = process.ReadMemory(
5799451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 1, error)
5899451b44SJordan Rupprecht        if not error.Success():
5999451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
6099451b44SJordan Rupprecht        if self.TraceOn():
6199451b44SJordan Rupprecht            print("memory content:", content)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        self.expect(
6499451b44SJordan Rupprecht            content,
6599451b44SJordan Rupprecht            "Result from SBProcess.ReadMemory() matches our expected output: 'x'",
6699451b44SJordan Rupprecht            exe=False,
6799451b44SJordan Rupprecht            startstr=b'x')
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        # Read (char *)my_char_ptr.
7099451b44SJordan Rupprecht        val = frame.FindValue("my_char_ptr", lldb.eValueTypeVariableGlobal)
7199451b44SJordan Rupprecht        self.DebugSBValue(val)
7299451b44SJordan Rupprecht        cstring = process.ReadCStringFromMemory(
7399451b44SJordan Rupprecht            val.GetValueAsUnsigned(), 256, error)
7499451b44SJordan Rupprecht        if not error.Success():
7599451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
7699451b44SJordan Rupprecht        if self.TraceOn():
7799451b44SJordan Rupprecht            print("cstring read is:", cstring)
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        self.expect(
8099451b44SJordan Rupprecht            cstring,
8199451b44SJordan Rupprecht            "Result from SBProcess.ReadCStringFromMemory() matches our expected output",
8299451b44SJordan Rupprecht            exe=False,
8399451b44SJordan Rupprecht            startstr='Does it work?')
8499451b44SJordan Rupprecht
8599451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_cstring'.
8699451b44SJordan Rupprecht        val = frame.FindValue("my_cstring", lldb.eValueTypeVariableGlobal)
8799451b44SJordan Rupprecht        self.DebugSBValue(val)
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 256 to read at most 256 bytes
9099451b44SJordan Rupprecht        # from the address, and expect to get a Python string as the result
9199451b44SJordan Rupprecht        # object!
9299451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
9399451b44SJordan Rupprecht        cstring = process.ReadCStringFromMemory(
9499451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 256, error)
9599451b44SJordan Rupprecht        if not error.Success():
9699451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
9799451b44SJordan Rupprecht        if self.TraceOn():
9899451b44SJordan Rupprecht            print("cstring read is:", cstring)
9999451b44SJordan Rupprecht
10099451b44SJordan Rupprecht        self.expect(
10199451b44SJordan Rupprecht            cstring,
10299451b44SJordan Rupprecht            "Result from SBProcess.ReadCStringFromMemory() matches our expected output",
10399451b44SJordan Rupprecht            exe=False,
10499451b44SJordan Rupprecht            startstr='lldb.SBProcess.ReadCStringFromMemory() works!')
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_uint32'.
10799451b44SJordan Rupprecht        val = frame.FindValue("my_uint32", lldb.eValueTypeVariableGlobal)
10899451b44SJordan Rupprecht        self.DebugSBValue(val)
10999451b44SJordan Rupprecht
11099451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 4 to read 4 bytes
11199451b44SJordan Rupprecht        # from the address, and expect to get an int as the result!
11299451b44SJordan Rupprecht        self.assertFalse(val.TypeIsPointerType())
11399451b44SJordan Rupprecht        my_uint32 = process.ReadUnsignedFromMemory(
11499451b44SJordan Rupprecht            val.AddressOf().GetValueAsUnsigned(), 4, error)
11599451b44SJordan Rupprecht        if not error.Success():
11699451b44SJordan Rupprecht            self.fail("SBProcess.ReadCStringFromMemory() failed")
11799451b44SJordan Rupprecht        if self.TraceOn():
11899451b44SJordan Rupprecht            print("uint32 read is:", my_uint32)
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht        if my_uint32 != 12345:
12199451b44SJordan Rupprecht            self.fail(
12299451b44SJordan Rupprecht                "Result from SBProcess.ReadUnsignedFromMemory() does not match our expected output")
12399451b44SJordan Rupprecht
1247606a543SJonas Devlieghere    @skipIfReproducer # SBProcess::WriteMemory is not instrumented.
12599451b44SJordan Rupprecht    def test_write_memory(self):
12699451b44SJordan Rupprecht        """Test Python SBProcess.WriteMemory() API."""
12799451b44SJordan Rupprecht        self.build()
12899451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
12999451b44SJordan Rupprecht
13099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
13199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
13299451b44SJordan Rupprecht
13399451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
13499451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
13599451b44SJordan Rupprecht
13699451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
13799451b44SJordan Rupprecht        process = target.LaunchSimple(
13899451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
13999451b44SJordan Rupprecht
14099451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
14199451b44SJordan Rupprecht        self.assertTrue(
14299451b44SJordan Rupprecht            thread.IsValid(),
14399451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
14499451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
14599451b44SJordan Rupprecht
14699451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_char'.
14799451b44SJordan Rupprecht        val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal)
14899451b44SJordan Rupprecht        self.DebugSBValue(val)
14999451b44SJordan Rupprecht
15099451b44SJordan Rupprecht        # If the variable does not have a load address, there's no sense
15199451b44SJordan Rupprecht        # continuing.
15299451b44SJordan Rupprecht        if not val.GetLocation().startswith("0x"):
15399451b44SJordan Rupprecht            return
15499451b44SJordan Rupprecht
15599451b44SJordan Rupprecht        # OK, let's get the hex location of the variable.
15699451b44SJordan Rupprecht        location = int(val.GetLocation(), 16)
15799451b44SJordan Rupprecht
15899451b44SJordan Rupprecht        # The program logic makes the 'my_char' variable to have memory content as 'x'.
15999451b44SJordan Rupprecht        # But we want to use the WriteMemory() API to assign 'a' to the
16099451b44SJordan Rupprecht        # variable.
16199451b44SJordan Rupprecht
16299451b44SJordan Rupprecht        # Now use WriteMemory() API to write 'a' into the global variable.
16399451b44SJordan Rupprecht        error = lldb.SBError()
16499451b44SJordan Rupprecht        result = process.WriteMemory(location, 'a', error)
16599451b44SJordan Rupprecht        if not error.Success() or result != 1:
16699451b44SJordan Rupprecht            self.fail("SBProcess.WriteMemory() failed")
16799451b44SJordan Rupprecht
16899451b44SJordan Rupprecht        # Read from the memory location.  This time it should be 'a'.
16999451b44SJordan Rupprecht        # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and
17099451b44SJordan Rupprecht        # expect to get a Python string as the result object!
17199451b44SJordan Rupprecht        content = process.ReadMemory(location, 1, error)
17299451b44SJordan Rupprecht        if not error.Success():
17399451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
17499451b44SJordan Rupprecht        if self.TraceOn():
17599451b44SJordan Rupprecht            print("memory content:", content)
17699451b44SJordan Rupprecht
17799451b44SJordan Rupprecht        self.expect(
17899451b44SJordan Rupprecht            content,
17999451b44SJordan Rupprecht            "Result from SBProcess.ReadMemory() matches our expected output: 'a'",
18099451b44SJordan Rupprecht            exe=False,
18199451b44SJordan Rupprecht            startstr=b'a')
18299451b44SJordan Rupprecht
1837606a543SJonas Devlieghere    @skipIfReproducer # SBProcess::WriteMemory is not instrumented.
18499451b44SJordan Rupprecht    def test_access_my_int(self):
18599451b44SJordan Rupprecht        """Test access 'my_int' using Python SBProcess.GetByteOrder() and other APIs."""
18699451b44SJordan Rupprecht        self.build()
18799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
18899451b44SJordan Rupprecht
18999451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
19099451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
19199451b44SJordan Rupprecht
19299451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
19399451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
19499451b44SJordan Rupprecht
19599451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
19699451b44SJordan Rupprecht        process = target.LaunchSimple(
19799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
19899451b44SJordan Rupprecht
19999451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
20099451b44SJordan Rupprecht        self.assertTrue(
20199451b44SJordan Rupprecht            thread.IsValid(),
20299451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
20399451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
20499451b44SJordan Rupprecht
20599451b44SJordan Rupprecht        # Get the SBValue for the global variable 'my_int'.
20699451b44SJordan Rupprecht        val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal)
20799451b44SJordan Rupprecht        self.DebugSBValue(val)
20899451b44SJordan Rupprecht
20999451b44SJordan Rupprecht        # If the variable does not have a load address, there's no sense
21099451b44SJordan Rupprecht        # continuing.
21199451b44SJordan Rupprecht        if not val.GetLocation().startswith("0x"):
21299451b44SJordan Rupprecht            return
21399451b44SJordan Rupprecht
21499451b44SJordan Rupprecht        # OK, let's get the hex location of the variable.
21599451b44SJordan Rupprecht        location = int(val.GetLocation(), 16)
21699451b44SJordan Rupprecht
21799451b44SJordan Rupprecht        # Note that the canonical from of the bytearray is little endian.
21899451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import int_to_bytearray, bytearray_to_int
21999451b44SJordan Rupprecht
22099451b44SJordan Rupprecht        byteSize = val.GetByteSize()
22199451b44SJordan Rupprecht        bytes = int_to_bytearray(256, byteSize)
22299451b44SJordan Rupprecht
22399451b44SJordan Rupprecht        byteOrder = process.GetByteOrder()
22499451b44SJordan Rupprecht        if byteOrder == lldb.eByteOrderBig:
22599451b44SJordan Rupprecht            bytes.reverse()
22699451b44SJordan Rupprecht        elif byteOrder == lldb.eByteOrderLittle:
22799451b44SJordan Rupprecht            pass
22899451b44SJordan Rupprecht        else:
22999451b44SJordan Rupprecht            # Neither big endian nor little endian?  Return for now.
23099451b44SJordan Rupprecht            # Add more logic here if we want to handle other types.
23199451b44SJordan Rupprecht            return
23299451b44SJordan Rupprecht
23399451b44SJordan Rupprecht        # The program logic makes the 'my_int' variable to have int type and value of 0.
23499451b44SJordan Rupprecht        # But we want to use the WriteMemory() API to assign 256 to the
23599451b44SJordan Rupprecht        # variable.
23699451b44SJordan Rupprecht
23799451b44SJordan Rupprecht        # Now use WriteMemory() API to write 256 into the global variable.
23899451b44SJordan Rupprecht        error = lldb.SBError()
23999451b44SJordan Rupprecht        result = process.WriteMemory(location, bytes, error)
24099451b44SJordan Rupprecht        if not error.Success() or result != byteSize:
24199451b44SJordan Rupprecht            self.fail("SBProcess.WriteMemory() failed")
24299451b44SJordan Rupprecht
24399451b44SJordan Rupprecht        # Make sure that the val we got originally updates itself to notice the
24499451b44SJordan Rupprecht        # change:
24599451b44SJordan Rupprecht        self.expect(
24699451b44SJordan Rupprecht            val.GetValue(),
24799451b44SJordan Rupprecht            "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'",
24899451b44SJordan Rupprecht            exe=False,
24999451b44SJordan Rupprecht            startstr='256')
25099451b44SJordan Rupprecht
25199451b44SJordan Rupprecht        # And for grins, get the SBValue for the global variable 'my_int'
25299451b44SJordan Rupprecht        # again, to make sure that also tracks the new value:
25399451b44SJordan Rupprecht        val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal)
25499451b44SJordan Rupprecht        self.expect(
25599451b44SJordan Rupprecht            val.GetValue(),
25699451b44SJordan Rupprecht            "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'",
25799451b44SJordan Rupprecht            exe=False,
25899451b44SJordan Rupprecht            startstr='256')
25999451b44SJordan Rupprecht
26099451b44SJordan Rupprecht        # Now read the memory content.  The bytearray should have (byte)1 as
26199451b44SJordan Rupprecht        # the second element.
26299451b44SJordan Rupprecht        content = process.ReadMemory(location, byteSize, error)
26399451b44SJordan Rupprecht        if not error.Success():
26499451b44SJordan Rupprecht            self.fail("SBProcess.ReadMemory() failed")
26599451b44SJordan Rupprecht
26699451b44SJordan Rupprecht        # The bytearray_to_int utility function expects a little endian
26799451b44SJordan Rupprecht        # bytearray.
26899451b44SJordan Rupprecht        if byteOrder == lldb.eByteOrderBig:
26999451b44SJordan Rupprecht            content = bytearray(content, 'ascii')
27099451b44SJordan Rupprecht            content.reverse()
27199451b44SJordan Rupprecht
27299451b44SJordan Rupprecht        new_value = bytearray_to_int(content, byteSize)
27399451b44SJordan Rupprecht        if new_value != 256:
27499451b44SJordan Rupprecht            self.fail("Memory content read from 'my_int' does not match (int)256")
27599451b44SJordan Rupprecht
27699451b44SJordan Rupprecht        # Dump the memory content....
27799451b44SJordan Rupprecht        if self.TraceOn():
27899451b44SJordan Rupprecht            for i in content:
27999451b44SJordan Rupprecht                print("byte:", i)
28099451b44SJordan Rupprecht
28199451b44SJordan Rupprecht    def test_remote_launch(self):
28299451b44SJordan Rupprecht        """Test SBProcess.RemoteLaunch() API with a process not in eStateConnected, and it should fail."""
28399451b44SJordan Rupprecht        self.build()
28499451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
28599451b44SJordan Rupprecht
28699451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
28799451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
28899451b44SJordan Rupprecht
28999451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
29099451b44SJordan Rupprecht        process = target.LaunchSimple(
29199451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
29299451b44SJordan Rupprecht
29399451b44SJordan Rupprecht        if self.TraceOn():
29499451b44SJordan Rupprecht            print("process state:", state_type_to_str(process.GetState()))
29599451b44SJordan Rupprecht        self.assertTrue(process.GetState() != lldb.eStateConnected)
29699451b44SJordan Rupprecht
29799451b44SJordan Rupprecht        error = lldb.SBError()
29899451b44SJordan Rupprecht        success = process.RemoteLaunch(
29999451b44SJordan Rupprecht            None, None, None, None, None, None, 0, False, error)
30099451b44SJordan Rupprecht        self.assertTrue(
30199451b44SJordan Rupprecht            not success,
30299451b44SJordan Rupprecht            "RemoteLaunch() should fail for process state != eStateConnected")
30399451b44SJordan Rupprecht
30499451b44SJordan Rupprecht    def test_get_num_supported_hardware_watchpoints(self):
30599451b44SJordan Rupprecht        """Test SBProcess.GetNumSupportedHardwareWatchpoints() API with a process."""
30699451b44SJordan Rupprecht        self.build()
30799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
30899451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
30999451b44SJordan Rupprecht
31099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
31199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
31299451b44SJordan Rupprecht
31399451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
31499451b44SJordan Rupprecht        self.assertTrue(breakpoint, VALID_BREAKPOINT)
31599451b44SJordan Rupprecht
31699451b44SJordan Rupprecht        # Launch the process, and do not stop at the entry point.
31799451b44SJordan Rupprecht        process = target.LaunchSimple(
31899451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
31999451b44SJordan Rupprecht
32099451b44SJordan Rupprecht        error = lldb.SBError()
32199451b44SJordan Rupprecht        num = process.GetNumSupportedHardwareWatchpoints(error)
32299451b44SJordan Rupprecht        if self.TraceOn() and error.Success():
32399451b44SJordan Rupprecht            print("Number of supported hardware watchpoints: %d" % num)
32499451b44SJordan Rupprecht
32599451b44SJordan Rupprecht    @no_debug_info_test
32699451b44SJordan Rupprecht    def test_get_process_info(self):
32799451b44SJordan Rupprecht        """Test SBProcess::GetProcessInfo() API with a locally launched process."""
32899451b44SJordan Rupprecht        self.build()
32999451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
33099451b44SJordan Rupprecht        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
33199451b44SJordan Rupprecht
33299451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
33399451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
33499451b44SJordan Rupprecht
33599451b44SJordan Rupprecht        # Launch the process and stop at the entry point.
33686aa8e63SJonas Devlieghere        launch_info = target.GetLaunchInfo()
33799451b44SJordan Rupprecht        launch_info.SetWorkingDirectory(self.get_process_working_directory())
33899451b44SJordan Rupprecht        launch_flags = launch_info.GetLaunchFlags()
33999451b44SJordan Rupprecht        launch_flags |= lldb.eLaunchFlagStopAtEntry
34099451b44SJordan Rupprecht        launch_info.SetLaunchFlags(launch_flags)
34199451b44SJordan Rupprecht        error = lldb.SBError()
34299451b44SJordan Rupprecht        process = target.Launch(launch_info, error)
34399451b44SJordan Rupprecht
34499451b44SJordan Rupprecht        if not error.Success():
34599451b44SJordan Rupprecht            self.fail("Failed to launch process")
34699451b44SJordan Rupprecht
34799451b44SJordan Rupprecht        # Verify basic process info can be retrieved successfully
34899451b44SJordan Rupprecht        process_info = process.GetProcessInfo()
34999451b44SJordan Rupprecht        self.assertTrue(process_info.IsValid())
35099451b44SJordan Rupprecht        file_spec = process_info.GetExecutableFile()
35199451b44SJordan Rupprecht        self.assertTrue(file_spec.IsValid())
35299451b44SJordan Rupprecht        process_name = process_info.GetName()
35399451b44SJordan Rupprecht        self.assertIsNotNone(process_name, "Process has a name")
35499451b44SJordan Rupprecht        self.assertGreater(len(process_name), 0, "Process name isn't blank")
35599451b44SJordan Rupprecht        self.assertEqual(file_spec.GetFilename(), "a.out")
35699451b44SJordan Rupprecht        self.assertNotEqual(
35799451b44SJordan Rupprecht            process_info.GetProcessID(), lldb.LLDB_INVALID_PROCESS_ID,
35899451b44SJordan Rupprecht            "Process ID is valid")
359*251a5d9dSBruce Mitchener        triple = process_info.GetTriple()
360*251a5d9dSBruce Mitchener        self.assertIsNotNone(triple, "Process has a triple")
36199451b44SJordan Rupprecht
36299451b44SJordan Rupprecht        # Additional process info varies by platform, so just check that
36399451b44SJordan Rupprecht        # whatever info was retrieved is consistent and nothing blows up.
36499451b44SJordan Rupprecht        if process_info.UserIDIsValid():
36599451b44SJordan Rupprecht            self.assertNotEqual(
36699451b44SJordan Rupprecht                process_info.GetUserID(), lldb.UINT32_MAX,
36799451b44SJordan Rupprecht                "Process user ID is valid")
36899451b44SJordan Rupprecht        else:
36999451b44SJordan Rupprecht            self.assertEqual(
37099451b44SJordan Rupprecht                process_info.GetUserID(), lldb.UINT32_MAX,
37199451b44SJordan Rupprecht                "Process user ID is invalid")
37299451b44SJordan Rupprecht
37399451b44SJordan Rupprecht        if process_info.GroupIDIsValid():
37499451b44SJordan Rupprecht            self.assertNotEqual(
37599451b44SJordan Rupprecht                process_info.GetGroupID(), lldb.UINT32_MAX,
37699451b44SJordan Rupprecht                "Process group ID is valid")
37799451b44SJordan Rupprecht        else:
37899451b44SJordan Rupprecht            self.assertEqual(
37999451b44SJordan Rupprecht                process_info.GetGroupID(), lldb.UINT32_MAX,
38099451b44SJordan Rupprecht                "Process group ID is invalid")
38199451b44SJordan Rupprecht
38299451b44SJordan Rupprecht        if process_info.EffectiveUserIDIsValid():
38399451b44SJordan Rupprecht            self.assertNotEqual(
38499451b44SJordan Rupprecht                process_info.GetEffectiveUserID(), lldb.UINT32_MAX,
38599451b44SJordan Rupprecht                "Process effective user ID is valid")
38699451b44SJordan Rupprecht        else:
38799451b44SJordan Rupprecht            self.assertEqual(
38899451b44SJordan Rupprecht                process_info.GetEffectiveUserID(), lldb.UINT32_MAX,
38999451b44SJordan Rupprecht                "Process effective user ID is invalid")
39099451b44SJordan Rupprecht
39199451b44SJordan Rupprecht        if process_info.EffectiveGroupIDIsValid():
39299451b44SJordan Rupprecht            self.assertNotEqual(
39399451b44SJordan Rupprecht                process_info.GetEffectiveGroupID(), lldb.UINT32_MAX,
39499451b44SJordan Rupprecht                "Process effective group ID is valid")
39599451b44SJordan Rupprecht        else:
39699451b44SJordan Rupprecht            self.assertEqual(
39799451b44SJordan Rupprecht                process_info.GetEffectiveGroupID(), lldb.UINT32_MAX,
39899451b44SJordan Rupprecht                "Process effective group ID is invalid")
39999451b44SJordan Rupprecht
40099451b44SJordan Rupprecht        process_info.GetParentProcessID()
401