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

require allow_python_tests

load_lib gdb-python.exp

standard_testfile

set testfile1 $testfile-a
set binfile1 [standard_output_file $testfile1]
set testfile2 $testfile-b
set binfile2 [standard_output_file $testfile2]

if {[build_executable "failed to prepare first executable" \
	 $binfile1 $srcfile]} {
    return -1
}

if {[build_executable "failed to prepare second executable" \
	 $binfile2 $srcfile]} {
    return -1
}

set binfile1 [gdb_remote_download host $binfile1]
set binfile2 [gdb_remote_download host $binfile2]

# Setup a Python function to listen for the executable changed event.
proc setup_exec_change_handler {} {
    gdb_py_test_silent_cmd \
	[multi_line \
	     "python" \
	     "def reset_state():" \
	     "   global exec_changed_state" \
	     "   exec_changed_state = \[0, None, None\]" \
	     "end" ] \
	"build reset_state function" 0

    gdb_py_test_silent_cmd \
	[multi_line \
	     "python" \
	     "def executable_changed(event):" \
	     "   global exec_changed_state" \
	     "   exec_changed_state\[0\] += 1" \
	     "   exec_changed_state\[1\] = event.progspace.executable_filename" \
	     "   exec_changed_state\[2\] = event.reload" \
	     "end" ] \
	"build executable_changed function" 0

    gdb_test_no_output -nopass "python reset_state()"
    gdb_test_no_output "python gdb.events.executable_changed.connect(executable_changed)"
}

# Check the global Python state that is updated when the
# executable_changed event occurs, and then reset the global state.
# FILENAME is a string, the name of the new executable file.  RELOAD
# is a string, which should be 'True' or 'False', and represents if
# the executable file was reloaded, or changed.
proc check_exec_change { filename_re reload testname } {
    if { $filename_re ne "None" } {
	set filename_re "'$filename_re'"
    }
    if { $filename_re eq "None" && $reload eq "None" } {
	set count 0
    } else {
	set count 1
    }
    gdb_test "python print(exec_changed_state)" \
	"\\\[$count, $filename_re, $reload\\\]" \
	$testname
    gdb_test_no_output -nopass "python reset_state()"
}

# Check that the executable_filename is set correctly after using the
# 'file' command.
with_test_prefix "using 'file' command" {
    clean_restart

    setup_exec_change_handler

    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"None" \
	"check executable_filename when no file is loaded"

    gdb_test "file $binfile1" \
	"Reading symbols from [string_to_regexp $binfile1]\\.\\.\\..*" \
	"load first executable"
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"[string_to_regexp $binfile1]" \
	"check executable_filename when first executable is loaded"

    check_exec_change [string_to_regexp $binfile1] False \
	"check executable_changed state after first executable was loaded"

    gdb_test "file $binfile2" \
	"Reading symbols from [string_to_regexp $binfile2]\\.\\.\\..*" \
	"load second executable" \
	"Load new symbol table from .*\? .y or n. " "y"
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"[string_to_regexp $binfile2]" \
	"check executable_filename when second executable is loaded"

    check_exec_change [string_to_regexp $binfile2] False \
	"check executable_changed state after second executable was loaded"

    gdb_unload
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"None" \
	"check executable_filename after unloading file"

    check_exec_change None False \
	"check executable_changed state after unloading the executable"
}

# Check that the executable_filename is correctly set when we only set
# the exec-file.
with_test_prefix "using 'exec-file' command" {
    clean_restart

    setup_exec_change_handler

    gdb_test_no_output "exec-file $binfile1" \
	"load first executable"
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"[string_to_regexp $binfile1]" \
	"check executable_filename when first executable is loaded"

    check_exec_change [string_to_regexp $binfile1] False \
	"check executable_changed state after first executable was loaded"

    gdb_test_no_output "exec-file $binfile2" \
	"load second executable"
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"[string_to_regexp $binfile2]" \
	"check executable_filename when second executable is loaded"

    check_exec_change [string_to_regexp $binfile2] False \
	"check executable_changed state after second executable was loaded"

    gdb_test "exec-file" "No executable file now\\."
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"None" \
	"check executable_filename after unloading file"

    check_exec_change None False \
	"check executable_changed state after unloading the executable"
}

# Check that setting the symbol-file doesn't cause the
# executable_filename to be set.
with_test_prefix "using 'symbol-file' command" {
    clean_restart

    setup_exec_change_handler

    gdb_test "symbol-file $binfile1" \
	"Reading symbols from [string_to_regexp $binfile1]\\.\\.\\..*" \
	"load first executable"
    gdb_test "python print(gdb.current_progspace().executable_filename)" \
	"None" \
	"check executable_filename after setting symbol-file"

    check_exec_change None None \
	"check executable_changed state after setting symbol-file"
}

# Check the executable_changed event when the executable changes on disk.
with_test_prefix "exec changes on disk" {
    clean_restart $::testfile1

    setup_exec_change_handler

    runto_main

    gdb_test_no_output "shell sleep 1" \
	"ensure executable is at least 1 second old"

    gdb_test "shell touch ${binfile1}" "" \
	"update the executable on disk"

    runto_main

    check_exec_change [string_to_regexp $binfile1] True \
	"check executable_changed state after exec changed on disk"
}
