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

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

# This file verifies that methods Inferior.thread_from_handle
# and InferiorThread.handle work as expected.

load_lib gdb-python.exp

require allow_python_tests

standard_testfile

if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable debug] != "" } {
    return -1
}

clean_restart ${::testfile}

runto_main

gdb_test "break after_mc_barrier" \
    "Breakpoint 2 at .*: file .*${srcfile}, line .*" \
	 "breakpoint on after_mc_barrier"

gdb_test "break do_something" \
    "Breakpoint 3 at .*: file .*${srcfile}, line .*" \
	 "breakpoint on do_something"

gdb_test "continue" \
	"Breakpoint 2, after_mc_barrier .*" \
	"run to after_mc_barrier"

gdb_test_no_output "del 2" "delete after_mc_barrier breakpoint"

gdb_test "continue" \
	"Breakpoint 3, do_something .*" \
	"run to do_something"

# The test case has been constructed so that the current thread,
# indicated by '*' in the "info threads" output, should be stopped in
# do_something() with a value of n which is the same as the number
# reported in the "Id" column.  If it's not, then something went wrong
# with the start up sequence which should cause the main thread to be
# thread 1, the first child thread to be thread 2, and the second
# child thread to be thread 3.
#
# Note that \1 in the RE below is a backreference to the thread id
# reported in the "Id" column.

gdb_test "info threads"  \
	[format {.*[\r\n]+\* +([0-9]+) +%s[^\r\n]* do_something \(n=\1\) at.*} $tdlabel_re]

# Check for expected results when passing a valid thread handle to
# thread_from_handle().

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs\[0\]')).num)" \
	"1" "print thread id for thrs\[0\]"

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs\[1\]')).num)" \
	"2" "print thread id for thrs\[1\]"

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs\[2\]')).num)" \
	"3" "print thread id for thrs\[2\]"

# Objects which are of the correct size, but which are bogus thread
# handles should return None.  For the first test (using thrs[3]), we
# use 0.  For the second (thrs[4]), we use an unlikely bit pattern.

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs\[3\]')))" \
	"None" "print thread for bogus handle thrs\[3\]"

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs\[4\]')))" \
	"None" "print thread for bogus handle thrs\[4\]"

# We should see an exception when passing an object of the wrong type.

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.lookup_symbol('main')))" \
	 ".*TypeError.*: Argument 'handle' must be a thread handle object.*" \
	 "TypeError when passing a symbol object to thread_from_handle"

# We should see an exception when passing too large of an object.

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('thrs')))" \
	 ".*Thread handle size mismatch.*" \
	 "Pass overly large object to thread_from_handle"

# We should see an exception when passing too small of an object.

gdb_test "python print(gdb.selected_inferior().thread_from_handle(gdb.parse_and_eval('\"S\"')))" \
	 ".*Thread handle size mismatch.*" \
	 "Pass too small of an object to thread_from_handle"

# Test the thread_handle method

gdb_py_test_silent_cmd "python tp=gdb.lookup_type('pthread_t')" \
		       "Get pthread_t type" 0
gdb_py_test_silent_cmd "python inf=gdb.selected_inferior()" "Get inferior" 0

foreach thrN {0 1 2} {
    with_test_prefix "thread $thrN" {

	gdb_py_test_silent_cmd \
	    "python hand = gdb.parse_and_eval('thrs\[$thrN\]')" \
	    "fetch thread handle from inferior" \
	    1

	gdb_py_test_silent_cmd \
	    "python hand_bytes = inf.thread_from_handle(hand).handle()" \
	    "fetch thread handle from thread" \
	    1


	# It'd be nice to be able to use this comparison expression:
	#
	#    hand == hand_bytes
	#
	# But this won't work because hand is a gdb.Value and hand_bytes
	# is a Python bytes object.  Therefore, we convert the bytes
	# object into a gdb.value by calling the two argument form of
	# its constructor.

	gdb_test "python print(gdb.Value(hand_bytes, tp) == hand)" \
		 "True" \
		 "verify that handles are the same"
    }
}
