# Copyright (C) 2008-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 part of the GDB testsuite.

load_lib gdb-python.exp

require allow_shlib_tests allow_python_tests

standard_testfile

set libfile  "py-shared-sl"
set libsrc   ${libfile}.c
set library  [standard_output_file ${libfile}.sl]

if { [gdb_compile_shlib ${srcdir}/${subdir}/${libsrc} ${library} "debug"] != "" } {
    untested "failed to compile shared library"
    return -1
}

set exec_opts [list debug shlib=${library}]

if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable $exec_opts] != "" } {
    untested "failed to compile"
    return -1
}

# Start with a fresh gdb.
clean_restart $testfile
gdb_load_shlib ${library}

# The following tests require execution.

if {![runto_main]} {
    return 0
}

runto [gdb_get_line_number "Break to end."]

# Test gdb.solib_name
gdb_test "p &func1" "" "func1 address"
gdb_py_test_silent_cmd "python func1 = gdb.history(0)" "Acquire func1 address" 1
gdb_test "python print (gdb.solib_name(int(func1)))" "py-shared-sl.sl" \
    "test func1 solib location"
gdb_test "python print (gdb.solib_name(func1))" "py-shared-sl.sl" \
    "test func1 solib location using Value"

gdb_test "p &main" "" "main address"
gdb_py_test_silent_cmd "python main = gdb.history(0)" "Acquire main address" 1
gdb_test "python print (gdb.solib_name(int(main)))" "None" "test main solib location"

if {[is_lp64_target]} {
    gdb_test "python print (len(\[gdb.solib_name(0xffffffffffffffff)\]))" "1"
}

gdb_test "python print(gdb.solib_name(-1))" \
    [multi_line \
	 "Python Exception <class 'OverflowError'>: can't convert negative int to unsigned" \
	 "Error occurred in Python: can't convert negative int to unsigned"]

gdb_test "python print(gdb.current_progspace().solib_name(-1))" \
    [multi_line \
	 "Python Exception <class 'OverflowError'>: can't convert negative int to unsigned" \
	 "Error occurred in Python: can't convert negative int to unsigned"]

gdb_test "python print(gdb.current_progspace().solib_name(\"string\"))" \
    [multi_line \
	 "Python Exception <class 'ValueError'>: invalid literal for int\\(\\) with base 10: 'string'" \
	 "Error occurred in Python: invalid literal for int\\(\\) with base 10: 'string'"]
