xref: /llvm-project/lldb/test/API/commands/settings/TestSettings.py (revision efc6d33be9f4b4d0f0e8d3d5f198f2616b75792b)
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