From patchwork Thu May 26 18:37:38 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 12538 Received: (qmail 9088 invoked by alias); 26 May 2016 18:37:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 9074 invoked by uid 89); 26 May 2016 18:37:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.3 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=reviews, asynchronous, timeouts, do_test X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 26 May 2016 18:37:41 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E46BA85364 for ; Thu, 26 May 2016 18:37:39 +0000 (UTC) Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4QIbcJA026105 for ; Thu, 26 May 2016 14:37:39 -0400 Subject: [PATCH v3 35/34] Add "new-ui console" tests To: gdb-patches@sourceware.org References: <1462538104-19109-1-git-send-email-palves@redhat.com> From: Pedro Alves Message-ID: Date: Thu, 26 May 2016 19:37:38 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <1462538104-19109-1-git-send-email-palves@redhat.com> I'm adding this one to the series to cover a few bugs that were pointed out in earlier reviews, and more. From 19266f547086ae4f25900c1eeb10796f8951ee40 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 26 May 2016 13:12:32 +0100 Subject: [PATCH] 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: yyyy-mm-dd Pedro Alves * gdb.base/new-ui.c: New file. * 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. --- gdb/testsuite/gdb.base/new-ui.c | 42 +++++++++++ gdb/testsuite/gdb.base/new-ui.exp | 146 ++++++++++++++++++++++++++++++++++++++ gdb/testsuite/lib/gdb.exp | 32 +++++++++ gdb/testsuite/lib/mi-support.exp | 12 ---- 4 files changed, 220 insertions(+), 12 deletions(-) create mode 100644 gdb/testsuite/gdb.base/new-ui.c create mode 100644 gdb/testsuite/gdb.base/new-ui.exp diff --git a/gdb/testsuite/gdb.base/new-ui.c b/gdb/testsuite/gdb.base/new-ui.c new file mode 100644 index 0000000..8fff0bc --- /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 0000000..f3f66db --- /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 a374370..40de630 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -2070,6 +2070,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 edfc07d..7b5c90b 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