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

standard_testfile

if [is_remote host] {
    untested "remote host"
    return 0
}

file delete [standard_output_file ${testfile}.dwp]
if [file exists [standard_output_file ${testfile}.dwp]] {
    unsupported "dwp file cannot be deleted"
    return 0
}
if { [build_executable ${testfile}.exp ${testfile} ${srcfile}] == -1 } {
    return -1
}
if ![file exists [standard_output_file ${testfile}.dwp]] {
    unsupported "testsuite run does not produce dwp files"
    return 0
}

set thelink "${testfile}-thelink"

file delete [standard_output_file ${thelink}]
file delete [standard_output_file ${thelink}.dwp]
# file link is only Tcl 8.4+.
exec "ln" "-sf" "${testfile}" "[standard_output_file $thelink]"
if ![file exists [standard_output_file $thelink]] {
    unsupported "host does not support symbolic links (binary symlink is missing)"
    return 0
}
if [file exists [standard_output_file $thelink.dwp]] {
    unsupported "host does not support symbolic links (we tried to delete a file and it is still there)"
    return 0
}

clean_restart "$testfile"

gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary default, dwp default"

clean_restart "$thelink"

gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp default"

gdb_exit
file rename [standard_output_file ${testfile}.dwp] [standard_output_file ${thelink}.dwp]
if [file exists [standard_output_file ${testfile}.dwp]] {
    unsupported "host does not support symbolic links (binary symlink exists)"
    return 0
}
if ![file exists [standard_output_file ${thelink}.dwp]] {
    unsupported "host does not support symbolic links (dwp symlink is missing)"
    return 0
}

clean_restart "$testfile"

# This case cannot work.
gdb_test "ptype main" {type = int \(\)} "binary default, dwp at symlink"

clean_restart "$thelink"

gdb_test "ptype main" {type = int \(int, char \*\*\)} "binary symlink, dwp at symlink"
