# This testcase is part of GDB, the GNU debugger.
#
# Copyright 2019-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/>.

# This test script exposes a bug where, if gdbserver dies while GDB is
# sourcing a python command like 'gdb.execute ("continue")', then GDB
# will deadlock.

load_lib gdbserver-support.exp

standard_testfile multi-ui-errors.c

if {[skip_gdbserver_tests]} {
    return 0
}

# Gdb needs to be running for skip_python_tests, but exit once we're done,
# we'll start a custom gdb after this.
clean_restart
if { [skip_python_tests] } {
    return 0
}
gdb_exit

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

# Start gdbserver.
set res [gdbserver_spawn "${binfile}"]
set gdbserver_protocol [lindex $res 0]
set gdbserver_gdbport [lindex $res 1]
set gdbserver_pid [exp_pid -i $server_spawn_id]

# Generate a python script we will later source.
set file1 [standard_output_file file1.py]
set fd [open "$file1" w]
puts $fd \
"import gdb

def do_gdb_stuff ():
    gdb.execute ('target $gdbserver_protocol $gdbserver_gdbport')
    gdb.execute ('continue')

do_gdb_stuff()"
close $fd

# Now start GDB, sourcing the python command file we generated above.
# Set the height and width so we don't end up at a paging prompt.
if {[gdb_spawn_with_cmdline_opts \
	 "-quiet -iex \"set height 0\" -iex \"set width 0\" -ex \"source $file1\""] != 0} {
    fail "spawn"
    return
}

# Wait for the inferior to start up.
with_spawn_id $server_spawn_id {
    gdb_test_multiple "" "ensure inferior is running" {
	-re "@@XX@@ Inferior Starting @@XX@@" {
	    pass $gdb_test_name
	}
	timeout {
	    fail $gdb_test_name
	}
    }
}

# Now kill the gdbserver.
remote_exec target "kill -9 $gdbserver_pid"

# Wait for GDB to return to a prompt.
gdb_test_multiple "" "landed at prompt after gdbserver dies" {
    -re "$gdb_prompt $" {
	pass $gdb_test_name
    }
    timeout {
	fail "$gdb_test_name (timeout)"
    }
}

# Run a simple command to ensure we can interact with GDB.
gdb_test "echo hello\\n" "hello" "can we interact with gdb"
