# This testcase is part of GDB, the GNU debugger.

# Copyright 2017-2021 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 test doesn't make sense on native-gdbserver.
if { [use_gdb_stub] } {
    untested "not supported"
    return
}

standard_testfile

if { [build_executable "failed to prepare" $testfile $srcfile debug] } {
    return -1
}

set test_var_name "GDB_TEST_VAR"

# Helper function that performs a check on the output of "getenv".
#
# - VAR_NAME is the name of the variable to be checked.
#
# - VAR_VALUE is the value expected.
#
# - TEST_MSG, if not empty, is the test message to be used by the
#   "gdb_test".
#
# - EMPTY_VAR_P, if non-zero, means that the variable is not expected
#   to exist.  In this case, VAR_VALUE is not considered.

proc check_getenv { var_name var_value { test_msg "" } { empty_var_p 0 } } {
    global hex decimal

    if { $test_msg == "" } {
	set test_msg "print result of getenv for $var_name"
    }

    if { $empty_var_p } {
	set var_value_match "0x0"
    } else {
	set var_value_match "$hex \"$var_value\""
    }

    gdb_test "print my_getenv (\"$var_name\")" "\\\$$decimal = $var_value_match" \
	$test_msg
}

# Helper function to re-run to main and breaking at the "break-here"
# label.

proc do_prepare_inferior { } {
    global decimal hex

    if { ![runto_main] } {
	return -1
    }

    gdb_breakpoint [gdb_get_line_number "break-here"]

    gdb_test "continue" "Breakpoint $decimal, main \\\(argc=1, argv=$hex\\\) at.*" \
	"continue until breakpoint"
}

# Helper function that does the actual testing.
#
# - VAR_VALUE is the value of the environment variable.
#
# - VAR_NAME is the name of the environment variable.  If empty,
#   defaults to $test_var_name.
#
# - VAR_NAME_MATCH is the name (regex) that will be used to query the
#   environment about the variable (via getenv).  This is useful when
#   we're testing variables with strange names (e.g., with an equal
#   sign in the name) and we know that the variable will actually be
#   set using another name.  If empty, defatults, to $var_name.
#
# - VAR_VALUE_MATCH is the value (regex) that will be used to match
#   the result of getenv.  The rationale is the same as explained for
#   VAR_NAME_MATCH.  If empty, defaults, to $var_value.

proc do_test { var_value { var_name "" } { var_name_match "" } { var_value_match "" } } {
    global binfile test_var_name

    clean_restart $binfile

    if { $var_name == "" } {
	set var_name $test_var_name
    }

    if { $var_name_match == "" } {
	set var_name_match $var_name
    }

    if { $var_value_match == "" } {
	set var_value_match $var_value
    }

    if { $var_value != "" } {
	gdb_test_no_output "set environment $var_name = $var_value" \
	    "set $var_name = $var_value"
    } else {
	gdb_test "set environment $var_name =" \
	    "Setting environment variable \"$var_name\" to null value." \
	    "set $var_name to null value"
    }

    do_prepare_inferior

    check_getenv "$var_name_match" "$var_value_match" \
	"print result of getenv for $var_name"
}

with_test_prefix "long var value" {
    do_test "this is my test variable; testing long vars; {}"
}

with_test_prefix "empty var" {
    do_test ""
}

with_test_prefix "strange named var" {
    # In this test we're doing the following:
    #
    #   (gdb) set environment 'asd =' = 123 43; asd b ### [];;;
    #
    # However, due to how GDB parses this line, the environment
    # variable will end up named <'asd> (without the <>), and its
    # value will be <' = 123 43; asd b ### [];;;> (without the <>).
    do_test "123 43; asd b ### \[\];;;" "'asd ='" "'asd" \
	[string_to_regexp "' = 123 43; asd b ### \[\];;;"]
}

# Test setting and unsetting environment variables in various
# fashions.

proc test_set_unset_vars { } {
    global binfile

    clean_restart $binfile

    with_test_prefix "set 3 environment variables" {
	# Set some environment variables
	gdb_test_no_output "set environment A = 1" \
	    "set A to 1"
	gdb_test_no_output "set environment B = 2" \
	    "set B to 2"
	gdb_test_no_output "set environment C = 3" \
	    "set C to 3"

	do_prepare_inferior

	# Check that the variables are known by the inferior
	check_getenv "A" "1"
	check_getenv "B" "2"
	check_getenv "C" "3"
    }

    with_test_prefix "unset one variable, reset one" {
	# Now, unset/reset some values
	gdb_test_no_output "unset environment A" \
	    "unset A"
	gdb_test_no_output "set environment B = 4" \
	    "set B to 4"

	do_prepare_inferior

	check_getenv "A" "" "" 1
	check_getenv "B" "4"
	check_getenv "C" "3"
    }

    with_test_prefix "unset two variables, reset one" {
	# Unset more values
	gdb_test_no_output "unset environment B" \
	    "unset B"
	gdb_test_no_output "set environment A = 1" \
	    "set A to 1 again"
	gdb_test_no_output "unset environment C" \
	    "unset C"

	do_prepare_inferior

	check_getenv "A" "1"
	check_getenv "B" "" "" 1
	check_getenv "C" "" "" 1
    }
}

with_test_prefix "test set/unset of vars" {
    test_set_unset_vars
}

# Test that unsetting works.

proc test_unset { } {
    global hex decimal binfile gdb_prompt

    clean_restart $binfile

    do_prepare_inferior

    set test_msg "check if unset works"
    set found_home 0
    gdb_test_multiple "print my_getenv (\"HOME\")" $test_msg {
	-re "\\\$$decimal = $hex \".*\"\r\n$gdb_prompt $" {
	    pass $test_msg
	    set found_home 1
	}
	-re "\\\$$decimal = 0x0\r\n$gdb_prompt $" {
	    untested $test_msg
	}
    }

    if { $found_home == 1 } {
	with_test_prefix "simple unset" {
	    # We can do the test, because $HOME exists (and therefore can
	    # be unset).
	    gdb_test_no_output "unset environment HOME" "unset HOME"

	    do_prepare_inferior

	    # $HOME now must be empty
	    check_getenv "HOME" "" "" 1
	}

	with_test_prefix "set-then-unset" {
	    clean_restart $binfile

	    # Test if setting and then unsetting $HOME works.
	    gdb_test_no_output "set environment HOME = test" "set HOME as test"
	    gdb_test_no_output "unset environment HOME" "unset HOME again"

	    do_prepare_inferior

	    check_getenv "HOME" "" "" 1
	}
    }
}

with_test_prefix "test unset of vars" {
    test_unset
}
