mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2026-08-27 00:26:02 -04:00
Fix typos in gdb/testsuite using an interactive session: ... $ codespell --toml gdb/pyproject.toml -w -i 3 gdb/testsuite ...
382 lines
14 KiB
Text
382 lines
14 KiB
Text
# Copyright (C) 2025-2026 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# This file is part of the GDB testsuite. It tests
|
|
# gdb.ParameterPrefix. See each of the test procs for a full
|
|
# description of what is being tested.
|
|
|
|
load_lib gdb-python.exp
|
|
|
|
require allow_python_tests
|
|
|
|
clean_restart
|
|
|
|
# Helper proc to generate the output of 'show PREFIX' commands for the
|
|
# case where the prefix command doesn't handle unknown sub-commands.
|
|
# In this case GDB will list the value of every sub-command under
|
|
# PREFIX.
|
|
proc make_show_prefix_re { prefix } {
|
|
return "$prefix param-1:\\s+The current value of '$prefix param-1' is \"off\"\\."
|
|
}
|
|
|
|
# Helper proc to generate the help text that describes all of the sub
|
|
# commands under PREFIX. The MODE is either 'set' or 'show'. This
|
|
# output will appear for 'help MODE PREFIX' and also for 'set PREFIX'.
|
|
proc make_sub_cmd_help_re { mode prefix } {
|
|
if { $mode == "set" } {
|
|
set word "Set"
|
|
} else {
|
|
set word "Show"
|
|
}
|
|
|
|
return \
|
|
[multi_line \
|
|
"List of \"$mode $prefix\" subcommands:" \
|
|
"" \
|
|
"$mode $prefix param-1 -- $word the current value of '$prefix param-1'\\." \
|
|
"" \
|
|
"Type \"help $mode $prefix\" followed by subcommand name for full documentation\\." \
|
|
"Type \"apropos word\" to search for commands related to \"word\"\\." \
|
|
"Type \"apropos -v word\" for full documentation of commands related to \"word\"\\." \
|
|
"Command name abbreviations are allowed if unambiguous\\."]
|
|
}
|
|
|
|
# Helper proc to generate the output of 'help MODE PREFIX', where MODE
|
|
# will be either 'set' or 'show'. The HELP_TEXT is the expected help
|
|
# text for this prefix command, this should not be a regexp, as this
|
|
# proc converts the text to a regexp.
|
|
#
|
|
# Return a single regexp which should match the output.
|
|
proc make_help_re { mode prefix help_text } {
|
|
set help_re [string_to_regexp $help_text]
|
|
|
|
return \
|
|
[multi_line \
|
|
"$help_re" \
|
|
"" \
|
|
[make_sub_cmd_help_re $mode $prefix]]
|
|
}
|
|
|
|
# Create gdb.ParameterPrefix without using a sub-class, both with, and
|
|
# without a doc string. For the doc string case, test single line,
|
|
# and multi-line doc strings.
|
|
proc_with_prefix test_basic_usage {} {
|
|
gdb_test_multiline "some basic ParameterPrefix usage" \
|
|
"python" "" \
|
|
"gdb.ParameterPrefix('prefix-1', gdb.COMMAND_NONE)" "" \
|
|
"gdb.Parameter('prefix-1 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.Parameter('prefix-1 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.ParameterPrefix('prefix-2', gdb.COMMAND_NONE," "" \
|
|
" \"\"\"This is prefix-2 help string.\"\"\")" "" \
|
|
"gdb.Parameter('prefix-2 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.ParameterPrefix('prefix-3', gdb.COMMAND_NONE," "" \
|
|
" \"\"\"This is prefix-3 help string." "" \
|
|
" " "" \
|
|
" This help text spans multiple lines.\"\"\")" "" \
|
|
"gdb.Parameter('prefix-3 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"end"
|
|
|
|
foreach mode { "set" "show" } {
|
|
gdb_test "help $mode prefix-1" \
|
|
[make_help_re $mode "prefix-1" \
|
|
"This command is not documented."]
|
|
|
|
gdb_test "help $mode prefix-2" \
|
|
[make_help_re $mode "prefix-2" \
|
|
"This is prefix-2 help string."]
|
|
|
|
gdb_test "help $mode prefix-3" \
|
|
[make_help_re $mode "prefix-3" \
|
|
[multi_line \
|
|
"This is prefix-3 help string." \
|
|
"" \
|
|
"This help text spans multiple lines."]]
|
|
|
|
foreach prefix { prefix-1 prefix-2 prefix-3 } {
|
|
gdb_test "$mode $prefix xxx" \
|
|
"^Undefined $mode $prefix command: \"xxx\"\\. Try \"help $mode $prefix\"\\."
|
|
}
|
|
}
|
|
|
|
foreach prefix { prefix-1 prefix-2 prefix-3 } {
|
|
gdb_test "set $prefix" \
|
|
[make_sub_cmd_help_re "set" $prefix]
|
|
|
|
gdb_test "show $prefix" \
|
|
[make_show_prefix_re $prefix]
|
|
}
|
|
}
|
|
|
|
# Create a sub-class of gdb.ParameterPrefix, but don't do anything
|
|
# particularly interesting. Again test the with and without
|
|
# documentation string cases.
|
|
proc_with_prefix test_simple_sub_class {} {
|
|
gdb_test_multiline "some basic ParameterPrefix usage" \
|
|
"python" "" \
|
|
"class BasicParamPrefix(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
"BasicParamPrefix('prefix-4')" "" \
|
|
"gdb.Parameter('prefix-4 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class BasicParamPrefixWithSingleLineDoc(gdb.ParameterPrefix):" "" \
|
|
" \"\"\"This is a single line doc string.\"\"\"" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
"BasicParamPrefixWithSingleLineDoc('prefix-5')" "" \
|
|
"gdb.Parameter('prefix-5 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class BasicParamPrefixWithMultiLineDoc(gdb.ParameterPrefix):" "" \
|
|
" \"\"\"This is a multi line doc string." "" \
|
|
" " "" \
|
|
" The rest of the doc string is here.\"\"\"" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
"BasicParamPrefixWithMultiLineDoc('prefix-6')" "" \
|
|
"gdb.Parameter('prefix-6 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class BasicParamPrefixWithDocParameter(gdb.ParameterPrefix):" "" \
|
|
" \"\"\"This is an unused doc string.\"\"\"" "" \
|
|
" def __init__(self, name, doc):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE, doc)" "" \
|
|
"BasicParamPrefixWithDocParameter('prefix-7'," "" \
|
|
" \"\"\"The doc string text is here.\"\"\")" "" \
|
|
"gdb.Parameter('prefix-7 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"end"
|
|
|
|
foreach mode { "set" "show" } {
|
|
gdb_test "help $mode prefix-4" \
|
|
[make_help_re $mode "prefix-4" \
|
|
"This command is not documented."]
|
|
|
|
gdb_test "help $mode prefix-5" \
|
|
[make_help_re $mode "prefix-5" \
|
|
"This is a single line doc string."]
|
|
|
|
gdb_test "help $mode prefix-6" \
|
|
[make_help_re $mode "prefix-6" \
|
|
[multi_line \
|
|
"This is a multi line doc string." \
|
|
"" \
|
|
"The rest of the doc string is here."]]
|
|
|
|
gdb_test "help $mode prefix-7" \
|
|
[make_help_re $mode "prefix-7" \
|
|
"The doc string text is here."]
|
|
|
|
foreach prefix { prefix-4 prefix-5 prefix-6 prefix-7 } {
|
|
gdb_test "$mode $prefix xxx" \
|
|
"^Undefined $mode $prefix command: \"xxx\"\\. Try \"help $mode $prefix\"\\."
|
|
}
|
|
}
|
|
|
|
foreach prefix { prefix-4 prefix-5 prefix-6 prefix-7 } {
|
|
gdb_test "set $prefix" \
|
|
[make_sub_cmd_help_re "set" $prefix]
|
|
|
|
gdb_test "show $prefix" \
|
|
[make_show_prefix_re $prefix]
|
|
}
|
|
}
|
|
|
|
# Create a sub-class of gdb.ParameterPrefix, and make use of
|
|
# 'invoke_set' and 'invoke_show'. Test that the invoke method is
|
|
# executed when expected, and that, by default, these invoke methods
|
|
# repeat when the user issues an empty command.
|
|
proc_with_prefix test_prefix_with_invoke {} {
|
|
gdb_test_multiline "ParameterPrefix with invoke_set" \
|
|
"python" "" \
|
|
"class PrefixWithInvokeSet(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
" def invoke_set(self, args, from_tty):" "" \
|
|
" print(f\"invoke_set (a): \\\"{args}\\\" {from_tty}\")" "" \
|
|
"PrefixWithInvokeSet('prefix-8')" "" \
|
|
"gdb.Parameter('prefix-8 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class PrefixWithInvokeShow(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
" def invoke_show(self, args, from_tty):" "" \
|
|
" print(f\"invoke_show (b): \\\"{args}\\\" {from_tty}\")" "" \
|
|
"PrefixWithInvokeShow('prefix-9')" "" \
|
|
"gdb.Parameter('prefix-9 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class PrefixWithBothInvoke(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
" def invoke_set(self, args, from_tty):" "" \
|
|
" print(f\"invoke_set (c): \\\"{args}\\\" {from_tty}\")" "" \
|
|
" def invoke_show(self, args, from_tty):" "" \
|
|
" print(f\"invoke_show (d): \\\"{args}\\\" {from_tty}\")" "" \
|
|
"PrefixWithBothInvoke('prefix-10')" "" \
|
|
"gdb.Parameter('prefix-10 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"end"
|
|
|
|
gdb_test "set prefix-8 xxx yyy" \
|
|
"^invoke_set \\(a\\): \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^\r\ninvoke_set \\(a\\): \"xxx yyy\" True" \
|
|
"repeat set prefix-8 xxx yyy"
|
|
|
|
gdb_test "show prefix-8 xxx yyy" \
|
|
"^Undefined show prefix-8 command: \"xxx yyy\"\\. Try \"help show prefix-8\"\\."
|
|
|
|
gdb_test "set prefix-9 xxx yyy" \
|
|
"^Undefined set prefix-9 command: \"xxx yyy\"\\. Try \"help set prefix-9\"\\."
|
|
|
|
gdb_test "show prefix-9 xxx yyy" \
|
|
"^invoke_show \\(b\\): \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^\r\ninvoke_show \\(b\\): \"xxx yyy\" True" \
|
|
"repeat show prefix-9 xxx yyy"
|
|
|
|
gdb_test "set prefix-10 xxx yyy" \
|
|
"^invoke_set \\(c\\): \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^\r\ninvoke_set \\(c\\): \"xxx yyy\" True" \
|
|
"repeat set prefix-10 xxx yyy"
|
|
|
|
gdb_test "show prefix-10 xxx yyy" \
|
|
"^invoke_show \\(d\\): \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^\r\ninvoke_show \\(d\\): \"xxx yyy\" True" \
|
|
"repeat show prefix-10 xxx yyy"
|
|
|
|
gdb_test "set prefix-8" \
|
|
"^invoke_set \\(a\\): \"\" True"
|
|
|
|
gdb_test "show prefix-8" \
|
|
[make_show_prefix_re "prefix-8"]
|
|
|
|
gdb_test "set prefix-9" \
|
|
[make_sub_cmd_help_re "set" "prefix-9"]
|
|
|
|
gdb_test "show prefix-9" \
|
|
"^invoke_show \\(b\\): \"\" True"
|
|
|
|
gdb_test "set prefix-10" \
|
|
"^invoke_set \\(c\\): \"\" True"
|
|
|
|
gdb_test "show prefix-10" \
|
|
"^invoke_show \\(d\\): \"\" True"
|
|
}
|
|
|
|
# Create ParameterPrefix sub-classes that make use of the
|
|
# dont_repeat() method. Check that the relevant set/show invoke
|
|
# callback doesn't repeat when an empty command is used.
|
|
proc_with_prefix test_dont_repeat {} {
|
|
gdb_test_multiline "ParameterPrefix with invoke_set and dont_repeat" \
|
|
"python" "" \
|
|
"class PrefixWithInvokeAndDoNotRepeatSet(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
" def invoke_set(self, args, from_tty):" "" \
|
|
" self.dont_repeat()" "" \
|
|
" print(f\"invoke_set: \\\"{args}\\\" {from_tty}\")" "" \
|
|
" def invoke_show(self, args, from_tty):" "" \
|
|
" print(f\"invoke_show: \\\"{args}\\\" {from_tty}\")" "" \
|
|
"PrefixWithInvokeAndDoNotRepeatSet('prefix-11')" "" \
|
|
"gdb.Parameter('prefix-11 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"class PrefixWithInvokeAndDoNotRepeatShow(gdb.ParameterPrefix):" "" \
|
|
" def __init__(self, name):" "" \
|
|
" super().__init__(name, gdb.COMMAND_NONE)" "" \
|
|
" def invoke_set(self, args, from_tty):" "" \
|
|
" print(f\"invoke_set: \\\"{args}\\\" {from_tty}\")" "" \
|
|
" def invoke_show(self, args, from_tty):" "" \
|
|
" self.dont_repeat()" "" \
|
|
" print(f\"invoke_show: \\\"{args}\\\" {from_tty}\")" "" \
|
|
"PrefixWithInvokeAndDoNotRepeatShow('prefix-12')" "" \
|
|
"gdb.Parameter('prefix-12 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"end"
|
|
|
|
gdb_test "set prefix-11 xxx yyy" \
|
|
"^invoke_set: \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^" \
|
|
"repeat set prefix-11 xxx yyy"
|
|
|
|
gdb_test "show prefix-11 xxx yyy" \
|
|
"^invoke_show: \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "invoke_show: \"xxx yyy\" True" \
|
|
"repeat show prefix-11 xxx yyy"
|
|
|
|
gdb_test "set prefix-12 xxx yyy" \
|
|
"^invoke_set: \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^\r\ninvoke_set: \"xxx yyy\" True" \
|
|
"repeat set prefix-12 xxx yyy"
|
|
|
|
gdb_test "show prefix-12 xxx yyy" \
|
|
"^invoke_show: \"xxx yyy\" True"
|
|
|
|
send_gdb "\n"
|
|
gdb_test "" "^" \
|
|
"repeat show prefix-12 xxx yyy"
|
|
}
|
|
|
|
# Create a parameter prefixm, and immediately add another prefix under
|
|
# the first. The important thing here is that the second prefix is
|
|
# created into an otherwise empty prefix as this triggered a bug at
|
|
# one point.
|
|
proc_with_prefix test_nested {} {
|
|
gdb_test_multiline "Create nested parameter prefixes" \
|
|
"python" "" \
|
|
"gdb.ParameterPrefix('prefix-13', gdb.COMMAND_NONE)" "" \
|
|
"gdb.ParameterPrefix('prefix-13 prefix-14', gdb.COMMAND_NONE)" "" \
|
|
"gdb.Parameter('prefix-13 param-1', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.Parameter('prefix-13 param-2', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.Parameter('prefix-13 prefix-14 param-3', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"gdb.Parameter('prefix-13 prefix-14 param-4', gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN)" "" \
|
|
"end" ""
|
|
|
|
gdb_test "show prefix-13 prefix-14" \
|
|
[multi_line \
|
|
"^prefix-13 prefix-14 param-3: The current value of 'prefix-13 prefix-14 param-3' is \"off\"\\." \
|
|
"prefix-13 prefix-14 param-4: The current value of 'prefix-13 prefix-14 param-4' is \"off\"\\."]
|
|
|
|
gdb_test "show prefix-13" \
|
|
[multi_line \
|
|
"^prefix-13 param-1: The current value of 'prefix-13 param-1' is \"off\"\\." \
|
|
"prefix-13 param-2: The current value of 'prefix-13 param-2' is \"off\"\\." \
|
|
"prefix-13 prefix-14 param-3: The current value of 'prefix-13 prefix-14 param-3' is \"off\"\\." \
|
|
"prefix-13 prefix-14 param-4: The current value of 'prefix-13 prefix-14 param-4' is \"off\"\\."]
|
|
|
|
gdb_test "set prefix-13 prefix-14" \
|
|
[multi_line \
|
|
"" \
|
|
"set prefix-13 prefix-14 param-3 -- Set the current value of 'prefix-13 prefix-14 param-3'\\." \
|
|
"set prefix-13 prefix-14 param-4 -- Set the current value of 'prefix-13 prefix-14 param-4'\\." \
|
|
"" \
|
|
".*"]
|
|
|
|
gdb_test "set prefix-13" \
|
|
[multi_line \
|
|
"" \
|
|
"set prefix-13 param-1 -- Set the current value of 'prefix-13 param-1'\\." \
|
|
"set prefix-13 param-2 -- Set the current value of 'prefix-13 param-2'\\." \
|
|
"set prefix-13 prefix-14 -- This command is not documented\\." \
|
|
"" \
|
|
".*"]
|
|
}
|
|
|
|
test_basic_usage
|
|
test_simple_sub_class
|
|
test_prefix_with_invoke
|
|
test_dont_repeat
|
|
test_nested
|