From patchwork Thu Apr 27 19:06:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergio Durigan Junior X-Patchwork-Id: 20185 Received: (qmail 79399 invoked by alias); 27 Apr 2017 19:06:12 -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 79389 invoked by uid 89); 27 Apr 2017 19:06:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= 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 ESMTP; Thu, 27 Apr 2017 19:06:08 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD98C80069; Thu, 27 Apr 2017 19:06:08 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com BD98C80069 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sergiodj@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com BD98C80069 Received: from localhost (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 35D968293B; Thu, 27 Apr 2017 19:06:07 +0000 (UTC) From: Sergio Durigan Junior To: Pedro Alves Cc: GDB Patches , Luis Machado Subject: Re: [PATCH v3] Make environ.exp run on all platforms (and create info-program.exp) References: <20170331172901.23402-1-sergiodj@redhat.com> <20170426222833.9679-1-sergiodj@redhat.com> <03a5e3b7-054a-4c2b-a41b-b496333f349a@redhat.com> Date: Thu, 27 Apr 2017 15:06:07 -0400 In-Reply-To: <03a5e3b7-054a-4c2b-a41b-b496333f349a@redhat.com> (Pedro Alves's message of "Thu, 27 Apr 2017 15:52:59 +0100") Message-ID: <874lx9zn4w.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes On Thursday, April 27 2017, Pedro Alves wrote: > On 04/26/2017 11:28 PM, Sergio Durigan Junior wrote: >> Changes since v2: >> >> - Removed \t when matching the output of 'info program'. >> >> This has been on my TODO list for a while. There's a really old bug >> about this (PR testsuite/8595), and there was no reason for >> environ.exp to be specific for hppa* targets. So this patch removes >> this constraint, modernizes the testcase, and cleans up some things. >> Most of the tests remained, and some were rewritten (especially the >> one that checks if "show environment" works, which is something kind >> of hard to do). > > It'd be good to cross check for overlap with gdb.base/testenv.exp. One could say there is overlap, but testenv.exp is basically testing the interaction between GDB's environment system with live inferiors, while environ.exp is testing the "set/show" commands only. They are both worth having. >> # Verify that we can show all currently-set environment variables. >> -# (It's a bit hacky, but nonetheless probably safe to check for at >> -# least the SHELL variable.) >> -# >> -# need to increase timeout because of very long output >> -set oldtimeout $timeout >> -set timeout [expr "$timeout + 300"] >> - >> -send_gdb "show environment\n" >> -gdb_expect { >> - -re ".*SHELL=(\[a-zA-Z0-9\]*).*$gdb_prompt $"\ >> - {pass "show environment"} >> - -re "$gdb_prompt $"\ >> - {fail "show environment"} >> - timeout {fail "(timeout) show environment"} >> -} >> -set timeout $oldtimeout >> +# It's hard to do this verification since we can't really compare each >> +# entry with the current environment. So we just check to see if >> +# there is anything that looks like an environment variable being >> +# printed. >> +gdb_test "show environment" "(\[A-Za-z_\]+=.*)+" \ >> + "show environment works" > > We can easily set a variable in the environment before spawning GDB. > We'd just have to limit that specific test to when not testing with a > remote host, I think? See gdb.base/gdbhistsize-history.exp for example. Yeah, I thought about that, but what this command really wants to test is that there is a list of environment variables. testenv.exp has a test that does just what you described; I'd rather leave the environ.exp test like it is now, unless you really think it's worth doing it as you proposed. > >> +gdb_test_multiple "unset environment" $msg { >> + -re "Delete all environment variables.*y or n.*$" { >> + gdb_test_no_output "y" $msg >> + } >> + -re "$gdb_prompt $" { >> + fail $msg >> + } >> } > > The '-re "$gdb_prompt $"' part is not necessary because > gdb_test_multiple already does that by default. > And then you can use gdb_test for this: > > gdb_test "unset environment" "" $msg \ > "Delete all environment variables. .y or n. $" \ > "y" Hm, thanks, fixed that. >> -# Verify that GDB can manipulate the distinguished PATH variable. >> -# >> -send_gdb "path /tmp/FOOBARBAZGRUNGESPAZBALL\n" >> -gdb_expect { >> - -re ".*Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ >> - {pass "issue path"} >> - -re "$gdb_prompt $"\ >> - {fail "issue path"} >> - timeout {fail "(timeout) issue path"} >> -} >> -send_gdb "show paths\n" >> -gdb_expect { >> - -re "Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ >> - {pass "show paths"} >> - -re "$gdb_prompt $"\ >> - {fail "show paths"} >> - timeout {fail "(timeout) show paths"} > > Any reason these "path" command tests are dropped? > (AFAICS, the MI equivalent is tested by gdb.mi/mi-basics.exp). Somehow I thought these tests were not really testing anything useful. I've put them back now. >> -} >> +gdb_test_no_output "set environment FOOBARBAZGRUNGESPAZBALL = foo" \ >> + "set environment variable with trailing whitespace" >> +gdb_test "show environment FOOBARBAZGRUNGESPAZBALL" \ >> + "FOOBARBAZGRUNGESPAZBALL = foo" \ >> + "confirm set environment variable with trailing whitespace" >> >> gdb_exit >> return 0 >> diff --git a/gdb/testsuite/gdb.base/info-program.exp b/gdb/testsuite/gdb.base/info-program.exp >> new file mode 100644 >> index 0000000..e5e5fb9 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.base/info-program.exp >> @@ -0,0 +1,45 @@ >> +# Copyright 2017 Free Software Foundation, Inc. > > If the moved code is based on older code, the original copyright year > must be preserved. Fixed. Below is the updated patch. Thanks for the review, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c4d5b79..c3279ad 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2017-04-27 Sergio Durigan Junior + + PR testsuite/8595 + * gdb.base/environ.exp: Make test available in all architectures. + Move bits related to "info program" testing to + gdb.base/info-program.exp. Rewrite tests to use the two new + procedures mentione below. + (test_set_show_env_var) New procedure. + (test_set_show_env_var_equal): Likewise. + * gdb.base/info-program.exp: New file. + 2017-04-19 Pedro Alves * gdb.threads/threadapply.exp (kill_and_remove_inferior): New diff --git a/gdb/testsuite/gdb.base/environ.exp b/gdb/testsuite/gdb.base/environ.exp index a833f79..dd7bd8f 100644 --- a/gdb/testsuite/gdb.base/environ.exp +++ b/gdb/testsuite/gdb.base/environ.exp @@ -13,297 +13,95 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . */ -# -# test running programs -# +gdb_start -# This test exists solely to exercise the "environment" commands for -# code-coverage on HP-UX. -# -if ![istarget "hppa*-*-hpux*"] then { - return -} - -standard_testfile break.c break1.c - -if {[prepare_for_testing "failed to prepare" $testfile \ - [list $srcfile $srcfile2] {debug nowarnings}]} { - return -1 -} - -if ![runto_main] then { fail "environment command tests suppressed" } - -# (No, this is not really related to the environment commands. But it's -# a convenient place to verify that this command works.) -# -send_gdb "info program\n" -gdb_expect { - -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped at breakpoint 1..*$gdb_prompt $"\ - {pass "info program"} - -re "$gdb_prompt $"\ - {fail "info program"} - timeout {fail "(timeout) info program"} -} - -# We don't really care where this step lands, so long as it gets -# the inferior pushed off the breakpoint it's currently on... -# -send_gdb "next\n" -gdb_expect { - -re ".*$gdb_prompt $"\ - {pass "step before info program"} - timeout {fail "(timeout) step before info program"} +proc test_set_show_env_var { name value test_name } { + gdb_test_no_output "set environment $name $value" "$test_name" + gdb_test "show environment $name" "$name = $value" \ + "confirm $test_name" } -send_gdb "info program\n" -gdb_expect { - -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped after being stepped..*$gdb_prompt $"\ - {pass "info program after step"} - -re "$gdb_prompt $"\ - {fail "info program after step"} - timeout {fail "(timeout) info program after step"} -} - -if ![runto_main] then { fail "environment command tests suppressed" } -send_gdb "delete\n" -gdb_expect { - -re ".*y or n. $"\ - {send_gdb "y\n" - gdb_expect { - -re ".*$gdb_prompt $"\ - {pass "delete breakpoint before info program"} - timeout {fail "(timeout) delete breakpoint before info program"} - } - } - -re "$gdb_prompt $"\ - {fail "delete breakpoint before info program"} - timeout {fail "(timeout) delete breakpoint before info program"} -} -send_gdb "info program\n" -gdb_expect { - -re ".*Using the running image of child process \[0-9\]*.\r\nProgram stopped at 0x\[0-9a-fA-F\]*.\r\nIt stopped at a breakpoint that has since been deleted..*$gdb_prompt $"\ - {pass "info program after deleted breakpoint"} - -re "$gdb_prompt $"\ - {fail "info program after deleted breakpoint"} - timeout {fail "(timeout) info program after deleted breakpoint"} +proc test_set_show_env_var_equal { name value test_name } { + gdb_test_no_output "set environment $name = $value" "$test_name" + gdb_test "show environment $name" "$name = $value" \ + "confirm $test_name" } # Verify that we can show all currently-set environment variables. -# (It's a bit hacky, but nonetheless probably safe to check for at -# least the SHELL variable.) -# -# need to increase timeout because of very long output -set oldtimeout $timeout -set timeout [expr "$timeout + 300"] - -send_gdb "show environment\n" -gdb_expect { - -re ".*SHELL=(\[a-zA-Z0-9\]*).*$gdb_prompt $"\ - {pass "show environment"} - -re "$gdb_prompt $"\ - {fail "show environment"} - timeout {fail "(timeout) show environment"} -} -set timeout $oldtimeout +# It's hard to do this verification since we can't really compare each +# entry with the current environment. So we just check to see if +# there is anything that looks like an environment variable being +# printed. +gdb_test "show environment" "(\[A-Za-z_\]+=.*)+" \ + "show environment works" # Verify that we can unset a specific environment variable. -# -send_gdb "unset environment EDITOR\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue unset environment"} - timeout {fail "(timeout) issue unset environment"} -} -send_gdb "show environment EDITOR\n" -gdb_expect { - -re "Environment variable \"EDITOR\" not defined.\r\n$gdb_prompt $"\ - {pass "unset environment"} - -re "$gdb_prompt $"\ - {fail "unset environment"} - timeout {fail "(timeout) unset environment"} -} +gdb_test_no_output "unset environment EDITOR" "unset environment variable" + +gdb_test "show environment EDITOR" "Environment variable \"EDITOR\" not defined\." \ + "confirm unset environment variable worked" # Verify that we can unset all environment variables. -# -send_gdb "unset environment\n" -gdb_expect { - -re "Delete all environment variables.*y or n. $"\ - {send_gdb "y\n" - gdb_expect { - -re "$gdb_prompt $"\ - {pass "unset entire environment"} - timeout {fail "(timeout) unset entire environment"} - } - } - -re "$gdb_prompt $"\ - {fail "unset entire environment"} - timeout {fail "(timeout) unset entire environment"} -} +gdb_test "unset environment" "" "unset all environment variables" \ + "Delete all environment variables. .y or n. $" \ + "y" # Verify that we can set a specific environment variable. -# -send_gdb "set environment EDITOR emacs\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue set environment"} - timeout {fail "(timeout) issue set environment"} -} -send_gdb "show environment EDITOR\n" -gdb_expect { - -re "EDITOR = emacs\r\n$gdb_prompt $"\ - {pass "set environment"} - -re "$gdb_prompt $"\ - {fail "set environment"} - timeout {fail "(timeout) set environment"} -} +test_set_show_env_var "EDITOR" "emacs" "set environment variable" # Verify that GDB responds gracefully to a request to set environment, # with no variable name. -# -send_gdb "set environment\n" -gdb_expect { - -re "Argument required .environment variable and value..*$gdb_prompt $"\ - {pass "set environment without variable disallowed"} - -re "$gdb_prompt $"\ - {fail "set environment without variable disallowed"} - timeout {fail "(timeout) set environment without variable disallowed"} -} +gdb_test "set environment" "Argument required \\\(environment variable and value\\\)\." \ + "set environment without arguments" # I'm not sure just what GDB has in mind in explicitly checking # for this variant, but since GDB handles it, test it. -# -send_gdb "set environment =\n" -gdb_expect { - -re "Argument required .environment variable to set..*$gdb_prompt $"\ - {pass "set environment equals without variable disallowed"} - -re "$gdb_prompt $"\ - {fail "set environment equals without variable disallowed"} - timeout {fail "(timeout) set environment equals without variable disallowed"} -} +gdb_test "set environment =" "Argument required \\\(environment variable to set\\\)\." \ + "set environment without variable name" # Setting an environment variable without a value sets it to a NULL # value. -# -send_gdb "set environment EDITOR\n" -gdb_expect { - -re "Setting environment variable \"EDITOR\" to null value..*$gdb_prompt $"\ - {pass "issue set environment without variable value"} - -re "$gdb_prompt $"\ - {fail "issue set environment without variable value"} - timeout {fail "(timeout) issue set environment without variable value"} -} -send_gdb "show environment EDITOR\n" -gdb_expect { - -re "EDITOR = \r\n$gdb_prompt $"\ - {pass "set environment without variable value"} - -re "$gdb_prompt $"\ - {fail "set environment without variable value"} - timeout {fail "(timeout) set environment without variable value"} -} +gdb_test "set environment EDITOR" "Setting environment variable \"EDITOR\" to null value\." \ + "set environment variable to null value" +gdb_test "show environment EDITOR" "EDITOR = " "show null environment variable" # Verify that GDB responds gracefully to an attempt to show a # non-existent environment variable. (We hope this variable is # undefined!) -# -send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re "Environment variable \"FOOBARBAZGRUNGESPAZBALL\" not defined..*$gdb_prompt $"\ - {pass "show non-existent environment variable disallowed"} - -re "$gdb_prompt $"\ - {fail "show non-existent environment variable disallowed"} - timeout {fail "(timeout) show non-existent environment variable disallowed"} -} +gdb_test "show environment FOOBARBAZGRUNGESPAZBALL" \ + "Environment variable \"FOOBARBAZGRUNGESPAZBALL\" not defined\." \ + "show non-existent environment variable" # Verify that GDB can set an environment variable hitherto undefined. -# -send_gdb "set environment FOOBARBAZGRUNGESPAZBALL t\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue set environment for previously undefined variable"} - timeout {fail "(timeout) issue set environment for previously undefined variable"} -} -send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re "FOOBARBAZGRUNGESPAZBALL = t\r\n$gdb_prompt $"\ - {pass "set environment for previously undefined variable"} - -re "$gdb_prompt $"\ - {fail "set environment for previously undefined variable"} - timeout {fail "(timeout) set environment for previously undefined variable"} -} +test_set_show_env_var "FOOBARBAZGRUNGESPAZBALL" "t" \ + "set environment variable previously undefined" # Verify that GDB can also set an environment variable using the "=" # syntax. -# -send_gdb "set environment FOOBARBAZGRUNGESPAZBALL = t\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue set environment with equals"} - timeout {fail "(timeout) issue set environment with equals"} -} -send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re "FOOBARBAZGRUNGESPAZBALL = t\r\n$gdb_prompt $"\ - {pass "set environment with equals"} - -re "$gdb_prompt $"\ - {fail "set environment with equals"} - timeout {fail "(timeout) set environment with equals"} -} +test_set_show_env_var_equal "FOOBARBAZGRUNGESPAZBALL" "y" \ + "set environment variable using = syntax" # Verify that GDB can set an environment variable to a value that has # an embedded (trailing, in this case) equals. -# -send_gdb "set environment FOOBARBAZGRUNGESPAZBALL t=\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue set environment with trailing equals"} - timeout {fail "(timeout) issue set environment with trailing equals"} -} -send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re "FOOBARBAZGRUNGESPAZBALL = t=\r\n$gdb_prompt $"\ - {pass "set environment with trailing equals"} - -re "$gdb_prompt $"\ - {fail "set environment with trailing equals"} - timeout {fail "(timeout) set environment with trailing equals"} -} +test_set_show_env_var_equal "FOOBARBAZGRUNGESPAZBALL" "t=" \ + "set environment variable with trailing equals" # Verify that GDB can set an environment variable to a value preceded # by whitespace, and that such whitespace is ignored (not included # in the set value). -# -send_gdb "set environment FOOBARBAZGRUNGESPAZBALL = foo\n" -gdb_expect { - -re "$gdb_prompt $"\ - {pass "issue set environment with preceding whitespace"} - timeout {fail "(timeout) issue set environment with preceding whitespace"} -} -send_gdb "show environment FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re "FOOBARBAZGRUNGESPAZBALL = foo\r\n$gdb_prompt $"\ - {pass "set environment with preceding whitespace"} - -re "$gdb_prompt $"\ - {fail "set environment with preceding whitespace"} - timeout {fail "(timeout) set environment with preceding whitespace"} -} +gdb_test_no_output "set environment FOOBARBAZGRUNGESPAZBALL = foo" \ + "set environment variable with trailing whitespace" +gdb_test "show environment FOOBARBAZGRUNGESPAZBALL" \ + "FOOBARBAZGRUNGESPAZBALL = foo" \ + "confirm set environment variable with trailing whitespace" # Verify that GDB can manipulate the distinguished PATH variable. -# -send_gdb "path /tmp/FOOBARBAZGRUNGESPAZBALL\n" -gdb_expect { - -re ".*Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ - {pass "issue path"} - -re "$gdb_prompt $"\ - {fail "issue path"} - timeout {fail "(timeout) issue path"} -} -send_gdb "show paths\n" -gdb_expect { - -re "Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*$gdb_prompt $"\ - {pass "show paths"} - -re "$gdb_prompt $"\ - {fail "show paths"} - timeout {fail "(timeout) show paths"} -} +gdb_test "path /tmp/FOOBARBAZGRUNGESPAZBALL" \ + ".*Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*" \ + "set path containing env var name" +gdb_test "show paths" \ + "Executable and object file path: /tmp/FOOBARBAZGRUNGESPAZBALL.*" \ + "show paths correctly show path with env var name" gdb_exit return 0 diff --git a/gdb/testsuite/gdb.base/info-program.exp b/gdb/testsuite/gdb.base/info-program.exp new file mode 100644 index 0000000..e3690c8 --- /dev/null +++ b/gdb/testsuite/gdb.base/info-program.exp @@ -0,0 +1,45 @@ +# Copyright 1997-2017 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 normal.c + +if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { + return -1 +} + +if { ![runto_main] } { + fail "can't run to main" + return -1 +} + +gdb_test "info program" ".*\r\nProgram stopped at $hex\.\r\nIt stopped at breakpoint $decimal\.\r\nType \"info stack\" or \"info registers\" for more information\." \ + "info program after run to main" + +# We don't really care where this step lands, so long as it gets +# the inferior pushed off the breakpoint it's currently on... +gdb_test "next" "$decimal\t.*" "advancing pc" + +gdb_test "info program" ".*\r\nProgram stopped at $hex\.\r\nIt stopped after being stepped\.\r\nType \"info stack\" or \"info registers\" for more information\." \ + "info program after next" + +if { ![runto_main] } then { + fail "can't restart program" + return -1 +} + +delete_breakpoints + +gdb_test "info program" ".*\r\nProgram stopped at $hex\.\r\nIt stopped at a breakpoint that has since been deleted\.\r\nType \"info stack\" or \"info registers\" for more information\." \ + "info program after deleting all breakpoints"