Add "new-ui console" tests
This adds a test that uses new-ui to create a secondary console, and then runs some basic smoke tests. It ensures that: - synchronous commands send output to the UI that initiated it - asynchronous events like breakpoint hits are reported on all consoles. - "new-ui" without arguments doesn't crash. - The "new-ui" command doesn't repeat. gdb/testsuite/ChangeLog: 2016-06-21 Pedro Alves <palves@redhat.com> * gdb.base/new-ui.exp: New file. * lib/mi-support.exp (switch_gdb_spawn_id): Move to ... * lib/gdb.exp (switch_gdb_spawn_id): ... here. (with_spawn_id): New procedure.
This commit is contained in:
parent
49940788ab
commit
ac69f7863a
|
@ -1,3 +1,10 @@
|
|||
2016-06-21 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.base/new-ui.exp: New file.
|
||||
* lib/mi-support.exp (switch_gdb_spawn_id): Move to ...
|
||||
* lib/gdb.exp (switch_gdb_spawn_id): ... here.
|
||||
(with_spawn_id): New procedure.
|
||||
|
||||
2016-06-21 Pedro Alves <palves@redhat.com>
|
||||
|
||||
* gdb.mi/mi-exec-run.exp: New file.
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2016 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/>.
|
||||
|
||||
*/
|
||||
|
||||
volatile int global = 0;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1; /* set break main console here */
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1;
|
||||
global = 1; /* set break extra console here */
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,146 @@
|
|||
# Copyright 2016 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/>.
|
||||
|
||||
standard_testfile
|
||||
|
||||
set compile_options "debug"
|
||||
if {[build_executable $testfile.exp $testfile ${srcfile} ${compile_options}] == -1} {
|
||||
untested "failed to compile $testfile"
|
||||
return -1
|
||||
}
|
||||
|
||||
# Ensure no output has been sent. Use MESSAGE as test message.
|
||||
|
||||
proc ensure_no_output {message} {
|
||||
global decimal
|
||||
|
||||
# Run a command and use an anchor to make sure no output appears
|
||||
# before the command's expected output.
|
||||
gdb_test "print 999" "^print 999\r\n\\\$$decimal = 999" $message
|
||||
}
|
||||
|
||||
# Run a few execution-related commands on CON1, and ensure the proper
|
||||
# output, or none, if appropriate, is sent to CON2. CON1_NAME and
|
||||
# CON2_NAME are the names of the consoles.
|
||||
|
||||
proc do_execution_tests {con1 con1_name con2 con2_name} {
|
||||
global srcfile
|
||||
global decimal
|
||||
|
||||
set bp_lineno [gdb_get_line_number "set break $con1_name here"]
|
||||
|
||||
with_spawn_id $con1 {
|
||||
gdb_test "next" "global = 1;"
|
||||
}
|
||||
with_spawn_id $con2 {
|
||||
ensure_no_output "next causes no spurious output on other console"
|
||||
}
|
||||
|
||||
with_spawn_id $con1 {
|
||||
gdb_test "break $srcfile:$bp_lineno" \
|
||||
"Breakpoint $decimal .*$srcfile, line $bp_lineno\\." \
|
||||
"set breakpoint"
|
||||
}
|
||||
with_spawn_id $con2 {
|
||||
ensure_no_output "break causes no spurious output on other console"
|
||||
}
|
||||
|
||||
with_spawn_id $con1 {
|
||||
gdb_test "continue" "set break $con1_name here .*" "continue to breakpoint"
|
||||
}
|
||||
|
||||
with_spawn_id $con2 {
|
||||
set test "breakpoint hit reported on other console"
|
||||
gdb_test_multiple "" $test {
|
||||
-re "Breakpoint $decimal, .* set break $con1_name here " {
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# The test proper.
|
||||
|
||||
proc do_test {} {
|
||||
global srcfile testfile
|
||||
global gdb_prompt
|
||||
global gdb_spawn_id
|
||||
global gdb_main_spawn_id extra_spawn_id
|
||||
|
||||
clean_restart $testfile
|
||||
|
||||
if ![runto_main] {
|
||||
untested "could not run to main"
|
||||
return -1
|
||||
}
|
||||
|
||||
gdb_test "new-ui" \
|
||||
"usage: new-ui <interpreter> <tty>" \
|
||||
"new-ui without arguments"
|
||||
|
||||
set test "new-ui does not repeat"
|
||||
send_gdb "\n"
|
||||
gdb_test_multiple "" $test {
|
||||
-re "^\r\n$gdb_prompt $" {
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
|
||||
# Save the main UI's spawn ID.
|
||||
set gdb_main_spawn_id $gdb_spawn_id
|
||||
|
||||
# Create the new PTY for the secondary console UI.
|
||||
spawn -pty
|
||||
set extra_spawn_id $spawn_id
|
||||
set extra_tty_name $spawn_out(slave,name)
|
||||
gdb_test_multiple "new-ui console $extra_tty_name" "new-ui" {
|
||||
-re "New UI allocated\r\n$gdb_prompt $" {
|
||||
}
|
||||
}
|
||||
|
||||
with_spawn_id $extra_spawn_id {
|
||||
set test "initial prompt on extra console"
|
||||
gdb_test_multiple "" $test {
|
||||
-re "$gdb_prompt $" {
|
||||
pass $test
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure non-execution commands in one console don't cause output
|
||||
# in the other consoles.
|
||||
with_spawn_id $gdb_main_spawn_id {
|
||||
gdb_test "print 1" "^print 1\r\n\\\$1 = 1" "print on main console"
|
||||
}
|
||||
with_spawn_id $extra_spawn_id {
|
||||
gdb_test "print 2" "^print 2\r\n\\\$2 = 2" "print on extra console"
|
||||
}
|
||||
|
||||
# Run a few execution tests with the main console as the driver
|
||||
# console.
|
||||
with_test_prefix "main console" {
|
||||
do_execution_tests \
|
||||
$gdb_main_spawn_id "main console" \
|
||||
$extra_spawn_id "extra console"
|
||||
}
|
||||
# Same, but with the extra console as driver.
|
||||
with_test_prefix "extra console" {
|
||||
do_execution_tests \
|
||||
$extra_spawn_id "extra console" \
|
||||
$gdb_main_spawn_id "main console"
|
||||
}
|
||||
}
|
||||
|
||||
do_test
|
|
@ -2075,6 +2075,38 @@ proc with_target_charset { target_charset body } {
|
|||
}
|
||||
}
|
||||
|
||||
# Switch the default spawn id to SPAWN_ID, so that gdb_test,
|
||||
# mi_gdb_test etc. default to using it.
|
||||
|
||||
proc switch_gdb_spawn_id {spawn_id} {
|
||||
global gdb_spawn_id
|
||||
global board board_info
|
||||
|
||||
set gdb_spawn_id $spawn_id
|
||||
set board [host_info name]
|
||||
set board_info($board,fileid) $spawn_id
|
||||
}
|
||||
|
||||
# Run BODY with SPAWN_ID as current spawn id.
|
||||
|
||||
proc with_spawn_id { spawn_id body } {
|
||||
global gdb_spawn_id
|
||||
|
||||
set saved_spawn_id $gdb_spawn_id
|
||||
switch_gdb_spawn_id $spawn_id
|
||||
|
||||
set code [catch {uplevel 1 $body} result]
|
||||
|
||||
switch_gdb_spawn_id $saved_spawn_id
|
||||
|
||||
if {$code == 1} {
|
||||
global errorInfo errorCode
|
||||
return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
|
||||
} else {
|
||||
return -code $code $result
|
||||
}
|
||||
}
|
||||
|
||||
# Select the largest timeout from all the timeouts:
|
||||
# - the local "timeout" variable of the scope two levels above,
|
||||
# - the global "timeout" variable,
|
||||
|
|
|
@ -122,18 +122,6 @@ proc mi_create_inferior_pty {} {
|
|||
}
|
||||
}
|
||||
|
||||
# Switch the default spawn id to SPAWN_ID, so that mi_gdb_test
|
||||
# etc. default to using it.
|
||||
|
||||
proc switch_gdb_spawn_id {spawn_id} {
|
||||
global gdb_spawn_id
|
||||
global board board_info
|
||||
|
||||
set gdb_spawn_id $spawn_id
|
||||
set board [host_info name]
|
||||
set board_info($board,fileid) $spawn_id
|
||||
}
|
||||
|
||||
proc mi_gdb_start_separate_mi_tty { args } {
|
||||
global gdb_prompt mi_gdb_prompt
|
||||
global timeout
|
||||
|
|
Loading…
Reference in New Issue