# 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

standard_testfile server.c

if { [skip_gdbserver_tests] } {
    return 0
}

if {[build_executable $testfile.exp $testfile $srcfile debug] == -1} {
    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"
