1# Copyright 1998-2015 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file was written by Elena Zannoni. (ezannoni@cygnus.com) 17 18 19# 20# test running programs 21# 22 23standard_testfile break.c break1.c 24 25if {[prepare_for_testing ${testfile}.exp ${testfile} \ 26 [list $srcfile $srcfile2] {debug nowarnings}]} { 27 return -1 28} 29 30set bp_location1 [gdb_get_line_number "set breakpoint 1 here"] 31set bp_location11 [gdb_get_line_number "set breakpoint 11 here"] 32 33if ![runto_main] then { fail "define tests suppressed" } 34 35# Verify that GDB allows a user to define their very own commands. 36# 37gdb_test_multiple "define nextwhere" "define user command: nextwhere" { 38 -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" { 39 gdb_test "next\nbt\nend" "" \ 40 "define user command: nextwhere" 41 } 42} 43 44# Verify that those commands work as gdb_expected. 45# 46gdb_test "nextwhere" \ 47 "$bp_location1\[ \t\]*printf.*#0\[ \t\]*main.*:$bp_location1.*" \ 48 "use user command: nextwhere" 49 50# Verify that a user can define a command whose spelling is a 51# proper substring of another user-defined command. 52# 53gdb_test_multiple "define nextwh" "define user command: nextwh" { 54 -re "Type commands for definition of \"nextwh\".\r\nEnd with a line saying just \"end\".\r\n>$" { 55 gdb_test "next 2\nbt\nend" "" \ 56 "define user command: nextwh" 57 } 58} 59 60# Verify that a user can redefine their commands. (Test both the 61# confirmed and unconfirmed cases.) 62# 63gdb_test "define nextwhere" \ 64 "Command \"nextwhere\" not redefined.*" \ 65 "redefine user command aborted: nextwhere" \ 66 "Redefine command \"nextwhere\".*y or n. $" \ 67 "n" 68 69send_gdb "define nextwhere\n" 70gdb_expect { 71 -re "Redefine command \"nextwhere\".*y or n. $"\ 72 {send_gdb "y\n" 73 gdb_expect { 74 -re "Type commands for definition of \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$"\ 75 {send_gdb "bt\nnext\nend\n" 76 gdb_expect { 77 -re "$gdb_prompt $"\ 78 {pass "redefine user command: nextwhere"} 79 timeout {fail "(timeout) redefine user command: nextwhere"} 80 } 81 } 82 timeout {fail "(timeout) redefine user command: nextwhere"} 83 } 84 } 85 -re "$gdb_prompt $"\ 86 {fail "redefine user command: nextwhere"} 87 timeout {fail "(timeout) redefine user command: nextwhere"} 88} 89 90# Verify that GDB gracefully handles an attempt to redefine the 91# help text for a builtin command. 92# 93gdb_test "document step" "Command \"step\" is built-in.*" \ 94 "redocumenting builtin command disallowed" 95 96# Verify that a user can document their own commands. (And redocument 97# them.) 98# 99gdb_test_multiple "document nextwhere" "document user command: nextwhere" { 100 -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" { 101 gdb_test "A next command that first shows you where you're stepping from.\nend" \ 102 "" \ 103 "document user command: nextwhere" 104 } 105} 106 107gdb_test_multiple "document nextwhere" "re-document user command: nextwhere" { 108 -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" { 109 gdb_test "A next command that first shows you where you're stepping from.\nend" \ 110 "" \ 111 "re-document user command: nextwhere" 112 } 113} 114 115gdb_test "help nextwhere" \ 116 "A next command that first shows you where you're stepping from.*" \ 117 "help user command: nextwhere" 118 119# Verify that the document command preserves whitespace in the beginning of the line. 120# 121gdb_test_multiple "document nextwhere" "set up whitespace in help string" { 122 -re "Type documentation for \"nextwhere\".\r\nEnd with a line saying just \"end\".\r\n>$" { 123 gdb_test " A next command that first shows you where you're stepping from.\nend" \ 124 "" \ 125 "set up whitespace in help string" 126 } 127} 128 129gdb_test "help nextwhere" \ 130 " A next command that first shows you where you're stepping from.*" \ 131 "preserve whitespace in help string" 132 133# Verify that the command parser doesn't require a space after an 'if' 134# command in a user defined function. 135# 136gdb_test_multiple "define ifnospace" "define user command: ifnospace" \ 137{ 138 -re "Type commands for definition of \"ifnospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \ 139 { 140 gdb_test_multiple "if(3<4)\nprint \"hi there\\n\"\nend\nend" "send body of ifnospace" \ 141 { 142 -re "$gdb_prompt $"\ 143 {pass "define user command: ifnospace"} 144 } 145 } 146} 147 148gdb_test "ifnospace" ".*hi there.*" "test ifnospace is parsed correctly" 149 150# Verify that the command parser doesn't require a space after an 'while' 151# command in a user defined function. 152# 153gdb_test_multiple "define whilenospace" "define user command: whilenospace" \ 154{ 155 -re "Type commands for definition of \"whilenospace\".\r\nEnd with a line saying just \"end\".\r\n>$" \ 156 { 157 gdb_test_multiple "set \$i=1\nwhile(\$i<2)\nset \$i=2\nprint \"hi there\\n\"\nend\nend" "send body of whilenospace" \ 158 { 159 -re "$gdb_prompt $" \ 160 {pass "define user command: whilenospace"} 161 } 162 } 163} 164 165gdb_test "whilenospace" ".*hi there.*" "test whilenospace is parsed correctly" 166 167# Verify that the user can "hook" a builtin command. We choose to 168# hook the "stop" pseudo command, and we'll define it to use a user- 169# define command. 170# 171gdb_test_multiple "define user-bt" "define user command: user-bt" { 172 -re "Type commands for definition of \"user-bt\".\r\nEnd with a line saying just \"end\".\r\n>$" { 173 gdb_test "bt\nend" \ 174 "" \ 175 "define user command: user-bt" 176 } 177} 178 179gdb_test_multiple "define hook-stop" "define hook-stop command" { 180 -re "Type commands for definition of \"hook-stop\".\r\nEnd with a line saying just \"end\".\r\n>$" { 181 gdb_test "user-b\nend" \ 182 "" \ 183 "define hook-stop command" 184 } 185} 186 187gdb_test "next" "#0\[ \t\]*main.*:$bp_location11.*" \ 188 "use hook-stop command" 189 190# Verify that GDB responds gracefully to an attempt to define a "hook 191# command" which doesn't exist. (Test both the confirmed and unconfirmed 192# cases.) 193# 194gdb_test "define hook-bar" \ 195 "Not confirmed.*" \ 196 "define hook undefined command aborted: bar" \ 197 "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $" \ 198 "n" 199 200send_gdb "define hook-bar\n" 201gdb_expect { 202 -re "warning: Your new `hook-bar' command does not hook any existing command.\r\nProceed.*y or n. $"\ 203 {send_gdb "y\n" 204 gdb_expect { 205 -re "Type commands for definition of \"hook-bar\".\r\nEnd with a line saying just \"end\".\r\n>$"\ 206 {send_gdb "nextwhere\nend\n" 207 gdb_expect { 208 -re "$gdb_prompt $"\ 209 {pass "define hook undefined command: bar"} 210 timeout {fail "(timeout) define hook undefined command: bar"} 211 } 212 } 213 -re "$gdb_prompt $"\ 214 {fail "define hook undefined command: bar"} 215 timeout {fail "(timeout) define hook undefined command: bar"} 216 } 217 } 218 -re "$gdb_prompt $"\ 219 {fail "define hook undefined command: bar"} 220 timeout {fail "(timeout) define hook undefined command: bar"} 221} 222 223# Test creation of an additional target subcommand. 224gdb_test_multiple "define target testsuite" "" { 225 -re "Type commands for definition of \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" { 226 gdb_test "printf \"hello\\n\"\nend" "" "define target testsuite" 227 } 228} 229gdb_test_multiple "document target testsuite" "" { 230 -re "Type documentation for \"target testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" { 231 gdb_test "A test target.\nend" "" "document target testsuite" 232 } 233} 234 235gdb_test "help target" ".*A test target.*" 236gdb_test "target testsuite" "hello" 237gdb_test "show user target testsuite" "User command \"target testsuite\":\r\n printf \"hello\\\\n\"\r\n" 238 239# We should even be able to hook subcommands. 240gdb_test_multiple "define target hook-testsuite" "" { 241 -re "Type commands for definition of \"target hook-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" { 242 gdb_test "printf \"one\\n\"\nend" "" "define target hook-testsuite" 243 } 244} 245 246gdb_test_multiple "define target hookpost-testsuite" "" { 247 -re "Type commands for definition of \"target hookpost-testsuite\".\r\nEnd with a line saying just \"end\".\r\n>$" { 248 gdb_test "printf \"two\\n\"\nend" "" "define target hookpost-testsuite" 249 } 250} 251 252gdb_test "target testsuite" "one\r\nhello\r\ntwo" "target testsuite with hooks" 253 254# This is a quasi-define command: Verify that the user can redefine 255# GDB's gdb_prompt. 256# 257gdb_test_multiple "set prompt \\(blah\\) " "set gdb_prompt" { 258 -re "\\(blah\\) $" { 259 pass "set gdb_prompt" 260 } 261} 262 263gdb_test_multiple "set prompt \\(gdb\\) " "reset gdb_prompt" { 264 -re "$gdb_prompt $" { 265 pass "reset gdb_prompt" 266 } 267} 268 269gdb_exit 270return 0 271