199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb settings command. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 5d5f54751SJeffrey Tanimport json 699451b44SJordan Rupprechtimport os 799451b44SJordan Rupprechtimport re 8bc0b5699Swalter erquinigo 999451b44SJordan Rupprechtimport lldb 10bc0b5699Swalter erquinigofrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1299451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht 1599451b44SJordan Rupprechtclass SettingsCommandTestCase(TestBase): 1699451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht def test_apropos_should_also_search_settings_description(self): 1999451b44SJordan Rupprecht """Test that 'apropos' command should also search descriptions for the settings variables.""" 2099451b44SJordan Rupprecht 212238dcc3SJonas Devlieghere self.expect( 222238dcc3SJonas Devlieghere "apropos 'environment variable'", 232238dcc3SJonas Devlieghere substrs=[ 242238dcc3SJonas Devlieghere "target.env-vars", 2599451b44SJordan Rupprecht "environment variables", 262238dcc3SJonas Devlieghere "executable's environment", 272238dcc3SJonas Devlieghere ], 282238dcc3SJonas Devlieghere ) 2999451b44SJordan Rupprecht 3036eab463SMed Ismail Bennani def test_set_interpreter_repeat_prev_command(self): 3136eab463SMed Ismail Bennani """Test the `interpreter.repeat-previous-command` setting.""" 3236eab463SMed Ismail Bennani self.build() 3336eab463SMed Ismail Bennani 3436eab463SMed Ismail Bennani exe = self.getBuildArtifact("a.out") 3536eab463SMed Ismail Bennani self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 3636eab463SMed Ismail Bennani setting = "interpreter.repeat-previous-command" 3736eab463SMed Ismail Bennani 3836eab463SMed Ismail Bennani def cleanup(setting): 392238dcc3SJonas Devlieghere self.runCmd("settings clear %s" % setting, check=False) 4036eab463SMed Ismail Bennani 4136eab463SMed Ismail Bennani # Execute the cleanup function during test case tear down. 4236eab463SMed Ismail Bennani self.addTearDownHook(cleanup(setting)) 4336eab463SMed Ismail Bennani 4436eab463SMed Ismail Bennani # First, check for the setting default value. 452238dcc3SJonas Devlieghere self.expect( 462238dcc3SJonas Devlieghere "setting show %s" % setting, 472238dcc3SJonas Devlieghere substrs=["interpreter.repeat-previous-command (boolean) = true"], 482238dcc3SJonas Devlieghere ) 4936eab463SMed Ismail Bennani 5036eab463SMed Ismail Bennani # Then, invert the setting, and check that was set correctly 5136eab463SMed Ismail Bennani self.runCmd("setting set %s false" % setting) 522238dcc3SJonas Devlieghere self.expect( 532238dcc3SJonas Devlieghere "setting show %s" % setting, 542238dcc3SJonas Devlieghere substrs=["interpreter.repeat-previous-command (boolean) = false"], 552238dcc3SJonas Devlieghere ) 5636eab463SMed Ismail Bennani 5736eab463SMed Ismail Bennani ci = self.dbg.GetCommandInterpreter() 5836eab463SMed Ismail Bennani self.assertTrue(ci.IsValid(), "Invalid command interpreter.") 5936eab463SMed Ismail Bennani # Now, test the functionnality 6036eab463SMed Ismail Bennani res = lldb.SBCommandReturnObject() 612238dcc3SJonas Devlieghere ci.HandleCommand("breakpoint set -n main", res) 6236eab463SMed Ismail Bennani self.assertTrue(res.Succeeded(), "Command failed.") 632238dcc3SJonas Devlieghere ci.HandleCommand("", res) 6436eab463SMed Ismail Bennani self.assertTrue(res.Succeeded(), "Empty command failed.") 6536eab463SMed Ismail Bennani self.assertEqual(self.dbg.GetSelectedTarget().GetNumBreakpoints(), 1) 6636eab463SMed Ismail Bennani 6799451b44SJordan Rupprecht def test_append_target_env_vars(self): 68e53e1de5SAlex Langford """Test that 'append target.env-vars' works.""" 6999451b44SJordan Rupprecht # Append the env-vars. 702238dcc3SJonas Devlieghere self.runCmd("settings append target.env-vars MY_ENV_VAR=YES") 7199451b44SJordan Rupprecht # And add hooks to restore the settings during tearDown(). 722238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.env-vars")) 7399451b44SJordan Rupprecht 7499451b44SJordan Rupprecht # Check it immediately! 752238dcc3SJonas Devlieghere self.expect("settings show target.env-vars", substrs=["MY_ENV_VAR=YES"]) 7699451b44SJordan Rupprecht 7799451b44SJordan Rupprecht def test_insert_before_and_after_target_run_args(self): 7899451b44SJordan Rupprecht """Test that 'insert-before/after target.run-args' works.""" 7999451b44SJordan Rupprecht # Set the run-args first. 802238dcc3SJonas Devlieghere self.runCmd("settings set target.run-args a b c") 8199451b44SJordan Rupprecht # And add hooks to restore the settings during tearDown(). 822238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.run-args")) 8399451b44SJordan Rupprecht 8499451b44SJordan Rupprecht # Now insert-before the index-0 element with '__a__'. 852238dcc3SJonas Devlieghere self.runCmd("settings insert-before target.run-args 0 __a__") 8699451b44SJordan Rupprecht # And insert-after the index-1 element with '__A__'. 872238dcc3SJonas Devlieghere self.runCmd("settings insert-after target.run-args 1 __A__") 8899451b44SJordan Rupprecht # Check it immediately! 892238dcc3SJonas Devlieghere self.expect( 902238dcc3SJonas Devlieghere "settings show target.run-args", 912238dcc3SJonas Devlieghere substrs=[ 922238dcc3SJonas Devlieghere "target.run-args", 9399451b44SJordan Rupprecht '[0]: "__a__"', 9499451b44SJordan Rupprecht '[1]: "a"', 9599451b44SJordan Rupprecht '[2]: "__A__"', 9699451b44SJordan Rupprecht '[3]: "b"', 972238dcc3SJonas Devlieghere '[4]: "c"', 982238dcc3SJonas Devlieghere ], 992238dcc3SJonas Devlieghere ) 10099451b44SJordan Rupprecht 10199451b44SJordan Rupprecht def test_replace_target_run_args(self): 10299451b44SJordan Rupprecht """Test that 'replace target.run-args' works.""" 10399451b44SJordan Rupprecht # Set the run-args and then replace the index-0 element. 1042238dcc3SJonas Devlieghere self.runCmd("settings set target.run-args a b c") 10599451b44SJordan Rupprecht # And add hooks to restore the settings during tearDown(). 1062238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.run-args")) 10799451b44SJordan Rupprecht 10899451b44SJordan Rupprecht # Now replace the index-0 element with 'A', instead. 1092238dcc3SJonas Devlieghere self.runCmd("settings replace target.run-args 0 A") 11099451b44SJordan Rupprecht # Check it immediately! 1112238dcc3SJonas Devlieghere self.expect( 1122238dcc3SJonas Devlieghere "settings show target.run-args", 1132238dcc3SJonas Devlieghere substrs=[ 1142238dcc3SJonas Devlieghere "target.run-args (arguments) =", 11599451b44SJordan Rupprecht '[0]: "A"', 11699451b44SJordan Rupprecht '[1]: "b"', 1172238dcc3SJonas Devlieghere '[2]: "c"', 1182238dcc3SJonas Devlieghere ], 1192238dcc3SJonas Devlieghere ) 12099451b44SJordan Rupprecht 12199451b44SJordan Rupprecht def test_set_prompt(self): 12299451b44SJordan Rupprecht """Test that 'set prompt' actually changes the prompt.""" 12399451b44SJordan Rupprecht 12499451b44SJordan Rupprecht # Set prompt to 'lldb2'. 12599451b44SJordan Rupprecht self.runCmd("settings set prompt 'lldb2 '") 12699451b44SJordan Rupprecht 12799451b44SJordan Rupprecht # Immediately test the setting. 1282238dcc3SJonas Devlieghere self.expect( 1292238dcc3SJonas Devlieghere "settings show prompt", 1302238dcc3SJonas Devlieghere SETTING_MSG("prompt"), 1312238dcc3SJonas Devlieghere startstr='prompt (string) = "lldb2 "', 1322238dcc3SJonas Devlieghere ) 13399451b44SJordan Rupprecht 13499451b44SJordan Rupprecht # The overall display should also reflect the new setting. 1352238dcc3SJonas Devlieghere self.expect( 1362238dcc3SJonas Devlieghere "settings show", 1372238dcc3SJonas Devlieghere SETTING_MSG("prompt"), 1382238dcc3SJonas Devlieghere substrs=['prompt (string) = "lldb2 "'], 1392238dcc3SJonas Devlieghere ) 14099451b44SJordan Rupprecht 14199451b44SJordan Rupprecht # Use '-r' option to reset to the original default prompt. 14299451b44SJordan Rupprecht self.runCmd("settings clear prompt") 14399451b44SJordan Rupprecht 14499451b44SJordan Rupprecht def test_set_term_width(self): 14599451b44SJordan Rupprecht """Test that 'set term-width' actually changes the term-width.""" 14699451b44SJordan Rupprecht 14799451b44SJordan Rupprecht self.runCmd("settings set term-width 70") 14899451b44SJordan Rupprecht 14999451b44SJordan Rupprecht # Immediately test the setting. 1502238dcc3SJonas Devlieghere self.expect( 1512238dcc3SJonas Devlieghere "settings show term-width", 1522238dcc3SJonas Devlieghere SETTING_MSG("term-width"), 153afd46902SJonas Devlieghere startstr="term-width (unsigned) = 70", 1542238dcc3SJonas Devlieghere ) 15599451b44SJordan Rupprecht 15699451b44SJordan Rupprecht # The overall display should also reflect the new setting. 1572238dcc3SJonas Devlieghere self.expect( 1582238dcc3SJonas Devlieghere "settings show", 1592238dcc3SJonas Devlieghere SETTING_MSG("term-width"), 160afd46902SJonas Devlieghere substrs=["term-width (unsigned) = 70"], 161afd46902SJonas Devlieghere ) 162afd46902SJonas Devlieghere 163afd46902SJonas Devlieghere self.dbg.SetTerminalWidth(60) 164afd46902SJonas Devlieghere 165afd46902SJonas Devlieghere self.expect( 166afd46902SJonas Devlieghere "settings show", 167afd46902SJonas Devlieghere SETTING_MSG("term-width"), 168afd46902SJonas Devlieghere substrs=["term-width (unsigned) = 60"], 1692238dcc3SJonas Devlieghere ) 17099451b44SJordan Rupprecht 17199451b44SJordan Rupprecht # rdar://problem/10712130 17299451b44SJordan Rupprecht @skipIf(oslist=["windows"], bugnumber="llvm.org/pr44431") 17399451b44SJordan Rupprecht def test_set_frame_format(self): 17499451b44SJordan Rupprecht """Test that 'set frame-format' with a backtick char in the format string works as well as fullpath.""" 17599451b44SJordan Rupprecht self.build() 17699451b44SJordan Rupprecht 17799451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 17899451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 17999451b44SJordan Rupprecht 18099451b44SJordan Rupprecht def cleanup(): 18199451b44SJordan Rupprecht self.runCmd( 1822238dcc3SJonas Devlieghere "settings set frame-format %s" % self.format_string, check=False 1832238dcc3SJonas Devlieghere ) 18499451b44SJordan Rupprecht 18599451b44SJordan Rupprecht # Execute the cleanup function during test case tear down. 18699451b44SJordan Rupprecht self.addTearDownHook(cleanup) 18799451b44SJordan Rupprecht 18899451b44SJordan Rupprecht self.runCmd("settings show frame-format") 1892238dcc3SJonas Devlieghere m = re.match('^frame-format \(format-string\) = "(.*)"$', self.res.GetOutput()) 19099451b44SJordan Rupprecht self.assertTrue(m, "Bad settings string") 19199451b44SJordan Rupprecht self.format_string = m.group(1) 19299451b44SJordan Rupprecht 19399451b44SJordan Rupprecht # Change the default format to print function.name rather than 19499451b44SJordan Rupprecht # function.name-with-args 19599451b44SJordan Rupprecht format_string = "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}\`${function.name}{${function.pc-offset}}}{ at ${line.file.fullpath}:${line.number}}{, lang=${language}}\n" 19699451b44SJordan Rupprecht self.runCmd("settings set frame-format %s" % format_string) 19799451b44SJordan Rupprecht 19899451b44SJordan Rupprecht # Immediately test the setting. 1992238dcc3SJonas Devlieghere self.expect( 2002238dcc3SJonas Devlieghere "settings show frame-format", 2012238dcc3SJonas Devlieghere SETTING_MSG("frame-format"), 2022238dcc3SJonas Devlieghere substrs=[format_string], 2032238dcc3SJonas Devlieghere ) 20499451b44SJordan Rupprecht 20599451b44SJordan Rupprecht self.runCmd("breakpoint set -n main") 2062238dcc3SJonas Devlieghere self.runCmd( 2072238dcc3SJonas Devlieghere "process launch --working-dir '{0}'".format( 2082238dcc3SJonas Devlieghere self.get_process_working_directory() 2092238dcc3SJonas Devlieghere ), 2102238dcc3SJonas Devlieghere RUN_SUCCEEDED, 2112238dcc3SJonas Devlieghere ) 2122238dcc3SJonas Devlieghere self.expect("thread backtrace", substrs=["`main", self.getSourceDir()]) 21399451b44SJordan Rupprecht 21499451b44SJordan Rupprecht def test_set_auto_confirm(self): 21599451b44SJordan Rupprecht """Test that after 'set auto-confirm true', manual confirmation should not kick in.""" 21699451b44SJordan Rupprecht self.build() 21799451b44SJordan Rupprecht 21899451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 21999451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 22099451b44SJordan Rupprecht 22199451b44SJordan Rupprecht self.runCmd("settings set auto-confirm true") 22299451b44SJordan Rupprecht 22399451b44SJordan Rupprecht # Immediately test the setting. 2242238dcc3SJonas Devlieghere self.expect( 2252238dcc3SJonas Devlieghere "settings show auto-confirm", 2262238dcc3SJonas Devlieghere SETTING_MSG("auto-confirm"), 2272238dcc3SJonas Devlieghere startstr="auto-confirm (boolean) = true", 2282238dcc3SJonas Devlieghere ) 22999451b44SJordan Rupprecht 23099451b44SJordan Rupprecht # Now 'breakpoint delete' should just work fine without confirmation 23199451b44SJordan Rupprecht # prompt from the command interpreter. 23299451b44SJordan Rupprecht self.runCmd("breakpoint set -n main") 2332238dcc3SJonas Devlieghere self.expect("breakpoint delete", startstr="All breakpoints removed") 23499451b44SJordan Rupprecht 23599451b44SJordan Rupprecht # Restore the original setting of auto-confirm. 23699451b44SJordan Rupprecht self.runCmd("settings clear auto-confirm") 2372238dcc3SJonas Devlieghere self.expect( 2382238dcc3SJonas Devlieghere "settings show auto-confirm", 2392238dcc3SJonas Devlieghere SETTING_MSG("auto-confirm"), 2402238dcc3SJonas Devlieghere startstr="auto-confirm (boolean) = false", 2412238dcc3SJonas Devlieghere ) 24299451b44SJordan Rupprecht 2432238dcc3SJonas Devlieghere @skipIf(archs=no_match(["x86_64", "i386", "i686"])) 24499451b44SJordan Rupprecht def test_disassembler_settings(self): 24599451b44SJordan Rupprecht """Test that user options for the disassembler take effect.""" 24699451b44SJordan Rupprecht self.build() 24799451b44SJordan Rupprecht 24899451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 24999451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 25099451b44SJordan Rupprecht 25199451b44SJordan Rupprecht # AT&T syntax 25299451b44SJordan Rupprecht self.runCmd("settings set target.x86-disassembly-flavor att") 25399451b44SJordan Rupprecht self.runCmd("settings set target.use-hex-immediates false") 2542238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["$90"]) 25599451b44SJordan Rupprecht self.runCmd("settings set target.use-hex-immediates true") 25699451b44SJordan Rupprecht self.runCmd("settings set target.hex-immediate-style c") 2572238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["$0x5a"]) 25899451b44SJordan Rupprecht self.runCmd("settings set target.hex-immediate-style asm") 2592238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["$5ah"]) 26099451b44SJordan Rupprecht 26199451b44SJordan Rupprecht # Intel syntax 26299451b44SJordan Rupprecht self.runCmd("settings set target.x86-disassembly-flavor intel") 26399451b44SJordan Rupprecht self.runCmd("settings set target.use-hex-immediates false") 2642238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["90"]) 26599451b44SJordan Rupprecht self.runCmd("settings set target.use-hex-immediates true") 26699451b44SJordan Rupprecht self.runCmd("settings set target.hex-immediate-style c") 2672238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["0x5a"]) 26899451b44SJordan Rupprecht self.runCmd("settings set target.hex-immediate-style asm") 2692238dcc3SJonas Devlieghere self.expect("disassemble -n numberfn", substrs=["5ah"]) 27099451b44SJordan Rupprecht 27199451b44SJordan Rupprecht @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files 27299451b44SJordan Rupprecht def test_run_args_and_env_vars(self): 273cd7b4505SFred Riss self.do_test_run_args_and_env_vars(use_launchsimple=False) 274cd7b4505SFred Riss 275cd7b4505SFred Riss @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files 276cd7b4505SFred Riss def test_launchsimple_args_and_env_vars(self): 277cd7b4505SFred Riss self.do_test_run_args_and_env_vars(use_launchsimple=True) 278cd7b4505SFred Riss 279cd7b4505SFred Riss def do_test_run_args_and_env_vars(self, use_launchsimple): 28099451b44SJordan Rupprecht """Test that run-args and env-vars are passed to the launched process.""" 28199451b44SJordan Rupprecht self.build() 28299451b44SJordan Rupprecht 28399451b44SJordan Rupprecht # Set the run-args and the env-vars. 28499451b44SJordan Rupprecht # And add hooks to restore the settings during tearDown(). 2852238dcc3SJonas Devlieghere self.runCmd("settings set target.run-args A B C") 2862238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.run-args")) 28799451b44SJordan Rupprecht self.runCmd('settings set target.env-vars ["MY_ENV_VAR"]=YES') 2882238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.env-vars")) 28999451b44SJordan Rupprecht 290cd7b4505SFred Riss exe = self.getBuildArtifact("a.out") 291cd7b4505SFred Riss self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 292cd7b4505SFred Riss 293cd7b4505SFred Riss target = self.dbg.GetTargetAtIndex(0) 294cd7b4505SFred Riss launch_info = target.GetLaunchInfo() 2959228a9efSFred Riss found_env_var = False 2969228a9efSFred Riss for i in range(0, launch_info.GetNumEnvironmentEntries()): 2979228a9efSFred Riss if launch_info.GetEnvironmentEntryAtIndex(i) == "MY_ENV_VAR=YES": 2989228a9efSFred Riss found_env_var = True 2999228a9efSFred Riss break 3002238dcc3SJonas Devlieghere self.assertTrue(found_env_var, "MY_ENV_VAR was not set in LaunchInfo object") 3019228a9efSFred Riss 302f0f183eeSTatyana Krasnukha self.assertEqual(launch_info.GetNumArguments(), 3) 303f0f183eeSTatyana Krasnukha self.assertEqual(launch_info.GetArgumentAtIndex(0), "A") 304f0f183eeSTatyana Krasnukha self.assertEqual(launch_info.GetArgumentAtIndex(1), "B") 305f0f183eeSTatyana Krasnukha self.assertEqual(launch_info.GetArgumentAtIndex(2), "C") 306f0f183eeSTatyana Krasnukha 3072238dcc3SJonas Devlieghere self.expect("target show-launch-environment", substrs=["MY_ENV_VAR=YES"]) 308b4a6e63eSFred Riss 309cd7b4505SFred Riss wd = self.get_process_working_directory() 310cd7b4505SFred Riss if use_launchsimple: 311cd7b4505SFred Riss process = target.LaunchSimple(None, None, wd) 312cd7b4505SFred Riss self.assertTrue(process) 313cd7b4505SFred Riss else: 3142238dcc3SJonas Devlieghere self.runCmd("process launch --working-dir '{0}'".format(wd), RUN_SUCCEEDED) 31599451b44SJordan Rupprecht 31699451b44SJordan Rupprecht # Read the output file produced by running the program. 31799451b44SJordan Rupprecht output = lldbutil.read_file_from_process_wd(self, "output2.txt") 31899451b44SJordan Rupprecht 31999451b44SJordan Rupprecht self.expect( 32099451b44SJordan Rupprecht output, 32199451b44SJordan Rupprecht exe=False, 32299451b44SJordan Rupprecht substrs=[ 32399451b44SJordan Rupprecht "argv[1] matches", 32499451b44SJordan Rupprecht "argv[2] matches", 32599451b44SJordan Rupprecht "argv[3] matches", 3262238dcc3SJonas Devlieghere "Environment variable 'MY_ENV_VAR' successfully passed.", 3272238dcc3SJonas Devlieghere ], 3282238dcc3SJonas Devlieghere ) 32999451b44SJordan Rupprecht 330b4a6e63eSFred Riss # Check that env-vars overrides unset-env-vars. 3312238dcc3SJonas Devlieghere self.runCmd("settings set target.unset-env-vars MY_ENV_VAR") 332b4a6e63eSFred Riss 333b4a6e63eSFred Riss self.expect( 3342238dcc3SJonas Devlieghere "target show-launch-environment", 3352238dcc3SJonas Devlieghere "env-vars overrides unset-env-vars", 3362238dcc3SJonas Devlieghere substrs=["MY_ENV_VAR=YES"], 3372238dcc3SJonas Devlieghere ) 338b4a6e63eSFred Riss 339b4a6e63eSFred Riss wd = self.get_process_working_directory() 340b4a6e63eSFred Riss if use_launchsimple: 341b4a6e63eSFred Riss process = target.LaunchSimple(None, None, wd) 342b4a6e63eSFred Riss self.assertTrue(process) 343b4a6e63eSFred Riss else: 3442238dcc3SJonas Devlieghere self.runCmd("process launch --working-dir '{0}'".format(wd), RUN_SUCCEEDED) 345b4a6e63eSFred Riss 346b4a6e63eSFred Riss # Read the output file produced by running the program. 347b4a6e63eSFred Riss output = lldbutil.read_file_from_process_wd(self, "output2.txt") 348b4a6e63eSFred Riss 349b4a6e63eSFred Riss self.expect( 350b4a6e63eSFred Riss output, 351b4a6e63eSFred Riss exe=False, 3522238dcc3SJonas Devlieghere substrs=["Environment variable 'MY_ENV_VAR' successfully passed."], 3532238dcc3SJonas Devlieghere ) 354b4a6e63eSFred Riss 35599451b44SJordan Rupprecht @skipIfRemote # it doesn't make sense to send host env to remote target 35699451b44SJordan Rupprecht def test_pass_host_env_vars(self): 35799451b44SJordan Rupprecht """Test that the host env vars are passed to the launched process.""" 35899451b44SJordan Rupprecht self.build() 35999451b44SJordan Rupprecht 36099451b44SJordan Rupprecht # Set some host environment variables now. 36199451b44SJordan Rupprecht os.environ["MY_HOST_ENV_VAR1"] = "VAR1" 36299451b44SJordan Rupprecht os.environ["MY_HOST_ENV_VAR2"] = "VAR2" 36399451b44SJordan Rupprecht 36499451b44SJordan Rupprecht # This is the function to unset the two env variables set above. 36599451b44SJordan Rupprecht def unset_env_variables(): 36699451b44SJordan Rupprecht os.environ.pop("MY_HOST_ENV_VAR1") 36799451b44SJordan Rupprecht os.environ.pop("MY_HOST_ENV_VAR2") 3682238dcc3SJonas Devlieghere 369b4a6e63eSFred Riss self.addTearDownHook(unset_env_variables) 37099451b44SJordan Rupprecht 3719228a9efSFred Riss exe = self.getBuildArtifact("a.out") 3729228a9efSFred Riss self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 3739228a9efSFred Riss 3749228a9efSFred Riss # By default, inherit-env is 'true'. 3759228a9efSFred Riss self.expect( 3762238dcc3SJonas Devlieghere "settings show target.inherit-env", 3779228a9efSFred Riss "Default inherit-env is 'true'", 3782238dcc3SJonas Devlieghere startstr="target.inherit-env (boolean) = true", 3792238dcc3SJonas Devlieghere ) 3809228a9efSFred Riss 381b4a6e63eSFred Riss self.expect( 3822238dcc3SJonas Devlieghere "target show-launch-environment", 3832238dcc3SJonas Devlieghere "Host environment is passed correctly", 3842238dcc3SJonas Devlieghere substrs=["MY_HOST_ENV_VAR1=VAR1", "MY_HOST_ENV_VAR2=VAR2"], 3852238dcc3SJonas Devlieghere ) 3862238dcc3SJonas Devlieghere self.runCmd( 3872238dcc3SJonas Devlieghere "process launch --working-dir '{0}'".format( 3882238dcc3SJonas Devlieghere self.get_process_working_directory() 3892238dcc3SJonas Devlieghere ), 3902238dcc3SJonas Devlieghere RUN_SUCCEEDED, 3912238dcc3SJonas Devlieghere ) 39299451b44SJordan Rupprecht 39399451b44SJordan Rupprecht # Read the output file produced by running the program. 39499451b44SJordan Rupprecht output = lldbutil.read_file_from_process_wd(self, "output1.txt") 39599451b44SJordan Rupprecht 39699451b44SJordan Rupprecht self.expect( 39799451b44SJordan Rupprecht output, 39899451b44SJordan Rupprecht exe=False, 39999451b44SJordan Rupprecht substrs=[ 40099451b44SJordan Rupprecht "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed.", 4012238dcc3SJonas Devlieghere "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed.", 4022238dcc3SJonas Devlieghere ], 4032238dcc3SJonas Devlieghere ) 40499451b44SJordan Rupprecht 405b4a6e63eSFred Riss # Now test that we can prevent the inferior from inheriting the 406b4a6e63eSFred Riss # environment. 4072238dcc3SJonas Devlieghere self.runCmd("settings set target.inherit-env false") 408b4a6e63eSFred Riss 409b4a6e63eSFred Riss self.expect( 4102238dcc3SJonas Devlieghere "target show-launch-environment", 4112238dcc3SJonas Devlieghere "target.inherit-env affects `target show-launch-environment`", 412b4a6e63eSFred Riss matching=False, 4132238dcc3SJonas Devlieghere substrs=["MY_HOST_ENV_VAR1=VAR1", "MY_HOST_ENV_VAR2=VAR2"], 4142238dcc3SJonas Devlieghere ) 415b4a6e63eSFred Riss 4162238dcc3SJonas Devlieghere self.runCmd( 4172238dcc3SJonas Devlieghere "process launch --working-dir '{0}'".format( 4182238dcc3SJonas Devlieghere self.get_process_working_directory() 4192238dcc3SJonas Devlieghere ), 4202238dcc3SJonas Devlieghere RUN_SUCCEEDED, 4212238dcc3SJonas Devlieghere ) 422b4a6e63eSFred Riss 423b4a6e63eSFred Riss # Read the output file produced by running the program. 424b4a6e63eSFred Riss output = lldbutil.read_file_from_process_wd(self, "output1.txt") 425b4a6e63eSFred Riss 426b4a6e63eSFred Riss self.expect( 427b4a6e63eSFred Riss output, 428b4a6e63eSFred Riss exe=False, 429b4a6e63eSFred Riss matching=False, 430b4a6e63eSFred Riss substrs=[ 431b4a6e63eSFred Riss "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed.", 4322238dcc3SJonas Devlieghere "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed.", 4332238dcc3SJonas Devlieghere ], 4342238dcc3SJonas Devlieghere ) 435b4a6e63eSFred Riss 436b4a6e63eSFred Riss # Now test that we can unset variables from the inherited environment. 4372238dcc3SJonas Devlieghere self.runCmd("settings set target.inherit-env true") 4382238dcc3SJonas Devlieghere self.runCmd("settings set target.unset-env-vars MY_HOST_ENV_VAR1") 4392238dcc3SJonas Devlieghere self.runCmd( 4402238dcc3SJonas Devlieghere "process launch --working-dir '{0}'".format( 4412238dcc3SJonas Devlieghere self.get_process_working_directory() 4422238dcc3SJonas Devlieghere ), 4432238dcc3SJonas Devlieghere RUN_SUCCEEDED, 4442238dcc3SJonas Devlieghere ) 445b4a6e63eSFred Riss 446b4a6e63eSFred Riss # Read the output file produced by running the program. 447b4a6e63eSFred Riss output = lldbutil.read_file_from_process_wd(self, "output1.txt") 448b4a6e63eSFred Riss 449b4a6e63eSFred Riss self.expect( 4502238dcc3SJonas Devlieghere "target show-launch-environment", 4512238dcc3SJonas Devlieghere "MY_HOST_ENV_VAR1 is unset, it shouldn't be in `target show-launch-environment`", 452b4a6e63eSFred Riss matching=False, 4532238dcc3SJonas Devlieghere substrs=["MY_HOST_ENV_VAR1=VAR1"], 4542238dcc3SJonas Devlieghere ) 455b4a6e63eSFred Riss self.expect( 4562238dcc3SJonas Devlieghere "target show-launch-environment", 4572238dcc3SJonas Devlieghere "MY_HOST_ENV_VAR2 shouldn be in `target show-launch-environment`", 4582238dcc3SJonas Devlieghere substrs=["MY_HOST_ENV_VAR2=VAR2"], 4592238dcc3SJonas Devlieghere ) 460b4a6e63eSFred Riss 461b4a6e63eSFred Riss self.expect( 462b4a6e63eSFred Riss output, 463b4a6e63eSFred Riss exe=False, 464b4a6e63eSFred Riss matching=False, 465b4a6e63eSFred Riss substrs=[ 4662238dcc3SJonas Devlieghere "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed." 4672238dcc3SJonas Devlieghere ], 4682238dcc3SJonas Devlieghere ) 469b4a6e63eSFred Riss self.expect( 470b4a6e63eSFred Riss output, 471b4a6e63eSFred Riss exe=False, 472b4a6e63eSFred Riss substrs=[ 4732238dcc3SJonas Devlieghere "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed." 4742238dcc3SJonas Devlieghere ], 4752238dcc3SJonas Devlieghere ) 476b4a6e63eSFred Riss 47799451b44SJordan Rupprecht @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files 47899451b44SJordan Rupprecht def test_set_error_output_path(self): 47999451b44SJordan Rupprecht """Test that setting target.error/output-path for the launched process works.""" 48099451b44SJordan Rupprecht self.build() 48199451b44SJordan Rupprecht 48299451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 48399451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 48499451b44SJordan Rupprecht 48599451b44SJordan Rupprecht # Set the error-path and output-path and verify both are set. 4862238dcc3SJonas Devlieghere self.runCmd( 4872238dcc3SJonas Devlieghere "settings set target.error-path '{0}'".format( 4882238dcc3SJonas Devlieghere lldbutil.append_to_process_working_directory(self, "stderr.txt") 4892238dcc3SJonas Devlieghere ) 4902238dcc3SJonas Devlieghere ) 4912238dcc3SJonas Devlieghere self.runCmd( 4922238dcc3SJonas Devlieghere "settings set target.output-path '{0}".format( 4932238dcc3SJonas Devlieghere lldbutil.append_to_process_working_directory(self, "stdout.txt") 4942238dcc3SJonas Devlieghere ) 4952238dcc3SJonas Devlieghere ) 49699451b44SJordan Rupprecht # And add hooks to restore the original settings during tearDown(). 4972238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.output-path")) 4982238dcc3SJonas Devlieghere self.addTearDownHook(lambda: self.runCmd("settings clear target.error-path")) 49999451b44SJordan Rupprecht 5002238dcc3SJonas Devlieghere self.expect( 5012238dcc3SJonas Devlieghere "settings show target.error-path", 50299451b44SJordan Rupprecht SETTING_MSG("target.error-path"), 5032238dcc3SJonas Devlieghere substrs=["target.error-path (file)", 'stderr.txt"'], 5042238dcc3SJonas Devlieghere ) 50599451b44SJordan Rupprecht 5062238dcc3SJonas Devlieghere self.expect( 5072238dcc3SJonas Devlieghere "settings show target.output-path", 50899451b44SJordan Rupprecht SETTING_MSG("target.output-path"), 5092238dcc3SJonas Devlieghere substrs=["target.output-path (file)", 'stdout.txt"'], 5102238dcc3SJonas Devlieghere ) 51199451b44SJordan Rupprecht 5122238dcc3SJonas Devlieghere self.runCmd( 5132238dcc3SJonas Devlieghere "process launch --working-dir '{0}'".format( 5142238dcc3SJonas Devlieghere self.get_process_working_directory() 5152238dcc3SJonas Devlieghere ), 5162238dcc3SJonas Devlieghere RUN_SUCCEEDED, 5172238dcc3SJonas Devlieghere ) 51899451b44SJordan Rupprecht 51999451b44SJordan Rupprecht output = lldbutil.read_file_from_process_wd(self, "stderr.txt") 52099451b44SJordan Rupprecht message = "This message should go to standard error." 52199451b44SJordan Rupprecht if lldbplatformutil.hasChattyStderr(self): 52299451b44SJordan Rupprecht self.expect(output, exe=False, substrs=[message]) 52399451b44SJordan Rupprecht else: 52499451b44SJordan Rupprecht self.expect(output, exe=False, startstr=message) 52599451b44SJordan Rupprecht 52699451b44SJordan Rupprecht output = lldbutil.read_file_from_process_wd(self, "stdout.txt") 5272238dcc3SJonas Devlieghere self.expect( 5282238dcc3SJonas Devlieghere output, exe=False, startstr="This message should go to standard out." 5292238dcc3SJonas Devlieghere ) 53099451b44SJordan Rupprecht 531*efc6d33bSWanyi @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files 532*efc6d33bSWanyi def test_same_error_output_path(self): 533*efc6d33bSWanyi """Test that setting target.error and output-path to the same file path for the launched process works.""" 534*efc6d33bSWanyi self.build() 535*efc6d33bSWanyi 536*efc6d33bSWanyi exe = self.getBuildArtifact("a.out") 537*efc6d33bSWanyi self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 538*efc6d33bSWanyi 539*efc6d33bSWanyi # Set the error-path and output-path and verify both are set. 540*efc6d33bSWanyi self.runCmd( 541*efc6d33bSWanyi "settings set target.error-path '{0}'".format( 542*efc6d33bSWanyi lldbutil.append_to_process_working_directory(self, "output.txt") 543*efc6d33bSWanyi ) 544*efc6d33bSWanyi ) 545*efc6d33bSWanyi self.runCmd( 546*efc6d33bSWanyi "settings set target.output-path '{0}".format( 547*efc6d33bSWanyi lldbutil.append_to_process_working_directory(self, "output.txt") 548*efc6d33bSWanyi ) 549*efc6d33bSWanyi ) 550*efc6d33bSWanyi # And add hooks to restore the original settings during tearDown(). 551*efc6d33bSWanyi self.addTearDownHook(lambda: self.runCmd("settings clear target.output-path")) 552*efc6d33bSWanyi self.addTearDownHook(lambda: self.runCmd("settings clear target.error-path")) 553*efc6d33bSWanyi 554*efc6d33bSWanyi self.expect( 555*efc6d33bSWanyi "settings show target.error-path", 556*efc6d33bSWanyi SETTING_MSG("target.error-path"), 557*efc6d33bSWanyi substrs=["target.error-path (file)", 'output.txt"'], 558*efc6d33bSWanyi ) 559*efc6d33bSWanyi 560*efc6d33bSWanyi self.expect( 561*efc6d33bSWanyi "settings show target.output-path", 562*efc6d33bSWanyi SETTING_MSG("target.output-path"), 563*efc6d33bSWanyi substrs=["target.output-path (file)", 'output.txt"'], 564*efc6d33bSWanyi ) 565*efc6d33bSWanyi 566*efc6d33bSWanyi self.runCmd( 567*efc6d33bSWanyi "process launch --working-dir '{0}'".format( 568*efc6d33bSWanyi self.get_process_working_directory() 569*efc6d33bSWanyi ), 570*efc6d33bSWanyi RUN_SUCCEEDED, 571*efc6d33bSWanyi ) 572*efc6d33bSWanyi 573*efc6d33bSWanyi output = lldbutil.read_file_from_process_wd(self, "output.txt") 574*efc6d33bSWanyi err_message = "This message should go to standard error." 575*efc6d33bSWanyi out_message = "This message should go to standard out." 576*efc6d33bSWanyi # Error msg should get flushed by the output msg 577*efc6d33bSWanyi self.expect(output, exe=False, substrs=[out_message]) 578*efc6d33bSWanyi self.assertNotIn( 579*efc6d33bSWanyi err_message, 580*efc6d33bSWanyi output, 581*efc6d33bSWanyi "Race condition when both stderr/stdout redirects to the same file", 582*efc6d33bSWanyi ) 583*efc6d33bSWanyi 58499451b44SJordan Rupprecht def test_print_dictionary_setting(self): 58599451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars") 5862238dcc3SJonas Devlieghere self.runCmd('settings set target.env-vars ["MY_VAR"]=some-value') 5872238dcc3SJonas Devlieghere self.expect("settings show target.env-vars", substrs=["MY_VAR=some-value"]) 58899451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars") 58999451b44SJordan Rupprecht 59099451b44SJordan Rupprecht def test_print_array_setting(self): 59199451b44SJordan Rupprecht self.runCmd("settings clear target.run-args") 59299451b44SJordan Rupprecht self.runCmd("settings set target.run-args gobbledy-gook") 5932238dcc3SJonas Devlieghere self.expect("settings show target.run-args", substrs=['[0]: "gobbledy-gook"']) 59499451b44SJordan Rupprecht self.runCmd("settings clear target.run-args") 59599451b44SJordan Rupprecht 59699451b44SJordan Rupprecht def test_settings_with_quotes(self): 59799451b44SJordan Rupprecht self.runCmd("settings clear target.run-args") 59899451b44SJordan Rupprecht self.runCmd("settings set target.run-args a b c") 5992238dcc3SJonas Devlieghere self.expect( 6002238dcc3SJonas Devlieghere "settings show target.run-args", 6012238dcc3SJonas Devlieghere substrs=['[0]: "a"', '[1]: "b"', '[2]: "c"'], 6022238dcc3SJonas Devlieghere ) 60399451b44SJordan Rupprecht self.runCmd("settings set target.run-args 'a b c'") 6042238dcc3SJonas Devlieghere self.expect("settings show target.run-args", substrs=['[0]: "a b c"']) 60599451b44SJordan Rupprecht self.runCmd("settings clear target.run-args") 60699451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars") 60799451b44SJordan Rupprecht self.runCmd( 6082238dcc3SJonas Devlieghere 'settings set target.env-vars ["MY_FILE"]="this is a file name with spaces.txt"' 6092238dcc3SJonas Devlieghere ) 6102238dcc3SJonas Devlieghere self.expect( 6112238dcc3SJonas Devlieghere "settings show target.env-vars", 6122238dcc3SJonas Devlieghere substrs=["MY_FILE=this is a file name with spaces.txt"], 6132238dcc3SJonas Devlieghere ) 61499451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars") 61599451b44SJordan Rupprecht # Test and make sure that setting "format-string" settings obeys quotes 61699451b44SJordan Rupprecht # if they are provided 61799451b44SJordan Rupprecht self.runCmd("settings set thread-format 'abc def' ") 6182238dcc3SJonas Devlieghere self.expect( 6192238dcc3SJonas Devlieghere "settings show thread-format", 6202238dcc3SJonas Devlieghere startstr='thread-format (format-string) = "abc def"', 6212238dcc3SJonas Devlieghere ) 62299451b44SJordan Rupprecht self.runCmd('settings set thread-format "abc def" ') 6232238dcc3SJonas Devlieghere self.expect( 6242238dcc3SJonas Devlieghere "settings show thread-format", 6252238dcc3SJonas Devlieghere startstr='thread-format (format-string) = "abc def"', 6262238dcc3SJonas Devlieghere ) 62799451b44SJordan Rupprecht # Make sure when no quotes are provided that we maintain any trailing 62899451b44SJordan Rupprecht # spaces 6292238dcc3SJonas Devlieghere self.runCmd("settings set thread-format abc def ") 6302238dcc3SJonas Devlieghere self.expect( 6312238dcc3SJonas Devlieghere "settings show thread-format", 6322238dcc3SJonas Devlieghere startstr='thread-format (format-string) = "abc def "', 6332238dcc3SJonas Devlieghere ) 6342238dcc3SJonas Devlieghere self.runCmd("settings clear thread-format") 63599451b44SJordan Rupprecht 63699451b44SJordan Rupprecht def test_settings_with_trailing_whitespace(self): 63799451b44SJordan Rupprecht # boolean 63899451b44SJordan Rupprecht # Set to known value 63999451b44SJordan Rupprecht self.runCmd("settings set target.skip-prologue true") 64099451b44SJordan Rupprecht # Set to new value with trailing whitespace 64199451b44SJordan Rupprecht self.runCmd("settings set target.skip-prologue false ") 64299451b44SJordan Rupprecht # Make sure the setting was correctly set to "false" 64399451b44SJordan Rupprecht self.expect( 64499451b44SJordan Rupprecht "settings show target.skip-prologue", 64599451b44SJordan Rupprecht SETTING_MSG("target.skip-prologue"), 6462238dcc3SJonas Devlieghere startstr="target.skip-prologue (boolean) = false", 6472238dcc3SJonas Devlieghere ) 64899451b44SJordan Rupprecht self.runCmd("settings clear target.skip-prologue", check=False) 64999451b44SJordan Rupprecht # integer 65099451b44SJordan Rupprecht self.runCmd("settings set term-width 70") # Set to known value 65199451b44SJordan Rupprecht # Set to new value with trailing whitespaces 65299451b44SJordan Rupprecht self.runCmd("settings set term-width 60 \t") 6532238dcc3SJonas Devlieghere self.expect( 6542238dcc3SJonas Devlieghere "settings show term-width", 6552238dcc3SJonas Devlieghere SETTING_MSG("term-width"), 656afd46902SJonas Devlieghere startstr="term-width (unsigned) = 60", 6572238dcc3SJonas Devlieghere ) 65899451b44SJordan Rupprecht self.runCmd("settings clear term-width", check=False) 65999451b44SJordan Rupprecht # string 66099451b44SJordan Rupprecht self.runCmd("settings set target.arg0 abc") # Set to known value 66199451b44SJordan Rupprecht # Set to new value with trailing whitespaces 66299451b44SJordan Rupprecht self.runCmd("settings set target.arg0 cde\t ") 6632238dcc3SJonas Devlieghere self.expect( 6642238dcc3SJonas Devlieghere "settings show target.arg0", 6652238dcc3SJonas Devlieghere SETTING_MSG("target.arg0"), 6662238dcc3SJonas Devlieghere startstr='target.arg0 (string) = "cde"', 6672238dcc3SJonas Devlieghere ) 66899451b44SJordan Rupprecht self.runCmd("settings clear target.arg0", check=False) 66999451b44SJordan Rupprecht # file 67099451b44SJordan Rupprecht path1 = self.getBuildArtifact("path1.txt") 67199451b44SJordan Rupprecht path2 = self.getBuildArtifact("path2.txt") 6722238dcc3SJonas Devlieghere self.runCmd("settings set target.output-path %s" % path1) # Set to known value 6732238dcc3SJonas Devlieghere self.expect( 6742238dcc3SJonas Devlieghere "settings show target.output-path", 6752238dcc3SJonas Devlieghere SETTING_MSG("target.output-path"), 6762238dcc3SJonas Devlieghere startstr="target.output-path (file) = ", 6772238dcc3SJonas Devlieghere substrs=[path1], 6782238dcc3SJonas Devlieghere ) 67999451b44SJordan Rupprecht self.runCmd( 6802238dcc3SJonas Devlieghere "settings set target.output-path %s " % path2 6812238dcc3SJonas Devlieghere ) # Set to new value with trailing whitespaces 68299451b44SJordan Rupprecht self.expect( 68399451b44SJordan Rupprecht "settings show target.output-path", 68499451b44SJordan Rupprecht SETTING_MSG("target.output-path"), 6852238dcc3SJonas Devlieghere startstr="target.output-path (file) = ", 6862238dcc3SJonas Devlieghere substrs=[path2], 6872238dcc3SJonas Devlieghere ) 68899451b44SJordan Rupprecht self.runCmd("settings clear target.output-path", check=False) 68999451b44SJordan Rupprecht # enum 69099451b44SJordan Rupprecht # Set to known value 69199451b44SJordan Rupprecht self.runCmd("settings set stop-disassembly-display never") 69299451b44SJordan Rupprecht # Set to new value with trailing whitespaces 69399451b44SJordan Rupprecht self.runCmd("settings set stop-disassembly-display always ") 69499451b44SJordan Rupprecht self.expect( 69599451b44SJordan Rupprecht "settings show stop-disassembly-display", 69699451b44SJordan Rupprecht SETTING_MSG("stop-disassembly-display"), 6972238dcc3SJonas Devlieghere startstr="stop-disassembly-display (enum) = always", 6982238dcc3SJonas Devlieghere ) 69999451b44SJordan Rupprecht self.runCmd("settings clear stop-disassembly-display", check=False) 70099451b44SJordan Rupprecht # language 70199451b44SJordan Rupprecht # Set to known value 70299451b44SJordan Rupprecht self.runCmd("settings set target.language c89") 70399451b44SJordan Rupprecht # Set to new value with trailing whitespace 70499451b44SJordan Rupprecht self.runCmd("settings set target.language c11 ") 70599451b44SJordan Rupprecht self.expect( 70699451b44SJordan Rupprecht "settings show target.language", 70799451b44SJordan Rupprecht SETTING_MSG("target.language"), 7082238dcc3SJonas Devlieghere startstr="target.language (language) = c11", 7092238dcc3SJonas Devlieghere ) 71099451b44SJordan Rupprecht self.runCmd("settings clear target.language", check=False) 71199451b44SJordan Rupprecht # arguments 71299451b44SJordan Rupprecht self.runCmd("settings set target.run-args 1 2 3") # Set to known value 71399451b44SJordan Rupprecht # Set to new value with trailing whitespaces 71499451b44SJordan Rupprecht self.runCmd("settings set target.run-args 3 4 5 ") 71599451b44SJordan Rupprecht self.expect( 71699451b44SJordan Rupprecht "settings show target.run-args", 71799451b44SJordan Rupprecht SETTING_MSG("target.run-args"), 71899451b44SJordan Rupprecht substrs=[ 7192238dcc3SJonas Devlieghere "target.run-args (arguments) =", 72099451b44SJordan Rupprecht '[0]: "3"', 72199451b44SJordan Rupprecht '[1]: "4"', 7222238dcc3SJonas Devlieghere '[2]: "5"', 7232238dcc3SJonas Devlieghere ], 7242238dcc3SJonas Devlieghere ) 72599451b44SJordan Rupprecht self.runCmd("settings set target.run-args 1 2 3") # Set to known value 72699451b44SJordan Rupprecht # Set to new value with trailing whitespaces 72799451b44SJordan Rupprecht self.runCmd("settings set target.run-args 3 \ \ ") 72899451b44SJordan Rupprecht self.expect( 72999451b44SJordan Rupprecht "settings show target.run-args", 73099451b44SJordan Rupprecht SETTING_MSG("target.run-args"), 73199451b44SJordan Rupprecht substrs=[ 7322238dcc3SJonas Devlieghere "target.run-args (arguments) =", 73399451b44SJordan Rupprecht '[0]: "3"', 73499451b44SJordan Rupprecht '[1]: " "', 7352238dcc3SJonas Devlieghere '[2]: " "', 7362238dcc3SJonas Devlieghere ], 7372238dcc3SJonas Devlieghere ) 73899451b44SJordan Rupprecht self.runCmd("settings clear target.run-args", check=False) 73999451b44SJordan Rupprecht # dictionaries 74099451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars") # Set to known value 74199451b44SJordan Rupprecht # Set to new value with trailing whitespaces 74299451b44SJordan Rupprecht self.runCmd("settings set target.env-vars A=B C=D\t ") 74399451b44SJordan Rupprecht self.expect( 74499451b44SJordan Rupprecht "settings show target.env-vars", 74599451b44SJordan Rupprecht SETTING_MSG("target.env-vars"), 7462238dcc3SJonas Devlieghere substrs=["target.env-vars (dictionary of strings) =", "A=B", "C=D"], 7472238dcc3SJonas Devlieghere ) 74899451b44SJordan Rupprecht self.runCmd("settings clear target.env-vars", check=False) 74999451b44SJordan Rupprecht # regex 75099451b44SJordan Rupprecht # Set to known value 75199451b44SJordan Rupprecht self.runCmd("settings clear target.process.thread.step-avoid-regexp") 75299451b44SJordan Rupprecht # Set to new value with trailing whitespaces 7532238dcc3SJonas Devlieghere self.runCmd("settings set target.process.thread.step-avoid-regexp foo\\ ") 75499451b44SJordan Rupprecht self.expect( 75599451b44SJordan Rupprecht "settings show target.process.thread.step-avoid-regexp", 75699451b44SJordan Rupprecht SETTING_MSG("target.process.thread.step-avoid-regexp"), 7572238dcc3SJonas Devlieghere substrs=["target.process.thread.step-avoid-regexp (regex) = foo\\ "], 7582238dcc3SJonas Devlieghere ) 75999451b44SJordan Rupprecht self.runCmd( 7602238dcc3SJonas Devlieghere "settings clear target.process.thread.step-avoid-regexp", check=False 7612238dcc3SJonas Devlieghere ) 76299451b44SJordan Rupprecht # format-string 76399451b44SJordan Rupprecht self.runCmd("settings clear disassembly-format") # Set to known value 76499451b44SJordan Rupprecht # Set to new value with trailing whitespaces 76599451b44SJordan Rupprecht self.runCmd("settings set disassembly-format foo ") 7662238dcc3SJonas Devlieghere self.expect( 7672238dcc3SJonas Devlieghere "settings show disassembly-format", 76899451b44SJordan Rupprecht SETTING_MSG("disassembly-format"), 7692238dcc3SJonas Devlieghere substrs=['disassembly-format (format-string) = "foo "'], 7702238dcc3SJonas Devlieghere ) 77199451b44SJordan Rupprecht self.runCmd("settings clear disassembly-format", check=False) 77299451b44SJordan Rupprecht 77399451b44SJordan Rupprecht def test_settings_list(self): 77499451b44SJordan Rupprecht # List settings (and optionally test the filter to only show 'target' settings). 7752238dcc3SJonas Devlieghere self.expect( 7762238dcc3SJonas Devlieghere "settings list target", substrs=["arg0", "detach-on-error", "language"] 7772238dcc3SJonas Devlieghere ) 77899451b44SJordan Rupprecht self.expect("settings list target", matching=False, substrs=["packet-timeout"]) 7792238dcc3SJonas Devlieghere self.expect( 7802238dcc3SJonas Devlieghere "settings list", 7812238dcc3SJonas Devlieghere substrs=["language", "arg0", "detach-on-error", "packet-timeout"], 7822238dcc3SJonas Devlieghere ) 78399451b44SJordan Rupprecht 78499451b44SJordan Rupprecht def test_settings_remove_single(self): 78599451b44SJordan Rupprecht # Set some environment variables and use 'remove' to delete them. 78699451b44SJordan Rupprecht self.runCmd("settings set target.env-vars a=b c=d") 78799451b44SJordan Rupprecht self.expect("settings show target.env-vars", substrs=["a=b", "c=d"]) 78899451b44SJordan Rupprecht self.runCmd("settings remove target.env-vars a") 78999451b44SJordan Rupprecht self.expect("settings show target.env-vars", matching=False, substrs=["a=b"]) 79099451b44SJordan Rupprecht self.expect("settings show target.env-vars", substrs=["c=d"]) 79199451b44SJordan Rupprecht self.runCmd("settings remove target.env-vars c") 7922238dcc3SJonas Devlieghere self.expect( 7932238dcc3SJonas Devlieghere "settings show target.env-vars", matching=False, substrs=["a=b", "c=d"] 7942238dcc3SJonas Devlieghere ) 79599451b44SJordan Rupprecht 79699451b44SJordan Rupprecht def test_settings_remove_multiple(self): 79799451b44SJordan Rupprecht self.runCmd("settings set target.env-vars a=b c=d e=f") 79899451b44SJordan Rupprecht self.expect("settings show target.env-vars", substrs=["a=b", "c=d", "e=f"]) 79999451b44SJordan Rupprecht self.runCmd("settings remove target.env-vars a e") 8002238dcc3SJonas Devlieghere self.expect( 8012238dcc3SJonas Devlieghere "settings show target.env-vars", matching=False, substrs=["a=b", "e=f"] 8022238dcc3SJonas Devlieghere ) 80399451b44SJordan Rupprecht self.expect("settings show target.env-vars", substrs=["c=d"]) 80499451b44SJordan Rupprecht 80599451b44SJordan Rupprecht def test_settings_remove_nonexistent_value(self): 8062238dcc3SJonas Devlieghere self.expect( 8072238dcc3SJonas Devlieghere "settings remove target.env-vars doesntexist", 8082238dcc3SJonas Devlieghere error=True, 8092238dcc3SJonas Devlieghere substrs=["no value found named 'doesntexist'"], 8102238dcc3SJonas Devlieghere ) 81199451b44SJordan Rupprecht 81299451b44SJordan Rupprecht def test_settings_remove_nonexistent_settings(self): 8132238dcc3SJonas Devlieghere self.expect( 8142238dcc3SJonas Devlieghere "settings remove doesntexist alsodoesntexist", 8152238dcc3SJonas Devlieghere error=True, 8162238dcc3SJonas Devlieghere substrs=["error: invalid value path 'doesntexist'"], 8172238dcc3SJonas Devlieghere ) 81899451b44SJordan Rupprecht 81999451b44SJordan Rupprecht def test_settings_remove_missing_arg(self): 8202238dcc3SJonas Devlieghere self.expect( 8212238dcc3SJonas Devlieghere "settings remove", 8222238dcc3SJonas Devlieghere error=True, 8232238dcc3SJonas Devlieghere substrs=["'settings remove' takes an array or dictionary item, or"], 8242238dcc3SJonas Devlieghere ) 82599451b44SJordan Rupprecht 82699451b44SJordan Rupprecht def test_settings_remove_empty_arg(self): 8272238dcc3SJonas Devlieghere self.expect( 8282238dcc3SJonas Devlieghere "settings remove ''", 8292238dcc3SJonas Devlieghere error=True, 8302238dcc3SJonas Devlieghere substrs=["'settings remove' command requires a valid variable name"], 8312238dcc3SJonas Devlieghere ) 83299451b44SJordan Rupprecht 833df90a15bSTatyana Krasnukha def test_settings_clear_all(self): 834df90a15bSTatyana Krasnukha # Change a dictionary. 835df90a15bSTatyana Krasnukha self.runCmd("settings set target.env-vars a=1 b=2 c=3") 836df90a15bSTatyana Krasnukha # Change an array. 837df90a15bSTatyana Krasnukha self.runCmd("settings set target.run-args a1 b2 c3") 838df90a15bSTatyana Krasnukha # Change a single boolean value. 839df90a15bSTatyana Krasnukha self.runCmd("settings set auto-confirm true") 840df90a15bSTatyana Krasnukha # Change a single integer value. 841bc0b5699Swalter erquinigo self.runCmd("settings set tab-size 4") 842df90a15bSTatyana Krasnukha 843df90a15bSTatyana Krasnukha # Clear everything. 844df90a15bSTatyana Krasnukha self.runCmd("settings clear --all") 845df90a15bSTatyana Krasnukha 846df90a15bSTatyana Krasnukha # Check that settings have their default values after clearing. 8472238dcc3SJonas Devlieghere self.expect( 8482238dcc3SJonas Devlieghere "settings show target.env-vars", 8492238dcc3SJonas Devlieghere patterns=["^target.env-vars \(dictionary of strings\) =\s*$"], 8502238dcc3SJonas Devlieghere ) 8512238dcc3SJonas Devlieghere self.expect( 8522238dcc3SJonas Devlieghere "settings show target.run-args", 8532238dcc3SJonas Devlieghere patterns=["^target.run-args \(arguments\) =\s*$"], 8542238dcc3SJonas Devlieghere ) 855df90a15bSTatyana Krasnukha self.expect("settings show auto-confirm", substrs=["false"]) 856bc0b5699Swalter erquinigo self.expect("settings show tab-size", substrs=["2"]) 857df90a15bSTatyana Krasnukha 858df90a15bSTatyana Krasnukha # Check that the command fails if we combine '--all' option with any arguments. 859df90a15bSTatyana Krasnukha self.expect( 860df90a15bSTatyana Krasnukha "settings clear --all auto-confirm", 861df90a15bSTatyana Krasnukha COMMAND_FAILED_AS_EXPECTED, 862df90a15bSTatyana Krasnukha error=True, 8632238dcc3SJonas Devlieghere substrs=["'settings clear --all' doesn't take any arguments"], 8642238dcc3SJonas Devlieghere ) 865df90a15bSTatyana Krasnukha 86699451b44SJordan Rupprecht def test_all_settings_exist(self): 8672238dcc3SJonas Devlieghere self.expect( 8682238dcc3SJonas Devlieghere "settings show", 8692238dcc3SJonas Devlieghere substrs=[ 8702238dcc3SJonas Devlieghere "auto-confirm", 87199451b44SJordan Rupprecht "frame-format", 87299451b44SJordan Rupprecht "notify-void", 87399451b44SJordan Rupprecht "prompt", 87499451b44SJordan Rupprecht "script-lang", 87599451b44SJordan Rupprecht "stop-disassembly-count", 87699451b44SJordan Rupprecht "stop-disassembly-display", 87799451b44SJordan Rupprecht "stop-line-count-after", 87899451b44SJordan Rupprecht "stop-line-count-before", 87999451b44SJordan Rupprecht "stop-show-column", 88099451b44SJordan Rupprecht "term-width", 88199451b44SJordan Rupprecht "thread-format", 88299451b44SJordan Rupprecht "use-external-editor", 88399451b44SJordan Rupprecht "target.breakpoints-use-platform-avoid-list", 88499451b44SJordan Rupprecht "target.default-arch", 88599451b44SJordan Rupprecht "target.disable-aslr", 88699451b44SJordan Rupprecht "target.disable-stdio", 88799451b44SJordan Rupprecht "target.x86-disassembly-flavor", 88899451b44SJordan Rupprecht "target.enable-synthetic-value", 88999451b44SJordan Rupprecht "target.env-vars", 89099451b44SJordan Rupprecht "target.error-path", 89199451b44SJordan Rupprecht "target.exec-search-paths", 89299451b44SJordan Rupprecht "target.expr-prefix", 89399451b44SJordan Rupprecht "target.hex-immediate-style", 89499451b44SJordan Rupprecht "target.inherit-env", 89599451b44SJordan Rupprecht "target.input-path", 89699451b44SJordan Rupprecht "target.language", 89799451b44SJordan Rupprecht "target.max-children-count", 89899451b44SJordan Rupprecht "target.max-string-summary-length", 89999451b44SJordan Rupprecht "target.move-to-nearest-code", 90099451b44SJordan Rupprecht "target.output-path", 90199451b44SJordan Rupprecht "target.prefer-dynamic-value", 90299451b44SJordan Rupprecht "target.run-args", 90399451b44SJordan Rupprecht "target.skip-prologue", 90499451b44SJordan Rupprecht "target.source-map", 90599451b44SJordan Rupprecht "target.use-hex-immediates", 90699451b44SJordan Rupprecht "target.process.disable-memory-cache", 90799451b44SJordan Rupprecht "target.process.extra-startup-command", 90899451b44SJordan Rupprecht "target.process.thread.trace-thread", 90999451b44SJordan Rupprecht "target.process.thread.step-avoid-regexp", 9102238dcc3SJonas Devlieghere ], 9112238dcc3SJonas Devlieghere ) 91299451b44SJordan Rupprecht 91399451b44SJordan Rupprecht # settings under an ".experimental" domain should have two properties: 91499451b44SJordan Rupprecht # 1. If the name does not exist with "experimental" in the name path, 91599451b44SJordan Rupprecht # the name lookup should try to find it without "experimental". So 91699451b44SJordan Rupprecht # a previously-experimental setting that has been promoted to a 91799451b44SJordan Rupprecht # "real" setting will still be set by the original name. 91899451b44SJordan Rupprecht # 2. Changing a setting with .experimental., name, where the setting 91999451b44SJordan Rupprecht # does not exist either with ".experimental." or without, should 92099451b44SJordan Rupprecht # not generate an error. So if an experimental setting is removed, 92199451b44SJordan Rupprecht # people who may have that in their ~/.lldbinit files should not see 92299451b44SJordan Rupprecht # any errors. 92399451b44SJordan Rupprecht def test_experimental_settings(self): 92499451b44SJordan Rupprecht cmdinterp = self.dbg.GetCommandInterpreter() 92599451b44SJordan Rupprecht result = lldb.SBCommandReturnObject() 92699451b44SJordan Rupprecht 92799451b44SJordan Rupprecht # Set target.arg0 to a known value, check that we can retrieve it via 92899451b44SJordan Rupprecht # the actual name and via .experimental. 9292238dcc3SJonas Devlieghere self.expect("settings set target.arg0 first-value") 9302238dcc3SJonas Devlieghere self.expect("settings show target.arg0", substrs=["first-value"]) 9312238dcc3SJonas Devlieghere self.expect( 9322238dcc3SJonas Devlieghere "settings show target.experimental.arg0", 9332238dcc3SJonas Devlieghere substrs=["first-value"], 9342238dcc3SJonas Devlieghere error=False, 9352238dcc3SJonas Devlieghere ) 93699451b44SJordan Rupprecht 93799451b44SJordan Rupprecht # Set target.arg0 to a new value via a target.experimental.arg0 name, 93899451b44SJordan Rupprecht # verify that we can read it back via both .experimental., and not. 9392238dcc3SJonas Devlieghere self.expect("settings set target.experimental.arg0 second-value", error=False) 9402238dcc3SJonas Devlieghere self.expect("settings show target.arg0", substrs=["second-value"]) 9412238dcc3SJonas Devlieghere self.expect( 9422238dcc3SJonas Devlieghere "settings show target.experimental.arg0", 9432238dcc3SJonas Devlieghere substrs=["second-value"], 9442238dcc3SJonas Devlieghere error=False, 9452238dcc3SJonas Devlieghere ) 94699451b44SJordan Rupprecht 94799451b44SJordan Rupprecht # showing & setting an undefined .experimental. setting should generate no errors. 9482238dcc3SJonas Devlieghere self.expect( 9492238dcc3SJonas Devlieghere "settings show target.experimental.setting-which-does-not-exist", 9502238dcc3SJonas Devlieghere patterns=["^\s$"], 9512238dcc3SJonas Devlieghere error=False, 9522238dcc3SJonas Devlieghere ) 9532238dcc3SJonas Devlieghere self.expect( 9542238dcc3SJonas Devlieghere "settings set target.experimental.setting-which-does-not-exist true", 9552238dcc3SJonas Devlieghere error=False, 9562238dcc3SJonas Devlieghere ) 95799451b44SJordan Rupprecht 95899451b44SJordan Rupprecht # A domain component before .experimental. which does not exist should give an error 95999451b44SJordan Rupprecht # But the code does not yet do that. 96099451b44SJordan Rupprecht # self.expect('settings set target.setting-which-does-not-exist.experimental.arg0 true', error=True) 96199451b44SJordan Rupprecht 96299451b44SJordan Rupprecht # finally, confirm that trying to set a setting that does not exist still fails. 96399451b44SJordan Rupprecht # (SHOWING a setting that does not exist does not currently yield an error.) 9642238dcc3SJonas Devlieghere self.expect("settings set target.setting-which-does-not-exist true", error=True) 9658a0fa4dbSJonas Devlieghere 9668a0fa4dbSJonas Devlieghere def test_settings_set_exists(self): 9678a0fa4dbSJonas Devlieghere cmdinterp = self.dbg.GetCommandInterpreter() 9688a0fa4dbSJonas Devlieghere 9698a0fa4dbSJonas Devlieghere # An unknown option should succeed. 9702238dcc3SJonas Devlieghere self.expect("settings set -e foo bar") 9712238dcc3SJonas Devlieghere self.expect("settings set --exists foo bar") 9728a0fa4dbSJonas Devlieghere 9738a0fa4dbSJonas Devlieghere # A known option should fail if its argument is invalid. 9748a0fa4dbSJonas Devlieghere self.expect("settings set auto-confirm bogus", error=True) 975d5f54751SJeffrey Tan 976d5f54751SJeffrey Tan def get_setting_json(self, setting_path=None): 977d5f54751SJeffrey Tan settings_data = self.dbg.GetSetting(setting_path) 978d5f54751SJeffrey Tan stream = lldb.SBStream() 979d5f54751SJeffrey Tan settings_data.GetAsJSON(stream) 980d5f54751SJeffrey Tan return json.loads(stream.GetData()) 981d5f54751SJeffrey Tan 982d5f54751SJeffrey Tan def verify_setting_value_json(self, setting_path, setting_value): 983d5f54751SJeffrey Tan self.runCmd("settings set %s %s" % (setting_path, setting_value)) 984d5f54751SJeffrey Tan settings_json = self.get_setting_json(setting_path) 985d5f54751SJeffrey Tan self.assertEqual(settings_json, setting_value) 986d5f54751SJeffrey Tan 987d5f54751SJeffrey Tan def test_settings_api(self): 988d5f54751SJeffrey Tan """ 989d5f54751SJeffrey Tan Test that ensures SBDebugger::GetSetting() APIs 990d5f54751SJeffrey Tan can correctly fetch settings. 991d5f54751SJeffrey Tan """ 992d5f54751SJeffrey Tan 993d5f54751SJeffrey Tan # Test basic values and embedding special JSON escaping characters. 994d5f54751SJeffrey Tan self.runCmd("settings set auto-confirm true") 995bc0b5699Swalter erquinigo self.runCmd("settings set tab-size 4") 9962238dcc3SJonas Devlieghere arg_value = 'hello "world"' 9972238dcc3SJonas Devlieghere self.runCmd("settings set target.arg0 %s" % arg_value) 998d5f54751SJeffrey Tan 999d5f54751SJeffrey Tan settings_json = self.get_setting_json() 1000d5f54751SJeffrey Tan self.assertEqual(settings_json["auto-confirm"], True) 1001bc0b5699Swalter erquinigo self.assertEqual(settings_json["tab-size"], 4) 1002d5f54751SJeffrey Tan self.assertEqual(settings_json["target"]["arg0"], arg_value) 1003d5f54751SJeffrey Tan 1004d5f54751SJeffrey Tan settings_data = self.get_setting_json("target.arg0") 1005d5f54751SJeffrey Tan self.assertEqual(settings_data, arg_value) 1006d5f54751SJeffrey Tan 1007d5f54751SJeffrey Tan # Test OptionValueFileSpec 10082238dcc3SJonas Devlieghere self.verify_setting_value_json( 1009710d95d1SDmitry Vasilyev "platform.module-cache-directory", self.getBuildDir() 10102238dcc3SJonas Devlieghere ) 1011d5f54751SJeffrey Tan 1012d5f54751SJeffrey Tan # Test OptionValueArray 1013d5f54751SJeffrey Tan setting_path = "target.run-args" 1014d5f54751SJeffrey Tan setting_value = ["value1", "value2", "value3"] 1015d5f54751SJeffrey Tan self.runCmd("settings set %s %s" % (setting_path, " ".join(setting_value))) 1016d5f54751SJeffrey Tan settings_json = self.get_setting_json(setting_path) 1017d5f54751SJeffrey Tan self.assertEqual(settings_json, setting_value) 1018d5f54751SJeffrey Tan 1019d5f54751SJeffrey Tan # Test OptionValueFormatEntity 1020d5f54751SJeffrey Tan setting_value = """thread #${thread.index}{, name = \\'${thread.name}\\ 1021d5f54751SJeffrey Tan '}{, queue = ${ansi.fg.green}\\'${thread.queue}\\'${ansi.normal}}{, 1022d5f54751SJeffrey Tan activity = ${ansi.fg.green}\\'${thread.info.activity.name}\\'${ansi.normal}} 1023d5f54751SJeffrey Tan {, ${thread.info.trace_messages} messages}{, stop reason = ${ansi.fg.red}$ 1024d5f54751SJeffrey Tan {thread.stop-reason}${ansi.normal}}{\\\\nReturn value: ${thread.return-value}} 1025d5f54751SJeffrey Tan {\\\\nCompleted expression: ${thread.completed-expression}}\\\\n""" 1026d5f54751SJeffrey Tan self.verify_setting_value_json("thread-stop-format", setting_value) 1027d5f54751SJeffrey Tan 1028d5f54751SJeffrey Tan # Test OptionValueRegex 10292238dcc3SJonas Devlieghere self.verify_setting_value_json( 10302238dcc3SJonas Devlieghere "target.process.thread.step-avoid-regexp", "^std::" 10312238dcc3SJonas Devlieghere ) 1032d5f54751SJeffrey Tan 1033d5f54751SJeffrey Tan # Test OptionValueLanguage 1034d5f54751SJeffrey Tan self.verify_setting_value_json("repl-lang", "c++") 1035c1885d2dSJim Ingham 1036c1885d2dSJim Ingham def test_global_option(self): 1037c1885d2dSJim Ingham # This command used to crash the settings because -g was signaled by a 1038c1885d2dSJim Ingham # NULL execution context (not one with an empty Target...) and in the 1039c1885d2dSJim Ingham # special handling for load-script-from-symbol-file this wasn't checked. 1040c1885d2dSJim Ingham self.runCmd("settings set -g target.load-script-from-symbol-file true") 1041