199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest some target commands: create, list, select, variable.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtimport os
699451b44SJordan Rupprechtimport stat
799451b44SJordan Rupprechtimport tempfile
899451b44SJordan Rupprecht
999451b44SJordan Rupprechtimport lldb
1099451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1299451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht
1599451b44SJordan Rupprechtclass targetCommandTestCase(TestBase):
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def setUp(self):
1899451b44SJordan Rupprecht        # Call super's setUp().
1999451b44SJordan Rupprecht        TestBase.setUp(self)
2099451b44SJordan Rupprecht        # Find the line numbers for our breakpoints.
2199451b44SJordan Rupprecht        self.line_b = line_number('b.c', '// Set break point at this line.')
2299451b44SJordan Rupprecht        self.line_c = line_number('c.c', '// Set break point at this line.')
2399451b44SJordan Rupprecht
2499451b44SJordan Rupprecht    def buildB(self):
2599451b44SJordan Rupprecht        db = {'C_SOURCES': 'b.c', 'EXE': self.getBuildArtifact('b.out')}
2699451b44SJordan Rupprecht        self.build(dictionary=db)
2799451b44SJordan Rupprecht        self.addTearDownCleanup(dictionary=db)
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht    def buildAll(self):
3099451b44SJordan Rupprecht        da = {'C_SOURCES': 'a.c', 'EXE': self.getBuildArtifact('a.out')}
3199451b44SJordan Rupprecht        self.build(dictionary=da)
3299451b44SJordan Rupprecht        self.addTearDownCleanup(dictionary=da)
3399451b44SJordan Rupprecht
3499451b44SJordan Rupprecht        self.buildB()
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht        dc = {'C_SOURCES': 'c.c', 'EXE': self.getBuildArtifact('c.out')}
3799451b44SJordan Rupprecht        self.build(dictionary=dc)
3899451b44SJordan Rupprecht        self.addTearDownCleanup(dictionary=dc)
3999451b44SJordan Rupprecht
4099451b44SJordan Rupprecht    def test_target_command(self):
4199451b44SJordan Rupprecht        """Test some target commands: create, list, select."""
4299451b44SJordan Rupprecht        self.buildAll()
4399451b44SJordan Rupprecht        self.do_target_command()
4499451b44SJordan Rupprecht
45b1bb1d4cSJonas Devlieghere    @expectedFailureDarwin(archs=["arm64", "arm64e"]) # <rdar://problem/37773624>
4699451b44SJordan Rupprecht    def test_target_variable_command(self):
4799451b44SJordan Rupprecht        """Test 'target variable' command before and after starting the inferior."""
4899451b44SJordan Rupprecht        d = {'C_SOURCES': 'globals.c', 'EXE': self.getBuildArtifact('globals')}
4999451b44SJordan Rupprecht        self.build(dictionary=d)
5099451b44SJordan Rupprecht        self.addTearDownCleanup(dictionary=d)
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht        self.do_target_variable_command('globals')
5399451b44SJordan Rupprecht
54b1bb1d4cSJonas Devlieghere    @expectedFailureDarwin(archs=["arm64", "arm64e"]) # <rdar://problem/37773624>
5599451b44SJordan Rupprecht    def test_target_variable_command_no_fail(self):
5699451b44SJordan Rupprecht        """Test 'target variable' command before and after starting the inferior."""
5799451b44SJordan Rupprecht        d = {'C_SOURCES': 'globals.c', 'EXE': self.getBuildArtifact('globals')}
5899451b44SJordan Rupprecht        self.build(dictionary=d)
5999451b44SJordan Rupprecht        self.addTearDownCleanup(dictionary=d)
6099451b44SJordan Rupprecht
6199451b44SJordan Rupprecht        self.do_target_variable_command_no_fail('globals')
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht    def do_target_command(self):
6499451b44SJordan Rupprecht        """Exercise 'target create', 'target list', 'target select' commands."""
6599451b44SJordan Rupprecht        exe_a = self.getBuildArtifact("a.out")
6699451b44SJordan Rupprecht        exe_b = self.getBuildArtifact("b.out")
6799451b44SJordan Rupprecht        exe_c = self.getBuildArtifact("c.out")
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        self.runCmd("target list")
7099451b44SJordan Rupprecht        output = self.res.GetOutput()
7199451b44SJordan Rupprecht        if output.startswith("No targets"):
7299451b44SJordan Rupprecht            # We start from index 0.
7399451b44SJordan Rupprecht            base = 0
7499451b44SJordan Rupprecht        else:
7599451b44SJordan Rupprecht            # Find the largest index of the existing list.
7699451b44SJordan Rupprecht            import re
7799451b44SJordan Rupprecht            pattern = re.compile("target #(\d+):")
7899451b44SJordan Rupprecht            for line in reversed(output.split(os.linesep)):
7999451b44SJordan Rupprecht                match = pattern.search(line)
8099451b44SJordan Rupprecht                if match:
8199451b44SJordan Rupprecht                    # We will start from (index + 1) ....
8299451b44SJordan Rupprecht                    base = int(match.group(1), 10) + 1
83b321b429SJonas Devlieghere                    self.trace("base is:", base)
8499451b44SJordan Rupprecht                    break
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht        self.runCmd("target create " + exe_a, CURRENT_EXECUTABLE_SET)
8799451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        self.runCmd("target create " + exe_b, CURRENT_EXECUTABLE_SET)
9099451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
9199451b44SJordan Rupprecht            self, 'b.c', self.line_b, num_expected_locations=1, loc_exact=True)
9299451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
9399451b44SJordan Rupprecht
9499451b44SJordan Rupprecht        self.runCmd("target create " + exe_c, CURRENT_EXECUTABLE_SET)
9599451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(
9699451b44SJordan Rupprecht            self, 'c.c', self.line_c, num_expected_locations=1, loc_exact=True)
9799451b44SJordan Rupprecht        self.runCmd("run", RUN_SUCCEEDED)
9899451b44SJordan Rupprecht
9999451b44SJordan Rupprecht        self.runCmd("target list")
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht        self.runCmd("target select %d" % base)
10299451b44SJordan Rupprecht        self.runCmd("thread backtrace")
10399451b44SJordan Rupprecht
10499451b44SJordan Rupprecht        self.runCmd("target select %d" % (base + 2))
10599451b44SJordan Rupprecht        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
10699451b44SJordan Rupprecht                    substrs=['stop reason = breakpoint' ,'c.c:%d' % self.line_c
10799451b44SJordan Rupprecht                             ])
10899451b44SJordan Rupprecht
10999451b44SJordan Rupprecht        self.runCmd("target select %d" % (base + 1))
11099451b44SJordan Rupprecht        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
11199451b44SJordan Rupprecht                    substrs=['stop reason = breakpoint', 'b.c:%d' % self.line_b
11299451b44SJordan Rupprecht                             ])
11399451b44SJordan Rupprecht
11499451b44SJordan Rupprecht        self.runCmd("target list")
11599451b44SJordan Rupprecht
1164add8536SJonas Devlieghere    @no_debug_info_test
1174add8536SJonas Devlieghere    def test_target_create_invalid_arch(self):
1184add8536SJonas Devlieghere        exe = self.getBuildArtifact("a.out")
1194add8536SJonas Devlieghere        self.expect("target create {} --arch doesntexist".format(exe), error=True,
1204add8536SJonas Devlieghere                    patterns=["error: invalid triple 'doesntexist'"])
1214add8536SJonas Devlieghere
1224add8536SJonas Devlieghere    @no_debug_info_test
1234add8536SJonas Devlieghere    def test_target_create_platform(self):
1244add8536SJonas Devlieghere        self.buildB()
1254add8536SJonas Devlieghere        exe = self.getBuildArtifact("b.out")
1264add8536SJonas Devlieghere        self.expect("target create {} --platform host".format(exe))
1274add8536SJonas Devlieghere
1284add8536SJonas Devlieghere    @no_debug_info_test
1294add8536SJonas Devlieghere    def test_target_create_unsupported_platform(self):
1304add8536SJonas Devlieghere        yaml = os.path.join(self.getSourceDir(), "bogus.yaml")
1314add8536SJonas Devlieghere        exe = self.getBuildArtifact("bogus")
1324add8536SJonas Devlieghere        self.yaml2obj(yaml, exe)
1334add8536SJonas Devlieghere        self.expect("target create {}".format(exe), error=True,
1344add8536SJonas Devlieghere                    patterns=['error: no matching platforms found for this file'])
1354add8536SJonas Devlieghere
1364add8536SJonas Devlieghere    @no_debug_info_test
1374add8536SJonas Devlieghere    def test_target_create_invalid_platform(self):
1384add8536SJonas Devlieghere        self.buildB()
1394add8536SJonas Devlieghere        exe = self.getBuildArtifact("b.out")
1404add8536SJonas Devlieghere        self.expect("target create {} --platform doesntexist".format(exe), error=True,
1414add8536SJonas Devlieghere                    patterns=['error: unable to find a plug-in for the platform named "doesntexist"'])
1424add8536SJonas Devlieghere
14399451b44SJordan Rupprecht    def do_target_variable_command(self, exe_name):
14499451b44SJordan Rupprecht        """Exercise 'target variable' command before and after starting the inferior."""
14599451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact(exe_name),
14699451b44SJordan Rupprecht                    CURRENT_EXECUTABLE_SET)
14799451b44SJordan Rupprecht
14899451b44SJordan Rupprecht        self.expect(
14999451b44SJordan Rupprecht            "target variable my_global_char",
15099451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
15199451b44SJordan Rupprecht            substrs=[
15299451b44SJordan Rupprecht                "my_global_char",
15399451b44SJordan Rupprecht                "'X'"])
15499451b44SJordan Rupprecht        self.expect(
15599451b44SJordan Rupprecht            "target variable my_global_str",
15699451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
15799451b44SJordan Rupprecht            substrs=[
15899451b44SJordan Rupprecht                'my_global_str',
15999451b44SJordan Rupprecht                '"abc"'])
16099451b44SJordan Rupprecht        self.expect(
16199451b44SJordan Rupprecht            "target variable my_static_int",
16299451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
16399451b44SJordan Rupprecht            substrs=[
16499451b44SJordan Rupprecht                'my_static_int',
16599451b44SJordan Rupprecht                '228'])
16699451b44SJordan Rupprecht        self.expect("target variable my_global_str_ptr", matching=False,
16799451b44SJordan Rupprecht                    substrs=['"abc"'])
16899451b44SJordan Rupprecht        self.expect("target variable *my_global_str_ptr", matching=True,
16999451b44SJordan Rupprecht                    substrs=['"abc"'])
17099451b44SJordan Rupprecht        self.expect(
17199451b44SJordan Rupprecht            "target variable *my_global_str",
17299451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
17399451b44SJordan Rupprecht            substrs=['a'])
17499451b44SJordan Rupprecht
17599451b44SJordan Rupprecht        self.runCmd("b main")
17699451b44SJordan Rupprecht        self.runCmd("run")
17799451b44SJordan Rupprecht
17899451b44SJordan Rupprecht        self.expect(
17999451b44SJordan Rupprecht            "target variable my_global_str",
18099451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
18199451b44SJordan Rupprecht            substrs=[
18299451b44SJordan Rupprecht                'my_global_str',
18399451b44SJordan Rupprecht                '"abc"'])
18499451b44SJordan Rupprecht        self.expect(
18599451b44SJordan Rupprecht            "target variable my_static_int",
18699451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
18799451b44SJordan Rupprecht            substrs=[
18899451b44SJordan Rupprecht                'my_static_int',
18999451b44SJordan Rupprecht                '228'])
19099451b44SJordan Rupprecht        self.expect("target variable my_global_str_ptr", matching=False,
19199451b44SJordan Rupprecht                    substrs=['"abc"'])
19299451b44SJordan Rupprecht        self.expect("target variable *my_global_str_ptr", matching=True,
19399451b44SJordan Rupprecht                    substrs=['"abc"'])
19499451b44SJordan Rupprecht        self.expect(
19599451b44SJordan Rupprecht            "target variable *my_global_str",
19699451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
19799451b44SJordan Rupprecht            substrs=['a'])
19899451b44SJordan Rupprecht        self.expect(
19999451b44SJordan Rupprecht            "target variable my_global_char",
20099451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
20199451b44SJordan Rupprecht            substrs=[
20299451b44SJordan Rupprecht                "my_global_char",
20399451b44SJordan Rupprecht                "'X'"])
20499451b44SJordan Rupprecht
20599451b44SJordan Rupprecht        self.runCmd("c")
20699451b44SJordan Rupprecht
20799451b44SJordan Rupprecht        self.expect(
20899451b44SJordan Rupprecht            "target variable my_global_str",
20999451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
21099451b44SJordan Rupprecht            substrs=[
21199451b44SJordan Rupprecht                'my_global_str',
21299451b44SJordan Rupprecht                '"abc"'])
21399451b44SJordan Rupprecht        self.expect(
21499451b44SJordan Rupprecht            "target variable my_static_int",
21599451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
21699451b44SJordan Rupprecht            substrs=[
21799451b44SJordan Rupprecht                'my_static_int',
21899451b44SJordan Rupprecht                '228'])
21999451b44SJordan Rupprecht        self.expect("target variable my_global_str_ptr", matching=False,
22099451b44SJordan Rupprecht                    substrs=['"abc"'])
22199451b44SJordan Rupprecht        self.expect("target variable *my_global_str_ptr", matching=True,
22299451b44SJordan Rupprecht                    substrs=['"abc"'])
22399451b44SJordan Rupprecht        self.expect(
22499451b44SJordan Rupprecht            "target variable *my_global_str",
22599451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
22699451b44SJordan Rupprecht            substrs=['a'])
22799451b44SJordan Rupprecht        self.expect(
22899451b44SJordan Rupprecht            "target variable my_global_char",
22999451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
23099451b44SJordan Rupprecht            substrs=[
23199451b44SJordan Rupprecht                "my_global_char",
23299451b44SJordan Rupprecht                "'X'"])
23399451b44SJordan Rupprecht
23499451b44SJordan Rupprecht    def do_target_variable_command_no_fail(self, exe_name):
23599451b44SJordan Rupprecht        """Exercise 'target variable' command before and after starting the inferior."""
23699451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact(exe_name),
23799451b44SJordan Rupprecht                    CURRENT_EXECUTABLE_SET)
23899451b44SJordan Rupprecht
23999451b44SJordan Rupprecht        self.expect(
24099451b44SJordan Rupprecht            "target variable my_global_char",
24199451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
24299451b44SJordan Rupprecht            substrs=[
24399451b44SJordan Rupprecht                "my_global_char",
24499451b44SJordan Rupprecht                "'X'"])
24599451b44SJordan Rupprecht        self.expect(
24699451b44SJordan Rupprecht            "target variable my_global_str",
24799451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
24899451b44SJordan Rupprecht            substrs=[
24999451b44SJordan Rupprecht                'my_global_str',
25099451b44SJordan Rupprecht                '"abc"'])
25199451b44SJordan Rupprecht        self.expect(
25299451b44SJordan Rupprecht            "target variable my_static_int",
25399451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
25499451b44SJordan Rupprecht            substrs=[
25599451b44SJordan Rupprecht                'my_static_int',
25699451b44SJordan Rupprecht                '228'])
25799451b44SJordan Rupprecht        self.expect("target variable my_global_str_ptr", matching=False,
25899451b44SJordan Rupprecht                    substrs=['"abc"'])
25999451b44SJordan Rupprecht        self.expect("target variable *my_global_str_ptr", matching=True,
26099451b44SJordan Rupprecht                    substrs=['"abc"'])
26199451b44SJordan Rupprecht        self.expect(
26299451b44SJordan Rupprecht            "target variable *my_global_str",
26399451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
26499451b44SJordan Rupprecht            substrs=['a'])
26599451b44SJordan Rupprecht
26699451b44SJordan Rupprecht        self.runCmd("b main")
26799451b44SJordan Rupprecht        self.runCmd("run")
26899451b44SJordan Rupprecht
26999451b44SJordan Rupprecht        # New feature: you don't need to specify the variable(s) to 'target vaiable'.
27099451b44SJordan Rupprecht        # It will find all the global and static variables in the current
27199451b44SJordan Rupprecht        # compile unit.
27299451b44SJordan Rupprecht        self.expect("target variable",
27399451b44SJordan Rupprecht                    ordered=False,
27499451b44SJordan Rupprecht                    substrs=['my_global_char',
27599451b44SJordan Rupprecht                             'my_static_int',
27699451b44SJordan Rupprecht                             'my_global_str',
27799451b44SJordan Rupprecht                             'my_global_str_ptr',
27899451b44SJordan Rupprecht                             ])
27999451b44SJordan Rupprecht
28099451b44SJordan Rupprecht        self.expect(
28199451b44SJordan Rupprecht            "target variable my_global_str",
28299451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
28399451b44SJordan Rupprecht            substrs=[
28499451b44SJordan Rupprecht                'my_global_str',
28599451b44SJordan Rupprecht                '"abc"'])
28699451b44SJordan Rupprecht        self.expect(
28799451b44SJordan Rupprecht            "target variable my_static_int",
28899451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
28999451b44SJordan Rupprecht            substrs=[
29099451b44SJordan Rupprecht                'my_static_int',
29199451b44SJordan Rupprecht                '228'])
29299451b44SJordan Rupprecht        self.expect("target variable my_global_str_ptr", matching=False,
29399451b44SJordan Rupprecht                    substrs=['"abc"'])
29499451b44SJordan Rupprecht        self.expect("target variable *my_global_str_ptr", matching=True,
29599451b44SJordan Rupprecht                    substrs=['"abc"'])
29699451b44SJordan Rupprecht        self.expect(
29799451b44SJordan Rupprecht            "target variable *my_global_str",
29899451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
29999451b44SJordan Rupprecht            substrs=['a'])
30099451b44SJordan Rupprecht        self.expect(
30199451b44SJordan Rupprecht            "target variable my_global_char",
30299451b44SJordan Rupprecht            VARIABLES_DISPLAYED_CORRECTLY,
30399451b44SJordan Rupprecht            substrs=[
30499451b44SJordan Rupprecht                "my_global_char",
30599451b44SJordan Rupprecht                "'X'"])
30699451b44SJordan Rupprecht
30799451b44SJordan Rupprecht    @no_debug_info_test
30899451b44SJordan Rupprecht    def test_target_stop_hook_disable_enable(self):
30999451b44SJordan Rupprecht        self.buildB()
31099451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
31199451b44SJordan Rupprecht
31299451b44SJordan Rupprecht        self.expect("target stop-hook disable 1", error=True, substrs=['unknown stop hook id: "1"'])
31399451b44SJordan Rupprecht        self.expect("target stop-hook disable blub", error=True, substrs=['invalid stop hook id: "blub"'])
31499451b44SJordan Rupprecht        self.expect("target stop-hook enable 1", error=True, substrs=['unknown stop hook id: "1"'])
31599451b44SJordan Rupprecht        self.expect("target stop-hook enable blub", error=True, substrs=['invalid stop hook id: "blub"'])
31699451b44SJordan Rupprecht
31799451b44SJordan Rupprecht    @no_debug_info_test
31899451b44SJordan Rupprecht    def test_target_stop_hook_delete(self):
31999451b44SJordan Rupprecht        self.buildB()
32099451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
32199451b44SJordan Rupprecht
32299451b44SJordan Rupprecht        self.expect("target stop-hook delete 1", error=True, substrs=['unknown stop hook id: "1"'])
32399451b44SJordan Rupprecht        self.expect("target stop-hook delete blub", error=True, substrs=['invalid stop hook id: "blub"'])
32499451b44SJordan Rupprecht
32599451b44SJordan Rupprecht    @no_debug_info_test
32699451b44SJordan Rupprecht    def test_target_list_args(self):
32799451b44SJordan Rupprecht        self.expect("target list blub", error=True,
328*c1b07d61SJim Ingham                    substrs=["'target list' doesn't take any arguments"])
32999451b44SJordan Rupprecht
33099451b44SJordan Rupprecht    @no_debug_info_test
33199451b44SJordan Rupprecht    def test_target_select_no_index(self):
33299451b44SJordan Rupprecht        self.expect("target select", error=True,
33399451b44SJordan Rupprecht                    substrs=["'target select' takes a single argument: a target index"])
33499451b44SJordan Rupprecht
33599451b44SJordan Rupprecht    @no_debug_info_test
33699451b44SJordan Rupprecht    def test_target_select_invalid_index(self):
33799451b44SJordan Rupprecht        self.runCmd("target delete --all")
33899451b44SJordan Rupprecht        self.expect("target select 0", error=True,
33999451b44SJordan Rupprecht                    substrs=["index 0 is out of range since there are no active targets"])
34099451b44SJordan Rupprecht        self.buildB()
34199451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
34299451b44SJordan Rupprecht        self.expect("target select 1", error=True,
34399451b44SJordan Rupprecht                    substrs=["index 1 is out of range, valid target indexes are 0 - 0"])
34499451b44SJordan Rupprecht
34599451b44SJordan Rupprecht
34699451b44SJordan Rupprecht    @no_debug_info_test
34799451b44SJordan Rupprecht    def test_target_create_multiple_args(self):
34899451b44SJordan Rupprecht        self.expect("target create a b", error=True,
34999451b44SJordan Rupprecht                    substrs=["'target create' takes exactly one executable path"])
35099451b44SJordan Rupprecht
35179809f58SAlexandre Ganea    @skipIfWindowsAndNonEnglish
35299451b44SJordan Rupprecht    @no_debug_info_test
35399451b44SJordan Rupprecht    def test_target_create_nonexistent_core_file(self):
35499451b44SJordan Rupprecht        self.expect("target create -c doesntexist", error=True,
3556b8d6f44SMed Ismail Bennani                    patterns=["Cannot open 'doesntexist'", ": (No such file or directory|The system cannot find the file specified)"])
35699451b44SJordan Rupprecht
35799451b44SJordan Rupprecht    # Write only files don't seem to be supported on Windows.
35899451b44SJordan Rupprecht    @skipIfWindows
35999451b44SJordan Rupprecht    @no_debug_info_test
36099451b44SJordan Rupprecht    def test_target_create_unreadable_core_file(self):
36199451b44SJordan Rupprecht        tf = tempfile.NamedTemporaryFile()
36299451b44SJordan Rupprecht        os.chmod(tf.name, stat.S_IWRITE)
36399451b44SJordan Rupprecht        self.expect("target create -c '" + tf.name + "'", error=True,
36401511741SMed Ismail Bennani                    substrs=["Cannot open '", "': Permission denied"])
36599451b44SJordan Rupprecht
36679809f58SAlexandre Ganea    @skipIfWindowsAndNonEnglish
36799451b44SJordan Rupprecht    @no_debug_info_test
36899451b44SJordan Rupprecht    def test_target_create_nonexistent_sym_file(self):
36999451b44SJordan Rupprecht        self.expect("target create -s doesntexist doesntexisteither", error=True,
3706b8d6f44SMed Ismail Bennani                    patterns=["Cannot open '", ": (No such file or directory|The system cannot find the file specified)"])
37199451b44SJordan Rupprecht
37299451b44SJordan Rupprecht    @skipIfWindows
37399451b44SJordan Rupprecht    @no_debug_info_test
37499451b44SJordan Rupprecht    def test_target_create_invalid_core_file(self):
37599451b44SJordan Rupprecht        invalid_core_path = os.path.join(self.getSourceDir(), "invalid_core_file")
37699451b44SJordan Rupprecht        self.expect("target create -c '" + invalid_core_path + "'", error=True,
37799451b44SJordan Rupprecht                    substrs=["Unable to find process plug-in for core file '"])
37899451b44SJordan Rupprecht
37999451b44SJordan Rupprecht
38099451b44SJordan Rupprecht    # Write only files don't seem to be supported on Windows.
38199451b44SJordan Rupprecht    @skipIfWindows
38299451b44SJordan Rupprecht    @no_debug_info_test
38399451b44SJordan Rupprecht    def test_target_create_unreadable_sym_file(self):
38499451b44SJordan Rupprecht        tf = tempfile.NamedTemporaryFile()
38599451b44SJordan Rupprecht        os.chmod(tf.name, stat.S_IWRITE)
38699451b44SJordan Rupprecht        self.expect("target create -s '" + tf.name + "' no_exe", error=True,
38701511741SMed Ismail Bennani                    substrs=["Cannot open '", "': Permission denied"])
38899451b44SJordan Rupprecht
38999451b44SJordan Rupprecht    @no_debug_info_test
39099451b44SJordan Rupprecht    def test_target_delete_all(self):
39199451b44SJordan Rupprecht        self.buildAll()
39299451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
39399451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
39499451b44SJordan Rupprecht        self.expect("target delete --all")
39599451b44SJordan Rupprecht        self.expect("target list", substrs=["No targets."])
39699451b44SJordan Rupprecht
39799451b44SJordan Rupprecht    @no_debug_info_test
39899451b44SJordan Rupprecht    def test_target_delete_by_index(self):
39999451b44SJordan Rupprecht        self.buildAll()
40099451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
40199451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
40299451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)
40399451b44SJordan Rupprecht        self.expect("target delete 3", error=True,
40499451b44SJordan Rupprecht                    substrs=["target index 3 is out of range, valid target indexes are 0 - 2"])
40599451b44SJordan Rupprecht
40699451b44SJordan Rupprecht        self.runCmd("target delete 1")
40799451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["b.out"])
40899451b44SJordan Rupprecht        self.runCmd("target delete 1")
40999451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["c.out"])
41099451b44SJordan Rupprecht
41199451b44SJordan Rupprecht        self.expect("target delete 1", error=True,
41299451b44SJordan Rupprecht                    substrs=["target index 1 is out of range, the only valid index is 0"])
41399451b44SJordan Rupprecht
41499451b44SJordan Rupprecht        self.runCmd("target delete 0")
41599451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["a.out"])
41699451b44SJordan Rupprecht
41799451b44SJordan Rupprecht        self.expect("target delete 0", error=True, substrs=["no targets to delete"])
41899451b44SJordan Rupprecht        self.expect("target delete 1", error=True, substrs=["no targets to delete"])
41999451b44SJordan Rupprecht
42099451b44SJordan Rupprecht    @no_debug_info_test
42199451b44SJordan Rupprecht    def test_target_delete_by_index_multiple(self):
42299451b44SJordan Rupprecht        self.buildAll()
42399451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
42499451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
42599451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)
42699451b44SJordan Rupprecht
42799451b44SJordan Rupprecht        self.expect("target delete 0 1 2 3", error=True,
42899451b44SJordan Rupprecht                    substrs=["target index 3 is out of range, valid target indexes are 0 - 2"])
42999451b44SJordan Rupprecht        self.expect("target list", substrs=["a.out", "b.out", "c.out"])
43099451b44SJordan Rupprecht
43199451b44SJordan Rupprecht        self.runCmd("target delete 0 1 2")
43299451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["a.out", "c.out"])
43399451b44SJordan Rupprecht
43499451b44SJordan Rupprecht    @no_debug_info_test
43599451b44SJordan Rupprecht    def test_target_delete_selected(self):
43699451b44SJordan Rupprecht        self.buildAll()
43799451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
43899451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
43999451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("c.out"), CURRENT_EXECUTABLE_SET)
44099451b44SJordan Rupprecht        self.runCmd("target select 1")
44199451b44SJordan Rupprecht        self.runCmd("target delete")
44299451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["b.out"])
44399451b44SJordan Rupprecht        self.runCmd("target delete")
44499451b44SJordan Rupprecht        self.runCmd("target delete")
44599451b44SJordan Rupprecht        self.expect("target list", substrs=["No targets."])
44699451b44SJordan Rupprecht        self.expect("target delete", error=True, substrs=["no target is currently selected"])
44799451b44SJordan Rupprecht
44899451b44SJordan Rupprecht    @no_debug_info_test
44999451b44SJordan Rupprecht    def test_target_modules_search_paths_clear(self):
45099451b44SJordan Rupprecht        self.buildB()
45199451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
45299451b44SJordan Rupprecht        self.runCmd("target modules search-paths add foo bar")
45399451b44SJordan Rupprecht        self.runCmd("target modules search-paths add foz baz")
45499451b44SJordan Rupprecht        self.runCmd("target modules search-paths clear")
45599451b44SJordan Rupprecht        self.expect("target list", matching=False, substrs=["bar", "baz"])
45699451b44SJordan Rupprecht
45799451b44SJordan Rupprecht    @no_debug_info_test
45899451b44SJordan Rupprecht    def test_target_modules_search_paths_query(self):
45999451b44SJordan Rupprecht        self.buildB()
46099451b44SJordan Rupprecht        self.runCmd("file " + self.getBuildArtifact("b.out"), CURRENT_EXECUTABLE_SET)
46199451b44SJordan Rupprecht        self.runCmd("target modules search-paths add foo bar")
46299451b44SJordan Rupprecht        self.expect("target modules search-paths query foo", substrs=["bar"])
46399451b44SJordan Rupprecht        # Query something that doesn't exist.
46499451b44SJordan Rupprecht        self.expect("target modules search-paths query faz", substrs=["faz"])
46599451b44SJordan Rupprecht
46699451b44SJordan Rupprecht        # Invalid arguments.
46799451b44SJordan Rupprecht        self.expect("target modules search-paths query faz baz", error=True,
46899451b44SJordan Rupprecht                    substrs=["query requires one argument"])
469a6469cdbSJonas Devlieghere
470a6469cdbSJonas Devlieghere    @no_debug_info_test
47113dfe0f0SMichał Górny    @expectedFailureAll(oslist=["freebsd"],
47213dfe0f0SMichał Górny                        bugnumber="github.com/llvm/llvm-project/issues/56079")
473a6469cdbSJonas Devlieghere    def test_target_modules_type(self):
474a6469cdbSJonas Devlieghere        self.buildB()
475a6469cdbSJonas Devlieghere        self.runCmd("file " + self.getBuildArtifact("b.out"),
476a6469cdbSJonas Devlieghere                    CURRENT_EXECUTABLE_SET)
477a6469cdbSJonas Devlieghere        self.expect("target modules lookup --type int",
478a6469cdbSJonas Devlieghere                    substrs=["1 match found", 'name = "int"'])
479