# 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 attaching to already-running programs using extended-remote.

load_lib gdbserver-support.exp
load_lib trace-support.exp

standard_testfile

if { [skip_gdbserver_tests] } {
    return 0
}

if {![can_spawn_for_attach]} {
    return 0
}

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\""
    }

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

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

set test_spawn_id [spawn_wait_for_attach $binfile]
set testpid [spawn_id_get_pid $test_spawn_id]

gdb_test "attach $testpid" \
    "Attaching to program: .*, process $testpid.*(in|at).*" \
    "attach to remote program 1"

if { [gdb_target_supports_trace] } then {
    # Test predefined TSVs are uploaded.
    gdb_test_sequence "info tvariables" "check uploaded tsv" {
	"\[\r\n\]+Name\[\t \]+Initial\[\t \]+Current"
	"\[\r\n\]+\\\$trace_timestamp 0"
    }
}

gdb_test "backtrace" ".*main.*" "backtrace 1"

gdb_test "detach" "Detaching from program.*process.*"
gdb_test "backtrace" "No stack\\." "backtrace with no program"

gdb_test "attach $testpid" \
    "Attaching to program: .*, process $testpid.*(in|at).*" \
    "attach to remote program 2"
gdb_test "backtrace" ".*main.*" "backtrace 2"

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

kill_wait_spawned_process $test_spawn_id
