# Copyright 2007, 2008, 2009, 2010, 2011 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"
