# Copyright 2007-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/>.

if {[gdb_skip_xml_test]} {
    unsupported "tdesc-arch.exp"
    return -1
}

gdb_start

# Find some valid architectures - we just need legitimate values
# to put in our <architecture> elements.
set arch1 ""
set arch2 ""
set msg "read valid architectures"
gdb_test_multiple "set architecture" $msg {
    -re "Requires an argument. Valid arguments are (\[^ \]*), (\[^ \]*), .*auto\\.\r\n$gdb_prompt $" {
	set arch1 $expect_out(1,string)
	set arch2 $expect_out(2,string)
	pass $msg
    }
    -re "Requires an argument. Valid arguments are (\[^ \]*), auto\\.\r\n$gdb_prompt $" {
	# If there is just one supported architecture, we can't do this test.
	unsupported "tdesc-arch.exp"
	return -1
    }
}

set default_arch ""
set msg "read default architecture"
gdb_test_multiple "show architecture" $msg {
    -re "The target architecture is set to \"auto\" \\(currently \"(\[^ \]*)\"\\)\\.\r\n$gdb_prompt $" {
	set default_arch $expect_out(1,string)
	pass $msg
    }
}

# If that did not work, no point running further tests.
if { "$arch1" == "" || "$arch2" == "" || "$default_arch" == "" } {
    unresolved "architecture XML tests"
    return -1
}

# Run these tests twice, once for $arch1 and once for $arch2, to
# make sure that the tdesc file overrides the global default.
# TRANS_MODE indicates how newlines should be represented; it should
# be one of the values supported by "fconfigure -translation".

proc set_arch { arch which trans_mode } {
    global gdb_prompt
    global subdir

    set filename [standard_output_file tdesc-arch.xml]
    set fd [open $filename w]
    fconfigure $fd -translation $trans_mode
    puts $fd \
	"<target>
	    <architecture>$arch</architecture>
	 </target>"
    close $fd
    if {[is_remote host]} {
	set filename [remote_download host $filename tdesc-arch.xml]
    }

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename $filename"
    set msg "set tdesc filename tdesc-arch.xml ($which architecture)"
    set cmd_regex [string_to_regexp $cmd]
    gdb_test_multiple $cmd $msg {
	-re "^$cmd_regex\r\n$gdb_prompt $" {
	    pass $msg
	}
	-re "^$cmd_regex\r\nwarning: A handler for the OS ABI.*\r\n$gdb_prompt $" {
	    kfail gdb/2225 $msg
	}
    }

    set cmd "show architecture"
    gdb_test $cmd \
	"The target architecture is set to \"auto\" \\(currently \"$arch\"\\)\\." \
	"$cmd ($which architecture)"

    remote_file host delete $filename
}

set_arch $arch1 first lf
set_arch $arch2 second lf

with_test_prefix crlf {
    set_arch $arch1 first crlf
    set_arch $arch2 second crlf
}

# Check an invalid architecture setting.
set filename [standard_output_file tdesc-arch.xml]
set fd [open $filename w]
puts $fd \
    "<target>
       <architecture>invalid</architecture>
     </target>"
close $fd
if {[is_remote host]} {
    set filename [remote_download host $filename "tdesc-arch.xml"]
}

set cmd "set tdesc filename $filename"
gdb_test $cmd \
    "warning:.*Target description specified unknown architecture.*" \
    "set tdesc filename tdesc-arch.xml (invalid architecture)"

set cmd "show architecture"
gdb_test $cmd \
    "The target architecture is set to \"auto\" \\(currently \"$default_arch\"\\)\\." \
    "$cmd (invalid architecture)"

remote_file host delete $filename
