# Copyright 2007-2012 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 automatically \\(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.

proc set_arch { arch which } {
    global gdb_prompt
    global subdir

    set fd [open "$subdir/tdesc-arch.xml" w]
    puts $fd \
	"<target>
	    <architecture>$arch</architecture>
	 </target>"
    close $fd
    remote_download host "${subdir}/tdesc-arch.xml" "tdesc-arch.xml"

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename tdesc-arch.xml"
    set msg "$cmd ($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 automatically \\(currently $arch\\)" \
	"$cmd ($which architecture)"

    file delete "${subdir}/tdesc-arch.xml"
    remote_file host delete "tdesc-arch.xml"
}

set_arch $arch1 first
set_arch $arch2 second

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

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

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

file delete "${subdir}/tdesc-arch.xml"
remote_file host delete "tdesc-arch.xml"
