# This testcase is part of GDB, the GNU debugger.
# Copyright 2007, 2008 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/>.

# Test gdbserver monitor commands.

load_lib gdbserver-support.exp

set testfile "server"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if { [skip_gdbserver_tests] } {
    return 0
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested file-transfer.exp
    return -1
}

gdb_exit
gdb_start
gdb_load $binfile
gdb_reinitialize_dir $srcdir/$subdir

gdbserver_run ""

proc test_file_transfer { filename description } {
    gdb_test "remote put \"$filename\" down-server" \
	"Successfully sent .*" "put $description"
    gdb_test "remote get down-server up-server" \
	"Successfully fetched .*" "get $description"

    if { ![is_remote target] } {
	# If we can check the target copy of the file, do that too.
	# This should catch symmetric errors in upload and download.
	set result [remote_exec host "cmp -s $filename down-server"]
	if { [lindex $result 0] == 0 } {
	    pass "compare intermediate $description"
	} else {
	    fail "compare intermediate $description"
	}
    }

    set result [remote_exec host "cmp -s $filename up-server"]
    if { [lindex $result 0] == 0 } {
	pass "compare $description"
    } else {
	fail "compare $description"
    }

    gdb_test "remote delete down-server" \
	"Successfully deleted .*" "deleted $description"

    if { ![is_remote target] } {
	if { ! [remote_file target exists down-server] } {
	    pass "verified deleted $description"
	} else {
	    fail "verified deleted $description"
	}
    }

    catch { file delete up-server }
}

test_file_transfer "$binfile" "binary file"
test_file_transfer "$srcdir/$subdir/transfer.txt" "text file"
