| # Copyright 2011-2021 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/>. |
| |
| # Test that the "shell", "!", "|" and "pipe" commands work. |
| |
| load_lib completion-support.exp |
| |
| gdb_exit |
| gdb_start |
| |
| gdb_test "shell echo foo" "foo" |
| |
| gdb_test "! echo foo" "foo" |
| gdb_test "!echo foo" "foo" |
| |
| # Convenience variables with shell command. |
| gdb_test_no_output "! exit 0" |
| gdb_test "p \$_shell_exitcode" " = 0" "shell success exitcode" |
| gdb_test "p \$_shell_exitsignal" " = void" "shell success exitsignal" |
| |
| gdb_test_no_output "! exit 1" |
| gdb_test "p \$_shell_exitcode" " = 1" "shell fail exitcode" |
| gdb_test "p \$_shell_exitsignal" " = void" "shell fail exitsignal" |
| |
| # This test will not work when the shell is CMD.EXE. |
| if { ! [ishost *-*-mingw*] } { |
| gdb_test_no_output "! kill -2 $$" |
| gdb_test "p \$_shell_exitcode" " = void" "shell interrupt exitcode" |
| gdb_test "p \$_shell_exitsignal" " = 2" "shell interrupt exitsignal" |
| } |
| |
| # Define the user command "foo", used to test "pipe" command. |
| gdb_test_multiple "define foo" "define foo" { |
| -re "End with" { |
| pass "define foo" |
| } |
| } |
| gdb_test \ |
| [multi_line_input \ |
| { echo coucou\n }\ |
| { echo truc\n }\ |
| { echo machin\n }\ |
| { if $argc > 0 }\ |
| { echo $arg0\n}\ |
| {end}\ |
| {end}] \ |
| "" \ |
| "enter commands" |
| |
| |
| gdb_test "pipe foo | wc -l" "3" "simple pipe" |
| gdb_test "pipe foo brol| wc -l" "4" "simple pipe with arg" |
| gdb_test "pipe foo truc2 | grep truc | wc -l" "2" "double pipe" |
| |
| gdb_test "| foo truc2 | grep truc | wc -l" "2" "double pipe, pipe char" |
| gdb_test "|foo|grep truc|wc -l" "1" "no space around pipe char" |
| |
| gdb_test "echo coucou\\n" "coucou" "echo coucou" |
| gdb_test "||wc -l" "1" "repeat previous command" |
| |
| gdb_test "| -d ! echo this contains a | character\\n ! sed -e \"s/|/PIPE/\"" \ |
| "this contains a PIPE character" "alternate 1char delim" |
| |
| gdb_test "|-d ! echo this contains a | character\\n!sed -e \"s/|/PIPE/\"" \ |
| "this contains a PIPE character" "alternate 1char delim, no space" |
| |
| gdb_test "| -d !!! echo this contains a | character\\n !!! sed -e \"s/|/PIPE/\"" \ |
| "this contains a PIPE character" "alternate 3char delim" |
| |
| gdb_test "|-d !!! echo this contains a | character\\n!!!sed -e \"s/|/PIPE/\"" \ |
| "this contains a PIPE character" "alternate 3char delim, no space" |
| |
| # Convenience variables with pipe command. |
| gdb_test "|p 123| exit 0" "" |
| gdb_test "p \$_shell_exitcode" " = 0" "pipe success exitcode" |
| gdb_test "p \$_shell_exitsignal" " = void" "pipe success exitsignal" |
| |
| gdb_test "|p 123| exit 1" "" |
| gdb_test "p \$_shell_exitcode" " = 1" "pipe fail exitcode" |
| gdb_test "p \$_shell_exitsignal" " = void" "pipe fail exitsignal" |
| |
| # This test will not work when the shell is CMD.EXE. |
| if { ! [ishost *-*-mingw*] } { |
| gdb_test "|p 123| kill -2 $$" "" |
| gdb_test "p \$_shell_exitcode" " = void" "pipe interrupt exitcode" |
| gdb_test "p \$_shell_exitsignal" " = 2" "pipe interrupt exitsignal" |
| } |
| |
| # Error handling verifications. |
| gdb_test "|" "Missing COMMAND" "all missing" |
| gdb_test "|-d" "-d requires an argument" "-d value missing" |
| gdb_test "|-d " "-d requires an argument" "-d spaces value missing" |
| gdb_test "| echo coucou" \ |
| "Missing delimiter before SHELL_COMMAND" \ |
| "| delimiter missing" |
| gdb_test "|-d DELIM echo coucou" \ |
| "Missing delimiter before SHELL_COMMAND" \ |
| "DELIM delimiter missing" |
| gdb_test "|echo coucou|" \ |
| "Missing SHELL_COMMAND" \ |
| "SHELL_COMMAND missing" |
| gdb_test "|-d ! echo coucou !" \ |
| "Missing SHELL_COMMAND" \ |
| "SHELL_COMMAND missing with delimiter" |
| gdb_test "|-d! echo coucou ! wc" \ |
| "Missing delimiter before SHELL_COMMAND" \ |
| "delimiter missing due to missing space" |
| |
| # Completion tests. |
| |
| test_gdb_complete_unique \ |
| "pipe" \ |
| "pipe" |
| |
| # Note that unlike "pipe", "|" doesn't require a space. This checks |
| # that completion behaves that way too. |
| foreach cmd {"pipe " "| " "|"} { |
| test_gdb_completion_offers_commands "$cmd" |
| |
| # There's only one option. |
| test_gdb_complete_unique \ |
| "${cmd}-" \ |
| "${cmd}-d" |
| |
| # Cannot complete "-d"'s argument. |
| test_gdb_complete_none "${cmd}-d " |
| test_gdb_complete_none "${cmd}-d main" |
| |
| # Check completing a GDB command, with and without -d. |
| test_gdb_complete_unique \ |
| "${cmd}maint set test-se" \ |
| "${cmd}maint set test-settings" |
| test_gdb_complete_unique \ |
| "${cmd}-d XXX maint set test-se" \ |
| "${cmd}-d XXX maint set test-settings" |
| |
| # Check that GDB doesn't try to complete the shell command. |
| test_gdb_complete_none \ |
| "${cmd}print 1 | " |
| |
| # Same, while making sure that the completer understands "-d". |
| test_gdb_complete_unique \ |
| "${cmd}-d XXX maint set" \ |
| "${cmd}-d XXX maint set" |
| test_gdb_complete_none \ |
| "${cmd}-d set maint set" |
| test_gdb_complete_none \ |
| "${cmd}-d set maint set " |
| } |