1"""
2Test some lldb platform commands.
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class PlatformCommandTestCase(TestBase):
14    NO_DEBUG_INFO_TESTCASE = True
15
16    @no_debug_info_test
17    def test_help_platform(self):
18        self.runCmd("help platform")
19
20    @no_debug_info_test
21    def test_help_shell_alias(self):
22        self.expect("help shell", substrs=["Run a shell command on the host.",
23                                           "shell <shell-command>",
24                                           "'shell' is an abbreviation"])
25        # "platform shell" has options. The "shell" alias for it does not.
26        self.expect("help shell", substrs=["Command Options:"], matching=False)
27
28    @no_debug_info_test
29    def test_list(self):
30        self.expect("platform list",
31                    patterns=['^Available platforms:'])
32
33    @no_debug_info_test
34    def test_process_list(self):
35        self.expect("platform process list",
36                    substrs=['PID', 'TRIPLE', 'NAME'])
37
38    @no_debug_info_test
39    def test_process_info_with_no_arg(self):
40        """This is expected to fail and to return a proper error message."""
41        self.expect("platform process info", error=True,
42                    substrs=['one or more process id(s) must be specified'])
43
44    @no_debug_info_test
45    def test_status(self):
46        self.expect(
47            "platform status",
48            substrs=[
49                'Platform',
50                'Triple',
51                'OS Version',
52                'Hostname',
53                'Kernel',
54            ])
55
56    @expectedFailureAll(oslist=["windows"])
57    @no_debug_info_test
58    def test_shell(self):
59        """ Test that the platform shell command can invoke ls. """
60        triple = self.dbg.GetSelectedPlatform().GetTriple()
61        if re.match(".*-.*-windows", triple):
62            self.expect(
63                "platform shell dir c:\\", substrs=[
64                    "Windows", "Program Files"])
65            self.expect("shell dir c:\\", substrs=["Windows", "Program Files"])
66        elif re.match(".*-.*-.*-android", triple):
67            self.expect(
68                "platform shell ls /",
69                substrs=[
70                    "cache",
71                    "dev",
72                    "system"])
73            self.expect("shell ls /",
74                substrs=["cache", "dev", "system"])
75        else:
76            self.expect("platform shell ls /", substrs=["dev", "tmp", "usr"])
77            self.expect("shell ls /", substrs=["dev", "tmp", "usr"])
78
79    @no_debug_info_test
80    def test_shell_builtin(self):
81        """ Test a shell built-in command (echo) """
82        self.expect("platform shell echo hello lldb",
83                    substrs=["hello lldb"])
84        self.expect("shell echo hello lldb",
85                    substrs=["hello lldb"])
86
87
88    @no_debug_info_test
89    def test_shell_timeout(self):
90        """ Test a shell built-in command (sleep) that times out """
91        self.skipTest("Alias with option not supported by the command interpreter.")
92        self.expect("platform shell -t 1 -- sleep 15", error=True, substrs=[
93                    "error: timed out waiting for shell command to complete"])
94        self.expect("shell -t 1 --  sleep 3", error=True, substrs=[
95                    "error: timed out waiting for shell command to complete"])
96
97    @no_debug_info_test
98    @skipIfRemote
99    def test_host_shell_interpreter(self):
100        """ Test the host platform shell with a different interpreter """
101        self.build()
102        exe = self.getBuildArtifact('a.out')
103        self.expect("platform shell -h -s " + exe + " -- 'echo $0'",
104                    substrs=['SUCCESS', 'a.out'])
105