2 Test lldb settings command.
10 from lldbsuite
.test
import lldbutil
11 from lldbsuite
.test
.decorators
import *
12 from lldbsuite
.test
.lldbtest
import *
15 class SettingsCommandTestCase(TestBase
):
16 NO_DEBUG_INFO_TESTCASE
= True
18 def test_apropos_should_also_search_settings_description(self
):
19 """Test that 'apropos' command should also search descriptions for the settings variables."""
22 "apropos 'environment variable'",
25 "environment variables",
26 "executable's environment",
30 def test_set_interpreter_repeat_prev_command(self
):
31 """Test the `interpreter.repeat-previous-command` setting."""
34 exe
= self
.getBuildArtifact("a.out")
35 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
36 setting
= "interpreter.repeat-previous-command"
39 self
.runCmd("settings clear %s" % setting
, check
=False)
41 # Execute the cleanup function during test case tear down.
42 self
.addTearDownHook(cleanup(setting
))
44 # First, check for the setting default value.
46 "setting show %s" % setting
,
47 substrs
=["interpreter.repeat-previous-command (boolean) = true"],
50 # Then, invert the setting, and check that was set correctly
51 self
.runCmd("setting set %s false" % setting
)
53 "setting show %s" % setting
,
54 substrs
=["interpreter.repeat-previous-command (boolean) = false"],
57 ci
= self
.dbg
.GetCommandInterpreter()
58 self
.assertTrue(ci
.IsValid(), "Invalid command interpreter.")
59 # Now, test the functionnality
60 res
= lldb
.SBCommandReturnObject()
61 ci
.HandleCommand("breakpoint set -n main", res
)
62 self
.assertTrue(res
.Succeeded(), "Command failed.")
63 ci
.HandleCommand("", res
)
64 self
.assertTrue(res
.Succeeded(), "Empty command failed.")
65 self
.assertEqual(self
.dbg
.GetSelectedTarget().GetNumBreakpoints(), 1)
67 def test_append_target_env_vars(self
):
68 """Test that 'append target.env-vars' works."""
69 # Append the env-vars.
70 self
.runCmd("settings append target.env-vars MY_ENV_VAR=YES")
71 # And add hooks to restore the settings during tearDown().
72 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.env-vars"))
74 # Check it immediately!
75 self
.expect("settings show target.env-vars", substrs
=["MY_ENV_VAR=YES"])
77 def test_insert_before_and_after_target_run_args(self
):
78 """Test that 'insert-before/after target.run-args' works."""
79 # Set the run-args first.
80 self
.runCmd("settings set target.run-args a b c")
81 # And add hooks to restore the settings during tearDown().
82 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.run-args"))
84 # Now insert-before the index-0 element with '__a__'.
85 self
.runCmd("settings insert-before target.run-args 0 __a__")
86 # And insert-after the index-1 element with '__A__'.
87 self
.runCmd("settings insert-after target.run-args 1 __A__")
88 # Check it immediately!
90 "settings show target.run-args",
101 def test_replace_target_run_args(self
):
102 """Test that 'replace target.run-args' works."""
103 # Set the run-args and then replace the index-0 element.
104 self
.runCmd("settings set target.run-args a b c")
105 # And add hooks to restore the settings during tearDown().
106 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.run-args"))
108 # Now replace the index-0 element with 'A', instead.
109 self
.runCmd("settings replace target.run-args 0 A")
110 # Check it immediately!
112 "settings show target.run-args",
114 "target.run-args (arguments) =",
121 def test_set_prompt(self
):
122 """Test that 'set prompt' actually changes the prompt."""
124 # Set prompt to 'lldb2'.
125 self
.runCmd("settings set prompt 'lldb2 '")
127 # Immediately test the setting.
129 "settings show prompt",
130 SETTING_MSG("prompt"),
131 startstr
='prompt (string) = "lldb2 "',
134 # The overall display should also reflect the new setting.
137 SETTING_MSG("prompt"),
138 substrs
=['prompt (string) = "lldb2 "'],
141 # Use '-r' option to reset to the original default prompt.
142 self
.runCmd("settings clear prompt")
144 def test_set_term_width(self
):
145 """Test that 'set term-width' actually changes the term-width."""
147 self
.runCmd("settings set term-width 70")
149 # Immediately test the setting.
151 "settings show term-width",
152 SETTING_MSG("term-width"),
153 startstr
="term-width (unsigned) = 70",
156 # The overall display should also reflect the new setting.
159 SETTING_MSG("term-width"),
160 substrs
=["term-width (unsigned) = 70"],
163 self
.dbg
.SetTerminalWidth(60)
167 SETTING_MSG("term-width"),
168 substrs
=["term-width (unsigned) = 60"],
171 # rdar://problem/10712130
172 @skipIf(oslist
=["windows"], bugnumber
="llvm.org/pr44431")
173 def test_set_frame_format(self
):
174 """Test that 'set frame-format' with a backtick char in the format string works as well as fullpath."""
177 exe
= self
.getBuildArtifact("a.out")
178 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
182 "settings set frame-format %s" % self
.format_string
, check
=False
185 # Execute the cleanup function during test case tear down.
186 self
.addTearDownHook(cleanup
)
188 self
.runCmd("settings show frame-format")
189 m
= re
.match('^frame-format \(format-string\) = "(.*)"$', self
.res
.GetOutput())
190 self
.assertTrue(m
, "Bad settings string")
191 self
.format_string
= m
.group(1)
193 # Change the default format to print function.name rather than
194 # function.name-with-args
195 format_string
= "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}\`${function.name}{${function.pc-offset}}}{ at ${line.file.fullpath}:${line.number}}{, lang=${language}}\n"
196 self
.runCmd("settings set frame-format %s" % format_string
)
198 # Immediately test the setting.
200 "settings show frame-format",
201 SETTING_MSG("frame-format"),
202 substrs
=[format_string
],
205 self
.runCmd("breakpoint set -n main")
207 "process launch --working-dir '{0}'".format(
208 self
.get_process_working_directory()
212 self
.expect("thread backtrace", substrs
=["`main", self
.getSourceDir()])
214 def test_set_auto_confirm(self
):
215 """Test that after 'set auto-confirm true', manual confirmation should not kick in."""
218 exe
= self
.getBuildArtifact("a.out")
219 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
221 self
.runCmd("settings set auto-confirm true")
223 # Immediately test the setting.
225 "settings show auto-confirm",
226 SETTING_MSG("auto-confirm"),
227 startstr
="auto-confirm (boolean) = true",
230 # Now 'breakpoint delete' should just work fine without confirmation
231 # prompt from the command interpreter.
232 self
.runCmd("breakpoint set -n main")
233 self
.expect("breakpoint delete", startstr
="All breakpoints removed")
235 # Restore the original setting of auto-confirm.
236 self
.runCmd("settings clear auto-confirm")
238 "settings show auto-confirm",
239 SETTING_MSG("auto-confirm"),
240 startstr
="auto-confirm (boolean) = false",
243 @skipIf(archs
=no_match(["x86_64", "i386", "i686"]))
244 def test_disassembler_settings(self
):
245 """Test that user options for the disassembler take effect."""
248 exe
= self
.getBuildArtifact("a.out")
249 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
252 self
.runCmd("settings set target.x86-disassembly-flavor att")
253 self
.runCmd("settings set target.use-hex-immediates false")
254 self
.expect("disassemble -n numberfn", substrs
=["$90"])
255 self
.runCmd("settings set target.use-hex-immediates true")
256 self
.runCmd("settings set target.hex-immediate-style c")
257 self
.expect("disassemble -n numberfn", substrs
=["$0x5a"])
258 self
.runCmd("settings set target.hex-immediate-style asm")
259 self
.expect("disassemble -n numberfn", substrs
=["$5ah"])
262 self
.runCmd("settings set target.x86-disassembly-flavor intel")
263 self
.runCmd("settings set target.use-hex-immediates false")
264 self
.expect("disassemble -n numberfn", substrs
=["90"])
265 self
.runCmd("settings set target.use-hex-immediates true")
266 self
.runCmd("settings set target.hex-immediate-style c")
267 self
.expect("disassemble -n numberfn", substrs
=["0x5a"])
268 self
.runCmd("settings set target.hex-immediate-style asm")
269 self
.expect("disassemble -n numberfn", substrs
=["5ah"])
271 @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files
272 def test_run_args_and_env_vars(self
):
273 self
.do_test_run_args_and_env_vars(use_launchsimple
=False)
275 @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files
276 def test_launchsimple_args_and_env_vars(self
):
277 self
.do_test_run_args_and_env_vars(use_launchsimple
=True)
279 def do_test_run_args_and_env_vars(self
, use_launchsimple
):
280 """Test that run-args and env-vars are passed to the launched process."""
283 # Set the run-args and the env-vars.
284 # And add hooks to restore the settings during tearDown().
285 self
.runCmd("settings set target.run-args A B C")
286 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.run-args"))
287 self
.runCmd('settings set target.env-vars ["MY_ENV_VAR"]=YES')
288 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.env-vars"))
290 exe
= self
.getBuildArtifact("a.out")
291 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
293 target
= self
.dbg
.GetTargetAtIndex(0)
294 launch_info
= target
.GetLaunchInfo()
295 found_env_var
= False
296 for i
in range(0, launch_info
.GetNumEnvironmentEntries()):
297 if launch_info
.GetEnvironmentEntryAtIndex(i
) == "MY_ENV_VAR=YES":
300 self
.assertTrue(found_env_var
, "MY_ENV_VAR was not set in LaunchInfo object")
302 self
.assertEqual(launch_info
.GetNumArguments(), 3)
303 self
.assertEqual(launch_info
.GetArgumentAtIndex(0), "A")
304 self
.assertEqual(launch_info
.GetArgumentAtIndex(1), "B")
305 self
.assertEqual(launch_info
.GetArgumentAtIndex(2), "C")
307 self
.expect("target show-launch-environment", substrs
=["MY_ENV_VAR=YES"])
309 wd
= self
.get_process_working_directory()
311 process
= target
.LaunchSimple(None, None, wd
)
312 self
.assertTrue(process
)
314 self
.runCmd("process launch --working-dir '{0}'".format(wd
), RUN_SUCCEEDED
)
316 # Read the output file produced by running the program.
317 output
= lldbutil
.read_file_from_process_wd(self
, "output2.txt")
326 "Environment variable 'MY_ENV_VAR' successfully passed.",
330 # Check that env-vars overrides unset-env-vars.
331 self
.runCmd("settings set target.unset-env-vars MY_ENV_VAR")
334 "target show-launch-environment",
335 "env-vars overrides unset-env-vars",
336 substrs
=["MY_ENV_VAR=YES"],
339 wd
= self
.get_process_working_directory()
341 process
= target
.LaunchSimple(None, None, wd
)
342 self
.assertTrue(process
)
344 self
.runCmd("process launch --working-dir '{0}'".format(wd
), RUN_SUCCEEDED
)
346 # Read the output file produced by running the program.
347 output
= lldbutil
.read_file_from_process_wd(self
, "output2.txt")
352 substrs
=["Environment variable 'MY_ENV_VAR' successfully passed."],
355 @skipIfRemote # it doesn't make sense to send host env to remote target
356 def test_pass_host_env_vars(self
):
357 """Test that the host env vars are passed to the launched process."""
360 # Set some host environment variables now.
361 os
.environ
["MY_HOST_ENV_VAR1"] = "VAR1"
362 os
.environ
["MY_HOST_ENV_VAR2"] = "VAR2"
364 # This is the function to unset the two env variables set above.
365 def unset_env_variables():
366 os
.environ
.pop("MY_HOST_ENV_VAR1")
367 os
.environ
.pop("MY_HOST_ENV_VAR2")
369 self
.addTearDownHook(unset_env_variables
)
371 exe
= self
.getBuildArtifact("a.out")
372 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
374 # By default, inherit-env is 'true'.
376 "settings show target.inherit-env",
377 "Default inherit-env is 'true'",
378 startstr
="target.inherit-env (boolean) = true",
382 "target show-launch-environment",
383 "Host environment is passed correctly",
384 substrs
=["MY_HOST_ENV_VAR1=VAR1", "MY_HOST_ENV_VAR2=VAR2"],
387 "process launch --working-dir '{0}'".format(
388 self
.get_process_working_directory()
393 # Read the output file produced by running the program.
394 output
= lldbutil
.read_file_from_process_wd(self
, "output1.txt")
400 "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed.",
401 "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed.",
405 # Now test that we can prevent the inferior from inheriting the
407 self
.runCmd("settings set target.inherit-env false")
410 "target show-launch-environment",
411 "target.inherit-env affects `target show-launch-environment`",
413 substrs
=["MY_HOST_ENV_VAR1=VAR1", "MY_HOST_ENV_VAR2=VAR2"],
417 "process launch --working-dir '{0}'".format(
418 self
.get_process_working_directory()
423 # Read the output file produced by running the program.
424 output
= lldbutil
.read_file_from_process_wd(self
, "output1.txt")
431 "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed.",
432 "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed.",
436 # Now test that we can unset variables from the inherited environment.
437 self
.runCmd("settings set target.inherit-env true")
438 self
.runCmd("settings set target.unset-env-vars MY_HOST_ENV_VAR1")
440 "process launch --working-dir '{0}'".format(
441 self
.get_process_working_directory()
446 # Read the output file produced by running the program.
447 output
= lldbutil
.read_file_from_process_wd(self
, "output1.txt")
450 "target show-launch-environment",
451 "MY_HOST_ENV_VAR1 is unset, it shouldn't be in `target show-launch-environment`",
453 substrs
=["MY_HOST_ENV_VAR1=VAR1"],
456 "target show-launch-environment",
457 "MY_HOST_ENV_VAR2 shouldn be in `target show-launch-environment`",
458 substrs
=["MY_HOST_ENV_VAR2=VAR2"],
466 "The host environment variable 'MY_HOST_ENV_VAR1' successfully passed."
473 "The host environment variable 'MY_HOST_ENV_VAR2' successfully passed."
477 @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files
478 def test_set_error_output_path(self
):
479 """Test that setting target.error/output-path for the launched process works."""
482 exe
= self
.getBuildArtifact("a.out")
483 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
485 # Set the error-path and output-path and verify both are set.
487 "settings set target.error-path '{0}'".format(
488 lldbutil
.append_to_process_working_directory(self
, "stderr.txt")
492 "settings set target.output-path '{0}".format(
493 lldbutil
.append_to_process_working_directory(self
, "stdout.txt")
496 # And add hooks to restore the original settings during tearDown().
497 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.output-path"))
498 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.error-path"))
501 "settings show target.error-path",
502 SETTING_MSG("target.error-path"),
503 substrs
=["target.error-path (file)", 'stderr.txt"'],
507 "settings show target.output-path",
508 SETTING_MSG("target.output-path"),
509 substrs
=["target.output-path (file)", 'stdout.txt"'],
513 "process launch --working-dir '{0}'".format(
514 self
.get_process_working_directory()
519 output
= lldbutil
.read_file_from_process_wd(self
, "stderr.txt")
520 message
= "This message should go to standard error."
521 if lldbplatformutil
.hasChattyStderr(self
):
522 self
.expect(output
, exe
=False, substrs
=[message
])
524 self
.expect(output
, exe
=False, startstr
=message
)
526 output
= lldbutil
.read_file_from_process_wd(self
, "stdout.txt")
528 output
, exe
=False, startstr
="This message should go to standard out."
531 @skipIfDarwinEmbedded # <rdar://problem/34446098> debugserver on ios etc can't write files
532 def test_same_error_output_path(self
):
533 """Test that setting target.error and output-path to the same file path for the launched process works."""
536 exe
= self
.getBuildArtifact("a.out")
537 self
.runCmd("file " + exe
, CURRENT_EXECUTABLE_SET
)
539 # Set the error-path and output-path and verify both are set.
541 "settings set target.error-path '{0}'".format(
542 lldbutil
.append_to_process_working_directory(self
, "output.txt")
546 "settings set target.output-path '{0}".format(
547 lldbutil
.append_to_process_working_directory(self
, "output.txt")
550 # And add hooks to restore the original settings during tearDown().
551 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.output-path"))
552 self
.addTearDownHook(lambda: self
.runCmd("settings clear target.error-path"))
555 "settings show target.error-path",
556 SETTING_MSG("target.error-path"),
557 substrs
=["target.error-path (file)", 'output.txt"'],
561 "settings show target.output-path",
562 SETTING_MSG("target.output-path"),
563 substrs
=["target.output-path (file)", 'output.txt"'],
567 "process launch --working-dir '{0}'".format(
568 self
.get_process_working_directory()
573 output
= lldbutil
.read_file_from_process_wd(self
, "output.txt")
574 err_message
= "This message should go to standard error."
575 out_message
= "This message should go to standard out."
576 # Error msg should get flushed by the output msg
577 self
.expect(output
, exe
=False, substrs
=[out_message
])
581 "Race condition when both stderr/stdout redirects to the same file",
584 def test_print_dictionary_setting(self
):
585 self
.runCmd("settings clear target.env-vars")
586 self
.runCmd('settings set target.env-vars ["MY_VAR"]=some-value')
587 self
.expect("settings show target.env-vars", substrs
=["MY_VAR=some-value"])
588 self
.runCmd("settings clear target.env-vars")
590 def test_print_array_setting(self
):
591 self
.runCmd("settings clear target.run-args")
592 self
.runCmd("settings set target.run-args gobbledy-gook")
593 self
.expect("settings show target.run-args", substrs
=['[0]: "gobbledy-gook"'])
594 self
.runCmd("settings clear target.run-args")
596 def test_settings_with_quotes(self
):
597 self
.runCmd("settings clear target.run-args")
598 self
.runCmd("settings set target.run-args a b c")
600 "settings show target.run-args",
601 substrs
=['[0]: "a"', '[1]: "b"', '[2]: "c"'],
603 self
.runCmd("settings set target.run-args 'a b c'")
604 self
.expect("settings show target.run-args", substrs
=['[0]: "a b c"'])
605 self
.runCmd("settings clear target.run-args")
606 self
.runCmd("settings clear target.env-vars")
608 'settings set target.env-vars ["MY_FILE"]="this is a file name with spaces.txt"'
611 "settings show target.env-vars",
612 substrs
=["MY_FILE=this is a file name with spaces.txt"],
614 self
.runCmd("settings clear target.env-vars")
615 # Test and make sure that setting "format-string" settings obeys quotes
616 # if they are provided
617 self
.runCmd("settings set thread-format 'abc def' ")
619 "settings show thread-format",
620 startstr
='thread-format (format-string) = "abc def"',
622 self
.runCmd('settings set thread-format "abc def" ')
624 "settings show thread-format",
625 startstr
='thread-format (format-string) = "abc def"',
627 # Make sure when no quotes are provided that we maintain any trailing
629 self
.runCmd("settings set thread-format abc def ")
631 "settings show thread-format",
632 startstr
='thread-format (format-string) = "abc def "',
634 self
.runCmd("settings clear thread-format")
636 def test_settings_with_trailing_whitespace(self
):
639 self
.runCmd("settings set target.skip-prologue true")
640 # Set to new value with trailing whitespace
641 self
.runCmd("settings set target.skip-prologue false ")
642 # Make sure the setting was correctly set to "false"
644 "settings show target.skip-prologue",
645 SETTING_MSG("target.skip-prologue"),
646 startstr
="target.skip-prologue (boolean) = false",
648 self
.runCmd("settings clear target.skip-prologue", check
=False)
650 self
.runCmd("settings set term-width 70") # Set to known value
651 # Set to new value with trailing whitespaces
652 self
.runCmd("settings set term-width 60 \t")
654 "settings show term-width",
655 SETTING_MSG("term-width"),
656 startstr
="term-width (unsigned) = 60",
658 self
.runCmd("settings clear term-width", check
=False)
660 self
.runCmd("settings set target.arg0 abc") # Set to known value
661 # Set to new value with trailing whitespaces
662 self
.runCmd("settings set target.arg0 cde\t ")
664 "settings show target.arg0",
665 SETTING_MSG("target.arg0"),
666 startstr
='target.arg0 (string) = "cde"',
668 self
.runCmd("settings clear target.arg0", check
=False)
670 path1
= self
.getBuildArtifact("path1.txt")
671 path2
= self
.getBuildArtifact("path2.txt")
672 self
.runCmd("settings set target.output-path %s" % path1
) # Set to known value
674 "settings show target.output-path",
675 SETTING_MSG("target.output-path"),
676 startstr
="target.output-path (file) = ",
680 "settings set target.output-path %s " % path2
681 ) # Set to new value with trailing whitespaces
683 "settings show target.output-path",
684 SETTING_MSG("target.output-path"),
685 startstr
="target.output-path (file) = ",
688 self
.runCmd("settings clear target.output-path", check
=False)
691 self
.runCmd("settings set stop-disassembly-display never")
692 # Set to new value with trailing whitespaces
693 self
.runCmd("settings set stop-disassembly-display always ")
695 "settings show stop-disassembly-display",
696 SETTING_MSG("stop-disassembly-display"),
697 startstr
="stop-disassembly-display (enum) = always",
699 self
.runCmd("settings clear stop-disassembly-display", check
=False)
702 self
.runCmd("settings set target.language c89")
703 # Set to new value with trailing whitespace
704 self
.runCmd("settings set target.language c11 ")
706 "settings show target.language",
707 SETTING_MSG("target.language"),
708 startstr
="target.language (language) = c11",
710 self
.runCmd("settings clear target.language", check
=False)
712 self
.runCmd("settings set target.run-args 1 2 3") # Set to known value
713 # Set to new value with trailing whitespaces
714 self
.runCmd("settings set target.run-args 3 4 5 ")
716 "settings show target.run-args",
717 SETTING_MSG("target.run-args"),
719 "target.run-args (arguments) =",
725 self
.runCmd("settings set target.run-args 1 2 3") # Set to known value
726 # Set to new value with trailing whitespaces
727 self
.runCmd("settings set target.run-args 3 \ \ ")
729 "settings show target.run-args",
730 SETTING_MSG("target.run-args"),
732 "target.run-args (arguments) =",
738 self
.runCmd("settings clear target.run-args", check
=False)
740 self
.runCmd("settings clear target.env-vars") # Set to known value
741 # Set to new value with trailing whitespaces
742 self
.runCmd("settings set target.env-vars A=B C=D\t ")
744 "settings show target.env-vars",
745 SETTING_MSG("target.env-vars"),
746 substrs
=["target.env-vars (dictionary of strings) =", "A=B", "C=D"],
748 self
.runCmd("settings clear target.env-vars", check
=False)
751 self
.runCmd("settings clear target.process.thread.step-avoid-regexp")
752 # Set to new value with trailing whitespaces
753 self
.runCmd("settings set target.process.thread.step-avoid-regexp foo\\ ")
755 "settings show target.process.thread.step-avoid-regexp",
756 SETTING_MSG("target.process.thread.step-avoid-regexp"),
757 substrs
=["target.process.thread.step-avoid-regexp (regex) = foo\\ "],
760 "settings clear target.process.thread.step-avoid-regexp", check
=False
763 self
.runCmd("settings clear disassembly-format") # Set to known value
764 # Set to new value with trailing whitespaces
765 self
.runCmd("settings set disassembly-format foo ")
767 "settings show disassembly-format",
768 SETTING_MSG("disassembly-format"),
769 substrs
=['disassembly-format (format-string) = "foo "'],
771 self
.runCmd("settings clear disassembly-format", check
=False)
773 def test_settings_list(self
):
774 # List settings (and optionally test the filter to only show 'target' settings).
776 "settings list target", substrs
=["arg0", "detach-on-error", "language"]
778 self
.expect("settings list target", matching
=False, substrs
=["packet-timeout"])
781 substrs
=["language", "arg0", "detach-on-error", "packet-timeout"],
784 def test_settings_remove_single(self
):
785 # Set some environment variables and use 'remove' to delete them.
786 self
.runCmd("settings set target.env-vars a=b c=d")
787 self
.expect("settings show target.env-vars", substrs
=["a=b", "c=d"])
788 self
.runCmd("settings remove target.env-vars a")
789 self
.expect("settings show target.env-vars", matching
=False, substrs
=["a=b"])
790 self
.expect("settings show target.env-vars", substrs
=["c=d"])
791 self
.runCmd("settings remove target.env-vars c")
793 "settings show target.env-vars", matching
=False, substrs
=["a=b", "c=d"]
796 def test_settings_remove_multiple(self
):
797 self
.runCmd("settings set target.env-vars a=b c=d e=f")
798 self
.expect("settings show target.env-vars", substrs
=["a=b", "c=d", "e=f"])
799 self
.runCmd("settings remove target.env-vars a e")
801 "settings show target.env-vars", matching
=False, substrs
=["a=b", "e=f"]
803 self
.expect("settings show target.env-vars", substrs
=["c=d"])
805 def test_settings_remove_nonexistent_value(self
):
807 "settings remove target.env-vars doesntexist",
809 substrs
=["no value found named 'doesntexist'"],
812 def test_settings_remove_nonexistent_settings(self
):
814 "settings remove doesntexist alsodoesntexist",
816 substrs
=["error: invalid value path 'doesntexist'"],
819 def test_settings_remove_missing_arg(self
):
823 substrs
=["'settings remove' takes an array or dictionary item, or"],
826 def test_settings_remove_empty_arg(self
):
828 "settings remove ''",
830 substrs
=["'settings remove' command requires a valid variable name"],
833 def test_settings_clear_all(self
):
834 # Change a dictionary.
835 self
.runCmd("settings set target.env-vars a=1 b=2 c=3")
837 self
.runCmd("settings set target.run-args a1 b2 c3")
838 # Change a single boolean value.
839 self
.runCmd("settings set auto-confirm true")
840 # Change a single integer value.
841 self
.runCmd("settings set tab-size 4")
844 self
.runCmd("settings clear --all")
846 # Check that settings have their default values after clearing.
848 "settings show target.env-vars",
849 patterns
=["^target.env-vars \(dictionary of strings\) =\s*$"],
852 "settings show target.run-args",
853 patterns
=["^target.run-args \(arguments\) =\s*$"],
855 self
.expect("settings show auto-confirm", substrs
=["false"])
856 self
.expect("settings show tab-size", substrs
=["2"])
858 # Check that the command fails if we combine '--all' option with any arguments.
860 "settings clear --all auto-confirm",
861 COMMAND_FAILED_AS_EXPECTED
,
863 substrs
=["'settings clear --all' doesn't take any arguments"],
866 def test_all_settings_exist(self
):
875 "stop-disassembly-count",
876 "stop-disassembly-display",
877 "stop-line-count-after",
878 "stop-line-count-before",
882 "use-external-editor",
883 "target.breakpoints-use-platform-avoid-list",
884 "target.default-arch",
885 "target.disable-aslr",
886 "target.disable-stdio",
887 "target.x86-disassembly-flavor",
888 "target.enable-synthetic-value",
891 "target.exec-search-paths",
892 "target.expr-prefix",
893 "target.hex-immediate-style",
894 "target.inherit-env",
897 "target.max-children-count",
898 "target.max-string-summary-length",
899 "target.move-to-nearest-code",
900 "target.output-path",
901 "target.prefer-dynamic-value",
903 "target.skip-prologue",
905 "target.use-hex-immediates",
906 "target.process.disable-memory-cache",
907 "target.process.extra-startup-command",
908 "target.process.thread.trace-thread",
909 "target.process.thread.step-avoid-regexp",
913 # settings under an ".experimental" domain should have two properties:
914 # 1. If the name does not exist with "experimental" in the name path,
915 # the name lookup should try to find it without "experimental". So
916 # a previously-experimental setting that has been promoted to a
917 # "real" setting will still be set by the original name.
918 # 2. Changing a setting with .experimental., name, where the setting
919 # does not exist either with ".experimental." or without, should
920 # not generate an error. So if an experimental setting is removed,
921 # people who may have that in their ~/.lldbinit files should not see
923 def test_experimental_settings(self
):
924 cmdinterp
= self
.dbg
.GetCommandInterpreter()
925 result
= lldb
.SBCommandReturnObject()
927 # Set target.arg0 to a known value, check that we can retrieve it via
928 # the actual name and via .experimental.
929 self
.expect("settings set target.arg0 first-value")
930 self
.expect("settings show target.arg0", substrs
=["first-value"])
932 "settings show target.experimental.arg0",
933 substrs
=["first-value"],
937 # Set target.arg0 to a new value via a target.experimental.arg0 name,
938 # verify that we can read it back via both .experimental., and not.
939 self
.expect("settings set target.experimental.arg0 second-value", error
=False)
940 self
.expect("settings show target.arg0", substrs
=["second-value"])
942 "settings show target.experimental.arg0",
943 substrs
=["second-value"],
947 # showing & setting an undefined .experimental. setting should generate no errors.
949 "settings show target.experimental.setting-which-does-not-exist",
954 "settings set target.experimental.setting-which-does-not-exist true",
958 # A domain component before .experimental. which does not exist should give an error
959 # But the code does not yet do that.
960 # self.expect('settings set target.setting-which-does-not-exist.experimental.arg0 true', error=True)
962 # finally, confirm that trying to set a setting that does not exist still fails.
963 # (SHOWING a setting that does not exist does not currently yield an error.)
964 self
.expect("settings set target.setting-which-does-not-exist true", error
=True)
966 def test_settings_set_exists(self
):
967 cmdinterp
= self
.dbg
.GetCommandInterpreter()
969 # An unknown option should succeed.
970 self
.expect("settings set -e foo bar")
971 self
.expect("settings set --exists foo bar")
973 # A known option should fail if its argument is invalid.
974 self
.expect("settings set auto-confirm bogus", error
=True)
976 def get_setting_json(self
, setting_path
=None):
977 settings_data
= self
.dbg
.GetSetting(setting_path
)
978 stream
= lldb
.SBStream()
979 settings_data
.GetAsJSON(stream
)
980 return json
.loads(stream
.GetData())
982 def verify_setting_value_json(self
, setting_path
, setting_value
):
983 self
.runCmd("settings set %s %s" % (setting_path
, setting_value
))
984 settings_json
= self
.get_setting_json(setting_path
)
985 self
.assertEqual(settings_json
, setting_value
)
987 def test_settings_api(self
):
989 Test that ensures SBDebugger::GetSetting() APIs
990 can correctly fetch settings.
993 # Test basic values and embedding special JSON escaping characters.
994 self
.runCmd("settings set auto-confirm true")
995 self
.runCmd("settings set tab-size 4")
996 arg_value
= 'hello "world"'
997 self
.runCmd("settings set target.arg0 %s" % arg_value
)
999 settings_json
= self
.get_setting_json()
1000 self
.assertEqual(settings_json
["auto-confirm"], True)
1001 self
.assertEqual(settings_json
["tab-size"], 4)
1002 self
.assertEqual(settings_json
["target"]["arg0"], arg_value
)
1004 settings_data
= self
.get_setting_json("target.arg0")
1005 self
.assertEqual(settings_data
, arg_value
)
1007 # Test OptionValueFileSpec
1008 self
.verify_setting_value_json(
1009 "platform.module-cache-directory", self
.getBuildDir()
1012 # Test OptionValueArray
1013 setting_path
= "target.run-args"
1014 setting_value
= ["value1", "value2", "value3"]
1015 self
.runCmd("settings set %s %s" % (setting_path
, " ".join(setting_value
)))
1016 settings_json
= self
.get_setting_json(setting_path
)
1017 self
.assertEqual(settings_json
, setting_value
)
1019 # Test OptionValueFormatEntity
1020 setting_value
= """thread #${thread.index}{, name = \\'${thread.name}\\
1021 '}{, queue = ${ansi.fg.green}\\'${thread.queue}\\'${ansi.normal}}{,
1022 activity = ${ansi.fg.green}\\'${thread.info.activity.name}\\'${ansi.normal}}
1023 {, ${thread.info.trace_messages} messages}{, stop reason = ${ansi.fg.red}$
1024 {thread.stop-reason}${ansi.normal}}{\\\\nReturn value: ${thread.return-value}}
1025 {\\\\nCompleted expression: ${thread.completed-expression}}\\\\n"""
1026 self
.verify_setting_value_json("thread-stop-format", setting_value
)
1028 # Test OptionValueRegex
1029 self
.verify_setting_value_json(
1030 "target.process.thread.step-avoid-regexp", "^std::"
1033 # Test OptionValueLanguage
1034 self
.verify_setting_value_json("repl-lang", "c++")
1036 def test_global_option(self
):
1037 # This command used to crash the settings because -g was signaled by a
1038 # NULL execution context (not one with an empty Target...) and in the
1039 # special handling for load-script-from-symbol-file this wasn't checked.
1040 self
.runCmd("settings set -g target.load-script-from-symbol-file true")