From: Pedro Alves Date: Thu, 12 Oct 2017 17:27:20 +0000 (+0100) Subject: Fix gdb.base/testenv.exp against --target_board=native-extended-gdbserver X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=50500caf810fcc6c05e3fd89bc37fe8f9e4adb07;p=binutils-gdb.git Fix gdb.base/testenv.exp against --target_board=native-extended-gdbserver Currently we get: Running ..../src/gdb/testsuite/gdb.base/testenv.exp ... FAIL: gdb.base/testenv.exp: test no TEST_GDB var FAIL: gdb.base/testenv.exp: test with one TEST_GDB var FAIL: gdb.base/testenv.exp: test with two TEST_GDB var FAIL: gdb.base/testenv.exp: test with one TEST_GDB var, after unset FAIL: gdb.base/testenv.exp: test with TEST_GDB_GLOBAL FAIL: gdb.base/testenv.exp: test with TEST_GDB_GLOBAL unset The problem is that the testcase relies on stdio. While we could fix this for gdbserver by read output from inferior_spawn_id, a better fix it to not rely on stdio at all. That's what this commit does. Instead, it reads variables off of the inferior to extract the necessary information. Along the way, most of the .exp file is reimplemented/cleaned up using more modern mechanisms. E.g., with_test_prefix, proc_with_prefix, save_vars, etc. Also, a missing check for "is_remote host" is added. gdb/testsuite/ChangeLog: 2017-10-13 Pedro Alves * gdb.base/testenv.exp: Check use_gdb_stub instead of is_remote. (test_num_test_vars, run_and_count_vars, find_env) (test_set_unset_env, test_inherit_env_var): New procedures. (top level): Use them. --- diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index aa016c82370..e6fc382f023 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2017-10-13 Pedro Alves + + * gdb.base/testenv.exp: Check use_gdb_stub instead of is_remote. + (test_num_test_vars, run_and_count_vars, find_env) + (test_set_unset_env, test_inherit_env_var): New procedures. + (top level): Use them. + 2017-10-13 Pedro Alves * lib/selftest-support.exp (selftest_setup): Extend comments, and diff --git a/gdb/testsuite/gdb.base/testenv.exp b/gdb/testsuite/gdb.base/testenv.exp index 52becfd2202..82bbdd2a339 100644 --- a/gdb/testsuite/gdb.base/testenv.exp +++ b/gdb/testsuite/gdb.base/testenv.exp @@ -18,9 +18,10 @@ # Check if environment variables are correctly passed to inferiors # -# There's no support for passing environment variables in the remote protocol. -if { [is_remote target] } { - return 0 +# Can't pass environment variables to the inferior if when we connect, +# the inferior is already running. +if [target_info exists use_gdb_stub] { + return } standard_testfile .c @@ -32,92 +33,154 @@ if { [prepare_for_testing "failed to prepare" ${binfile} ${srcfile}] } { return -1 } -# make sure $pc is sane, in case we're talking to a board. -if { ![runto_main] } { - gdb_suppress_tests +# Test that the the inferior sees EXPECTED env vars starting with +# "TEST_GDB". +proc test_num_test_vars {expected message} { + set num [get_integer_valueof "j" -1 "$message, get num vars"] + gdb_assert {$num == $expected} "$message, confirmed" } set bp_line [gdb_get_line_number "set breakpoint here"] gdb_breakpoint $bp_line +# Restart test program, and prepare for another test sequence. +# Returns true on success. +proc run_and_count_vars {} { + global srcfile bp_line + + return [runto "$srcfile:$bp_line"] +} + +# Find environment variable named VARNAME (peeking inferior variables +# directly), and return its value. Returns "" if not +# found. + +proc find_env {varname} { + global gdb_prompt + + for {set i 0} {1} {incr i} { + set test "printf \"var: %s\\n\", envp\[$i\] ? envp\[$i\] : \"\"" + set var "" + gdb_test_multiple $test $test { + -re "var: \r\n$gdb_prompt $" { + return "" + } + -re "var: \(\[^\r\n\]*\)\r\n$gdb_prompt $" { + set var $expect_out(1,string) + } + } + + if {[string match "$varname=*" $var]} { + set from [expr [string first "=" $var] + 1] + set to [string length $var] + return [string range $var $from $to] + } + } +} + # # Test gdb set/unset environment commands. -# Executable lists and counts all environment variables +# The executable lists and counts all environment variables # starting with TEST_GDB. +proc_with_prefix test_set_unset_env {} { + global binfile + + clean_restart $binfile + + # First test with no TEST_GDB_VAR. + with_test_prefix "test1" { + if ![run_and_count_vars] { + return + } + test_num_test_vars 0 "no TEST_GDB vars" + } + + # Second test with one TEST_GDB_VAR. + with_test_prefix "test2" { + gdb_test_no_output "set env TEST_GDB_VAR1 test1" \ + "set TEST_GDB_VAR1" + + if ![run_and_count_vars] { + return + } + test_num_test_vars 1 "one TEST_GDB var" + } + + # Third test with two TEST_GDB_VAR. + with_test_prefix "test3" { + gdb_test_no_output "set env TEST_GDB_VAR2 test2" \ + "set TEST_GDB_VAR2" + + if ![run_and_count_vars] { + return + } + + test_num_test_vars 2 "two TEST_GDB var" + } + + # Fourth test with one TEST_GDB_VAR left, after one was removed + # with unset command. + with_test_prefix "test4" { + gdb_test_no_output "unset env TEST_GDB_VAR1" \ + "unset TEST_GDB_VAR1" + + if ![run_and_count_vars] { + return + } + + test_num_test_vars 1 "one TEST_GDB var, after unset" + } +} -# First test with no TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 0 variables starting with TEST_GDB.*" \ - "test no TEST_GDB var" +proc_with_prefix test_inherit_env_var {} { + global binfile + global bp_line + global env -gdb_test_no_output "set env TEST_GDB_VAR1 test1" \ - "set TEST_GDB_VAR1" + # This test assumes that the build's environ (where dejagnu runs) + # is the same as the host's (where gdb runs) environ. + if [is_remote host] { + return + } -runto_main -gdb_breakpoint $bp_line + save_vars {env(TEST_GDB_GLOBAL)} { + set env(TEST_GDB_GLOBAL) "Global environment value" -# Second test with one TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 1 variables starting with TEST_GDB.*" \ - "test with one TEST_GDB var" + clean_restart $binfile -gdb_test_no_output "set env TEST_GDB_VAR2 test2" \ - "set TEST_GDB_VAR2" + gdb_breakpoint $bp_line -runto_main -gdb_breakpoint $bp_line + # First test with only inherited TEST_GDB_GLOBAL. + with_test_prefix "test1" { + if ![run_and_count_vars] { + return + } -# Third test with two TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 2 variables starting with TEST_GDB.*" \ - "test with two TEST_GDB var" + gdb_test "show env" ".*TEST_GDB_GLOBAL=.*" \ + "test passing TEST_GDB_GLOBAL to GDB" -gdb_test_no_output "unset env TEST_GDB_VAR1" \ - "unset TEST_GDB_VAR1" - -runto_main -gdb_breakpoint $bp_line + test_num_test_vars 1 "TEST_GDB_GLOBAL" -# Fourth test with one TEST_GDB_VAR left, after one was removed -# with unset command. -gdb_test "continue" \ - ".*Program found 1 variables starting with TEST_GDB.*" \ - "test with one TEST_GDB var, after unset" + set var [find_env "TEST_GDB_GLOBAL"] -gdb_exit + gdb_assert {[string equal $var "Global environment value"]} \ + "TEST_GDB_GLOBAL found with right value" + } -set env(TEST_GDB_GLOBAL) "Global environment value" + # Second test with one TEST_GDB_VAR. + with_test_prefix "test2" { + gdb_test_no_output "unset env TEST_GDB_GLOBAL" \ + "unset TEST_GDB_GLOBAL" -clean_restart $binfile + if ![run_and_count_vars] { + return + } -# make sure $pc is sane, in case we're talking to a board. -if { ![runto_main] } { - gdb_suppress_tests + test_num_test_vars 0 "TEST_GDB_GLOBAL is unset" + } + } } -set bp_line [gdb_get_line_number "set breakpoint here"] -gdb_breakpoint $bp_line - -gdb_test "show env" ".*TEST_GDB_GLOBAL=.*" "test passing TEST_GDB_GLOBAL to GDB" -# First test with only inherited TEST_GDB_GLOBAL -gdb_test "continue" \ - ".*TEST_GDB_GLOBAL=Global environment value.*Program found 1 variables starting with TEST_GDB.*" \ - "test with TEST_GDB_GLOBAL" - -gdb_test_no_output "unset env TEST_GDB_GLOBAL" \ - "unset TEST_GDB_GLOBAL" - -runto_main -gdb_breakpoint $bp_line - -# Second test with one TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 0 variables starting with TEST_GDB.*" \ - "test with TEST_GDB_GLOBAL unset" - -gdb_exit - -# Clear environment in case we're doing multiple runs -unset env(TEST_GDB_GLOBAL) - +test_set_unset_env +test_inherit_env_var