From: Pedro Alves Date: Tue, 21 Jun 2016 00:11:57 +0000 (+0100) Subject: Add "new-ui console" tests X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ac69f7863a6b5dbd1792356275de437371b8c879;p=binutils-gdb.git 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 * 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. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 6790c45c762..ae0edb376f9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-06-21 Pedro Alves + + * 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 * gdb.mi/mi-exec-run.exp: New file. diff --git a/gdb/testsuite/gdb.base/new-ui.c b/gdb/testsuite/gdb.base/new-ui.c new file mode 100644 index 00000000000..8fff0bcde25 --- /dev/null +++ b/gdb/testsuite/gdb.base/new-ui.c @@ -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 . + +*/ + +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; +} diff --git a/gdb/testsuite/gdb.base/new-ui.exp b/gdb/testsuite/gdb.base/new-ui.exp new file mode 100644 index 00000000000..f3f66db47fe --- /dev/null +++ b/gdb/testsuite/gdb.base/new-ui.exp @@ -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 . + +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 " \ + "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 diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 878da16bb35..b52fdd9c5d5 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -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, diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index edfc07dba82..7b5c90b5314 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -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