# Copyright (C) 2022-2025 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]} {
    return
}

# 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.  If we are
# using a 'remote' connection then this cannot be shared with the new
# inferior, so we get a warning, and a new inferior with no connection.
if { $connection_type == "remote" } {
    gdb_test "add-inferior" \
	[multi_line \
	     "warning: can't share connection 1 \\(remote \[^\r\n\]+\\) between inferiors" \
	     "Added inferior 2"]
} else {
    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"
}
