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

# Copyright 2022 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 starting gdbserver using the 'target remove | ....' syntax.
# The extended-remote target type is tested too.  The test checks that
# the `|` character can be seen in the 'info connections' output, and
# (when Python is available) in the gdb.TargetConnection.details
# string.

# This test relies on starting gdbserver using the pipe syntax.  Not
# sure how well this will run if part of this test is being run
# elsewhere.
if { [is_remote target] || [is_remote host] } {
    return 0
}

load_lib gdbserver-support.exp

standard_testfile

if { [skip_gdbserver_tests] } {
    return 0
}

set gdbserver [find_gdbserver]
if { $gdbserver == "" } {
    unsupported "could not find gdbserver"
    return
}

standard_testfile normal.c
set executable ${testfile}

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

# Start GDB using remote type TARGET, which should be either "remote"
# or "extended-remote".  Check the output of 'info connections', and
# the contents of the gdb.TargetConnection.details string.
proc do_test { target } {
    clean_restart ${::binfile}

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

    gdb_test "target ${target} | ${::gdbserver} - ${::binfile}" ".*" \
	"start gdbserver using pipe syntax"

    gdb_breakpoint main
    gdb_continue_to_breakpoint main
    gdb_test "info frame" ".* in main .*"

    gdb_test "info connections" "${target} \| ${::gdbserver} - ${::binfile} \[^\r\n\]+"

    if { ![skip_python_tests] } {
	gdb_test_no_output "python conn = gdb.selected_inferior().connection"
	gdb_test "python print(conn.details)" "\| ${::gdbserver} - ${::binfile}"
    }
}

save_vars { GDBFLAGS } {
    set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""

    # Test with the two remote protocol types.
    foreach_with_prefix target { remote extended-remote } {
	do_test ${target}
    }
}
