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

# Copyright 2007, 2009-2012 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

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

if { [skip_gdbserver_tests] } {
    return 0
}

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

# Start with a fresh gdb, gdb_skip_xml_test must be called while gdb
# is not running.

gdb_exit
set do_xml_test [expr ![gdb_skip_xml_test]]
gdb_start
gdb_load $binfile
gdb_reinitialize_dir $srcdir/$subdir

# 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"

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

gdb_test_no_output "monitor exit"
