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

# Testing for 'maint print xml-tdesc'.  Check we can print out the
# current target description and load it back in again.

if {[gdb_skip_xml_test]} {
    unsupported "xml tests not being run"
    return -1
}

standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

if ![runto_main] then {
    return 0
}

# Three files we're going to write out to.
set xml_file_1 [standard_output_file outfile1.xml]
set xml_file_2 [standard_output_file outfile2.xml]
set xml_file_3 [standard_output_file outfile3.xml]

# Write the current target description to a file.
gdb_test_no_output "pipe maint print xml-tdesc | cat > $xml_file_1" \
    "write current target description to file"

# Read the target description back in to GDB, and the write it back
# out to a file.
gdb_test_no_output \
    "pipe maint print xml-tdesc $xml_file_1 | cat > $xml_file_2" \
    "read previous xml description, and write it out to a second file"

# Check the two produced files are identical.
gdb_test "shell diff -s $xml_file_1 $xml_file_2" \
    "Files \[^\r\n\]* are identical" \
    "first two produced xml files are identical"

# Restart GDB.
clean_restart

# Change to use one of the target descriptions we wrote out earlier.
gdb_test_no_output "set tdesc filename $xml_file_1" \
    "set target description to use"

# Load the executable.
gdb_load ${binfile}

# Run to `main' where we begin our tests.
if ![runto_main] then {
    return -1
}

# Run info registers just to check this appears to run fine with the
# new target description.
gdb_test_multiple "info all-registers" "Run info registers" -lbl {
    -re -wrap "" {
	pass $gdb_test_name
    }
}

# Write out the current target description.
gdb_test_no_output "pipe maint print xml-tdesc | cat > $xml_file_3" \
    "write third target description to file"

# And check that it matches the original file we loaded.
gdb_test "shell diff -s $xml_file_1 $xml_file_3" \
    "Files \[^\r\n\]* are identical" \
    "first and third produced xml files are identical"
