This patch adds the ability to use a custom interpreter with the `platform shell` command. If the user set the `-s|--shell` option with the path to a binary, lldb passes it down to the platform's `RunShellProcess` method and set it as the shell to use in `ProcessLaunchInfo to run commands. Note that not all the Platforms support running shell commands with custom interpreters (i.e. RemoteGDBServer is only expected to use the default shell). This patch also makes some refactoring and cleanups, like swapping CString for StringRef when possible and updating `SBPlatformShellCommand` with new methods and a new constructor. rdar://67759256 Differential Revision: https://reviews.llvm.org/D86667 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
99 lines
3.9 KiB
Python
99 lines
3.9 KiB
Python
"""
|
|
Test the lldb platform Python API.
|
|
"""
|
|
|
|
|
|
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class PlatformPythonTestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
|
|
@add_test_categories(['pyapi'])
|
|
@no_debug_info_test
|
|
def test_platform_list(self):
|
|
"""Test SBDebugger::GetNumPlatforms() & GetPlatformAtIndex() API"""
|
|
# Verify the host platform is present by default.
|
|
initial_num_platforms = self.dbg.GetNumPlatforms()
|
|
self.assertGreater(initial_num_platforms, 0)
|
|
host_platform = self.dbg.GetPlatformAtIndex(0)
|
|
self.assertTrue(host_platform.IsValid() and
|
|
host_platform.GetName() == 'host',
|
|
'The host platform is present')
|
|
# Select another platform and verify that the platform is added to
|
|
# the platform list.
|
|
platform_idx = self.dbg.GetNumAvailablePlatforms() - 1
|
|
if platform_idx < 1:
|
|
self.fail('No platforms other than host are available')
|
|
platform_data = self.dbg.GetAvailablePlatformInfoAtIndex(platform_idx)
|
|
platform_name = platform_data.GetValueForKey('name').GetStringValue(100)
|
|
self.assertNotEqual(platform_name, 'host')
|
|
self.dbg.SetCurrentPlatform(platform_name)
|
|
selected_platform = self.dbg.GetSelectedPlatform()
|
|
self.assertTrue(selected_platform.IsValid())
|
|
self.assertEqual(selected_platform.GetName(), platform_name)
|
|
self.assertEqual(self.dbg.GetNumPlatforms(), initial_num_platforms + 1)
|
|
platform_found = False
|
|
for platform_idx in range(self.dbg.GetNumPlatforms()):
|
|
platform = self.dbg.GetPlatformAtIndex(platform_idx)
|
|
if platform.GetName() == platform_name:
|
|
platform_found = True
|
|
break
|
|
self.assertTrue(platform_found)
|
|
|
|
@add_test_categories(['pyapi'])
|
|
@no_debug_info_test
|
|
def test_host_is_connected(self):
|
|
# We've already tested that this one IS the host platform.
|
|
host_platform = self.dbg.GetPlatformAtIndex(0)
|
|
self.assertTrue(host_platform.IsConnected(), "The host platform is always connected")
|
|
|
|
|
|
@add_test_categories(['pyapi'])
|
|
@no_debug_info_test
|
|
def test_available_platform_list(self):
|
|
"""Test SBDebugger::GetNumAvailablePlatforms() and GetAvailablePlatformInfoAtIndex() API"""
|
|
num_platforms = self.dbg.GetNumAvailablePlatforms()
|
|
self.assertGreater(
|
|
num_platforms, 0,
|
|
'There should be at least one platform available')
|
|
|
|
for i in range(num_platforms):
|
|
platform_data = self.dbg.GetAvailablePlatformInfoAtIndex(i)
|
|
name_data = platform_data.GetValueForKey('name')
|
|
desc_data = platform_data.GetValueForKey('description')
|
|
self.assertTrue(
|
|
name_data and name_data.IsValid(),
|
|
'Platform has a name')
|
|
self.assertEqual(
|
|
name_data.GetType(), lldb.eStructuredDataTypeString,
|
|
'Platform name is a string')
|
|
self.assertTrue(
|
|
desc_data and desc_data.IsValid(),
|
|
'Platform has a description')
|
|
self.assertEqual(
|
|
desc_data.GetType(), lldb.eStructuredDataTypeString,
|
|
'Platform description is a string')
|
|
|
|
@add_test_categories(['pyapi'])
|
|
@no_debug_info_test
|
|
def test_shell_interpreter(self):
|
|
""" Test a shell with a custom interpreter """
|
|
platform = self.dbg.GetSelectedPlatform()
|
|
self.assertTrue(platform.IsValid())
|
|
|
|
sh_cmd = lldb.SBPlatformShellCommand('/bin/zsh', 'echo $0')
|
|
self.assertIn('/bin/zsh', sh_cmd.GetShell())
|
|
self.assertIn('echo $0', sh_cmd.GetCommand())
|
|
|
|
self.build()
|
|
sh_cmd.SetShell(self.getBuildArtifact('a.out'))
|
|
err = platform.Run(sh_cmd)
|
|
self.assertTrue(err.Success())
|
|
self.assertIn("SUCCESS", sh_cmd.GetOutput())
|