# This testcase is part of GDB, the GNU debugger.

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

# Test running programs using extended-remote.

load_lib gdbserver-support.exp

standard_testfile server.c

if { [skip_gdbserver_tests] } {
    return 0
}

if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
    return -1
}

# gdb_skip_xml_test must be called while gdb is not running.
set do_xml_test [expr ![gdb_skip_xml_test]]

save_vars { GDBFLAGS } {
    # If GDB and GDBserver are both running locally, set the sysroot to avoid
    # reading files via the remote protocol.
    if { ![is_remote host] && ![is_remote target] } {
	set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
    }

    clean_restart $binfile
}

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

set target_exec [gdbserver_download_current_prog]
gdbserver_start_extended

gdb_test_no_output "set remote exec-file $target_exec" "set remote exec-file"

gdb_breakpoint main
gdb_test "run" "Breakpoint.* main .*" "continue to main"

if { [istarget *-*-linux*] } {
    # On Linux, gdbserver can also report the list of processes.
    # But only if xml support is compiled in.
    if { $do_xml_test } {
	# This is done in a way to avoid the timeout that can occur from
	# applying .* regexp to large output.
	gdb_test_sequence "info os processes" "get process list" \
	    { "pid +user +command" "1 +root +\[/a-z\]*(init|systemd)" }
    }
}

gdb_test "kill" "" "kill" "Kill the program being debugged. .y or n. " "y"

gdb_load $binfile
gdb_test "monitor help" "The following monitor commands.*" \
        "load new file without any gdbserver inferior"

gdb_test_no_output "monitor exit"
