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 -# First test with no TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 0 variables starting with TEST_GDB.*" \ - "test no TEST_GDB var" + clean_restart $binfile -gdb_test_no_output "set env TEST_GDB_VAR1 test1" \ - "set TEST_GDB_VAR1" + # 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" + } -runto_main -gdb_breakpoint $bp_line + # 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" -# Second test with one TEST_GDB_VAR -gdb_test "continue" \ - ".*Program found 1 variables starting with TEST_GDB.*" \ - "test with one TEST_GDB var" + if ![run_and_count_vars] { + return + } + test_num_test_vars 1 "one TEST_GDB var" + } -gdb_test_no_output "set env TEST_GDB_VAR2 test2" \ - "set TEST_GDB_VAR2" + # 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" -runto_main -gdb_breakpoint $bp_line + 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" + test_num_test_vars 2 "two TEST_GDB var" + } -gdb_test_no_output "unset env TEST_GDB_VAR1" \ - "unset TEST_GDB_VAR1" + # 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" -runto_main -gdb_breakpoint $bp_line + if ![run_and_count_vars] { + return + } -# 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" - -gdb_exit - -set env(TEST_GDB_GLOBAL) "Global environment value" - -clean_restart $binfile - -# make sure $pc is sane, in case we're talking to a board. -if { ![runto_main] } { - gdb_suppress_tests + test_num_test_vars 1 "one TEST_GDB var, after unset" + } } -set bp_line [gdb_get_line_number "set breakpoint here"] -gdb_breakpoint $bp_line +proc_with_prefix test_inherit_env_var {} { + global binfile + global bp_line + global env -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" + # 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 + } -gdb_test_no_output "unset env TEST_GDB_GLOBAL" \ - "unset TEST_GDB_GLOBAL" + save_vars {env(TEST_GDB_GLOBAL)} { + set env(TEST_GDB_GLOBAL) "Global environment value" -runto_main -gdb_breakpoint $bp_line + clean_restart $binfile -# 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_breakpoint $bp_line -gdb_exit + # First test with only inherited TEST_GDB_GLOBAL. + with_test_prefix "test1" { + if ![run_and_count_vars] { + return + } -# Clear environment in case we're doing multiple runs -unset env(TEST_GDB_GLOBAL) + gdb_test "show env" ".*TEST_GDB_GLOBAL=.*" \ + "test passing TEST_GDB_GLOBAL to GDB" + test_num_test_vars 1 "TEST_GDB_GLOBAL" + + set var [find_env "TEST_GDB_GLOBAL"] + + gdb_assert {[string equal $var "Global environment value"]} \ + "TEST_GDB_GLOBAL found with right 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" + + if ![run_and_count_vars] { + return + } + + test_num_test_vars 0 "TEST_GDB_GLOBAL is unset" + } + } +} + +test_set_unset_env +test_inherit_env_var