# Copyright 2011-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 <http://www.gnu.org/licenses/>.

# This file was written by Pierre Muller <muller@ics.u-strasbg.fr>
#
# 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
}

standard_testfile .c

# Compile binary
# and start with a fresh gdb

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
}

set bp_line [gdb_get_line_number "set breakpoint here"]
gdb_breakpoint  $bp_line

#
# Test gdb set/unset environment commands.
# Executable lists and counts all environment variables
# starting with TEST_GDB.


# First test with no TEST_GDB_VAR
gdb_test "continue" \
  ".*Program found 0 variables starting with TEST_GDB.*" \
  "test no TEST_GDB var"

gdb_test_no_output "set env TEST_GDB_VAR1 test1" \
  "set TEST_GDB_VAR1"

runto_main
gdb_breakpoint  $bp_line

# Second test with one TEST_GDB_VAR
gdb_test "continue" \
  ".*Program found 1 variables starting with TEST_GDB.*" \
  "test with one TEST_GDB var"

gdb_test_no_output "set env TEST_GDB_VAR2 test2" \
  "set TEST_GDB_VAR2"

runto_main
gdb_breakpoint  $bp_line

# 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_no_output "unset env TEST_GDB_VAR1" \
  "unset TEST_GDB_VAR1"

runto_main
gdb_breakpoint  $bp_line

# 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
}

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)

