1# Copyright 1999-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# 17# Test basic Machine interface (MI) operations 18# 19# Verify that, using the MI, we can load a program and do 20# other basic things that are used by all test files through mi_gdb_exit, 21# mi_gdb_start, mi_delete_breakpoints, mi_gdb_reinitialize_dir and 22# mi_gdb_load, so we can safely use those. 23# 24# The goal is not to test gdb functionality, which is done by other tests, 25# but the command syntax and correct output response to MI operations. 26# 27 28load_lib mi-support.exp 29set MIFLAGS "-i=mi" 30 31gdb_exit 32if [mi_gdb_start separate-inferior-tty] { 33 continue 34} 35 36standard_testfile basics.c 37# This file was audited to ensure that the explicit references to 38# objdir in it are safe for parallel testing. Please be sure to 39# maintain this property in any additions. 40set escapedobjdir [string_to_regexp ${objdir}] 41set testsubdir [standard_output_file ""] 42set envirodir [string_to_regexp $testsubdir] 43 44if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { 45 untested mi-basics.exp 46 return -1 47} 48 49# In this file we want to test if the operations needed by the following 50# procedures work, so it makes no sense using them here. 51 52# mi_delete_breakpoints 53# mi_gdb_reinitialize_dir $srcdir/$subdir 54# mi_gdb_load ${binfile} 55 56# Test if the MI interpreter has been configured 57 58proc test_mi_interpreter_selection {} { 59 global mi_gdb_prompt 60 global gdb_prompt 61 62 # All this test expects is to get the prompt back 63 # with no syntax error message 64 if ![mi_gdb_test "-gdb-version" "~\"GNU gdb.*" "acceptance of MI operations"] { 65 return 1 66 } 67 68 note "Skipping all other MI tests." 69 return 0 70} 71 72proc test_exec_and_symbol_mi_operatons {} { 73 global mi_gdb_prompt 74 global binfile testfile 75 76 if [is_remote host] { 77 set filename ${testfile} 78 remote_download host ${binfile} ${filename} 79 } else { 80 set filename ${binfile} 81 } 82 83 # Load symbols and specify executable on a single operation 84 # Tests: 85 # -file-exec-and-symbols 86 87 if [mi_gdb_test "-file-exec-and-symbols ${filename}" "\\\^done" \ 88 "file-exec-and-symbols operation"] { 89 note "Skipping all other MI tests." 90 return 0 91 } 92 93 # The following is not used by mi-support.exp, but we test here so 94 # we get done with loading a program basics. 95 96 # Do it again, but now load symbols and specify executable with 97 # two separate operations 98 # Tests: 99 # -file-clear 100 # -file-exec-file 101 # -file-symbol-file 102 103 # FIXME: file-clear is not implemented yet. 104# mi_gdb_test "-file-clear" \ 105# "\\\^done" \ 106# "file-clear operation" 107 108 mi_gdb_test "-file-exec-file ${filename}" \ 109 "\\\^done" \ 110 "file-exec-file operation" 111 112 mi_gdb_test "-file-symbol-file ${filename}" \ 113 "\\\^done" \ 114 "file-symbol-file operation" 115 116 # We need to return != 0. 117 return 1 118} 119 120proc test_breakpoints_deletion {} { 121 global mi_gdb_prompt 122 global srcfile 123 124 # Clear all breakpoints and list to confirm 125 # Tests: 126 # -break-delete (all) 127 # -break-list 128 129 # The all parameter is actually no parameter. 130 mi_gdb_test "200-break-delete" \ 131 "200\\\^done" \ 132 "break-delete (all) operation" 133 134 mi_gdb_test "201-break-list" \ 135 ".*\\\^done,BreakpointTable=\\\{.*,body=\\\[\\\]\\\}" \ 136 "all breakpoints removed" 137} 138 139proc test_dir_specification {} { 140 global mi_gdb_prompt 141 global envirodir 142 global testsubdir 143 144 # Add to the search directories, display, then reset back to default 145 # Tests: 146 # -environment-directory arg 147 # -environment-directory 148 # -environment-directory -r 149 150 mi_gdb_test "202-environment-directory ${testsubdir}" \ 151 "202\\\^done,source-path=\"${envirodir}.\\\$cdir.\\\$cwd\"" \ 152 "environment-directory arg operation" 153 154 mi_gdb_test "203-environment-directory" \ 155 "203\\\^done,source-path=\"${envirodir}.\\\$cdir.\\\$cwd\"" \ 156 "environment-directory empty-string operation" 157 158 mi_gdb_test "204-environment-directory -r" \ 159 "204\\\^done,source-path=\"\\\$cdir.\\\$cwd\"" \ 160 "environment-directory operation" 161} 162 163proc test_cwd_specification {} { 164 global mi_gdb_prompt 165 global objdir 166 global escapedobjdir 167 168 # Change the working directory, then print the current working directory 169 # Tests: 170 # -environment-cd ${objdir} 171 # -environment-pwd 172 173 mi_gdb_test "205-environment-cd ${objdir}" \ 174 "205\\\^done" \ 175 "environment-cd arg operation" 176 177 # The canonical name of the working directory may differ on a 178 # remote host from that on the build system. 179 if ![is_remote host] { 180 mi_gdb_test "206-environment-pwd" \ 181 "206\\\^done,cwd=\"${escapedobjdir}\"" \ 182 "environment-pwd operation" 183 } 184} 185 186proc test_path_specification {} { 187 global mi_gdb_prompt 188 global orig_path 189 global objdir 190 global escapedobjdir 191 global testsubdir 192 global envirodir 193 global expect_out 194 195 # Add to the path, display, then reset 196 # Tests: 197 # -environment-path 198 # -environment-path dir1 dir2 199 # -environment-path -r dir 200 # -environment-path -r 201 202 mi_gdb_test "-environment-path" "\\\^done,path=\"(.*)\"" "environment-path" 203 set orig_path $expect_out(3,string) 204 205 set orig_path [string_to_regexp ${orig_path}] 206 207 mi_gdb_test "207-environment-path" \ 208 "207\\\^done,path=\"$orig_path\"" \ 209 "environment-path no-args operation" 210 211 mi_gdb_test "208-environment-path $objdir ${testsubdir}" \ 212 "208\\\^done,path=\"$escapedobjdir.${envirodir}.$orig_path\"" \ 213 "environment-path dir1 dir2 operation" 214 215 mi_gdb_test "209-environment-path -r $objdir" \ 216 "209\\\^done,path=\"$escapedobjdir.$orig_path\"" \ 217 "environment-path -r dir operation" 218 219 mi_gdb_test "210-environment-path -r" \ 220 "210\\\^done,path=\"$orig_path\"" \ 221 "environment-path -r operation" 222 223} 224 225proc test_setshow_inferior_tty {} { 226 global mi_gdb_prompt 227 global mi_inferior_tty_name 228 229 # Test that the commands, 230 # -inferior-tty-set 231 # -inferior-tty-show 232 # are setting/getting the same data in GDB. 233 234 mi_gdb_test "301-inferior-tty-show" \ 235 "301\\\^done,inferior_tty_terminal=\"$mi_inferior_tty_name\"" \ 236 "initial tty is mi_inferior_tty_name" 237 238 mi_gdb_test "302-inferior-tty-set /dev/pts/1" \ 239 "302\\\^done" \ 240 "set tty to /dev/pts/1" 241 242 mi_gdb_test "303-inferior-tty-show" \ 243 "303\\\^done,inferior_tty_terminal=\"/dev/pts/1\"" \ 244 "tty was set correctly" 245 246 mi_gdb_test "304-inferior-tty-set" \ 247 "304\\\^done" \ 248 "set tty to the empty string" 249 250 mi_gdb_test "305-inferior-tty-show" \ 251 "305\\\^done" \ 252 "make sure tty is empty" 253 254 mi_gdb_test "306-inferior-tty-set $mi_inferior_tty_name" \ 255 "306\\\^done" \ 256 "set tty to mi_inferior_tty_name (the way it was)" 257 258 mi_gdb_test "307-inferior-tty-show" \ 259 "307\\\^done,inferior_tty_terminal=\"$mi_inferior_tty_name\"" \ 260 "verify tty is correct" 261} 262 263if { [test_mi_interpreter_selection] 264 && [test_exec_and_symbol_mi_operatons] } { 265 test_breakpoints_deletion 266 test_dir_specification 267 test_cwd_specification 268 test_path_specification 269 test_setshow_inferior_tty 270} 271 272mi_gdb_exit 273return 0 274