# Copyright (C) 2021-2026 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 file is for testing the gdb.TargetConnection API.  This API is
# already tested in gdb.multi/multi-target-info-inferiors.exp and
# gdb.python/py-inferior.exp, this file just covers some edge cases
# that are not tested in other places.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile

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

if {![runto_main]} {
    return 0
}

if { [target_info exists gdb_protocol] } {
    set connection_type "RemoteTargetConnection"
} else {
    set connection_type "TargetConnection"
}

# Create a gdb.TargetConnection object and check it is initially
# valid.
gdb_test_no_output "python conn = gdb.selected_inferior().connection"
gdb_test "python print(conn)" \
    "<gdb.${connection_type} num=1, what=\"\[^\"\]+\">" \
    "print gdb.${connection_type} while it is still valid"
gdb_test "python print(conn.is_valid())" "True" "is_valid returns True"

# Get the connection again, and ensure we get the exact same object.
gdb_test_no_output "python conn2 = gdb.selected_inferior().connection"
gdb_test "python print('Same object: %s' % (conn is conn2))" "True"

# Now invalidate the connection, and ensure that the is_valid method
# starts to return False.
gdb_test "info connections" "\r\n\\* 1 .*" \
    "info connections while the connection is still around"
gdb_test "with confirm off -- kill" "" "kill inferior"
gdb_test "disconnect"
gdb_test "info connections" "No connections\\." \
    "info connections now all the connections have gone"
gdb_test "python print(conn)" "<gdb.${connection_type} \\(invalid\\)>" \
    "print gdb.${connection_type} now its invalid"
gdb_test "python print(conn.is_valid())" "False" "is_valid returns False"

# Now check that accessing properties of the invalid connection cases
# an error.
gdb_test "python print(conn.num)" \
    "RuntimeError.*: Connection no longer exists\\.\r\n.*"
gdb_test "python print(conn.type)" \
    "RuntimeError.*: Connection no longer exists\\.\r\n.*"
gdb_test "python print(conn.description)" \
    "RuntimeError.*: Connection no longer exists\\.\r\n.*"
gdb_test "python print(conn.details)" \
    "RuntimeError.*: Connection no longer exists\\.\r\n.*"
