# Copyright 2003-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 is a test for the gdb invocation option --args.

# Skip test if target does not support argument passing.
if [target_info exists noargs] {
    return
}

# This test requires starting new inferior processes, skip it if the target
# board is a stub.
if [use_gdb_stub] {
    return
}

standard_testfile

if {[build_executable $testfile.exp $testfile \
	 $srcfile {debug nowarnings}] == -1} {
    untested "failed to compile"
    return -1
}

# If SINGLE_QUOTES_NEWLINE_KFAIL true, arguments made of exactly '' or a
# newline character will fail, so kfail those tests.

proc args_test { name arglist {single_quotes_newline_kfail false}} {
    global srcdir
    global subdir
    global testfile
    global hex
    global decimal

    clean_restart $testfile

    runto_main
    gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
    gdb_continue_to_breakpoint "breakpoint for $name"

    set expected_len [expr 1 + [llength $arglist]]
    gdb_test "print argc" "\\\$$decimal = $expected_len" "argc for $name"

    set i 1
    foreach arg $arglist {
	if { $single_quotes_newline_kfail
	     && ($arg == {''} || $arg == {\\n}) } {
	    setup_kfail "gdb/27989" "*-*-*"
	}
	gdb_test "print argv\[$i\]" "\\\$$decimal = $hex \"$arg\"" \
	    "argv\[$i\] for $name"
	set i [expr $i + 1]
    }
}

#
# Test that the --args are processed correctly.
#

save_vars { GDBFLAGS } {
    set old_gdbflags $GDBFLAGS

    # Single quotes and newlines are not well handled by the extended-remote
    # target:  https://sourceware.org/bugzilla/show_bug.cgi?id=27989
    set single_quotes_newline_kfail \
	[expr { [target_info exists gdb_protocol] \
	        && [target_info gdb_protocol] == "extended-remote" }]

    set GDBFLAGS "$old_gdbflags --args $binfile 1 3"
    args_test basic {{1} {3}}

    #
    # Test that the --args are processed correctly even if one of them is empty.
    # The syntax needed is a little peculiar; DejaGNU treats the arguments as a
    # list and expands them itself, since no shell redirection is involved.
    #
    set GDBFLAGS "$old_gdbflags --args $binfile 1 {} 3"
    args_test "one empty" {{1} {} {3}}

    #
    # try with 2 empty args
    #
    set GDBFLAGS "$old_gdbflags --args $binfile 1 {} {} 3"
    args_test "two empty" {{1} {} {} 3}

    # Try with arguments containing literal single quotes.

    set GDBFLAGS "$old_gdbflags --args $binfile 1 '' 3"
    args_test "one empty with single quotes" {{1} {''} {3}} $single_quotes_newline_kfail

    set GDBFLAGS "$old_gdbflags --args $binfile 1 '' '' 3"
    args_test "two empty with single quotes" {{1} {''} {''} {3}} $single_quotes_newline_kfail

    # try with arguments containing literal newlines.

    set GDBFLAGS "$old_gdbflags --args $binfile 1 {\n} 3"
    args_test "one newline" {{1} {\\n} {3}} $single_quotes_newline_kfail

    set GDBFLAGS "$old_gdbflags --args $binfile 1 {\n} {\n} 3"
    args_test "two newlines" {{1} {\\n} {\\n} {3}} $single_quotes_newline_kfail
}
