# 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.  It tests the mechanism
# exposing values to Python.

load_lib gdb-python.exp

standard_testfile python.c python-1.c

if {[build_executable $testfile.exp $testfile \
	 [list $srcfile $srcfile2] debug] == -1} {
    return
}

clean_restart

set remote_source2_py [gdb_remote_download host \
			   ${srcdir}/${subdir}/source2.py]

# Do this instead of the skip_python_check.
# We want to do some tests when Python is not present.
gdb_test_multiple "python print (23)" "verify python support" {
    -re "not supported.*$gdb_prompt $"	{
      unsupported "python support is disabled"

      # If Python is not supported, verify that sourcing a python script
      # causes an error.
      gdb_test "source $remote_source2_py" \
	  "Error in sourced command file:.*" \
	  "source source2.py when python disabled"

      # Verify multi-line python commands cause an error.
      gdb_test_multiline "multi-line python command" \
	  "python" "" \
	  "print (23)" "" \
	  "end" "not supported.*"

      return
    }
    -re "$gdb_prompt $"	{}
}

gdb_test_multiline "multi-line python command" \
  "python" "" \
  "print (23)" "" \
  "end" "23"

# Spawn interactive Python help from a multi-line command, thus, after
# a secondary prompt.

with_test_prefix "python interactive help" {
    set test "python; help(); end"
    gdb_test_multiple "python\nhelp()\nend" $test {
	-re ".*help utility.*help> $" {
	    pass $test

	    # The "quit" must be seen on the output.  A buggy GDB
	    # would not display it.
	    gdb_test "quit" "^\r\nYou are now leaving help.*" "quit help"
	}
    }
}

gdb_test_multiline "show python command" \
  "define zzq" "Type commands for definition of .* just \"end\"\\.*" \
  "python" "" \
  "print (23)" "" \
  "end" "" \
  "end" "" \
  "show user zzq" "User command \"zzq\":.*  python.*print \\(23\\).*  end\r\n"

gdb_test_multiline "indented multi-line python command" \
  "python" "" \
  "def foo ():" "" \
  "  print ('hello, world!')" "" \
  "foo ()" "" \
  "end" "hello, world!"

gdb_test "source $remote_source2_py" "yes" "source source2.py"

gdb_test "source -s source2.py" "yes"

set remote_source2_symlink_notpy \
    [gdb_remote_download host ${srcdir}/${subdir}/source2.py \
	 [standard_output_file "source2-symlink.notpy"]]
set remote_source2_symlink_py [standard_output_file "source2-symlink.py"]
remote_file host delete $remote_source2_symlink_py
set status [remote_exec host "ln -sf $remote_source2_symlink_notpy $remote_source2_symlink_py"]
set test "source -s source2-symlink.py"
if {[lindex $status 0] == 0} {
    gdb_test "source -s $remote_source2_symlink_py" "yes" $test
} else {
    unsupported "$test (host does not support symbolic links)"
}

gdb_test "python print (gdb.current_objfile())" "None"
gdb_test "python print (gdb.objfiles())" "\\\[\\\]"

# Test http://bugs.python.org/issue4434 workaround in configure.ac
gdb_test "python import itertools; print ('IMPOR'+'TED')" "IMPORTED" "pythonX.Y/lib-dynload/*.so"

gdb_test_no_output \
    "python x = gdb.execute('printf \"%d\", 23', to_string = True)"
gdb_test "python print (x)" "23"

gdb_test "python gdb.execute('echo 2\\necho 3\\\\n\\n')" "23" \
    "multi-line execute"
gdb_test " " "23" "gdb.execute does not affect repeat history"

gdb_test_no_output \
    "python x = gdb.execute(\"interpreter-exec mi '-data-evaluate-expression 23'\", to_string=True)" \
    "execute MI command from python"
gdb_test "python print(x)" \
    "\\^done,value=\"23\"\r\n" \
    "output of MI command"

# Test post_event.
gdb_test_multiline "post event insertion" \
  "python" "" \
  "someVal = 0" "" \
  "class Foo(object):" "" \
  "  def __call__(self):" "" \
  "    global someVal" "" \
  "    someVal += 1" "" \
  "gdb.post_event(Foo())" "" \
  "end" ""

gdb_test "python print (someVal)" "1" "test post event execution"
gdb_test "python gdb.post_event(str(1))" "RuntimeError.*: Posted event is not callable.*" \
    "test non callable class"

send_gdb "python gdb.post_event(lambda: invalid())\n"
gdb_expect {
    -re "name 'invalid' is not defined" {
	pass "test post_event error on receipt"
    }
    default {
	fail "test post_event error on receipt"
    }
}

# Test (no) pagination of the executed command.
gdb_test "show height" {Number of lines gdb thinks are in a page is unlimited\.}
set lines 10
gdb_test_no_output "set height $lines"

set test "verify pagination beforehand"
gdb_test_multiple "python print (\"\\n\" * $lines)" $test {
    -re "$pagination_prompt$" {
	pass $test
    }
}
gdb_test "q" "Quit.*" "verify pagination beforehand: q"

gdb_test "python if gdb.execute('python print (\"\\\\n\" * $lines)', to_string=True) == \"\\n\" * [expr {$lines + 1}]: print (\"yes\")" "yes" "gdb.execute does not page"

set test "verify pagination afterwards"
gdb_test_multiple "python print (\"\\n\" * $lines)" $test {
    -re "$pagination_prompt$" {
	pass $test
    }
}
gdb_test "q" "Quit.*" "verify pagination afterwards: q"

gdb_test_no_output "set height 0"

gdb_test_no_output "python a = gdb.execute('help', to_string=True)" "collect help from uiout"

gdb_test "python print (a)" ".*aliases -- User-defined aliases of other commands.*" "verify help to uiout"

# Test PR 12212, using InfThread.selected_thread() when no inferior is
# loaded.
gdb_py_test_silent_cmd "python nothread = gdb.selected_thread()" "Attempt to acquire thread with no inferior" 1
gdb_test "python print (nothread is None)" "True" "ensure that no threads are returned"

gdb_test_multiline "register atexit function" \
    "python" "" \
    "import atexit" "" \
    "def printit(arg):" "" \
    "  print (arg)" "" \
    "atexit.register(printit, 'good bye world')" "" \
    "end" ""

send_gdb "quit\n"
gdb_expect {
    -re "good bye world" {
	pass "atexit handling"
    }
    default {
	fail "atexit handling"
    }
}

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

# The following tests require execution.

if {![runto_main]} {
    return
}

set lineno [gdb_get_line_number "Break to end."]
runto $lineno

# Test gdb.decode_line.
gdb_test "python gdb.decode_line(\"main.c:43\")" \
    "gdb.error.*: No source file named main.c.*" "test decode_line no source named main"

with_test_prefix "test decode_line current location" {
    gdb_py_test_silent_cmd "python symtab = gdb.decode_line()" "decode current line" 1
    gdb_test "python print (len(symtab))" "2" "length of result"
    gdb_test "python print (symtab\[0\])" "None" "no unparsed text"
    gdb_test "python print (len(symtab\[1\]))" "1" "length of result locations"
}

# Test that decode_line with an empty string argument does not crash.
gdb_py_test_silent_cmd "python symtab2 = gdb.decode_line('')" \
    "test decode_line with empty string" 1

if { [is_remote host] } {
    set python_c [string_to_regexp "python.c"]
} else {
    set python_c [string_to_regexp "gdb.python/python.c"]
}
with_test_prefix "test decode_line" {
    gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_c}" "current location filename"
    gdb_test "python print (symtab\[1\]\[0\].line)" "$lineno" "current location line number"

    gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"python.c:26 if foo\")" "python.c:26 decode" 1
    gdb_test "python print (len(symtab))" "2" "python.c:26 length 2"
    gdb_test "python print (symtab\[0\])" "if foo" "expression parse"
    gdb_test "python print (len(symtab\[1\]))" "1" "python.c:26 length 1"
    gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_c}" "python.c:26 filename"
    gdb_test "python print (symtab\[1\]\[0\].line)" "26" "python.c:26 line number"

    gdb_test "python gdb.decode_line(\"randomfunc\")" \
	"gdb.error.*: Function \"randomfunc\" not defined.*" "randomfunc"
    gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"func1\")" "func1()" 1
    gdb_test "python print (len(symtab))" "2" "func1 length 2"
    gdb_test "python print (len(symtab\[1\]))" "1" "func1 length 1"
}

if { [is_remote host] } {
    set python_1_c [string_to_regexp "python-1.c"]
} else {
    set python_1_c [string_to_regexp "gdb.python/python-1.c"]
}
gdb_test "python print (symtab\[1\]\[0\].symtab)" ".*${python_1_c}" "test decode_line func1 filename"

# Set a default value for func1_lineno in case we fail to fetch the line number
# below.
set func1_lineno "noline"

# Fetch the line GDB thinks func1 starts at.  This may change depending
# on the architecture and on how GDB handles the prologue of the function.
gdb_test_multiple "info line func1" "info line func1" {
    -re "Line ($decimal) of .* starts at address $hex <func1> and ends at $hex <func1\\+$decimal>\.\[\r\n\]+$gdb_prompt $" {
	# Fetch the line number.
	set func1_lineno $expect_out(1,string)
    }
}

gdb_test "python print (symtab\[1\]\[0\].line)" "$func1_lineno" "test decode_line func1 line number"
gdb_py_test_silent_cmd {python symtab = gdb.decode_line ("func1,func2")} \
    "test decode_line func1,func2" 1
gdb_test {python print (symtab[0])} ",func2" "stop at comma in linespec"

with_test_prefix "test decode_line" {
    gdb_py_test_silent_cmd "python symtab = gdb.decode_line(\"*0\")" "*0" 1
    gdb_test "python print (len(symtab))" "2" "*0 result length"
    gdb_test "python print (symtab\[0\])" "None" "*0 unparsed"
    gdb_test "python print (len(symtab\[1\]))" "1" "*0 locations length"
    gdb_test "python print (symtab\[1\]\[0\].symtab)" "None" "*0 filename"
    gdb_test "python print (symtab\[1\]\[0\].pc)" "0" "*0 pc"
}

# gdb.write
gdb_test "python print (sys.stderr)" ".*gdb._GdbFile (instance|object) at.*" "test stderr location"
gdb_test "python print (sys.stdout)" ".*gdb._GdbFile (instance|object) at.*" "test stdout location"
gdb_test "python gdb.write(\"Foo\\n\")" "Foo" "test default write"
gdb_test "python gdb.write(\"Error stream\\n\", stream=gdb.STDERR)" "Error stream" "test stderr write"
gdb_test "python gdb.write(\"Normal stream\\n\", stream=gdb.STDOUT)" "Normal stream" "test stdout write"

if {![gdb_debug_enabled]} {
  gdb_test "python gdb.write(\"Log stream\\n\", stream=gdb.STDLOG)" "Log stream" "test stdlog write"
}

# Turn on full stack printing for subsequent tests.
gdb_py_test_silent_cmd "set python print-stack full" \
    "Set print-stack full for prompt tests" 1

# Test prompt substituion

gdb_test_multiline "prompt substitution" \
  "python" "" \
  "someCounter = 0" "" \
  "def prompt(current):" "" \
  "   global someCounter" "" \
  "   if (current == \"testfake \"):" "" \
  "      return None" "" \
  "   someCounter = someCounter + 1" "" \
  "   return \"py prompt \" + str (someCounter) + \" \"" "" \
  "end" ""

gdb_test_multiline "prompt substitution readline" \
  "python" "" \
  "pCounter = 0" "" \
  "def program_prompt(current):" "" \
  "   global pCounter" "" \
  "   if (current == \">\"):" "" \
  "      pCounter = pCounter + 1" "" \
  "      return \"python line \" + str (pCounter) + \": \"" "" \
  "   return None" "" \
  "end" ""

set newprompt "py prompt 1"
set newprompt2 "py prompt 2"
set testfake "testfake"

gdb_test_multiple "python gdb.prompt_hook = prompt" "set the hook = prompt" {
    -re "\[\r\n\]$newprompt $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "set prompt testfake " "set testfake prompt in GDB" {
    -re "\[\r\n\]$testfake $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "show prompt" "show testfake prompt" {
    -re "Gdb's prompt is \"$testfake \"..* $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "set prompt blah " "set blah in GDB" {
    -re "\[\r\n\]$newprompt2 $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "python gdb.prompt_hook = None" "delete hook" {
    -re "\[\r\n\]$newprompt2 $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "set prompt $gdb_prompt " "set default prompt" {
    -re "\[\r\n\]$gdb_prompt $" {
	pass $gdb_test_name
    }
}

set working_dir ""
gdb_test_multiple "pwd" "pwd" {
    -re "Working directory (.*)\\.\[\r\n\]+$gdb_prompt $" {
	set working_dir $expect_out(1,string)
    }
}

gdb_test_multiple "python gdb.prompt_hook = program_prompt" "set the programming hook" {
    -re "\[\r\n\]$gdb_prompt $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "python" "test we ignore substitution for seconday prompts" {
    -re "\r\n>$" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "end" "end programming" {
    -re "\[\r\n\]$gdb_prompt $" {
	pass $gdb_test_name
    }
}

gdb_test_multiline "prompt substitution readline import" \
  "python" "" \
  "import gdb.command.prompt" "" \
  "end" ""

gdb_test_multiple "set extended-prompt one two three " \
    "set basic extended prompt" {
    -re "\[\r\n\]one two three $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "set extended-prompt \\w " \
    "set extended prompt working directory" {
    -re "\[\r\n\][string_to_regexp $working_dir] $" {
	pass $gdb_test_name
    }
}

gdb_test_multiple "set extended-prompt some param \\p{python print-stack} " \
    "set extended prompt parameter" {
    -re "\[\r\n\]some param full $" {
	pass $gdb_test_name
    }
}

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

# The following tests require execution.

if {![runto_main]} {
    return
}

# print-stack settings
gdb_test "show python print-stack" \
    "The mode of Python stack printing on error is \"message\".*" \
    "Test print-stack show setting. Default is message."
gdb_py_test_silent_cmd "set python print-stack full" \
    "Test print-stack set setting to full" 1
gdb_test "show python print-stack" \
    "The mode of Python stack printing on error is \"full\".*" \
    "Test print-stack show setting to full"
gdb_py_test_silent_cmd "set python print-stack none" \
    "Test print-stack set setting to none" 1
gdb_test "show python print-stack" \
    "The mode of Python stack printing on error is \"none\".*" \
    "test print-stack show setting to none"

gdb_py_test_silent_cmd "set python print-stack message" \
    "Test print-stack set setting to message" 1

gdb_test_multiline "prompt substitution readline error_prompt" \
  "python" "" \
  "pCounter = 0" "" \
  "def error_prompt(current):" "" \
  "   raise RuntimeError(\"Python exception called\")" "" \
  "end" ""

gdb_test_multiple "python gdb.prompt_hook = error_prompt" "set the hook error_prompt" {
    -re "Python Exception (exceptions.RuntimeError|<(type 'exceptions.|class ')RuntimeError'>): Python exception called\r\n$gdb_prompt $" {
	pass $gdb_test_name
    }
}

gdb_py_test_silent_cmd "python gdb.prompt_hook = None" \
    "set the hook to default 1" 1

gdb_py_test_silent_cmd "set python print-stack full" \
    "set print-stack full for prompt error test" 1

gdb_test_multiple "python gdb.prompt_hook = error_prompt" "set the hook error_prompt traceback" {
    -re "Traceback.*File.*line.*RuntimeError.*Python exception called.*$gdb_prompt $" {
	pass $gdb_test_name
    }
}

gdb_py_test_silent_cmd "python gdb.prompt_hook = None" \
    "set the hook to default 2" 1

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

# The following tests require execution.

if {![runto_main]} {
    return
}

runto [gdb_get_line_number "Break at func2 call site."]

gdb_py_test_silent_cmd "python line = gdb.selected_frame().find_sal().line" "Get line number of func2 call site" 1

gdb_py_test_silent_cmd "python pc_call = gdb.selected_frame().pc()" \
    "Get pc of func2 call site" 1

gdb_test "python print (gdb.find_pc_line(gdb.selected_frame().pc()).line == line)" "True" "test find_pc_line at func2 call site"

gdb_py_test_silent_cmd "step" "Step into func2" 1
gdb_py_test_silent_cmd "up" "Step out of func2" 1

# The point of the following test is to see if gdb has advanced past the
# location where the branch to a function was made.
set test_name "test find_pc_line with resume address"

gdb_py_test_silent_cmd "python pc_rtn = gdb.selected_frame().pc()" \
    "Get pc at func2 return site" 1

gdb_test "python print (pc_rtn > pc_call)" "True" \
    "test resume address greater then call address"

gdb_test "python print (gdb.find_pc_line(pc_rtn).line >= line)" "True" \
    "test find_pc_line with resume address"
gdb_test "python print (gdb.find_pc_line(pc_rtn).line == gdb.find_pc_line(gdb.Value(pc_rtn)).line)" \
    "True" \
    "test find_pc_line using Value"

gdb_test_no_output "set variable \$cvar1 = 23" "set convenience variable"
gdb_test "python print(gdb.convenience_variable('cvar1'))" "23"
gdb_test "python print(gdb.convenience_variable('cvar2'))" "None"
gdb_test_no_output "python gdb.set_convenience_variable('cvar1', 89)" \
    "change convenience variable from python"
gdb_test "python print(gdb.convenience_variable('cvar1'))" "89" \
    "print new value of convenience variable from python"
gdb_test "print \$cvar1" " = 89" \
    "print new value of convenience variable from CLI"
gdb_test_no_output "python gdb.set_convenience_variable('cvar3', -5)" \
    "make convenience variable from python"
gdb_test "python print(gdb.convenience_variable('cvar3'))" "-5" \
    "print value of new convenience variable from python"
gdb_test_no_output "python gdb.set_convenience_variable('cvar3', None)" \
    "reset convenience variable from python"
gdb_test "python print(gdb.convenience_variable('cvar3'))" "None" \
    "print reset convenience variable from python"
gdb_test "print \$cvar3" "= void" \
    "print reset convenience variable from CLI"

# Test PR 23669, the following would invoke the "commands" command instead of
# "show commands".
gdb_test "python gdb.execute(\"show commands\")" "$decimal  print \\\$cvar3.*"

# Check if starti command is supported.
if { [use_gdb_stub] == 0 } {
    # Test that the from_tty argument to gdb.execute is effective. If
    # False, the user is not prompted for decisions such as restarting the
    # program, and "yes" is assumed. If True, the user is prompted.
    # Case 1, from_tty=False.
    gdb_test "python gdb.execute('starti', from_tty=False)" \
	"Program stopped.*" \
	"starti via gdb.execute, not from tty"

    # Case 2, from_tty=True.
    set test "starti via gdb.execute, from tty"
    set question \
	[multi_line \
	     {The program being debugged has been started already\.} \
	     {Start it from the beginning\? \(y or n\) $}]
    gdb_test_multiple "python gdb.execute('starti', from_tty=True)" $test {
	-re $question {
	    gdb_test "y" "Starting program:.*" $gdb_test_name
	}
    }
}

# Regression test for PR python/32163: several types were not
# previously registered with the module, so could not be inspected
# directly.
foreach type {Instruction LazyString Membuf Record RecordFunctionSegment \
		  RecordGap RecordInstruction TuiWindow} {
    if { $type == "TuiWindow" && ![allow_tui_tests] } {
	continue
    }

    gdb_test "python print(type(gdb.$type))" "<class 'type'>" \
	"gdb.$type is registered"
}

set logfile [host_standard_output_file gdb.txt]
gdb_test_no_output "set logging file $logfile" \
    "set logging file [file tail $logfile]"
gdb_test_no_output "set logging redirect on" \
    "enable logging redirect via python"
gdb_test_no_output "python gdb.execute('set logging enabled on')" \
    "enable logging via python"

# Even with logging redirect on, this should capture the output.
gdb_test_no_output "python x = gdb.execute('print 23', to_string=True)" \
    "print from python with logging redirect"

gdb_test "set logging enabled off" \
    "Done logging to .*gdb.txt." \
    "disable logging"

gdb_test "python print(x)" " = 23.*" \
    "python still captured output"
