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

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

    # 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 "tdesc-arch.xml"
}

set_arch $arch1 first
set_arch $arch2 second

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

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 "tdesc-arch.xml"
