# Copyright (C) 2022-2024 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/>.

# Check that the gdb.connect_removed event triggers when we expect it
# too.
#
# Checking this event has wider implications that simply some corner
# of the Python API working or not.  The connection_removed event
# triggers when the reference count of a process_stratum_target
# reaches zero.  If these events stop triggering when expected then
# GDB might be getting the reference counting on target_ops objects
# wrong.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile py-connection.c

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

if ![runto_main] then {
    return 0
}

# Register a callback that will trigger when a connection is removed
# (deleted) within GDB.
gdb_test_multiline "Add connection_removed event" \
    "python" "" \
    "def connection_removed_handler(event):" "" \
    "   num = event.connection.num" "" \
    "   type = event.connection.type" "" \
    "   print('Connection %d (%s) removed' % (num, type))" "" \
    "gdb.events.connection_removed.connect (connection_removed_handler)" "" \
    "end" ""

if { [target_info exists gdb_protocol] } {
    if { [target_info gdb_protocol] == "extended-remote" } {
	set connection_type "extended-remote"
    } else {
	set connection_type "remote"
    }
} else {
    set connection_type "native"
}

# Add an inferior that shares a connection with inferior 1.
gdb_test "add-inferior" "Added inferior 2 on connection 1 \[^\r\n\]+"

# Add an inferior with no connection.
gdb_test "add-inferior -no-connection" "Added inferior 3"

# Kill the first inferior.  If we are using the plain 'remote' protocol then
# it as this point that the remote target connection is removed.  For the
# 'extended-remote' and 'native' targets the connection is removed later.
if { $connection_type == "remote" } {
    gdb_test "with confirm off -- kill" \
	"Connection 1 \\(remote\\) removed\r\n.*" "kill inferior"
} else {
    gdb_test "with confirm off -- kill" "" "kill inferior"
}

# Switch to inferior 3 (the one with no connection).
gdb_test "inferior 3"

# Remove inferior 1, not expecting anything interesting at this point.
gdb_test_no_output "remove-inferiors 1"

# Now removed inferior 2.  For the 'remote' target the connection has
# already been removed (see above), but for 'extended-remote' and 'native'
# targets, it is at this point that the connection is removed.
if { $connection_type == "remote" } {
    gdb_test_no_output "remove-inferiors 2"
} else {
    gdb_test "remove-inferiors 2" \
	"Connection 1 \\(${connection_type}\\) removed"
}
