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

load_lib gdbserver-support.exp

if {[skip_gdbserver_tests]} {
    return
}

standard_testfile normal.c

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

# Test running GDB without providing a local binary for it.  In order
# to do that, we unset GDBFLAGS before running GDB.  We also start
# gdbserver "by hand".  For more details about this test, see PR
# remote/21852.
save_vars { GDBFLAGS } {
    set GDBFLAGS ""
    gdb_exit
    gdb_start

    gdb_test_no_output "set remote exec-file $binfile" \
	"set remote exec-file"

    # Make sure we're disconnected, in case we're testing with an
    # extended-remote board, therefore already connected.
    gdb_test "disconnect" ".*"

    # Let's start gdbserver in extended-remote mode now.  We cannot
    # use gdbserver_start_extended here because it starts gdbserver,
    # then GDB *with* a local binary, and the connect both.
    set res [gdbserver_start "--multi" ""]
    set gdbserver_protocol [lindex $res 0]
    if { [string first "extended-" $gdbserver_protocol] != 0} {
	set gdbserver_protocol "extended-$gdbserver_protocol"
    }
    set gdbserver_gdbport [lindex $res 1]
    set use_gdb_stub 0

    gdb_test "target ${gdbserver_protocol} ${gdbserver_gdbport}" \
	"Remote debugging using [string_to_regexp $gdbserver_gdbport]" \
	"connect to gdbserver"

    gdb_test "run" \
	"\\\[Inferior $decimal \\\(process $decimal\\\) exited normally\\\]" \
	"run test program until the end"
}
