# 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-errors.exp"
    return -1
}

gdb_start

proc set_arch { srcfile errmsg } {
    global gdb_prompt
    global srcdir
    global subdir

    # Anchor the test output, so that error messages are detected.
    set cmd "set tdesc filename $srcdir/$subdir/$srcfile"
    set msg "set tdesc filename $subdir/$srcfile"
    set cmd_regex [string_to_regexp $cmd]
    gdb_test_multiple $cmd $msg {
	-re "^$cmd_regex\r\n$errmsg$gdb_prompt $" {
	    pass $msg
	}
    }
}

set common_warn "\r\nwarning: Could not load XML target description; ignoring\r\n"

# This file is valid, but specifies an unknown architecture.
# We should get a warning, if we process the includes correctly.
set_arch "includes.xml" \
    "warning:.*specified unknown architecture.* \"invalid-body\"$common_warn"

# This file contains a missing include.  We should warn the user about
# it.
set_arch "bad-include.xml" \
    "warning:.*Could not load XML document \"nonexistant.xml\"$common_warn"

# Make sure we detect infinite loops, eventually.
set_arch "loop.xml" \
    "warning:.*Maximum XInclude depth.*$common_warn"
