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