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