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

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

# There's no easy way to set environment variables on remote targets
# (via dejagnu) yet.
if { [is_remote target] } {
    untested "remote board"
    return
}

standard_testfile

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

set unique_file [standard_output_file "unique-file.unique-extension"]
set unique_file_dir [standard_output_file ""]

run_on_host \
    "touch OUTPUT_DIR/unique-file.unique-extension" \
    "touch" "$unique_file"

# Initial setup for simple test (wildcard expansion, variable substitution).

proc initial_setup_simple { startup_with_shell run_args } {
    global hex decimal binfile unique_file

    clean_restart $binfile

    gdb_test_no_output "set startup-with-shell $startup_with_shell"

    gdb_test_no_output "set args $run_args" \
	"set args \$run_args"

    set test "inferior started"
    if { [runto_main] } {
	pass $test
    } else {
	fail $test
    }
}

## Run the actual tests

with_test_prefix "startup_with_shell = on; run_args = *.unique-extension" {
    initial_setup_simple "on" "$unique_file_dir/*.unique-extension"
    gdb_test "print argv\[1\]" "\\\$$decimal = $hex \"$unique_file\"" \
	"first argument expanded"
}

with_test_prefix "startup_with_shell = off; run_args = *.unique-extension" {
    initial_setup_simple "off" "$unique_file_dir/*.unique-extension"
    gdb_test "print argv\[1\]" "\\\$$decimal = $hex \"$unique_file_dir/\\\*\.unique-extension\"" \
	"first argument not expanded"
}

with_test_prefix "startup_with_shell = on; run_args = \$TEST" {
    set env(TEST) "1234"
    initial_setup_simple "on" "\$TEST"
    gdb_test "print argv\[1\]" "\\\$$decimal = $hex \"1234\"" \
	"testing first argument"
    unset env(TEST)
}

with_test_prefix "startup_with_shell = off; run_args = \$TEST" {
    set env(TEST) "1234"
    initial_setup_simple "off" "\$TEST"
    gdb_test "print argv\[1\]" "\\\$$decimal = $hex \"\\\$TEST\"" \
	"testing first argument"
    unset env(TEST)
}
